Просмотр полной версии : Неужели никто не знает Паскаль?
Уважаемые знатоки! :D
Помогите решить задачу на паскале.
Условие следующее:
"Дана произвольная строка символов. Отредактировать заданную строку, удалив из неё все слова встречающиеся более одного раза.
Распечатать внове полученное слово."
Вопросов по условию прошу не задавать.
Я просто разместил объяву (С) :D
Вопросов по условию прошу не задавать.
Я просто разместил объяву (С) :D
Тада будут предъявы :D
Чо надо распечатать в конце? :D
Предлагаю распечатать все возможные варианты :)
а тебе на матричном принтере, на струйном или на лазерном? и на какой бумаге будет идти печать(это очень важно)
Прошу отнестись к теме серьёзно.
Lermontov
20.11.2006, 14:44
Kolin, жжошь с распечаткой +1
P.S. У меня такая ж лаба была по С++
выкладывай! афтар переделает под паскаль!
Паскаль мёртвый язык, зайди на какойнить делфёвый форум и задай вопрос тама, код будет одинаковый.
На счёт С/С++ могу написать...
Паскаль мёртвый язык, зайди на какойнить делфёвый форум и задай вопрос тама, код будет одинаковый.
На счёт С/С++ могу написать...
Нихрена не одинаковый :D
На дельфи эт пишется почти 1 строчкой -
myList := TStringList.Create();
myList.Sorted := true;
myList.IgnoreDuplicates := true;
while s = read(srcString) myList.Add(s);
Console.Writeln(myList.Text);
Мля эт уже сишарп получился )) ну короче идея ясна.
В дельфи есть специализированные классы.
А на паскале нада делать какой то алгоритм шоб отслеживать в наличие строки в списке.
P.S. Ваще ни на чем не могу писать после сишарпа :(
бла бла блаВ С/С++ тоже есть классы предназначенные для работы со строками и списками, причём тут это, ты реализацию той или иной функции в классе посмотри...тот же паскаль.
З.Ы. Делфи это грубоговоря некое расширение языка Паскаль, ещё, кто не в курсе, делфи называют - Object Pascal.
=))
З.Ы. Делфи это грубоговоря некое расширение языка Паскаль, ещё, кто не в курсе, делфи называют - Object Pascal.
=))
Который действительно назывался Object Pascal, а кхм после седьмой версии так и называется - Delphi :)
В С++ нет классов для работы со строками, там вообще нихрена нет по определению. По стандарту :)
Они есть в библиотеках. Нету в С++ контейнеров и итераторов, зато они есть в STL. На которую есть свой стандарт.
На классическом паскале, придется писать существенно больше кода нежели на дельфи. Именно потому тчо в классическом паскале нет VCL.
Все сука, много написал, хватит, но блаблабла задело :)
... сори за "блаблабла", не созла...
Мя тоже чёт строчить парит, я те одно напишу, поймёшь 100 %
VCL ~= STL
тока тсс! STL (Standart Template Library)
тока STL - это часть стандартной библиотеки С++. Про С ты прав нету там шаблонов. А вот С++ есть! и это стандарт!
Хватит выпендриваться, раз такие умные решите лучше задачу.
-=Sticky Fingaz=-
20.11.2006, 16:45
а тебе на структурном или обьектном паскале?
turbo pascal 6.0
без turbovision
А чё там писать-то?
Посимвольно по строке идёшь, как встречаешь не букву - вырезаешь до этой позиции слово, заносишь в массив, с проверокой, что подобные слова уже есть... Дальше идёшь, как встречаешь букву - запоминаешь, как начало нового слова и т.д. Это если совсем просто...
а тебе на структурном или обьектном паскале?
На том, где пишешь "var: i,j". И т.д.
пузырек прошлый век
Подобные задачки - тоже %)
общий тип на бейсике:
sub main(text)
#выдавалка слов
var i, n, k
text=' '+text+' '
for i=0 to len(text)
if mid(text,i,1)==' ' then
n=0
else
n=1
end if
if n==1 then
k=k+mid(text,i,1)
print(k) # << слово
else
k=''
end if
next
end sub
sub del(word,string)
#удалялка слова
var i, n=0, text=''
if wqty(word,string)>1 and not word=='' then
for i=0 to len(string)
text=text+mid(string,i,1)
if right(left(string,i),len(word))==word then
text=left(text,i-len(word))
end if
next
return trim(text)
end if
end sub
sub wqty(word,string)
#кол-во заданного слова в строке
var i, n=0
for i=0 to len(string)
if mid(string,i,1)==' ' and mid(string,i+1,len(word))==word then
n=n+1
end if
next
return n
end sub
:D а слабо на макроассемблере?
:D а слабо на макроассемблере?
это только для ярых фанатов... хотя не так уж и страшно на первый взгляд
Ну что на паскале никто не умеет програмить?!
По почкам резиновыми членами преподам, что суют своим студентам паскали, бэйсики и прочую херню.
Задача элементарная, пусть твой друг думает сам, а если он не может такую простую задачу решить, которая в 10 строчек максимум, пусть идёт учиться в другую специальность, пока не поздно.
Задача элементарная, пусть твой друг думает сам, а если он не может такую простую задачу решить, которая в 10 строчек максимум, пусть идёт учится в другую специальность, пока не поздно.
Во-первых, это не друг- а двоюродная сестра.
Во-вторых, эту задачку задали в школе, согластно школьной программе, для допуска к зачёту.
Ну раз сестра и школа, тогда не будем столь резки. :)
Вот и скажите мне после этого, что школа - это хорошо %)
Бесполезная трата 10-и лет жизни и нервов на никому ненужные "знания" %)
ЗЫ: я не помню стандартные паскалевские функции работы со строками уже... (так со школы ни разу и не пригодилось %) Разве что алгоритм могу рассказать %)
Не все школы одинакого полезны :)
Информатика всегда являлась проблемной сотроной многих школ.
Если некоторые директора школ и заставляют изменить программу образования, то другим глубоко пофиг на этот предмет и очень просто свалить всё на государство.
Но это уже другой вопрос, который можно обсудить в отдельном топике.
млин у меня школа была одна из лучших в районе но нас там ничему этому не учили.. :(
что такое языки программирования я начал представлять скачав запрещенную прогу для UO :)
p.s. 2Варлан - тут видимо всем будет впадлу - это к какому сроку надо написать?
ЗЫ: я не помню стандартные паскалевские функции работы со строками уже... (так со школы ни разу и не пригодилось %) Разве что алгоритм могу рассказать %)
Ну на дельфи напиши, консольную )))
У меня под рукой вообще ниче кроме VS 2005 нету :)
Во, консольное приложение, внимание, эт на дельфи! На паскале по идее не совсем так но похоже.
Даже странно что вспомнил )
program Example;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils;
const
ARR_MAX_SIZE = 255;
type
TStringArray = array [0..ARR_MAX_SIZE] of string;
var
text: string;
arr: TStringArray;
i: integer;
// Разделяем исходный текст на массив строк
// символом-разделителем считается пробел
function splitString(text: string): TStringArray;
var
i, wordCount: integer;
newWord: string;
begin
wordCount := 0;
for i := 1 to Length(text) do begin
if (text[i] = #$20) then
begin
Result[wordCount] := newWord;
inc(wordCount);
if wordCount > ARR_MAX_SIZE then break;
newWord := '';
end
else
newWord := newWord + text[i];
end;
Result[wordCount] := newWord;
end;
// Проверяем наличие указанной строки в массиве строк
// лень писать что то другое, поэтому ищем тупо, перебором
function stringExists(s: string; arr: TStringArray): boolean;
var
i: integer;
begin
Result := true;
for i:=0 to ARR_MAX_SIZE do if (arr[i] = s) then Exit;
Result := false;
end;
// Принимаем заданную строку текста и возвращаем массив строк
// в котором каждая строка-слово встречается только один раз
function verifyString(text: string): TStringArray;
var
i, j: integer;
oldList, newList: TStringArray;
begin
oldList := splitString(text);
j := 0;
for i:=0 to Length(oldList) do begin
if not(stringExists(oldList[i], newList)) then
begin
newList[j] := oldList[i];
inc(j);
end;
end;
Result := newList;
end;
// Точка входа приложения
begin
System.Writeln('Console application started...');
System.Writeln('Type input text: ');
// коротко, алгоритм:
// считываем строку текста
System.Readln(text);
// выводим ее же на экран для наглядности
System.Writeln('Input text: ' + text);
// делим строку на слова, и исключаем повторения
arr := verifyString(text);
// полученный массив опять записываем в строку
text := '';
for i:=0 to Length(arr) do
if arr[i] <> '' then
text := text + arr[i] + ' ';
// и выводим ее на экран, теперь две строки можно визуально сравнить
System.Writeln('Verified text: ' + text);
// ждем нажатия любой клавишы
System.Writeln('Press any key to exit...');
System.ReadLn;
end.
Что, Варлан, издеваются над тобой изверги? :lol:
Обратись на специализированные форумы, там быстрее помогут =)
Паскаль не помню, но могу точно сказать -
Во~первых нада отрезать "System" - это как я понял объект приложения. Во~вторых нада чтото делать с T<name> классами, это vcl'ная побалдень.
Во~вторых нада чтото делать с T<name> классами, это vcl'ная побалдень.
type
TStringArray = array [0..ARR_MAX_SIZE] of string;
Причем тут VCL? )))
type
TStringArray = array [0..ARR_MAX_SIZE] of string;
блин это в паскале определение типа так выглядит? ... =))
typedef char TStringArray[ARR_MAX_SIZE];
это типа одно и то же?
если так тода норм.
З.Ы. Просто в vcl все классы начинаются с Т...=)
это типа одно и то же?
именно :)
З.Ы. Просто в vcl все классы начинаются с Т...=)
... привычка :)
Ну на дельфи напиши, консольную )))
У меня под рукой вообще ниче кроме VS 2005 нету :)
А у меня кроме VS 2003 %)
Дельфями никогда и не маялся, максимум C++ билдером, и то 100 лет назад %)
The Odian
22.11.2006, 13:03
Можно уточнить?
"Дана произвольная строка символов. Отредактировать заданную строку, удалив из неё все слова встречающиеся более одного раза. Распечатать внове полученное слово."
Удалить слова? Как определяется понятие слово? Набор символов, разделённых пробелом, табом, любым whitespace-ом или каким-то ещё символом?
В результирующей строке, символы-разделители повторяющиеся больше одного раза в заданной строке, должны сохраняться?
Было:
"В этом топе все строят из себя умников, надо тоже отписаться в этоп топе."
должно стать:
"В этом все строят из себя умников, надо тоже отписаться в этом ."
еще желательно и без лишних пробелов :)
The Odian
22.11.2006, 16:46
А если есть (считай _ пробелами):
"Этот_топ___вошёл___в_топ_100", то должно стать:
"Этот____вошёл___в__100" или "Этот_вошёл_в_100"?
И где сказано, что слова должны быть разделены именно пробелом?
Фтрэш таких учителей, которые дают подобные условия задачи.
А если есть (считай _ пробелами):
"Этот_топ___вошёл___в_топ_100", то должно стать:
"Этот____вошёл___в__100" или "Этот_вошёл_в_100"?
И где сказано, что слова должны быть разделены именно пробелом?
Фтрэш таких учителей, которые дают подобные условия задачи. ты уж очень дотошно к задаче подходишь =)
Нада рассуждать логически, если задача была дана в школе, значит преподаватель который её давал, преследовал мысль что ученик выполняющий её получит некие знания по построению алгоритмов для парсинга строк(или чтото в этом духе), и какие там разделители между условными единицами неважно! Если уж всётаки это играет роль, можно сделать массив символов сепараторов...Какие вопросы то?
а че в паскаое нельзя указать разделитель в самой функции?
типа
sub main()
print( virezalka('В этом топе..','*тут разделитель*') )
end sub
sub virezalka(stroka,razdelitel)
..
end sub
The Odian
22.11.2006, 17:29
Если уж всётаки это играет роль, можно сделать массив символов сепараторов...Какие вопросы то?
Вопрос в том, что если ввести сепараторы, кто-нибудь потом поверит, что это сделала двоюродная сестра Варлана сама? А злой препод наверняка будет смотреть сорус-код :)
а че в паскаое нельзя указать разделитель в самой функции?
Можно, если сепаратор 1, а если несколько - то массив.
The Odian
22.11.2006, 17:34
Ладно, с сепараторами, так с сепараторами.. Только восстанавливать ли их в полном кол-ве? Хотя, лучше видимо да, их же не говорили удалять. Ладно, сэнк ю фор хелп :) Ай эм он ит.
The Odian
22.11.2006, 17:35
Можно, если сепаратор 1, а если несколько - то массив.
Уже шутя: а должны ли сепараторы быть односимвольными или разрешать и многосимвольные?
Посимвольно по строке идёшь, как встречаешь не букву - вырезаешь до этой позиции слово
... это к тому как определять разделители.
В дельфи это пишеться еще проще
if not( s[i] in ['A..Z', '0'..'9']) then
begin
...
end;
Но я не знаю есть ли такое в Паскале. Просто не помню.
typedef char TStringArray[ARR_MAX_SIZE];
я так понимаю, что это на Си? если да, то ты не прав :)
The Odian
22.11.2006, 19:10
... это к тому как определять разделители.
В дельфи это пишеться еще проще
if not( s[i] in ['A..Z', '0'..'9']) then
begin
...
end;
Но я не знаю есть ли такое в Паскале. Просто не помню.
Это фишка Дельфей.. В Паскале можно так:
case S[I] of 'A'..'Z', '0'..'9': ...; else ...; end;
if not( s[i] in ['A..Z', '0'..'9']) then
begin
...
end;
я так понял что если символ не A-Z и не 0-9 то - делаемм действие..
а если текст на русском?
The Odian
22.11.2006, 20:09
а если текст на русском?
Лучше просто проверять на сепараторы, чем на такие буквы.
Т.к. дана строка произвольных(?!) символов.
The Odian
22.11.2006, 20:21
Вопрос аффтару: к какому времени сие нужно то? (если вдруг предыдущие версии предложенные для Дельфи не будут работать в Паскале)? :)
Т.к. дана строка произвольных(?!) символов.
ну я просто поинтересовался хз че дано:)
The Odian
22.11.2006, 20:49
самое позднее к пятнице
Да что вы все, сговорились, чтоль.. :roll: Почему стольким людям нужно что-то самое позднее к пятнице :P
The Odian
24.11.2006, 02:17
Ну вот, следующая прога работает на Turbo Pascal 7.0 и ей вполне хватает дефолтных 64 кб. Работает именно так, как я описывал ранее. Оставляет весь whitespace нетронутым, убирая только повторяющиеся слова. Делимитеры можно указать напрямую в строке "#0 .. #32 { list all required delimeters here } :", допустим если будет только "#32" - это пробел, "#9, #32" - и таб и пробел, а если "#0..#32", то все контрол-символы.. и т.п.
Вопросы, комменты ар вэлкам. Копирайт передаю Варлану для дальнейшего пользования в любых целях. Итак, код :)
const MaxWords = 128; { max possible for delimited string w/ max 255 chars }
var Str, Res, Wrd: String; I, Words: Integer;
Dict: array[0..MaxWords-1] of String;
function DictWord (const S: String): Boolean;
var I: Integer;
begin
DictWord := True;
{ check for word in dictionary, return true if found }
for I := 0 to Words - 1 do
if Dict[I] = S then Exit;
{ if not add it there and return false }
Inc(Words); Dict[Words-1] := S;
DictWord := False;
end;
begin
{ Reading initial string }
Write('String: '); Readln(Str);
{ Main process }
Words := 0; Res := ''; Wrd := '';
for I := 1 to Length(Str) do
case Str[I] of
#0 .. #32 { list all required delimeters here } :
begin
if Wrd <> '' then
if not DictWord(Wrd) then
Res := Res + Wrd;
Wrd := '';
Res := Res + Str[I];
end;
else Wrd := Wrd + Str[I];
end;
if Wrd <> '' then
if not DictWord(Wrd) then
Res := Res + Wrd;
{ Output result }
Writeln (Res);
end.
Powered by vBulletin™ Version 4.0.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot