1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Дали новую тему, текстовые файлы. Давали студенты и никто из группы ничего не понял... А задачи нужно сдать завтра. Помогите хоть с какими-нибудь двумя!!!
1. Дан текстовый файл, содержащий целые числа. Найти • Арифметическое среднее чисел в файле; • Номер максимального элемента в файле; (решена)
2. Дан текстовый файл, содержащий строки. Найти самые короткие строки. (решена)
3. Даны два текстовых файла. Записать в третий только те строки, которые есть и в первом и во втором файлах.
4. Даны два файла А и В(тип элементов одинаковый). Поменять местами содержимое этих файлов. Использовать процедуру Rename не разрешается.
Нужно просто считать итерации и запоминать итерацию, на которой обнаружена самая короткая сторока.
кроме того у вас ошибка вот здесь:
assign (f, 'text.txt'); reset (f); Readln (f,s); //уберите эту строку! вдруг файл пустой? - будет ошибка min:=length(s); // замените на min:=MaxInt; или на min:=$7FFFFFFF;
Нужно просто считать итерации и запоминать итерацию, на которой обнаружена самая короткая сторока. кроме того у вас ошибка вот здесь...
у нас по условию таких строк несколько. сколько именно - заранее не знаем.
по-хорошему, надо проверять, есть ли вообще этот файлик ;)
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
у нас по условию таких строк несколько. сколько именно - заранее не знаем.
Так в чём проблема? Формируем список, каждый элемент которого будет содержать индекс строки. Вот и алгоритм: Если нашли строку короче, чем были до этого, то гробим предидущий список, и создаём новый (из 1 элемента) который заносим текущй индекс, если строка по длине такая же, то добавляем в текущий список.
В конце просто выбрасываем этот список на печать.
program FindAllMinStrings;
type PElement = ^TElement; TElement = record index: integer; //здесь будет храниться номер строки str: string; // сама строка next: PElement; //следующий элемент в списке end;
const InputFileName = 'test.txt';
var lst: PElement = nil;
// процедура будет разрушать список - возвращаем память procedure KillList; // обычный рекурсивный проход по элементам списка // можно, конечно, и в цикле, но я привык к SML procedure Kill(El: PElement); begin if El = nil then Exit; Kill(El^.next); Dispose(El) end; begin Kill(lst); lst:=nil; end;
// выделяет память под новый элемент списка и возвращает указатель // на него function NewElement(AIndex: integer; const AStr: string): PElement; var El: PElement; begin New(El); El^.index:=AIndex; El^.str:=AStr; El^.next:=nil; NewElement:=El; end;
// цепляет к новому элементу список lst // cons - это в LISP :-) была такая операция procedure Cons(El: PElement); begin El^.next:=Lst; Lst:=El; end;
// выводит на печать список - тоже рекурсивно // люблю я рекурсию :-) procedure PrintList; procedure Print(El: PElement); begin if El = nil then Exit;
// так как список наш сформирован с номерами строк (index) // задом на перёд, то сначала нада напечатать то, что было ранешнее Print(El^.next); // а потом текущий элемент WriteLn(El^.index, ': ', El^.str) end; begin Print(lst); end;
var InputFile: textfile; // файло со строками minlen: integer = MaxInt; // текущая минимальная длина строки её инициализируем максимальным целым curstr: string; // текущая строка curlen: integer; // длина текущей строки i: integer = 0; // индексатор строк - нумерация с 0 начинается begin Assign(InputFile, InputFileName); Reset(InputFile); while not EOF(InputFile) do begin ReadLn(InputFile, curstr); curlen:=Length(curstr); if curlen < minlen then begin // нашли строку короче, чем уже имеем - гробим список KillList; // и строим его заново Cons(NewElement(i, curstr)) end else if curlen = minlen then begin // нашли строку по длине совпадающую с текущим минимумом // благополучно запоминаем её и индекс Cons(NewElement(i, curstr)) end; inc(i); // не забываем считать строки :-) end; Close(InputFile); // печатаем что есть PrintList; // и чистим память (хотя можно и без этого) KillList; end.
Вот собсна. Делфю грузить неохота, но должно работать.
Вот собсна. Делфю грузить неохота, но должно работать.
Возможно... хотя у меня делфи на Assign ругается - предпочитает AssignFile. Но проблема в том, что списки в школе и в неспециализированных вузах не дают обычно. Сомневаюсь, что Clerick с ними сталкивался... соответственно, так решенная задача может вызвать подозрения препода.
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!