Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Re: Задачка для ПАСКАЛЯНТОВ!

Автор: trminator 25.11.2002 22:41

Примерно так

Код
PROGRAM FindTown;
var input:text;
     s,Find:string;
begin
 assign(input,'c:bpworkinput.txt');
 reset(input);
 ReadLn(Find);
 While not EOF(input) do
   begin
    ReadLn(input,s);
    if pos(Find,s)<>0 then {Если нужно не любое совпадение, а именно с начала, то кажется =1}
       WriteLn(s)
   end;
 close(input)
end.

Автор: Elected 9.10.2003 10:21

Привет Паскалянтам!
Помогите сделать прогу на паскале. Дан текстовый файл с городами в таком виде:

МОСКВА
ВОРОНЕЖ
БЕЛГОРОД
САНКТ-ПЕТЕРБУРГ
САМАРА
ИЖЕВСК
АРХАНГЕЛЬСК

Необходимо создать программу, которая бы выводила на экран именно тот город, который вы внесете с клавиатуры, но поиск города из текстового файла должен осуществляться по одной, двум, трем и т.д. буквам названия города, т.е.: На экране появляется строка "ВВЕДИТЕ НАЗВАНИЕ ГОРОДА =>", Вы хотите найти город МОСКВА, набираете "М" и на экране должна высветится "МОСКВА" или любой первый город на букву "М" в текстовом файле, т.е. если набрать "СА", то сначала высветится "САНКТ-ПЕТЕРБУРГ", а если
набрать уже "САМ", то "САМАРА".
С уважением,
Алексей.

Автор: Elected 9.10.2003 11:26

Спасибо за прогу trminator!

Код
PROGRAM FindTown;
Uses Crt;
var input:text;
s,Find:string;
begin
     ClrScr;
     GotoXY(10,10);
     Write('Введи название города => ');
     assign(input,'input.txt');
     reset(input);
     ReadLn(Find);
     While NOT EOF (input) do
     BEGIN
     ReadLn(input,s);
     if POS(Find,S)=1 then
     GotoXY(10,20);
     WriteLN(s);
     END;
     close(input);
     Readln;
end.

Эта прога работает, но если в текстовом файле input.txt будет
20 городов на букву "С", то на экране при наборе "Введите
название города =>" набрать букву "С", отобразятся
все 20 городов на "С", а мне надо, чтобы отобразился на экране только первый попавшийся на букву "С" город в файле input.txt, а не все города.

Заранее благодарен,
Алексей.

Автор: Elected 9.10.2003 12:35

Я решил поставленную задачу, не прошло как говориться и
пол года. Но всё же спасибо тебе trminator! Ты подал идею, а я её решил при помощи команды seek. Формат записи должен быть не text, а file of  string, вот в чём и была загвостка.

Код

Uses Crt;
Label 1;
Var
     FileTown:file of string;
     Town,Town1:string;
     i:integer;
     ch:char;
Begin
     {Запись городов в файл}
     TextBackGround(0);TextColor(15);ClrScr;
     Assign(FileTown,'town.txt');
     Rewrite(FileTown);
     For i:=1 To 10 do
     Begin
     Write('Введите название ',i,' города  => ');
     Readln(Town);
     Write(FileTown,Town);
     end;
     Close(FileTown);
     Write('Нажмите <Enter>');
     repeat
     ch:=ReadKey;if ch=chr(13) then
     until ch=chr(13);
     {Чтение городов из файла}
1:      TextBackGround(0);TextColor(15);ClrScr;
     Assign(FileTown,'town.txt');
     Reset(FileTown);
     Write('Введите название города => ');
     Readln(Town1);
     while not EOF(FileTown) do begin
     Read(FileTown,Town);
     If pos(Town1,Town)=1 Then BEGIN
     SEEK(FileTown,-1);
     Writeln(Town);
     end;end;
     Close(FileTown);
     Write('Нажмите <Enter> или <Esc>');
     repeat
     ch:=ReadKey;if ch=chr(13) then begin Goto 1;end;
     if ch=chr(27) then until ch=chr(27);
End.

Посмотрите, что получилось, может кто решит эту задачку по другому, более проще.
                                                          ;D

Автор: Elected 10.10.2003 12:09

Как сделать вышеуказанную задачу на паскале при помощи массива?

Автор: Nightmare 10.10.2003 18:13

Если заранее известно количество строк в списке, то его можно засунуть не в файл, а в массив. В противном случае нужно использовать либо связанный список динамически распределённых строк, либо какую-либо реализацию динамического массива.

Но в любом случае - не забывайте, что общий размер описанных переменных не может превышать 64К (т.е. порядка 250 экземпляров типа String).

Автор: Fire_Rage 11.10.2003 7:33

Немножко подправим trminator

Код
PROGRAM FindTown;
var input:text;
s,Find:string;
begin
assign(input,'c:bpworkinput.txt');
reset(input);
ReadLn(Find);
While ((not EOF(input))and(pos(Find,s)<>1)) do
 begin
  ReadLn(input,s);
  if pos(Find,s)<>0 then {Если нужно не любое совпадение, а именно с начала, то кажется =1}
 WriteLn(s)
 end;
close(input)
end.

Автор: Elected 13.10.2003 9:28

Спасибо Fire_Rage! Программа действительно выполняет поставленную задачу!

Автор: AlaRic 13.10.2003 13:23

Проге место в исходниках сайта  ;D

Автор: Elected 13.10.2003 15:19

Привет, Паскалянтам!
Более сложная задача. Даны два текстовых файла. В одном записаны города, а в другом денежные суммы этих городов. Например:
File1
Белгород
Москва
Санкт-Петербург
Воронеж

File2
1000
9000
2500
1900
Программа должна выполнить следующие задачи: Задача №1: На экран выдается запрос «Введите название города =>», набираем например «Мо». На экране должно высветиться: «город Москва – сумма 9000», т.е. должен происходить поиск в File1 по городу и сумма браться с  File2 соответствующая городу. В нашем примере «Москва – 9000», вторая строка в file1 и file2.
Задача №2: На экране выдается запрос «Введите новую сумму =>», набираем «10000». И после этого в File2 сумма «10000» записывается на вторую позицию строки вместо «9000», т.е. при повторном запуске программы, при поиске города «Москва» на экране должно высветиться «город Москва – сумма 10000» и т.д.
У меня ничего не получается, но кое-что я набросал, правда только получилось решить задание №1.

Код
Uses Crt;
lABEL 1;
Var
     find:string;
     s:string;
     input:text;
     a,a1:text;
     c:array [1..10] of string;
     c1:array [1..10] of integer;
     i:integer;
Begin
assign(input,'INPUT.txt');
reset(input);
Write('Введите город => ');
ReadLn(Find);
While ((not EOF(input))and(pos(Find,s)<>1)) do
 begin
  ReadLn(input,s);
  if pos(Find,s)<>0 then
  wRITELN(S);
 end;
 close(input);
     Assign(a,'summa.txt');
     Reset(a);
     Assign(a1,'input.txt');
     Reset(a1);
     For i:=1 To 10 Do
     Begin
     READLN(A,C1[I]);
     Readln(A1,c[i]);
     END;
     For i:=1 To 10 Do
     Begin
     iF S=C[I] tHEN wRITELN('Город ',C[I],' сумма ',C1[I]);
     END;
     Close(a);
     Close(a1);
Readln;
End.

Можно сделать такую прогу без применения массива?
Заранее благодарен,
Алексей.

Автор: Elected 14.10.2003 11:50

Код

Uses Crt;
LABEL 1;
Var
     FileTown,FileSumm:text;
     ch:char;
     i,Summ:longint;
     Town,s:string;
     Summ1:array [1..10] of longint;
     Town1:array [1..10] of string;
Begin
1:      ClrScr;
     Assign(FileTown,'town.dat');
     Reset(FileTown);
     Write('Введите город => ');
     Readln(Town);
     While ((not EOF(FileTown))and(pos(Town,s)<>1)) do begin
     Readln(FileTown,s);
     If pos(Town,s)<>0 then begin
     end;end;
     Close(FileTown);
     Assign(FileTown,'town.dat');
     Reset(FileTown);
     Assign(FileSumm,'summ.dat');
     Reset(FileSumm);
     For i:=1 To 10 Do Begin
     Readln(FileTown,Town1[i]);
     Readln(FileSumm,Summ1[i]);
     if s=Town1[i] then begin
     Write(Town1[i],' => ');
     Writeln(Summ1[i]);
     Write('Введите новую сумму => ');
     Readln(Summ1[i]);
     end;end;
     Close(FileSumm);
     Close(FileTown);
     Assign(FileSumm,'summ.dat');
     Rewrite(FileSumm);
     For i:=1 To 10 Do Begin
     Writeln(FileSumm,Summ1[i]);
     end;
     Close(FileSumm);
     Write('Нажмите <Enter>');
     repeat
     ch:=ReadKey;if ch=chr(13) then begin Goto 1;end;
     if ch=chr(27) then until ch=chr(27);
End.

Вот прога, которая практически выполняет эту задачу, но слишком она и сама сложная. Поиск с файла "города", запись городов с этого же файла в массив, так же и суммы. Работа через массив. Когда то очень давно, лет так 6 назад. Я делал эту задачу при помощи функции Seek (var имя_файла;номер_компоненты:LongInt) - передвигает текущую позицию файла в заданную компоненту. Причем поиск "города" из файла и считывания суммы пренадлежащей заданному городу искались с помощью этой функции. А вот, как это сделать с головы вылетело, годы...  Ведь функция Seek не работает с текстовыми файлами.
И ещё, готовые результаты новых сумм записывались не заново, т.е. не командой Rewrite, а командой Append. Хотя функция Append используется только в текстовых файлах, а Seek нет. Что очень странно! Может процедуру надо написать.  Короче, кто знает как это сделать, прошу откликнуться. А вот использовался массив или нет не помню, но одно точно знаю в файле с городами, было около 10000 городов. Выдержал ли бы массив такого или нет?
                                                           ???
Я наверное уже достал всех своей проблемой, но больше ни кто не поможет!
Заранее благодарен,
Алексей.

Автор: AlaRic 14.10.2003 15:59

Посетителям: просьба листинг прог заключать в КОД - кнопка при ответе!

Автор: Elected 14.10.2003 16:43

Просьба выполнена, я все проги заключил в КОД!

Автор: Elected 14.10.2003 16:48

Мужики, я тут долга мучался над этой задачей и понял, что без массива здесь никак не обойтись. Вот с поиском по массиву у меня не лады.

Автор: Fire_Rage 15.10.2003 8:18

Код
PROGRAM FindTown;
var
input,f2:text;
s,Find:string;
i,g:integer;
begin
assign(input,'c:bpworkfile1.txt');
reset(input);
ReadLn(Find);
i:=0;
While ((not EOF(input))and(pos(Find,s)<>1)) do
  begin
  ReadLn(input,s);
  i:=i+1;
  if pos(Find,s)<>0 then {Если нужно не любое совпадение, а именно с начала, то кажется =1}
 WriteLn(s)
 end;
close(input)
assign(input,'c:bpworkfile2.txt');
assign(f,'c:bpworkfile3.txt);
rewrite(f)
reset (input);
writeln('Введите новую сумму');
readln(Find);
for g:=1 to i-1 do begin
                              readln(input,s)
                              writeln(f,s)
                            end;
readln(input,s);
writeln('Старое число    ',s);
writeln(f,Find);
while eof(input) do begin
                                 readln(input,s)
                                 writeln(f,s)
                               end;
close(f);
close(input);
assign(input,'c:/bp/work/file2.txt');
assign(f,'c:bp/work/file3.txt');
rewrite(input);
reset(f);
while eof(f) do begin
                          readln(f,s);
                          writeln(input,s);
                        end;
end.

Автор: Elected 15.10.2003 11:45

Огромное спасибо, Fire_Rage! Ты уже во второй раз выручаешь меня. Прогу ты забацал довольно оригинально. Мне, правда, пришлось её малость подкорректировать. В принципе в одном месте я просто-напросто добавил "Not" и ещё где-то чего-то, так по мелочи. А в остальном прога класс!

Код
While Not Eof(input) Do
Begin
Readln(input,s);
Writeln(f,s);
End;

Вот, что получилось:
Код
PROGRAM FindTown;
Uses Crt;
Label 1;
Var
     input,f:text;
     s,find:string;
     i,g:integer;
     ch:char;
Begin
1:      ClrScr;
     Assign(input,'file1.txt');
     Reset(input);
     Write('Введите название города  => ');
     Readln(find);
     i:=0;
     While ((Not Eof(input))And(Pos(find,s)<>1)) Do
           Begin
           ReadLn(input,s);
           i:=i+1;
           If Pos(find,s)<>0 Then
           Writeln(s);
           End;
     Close(input);
     Assign(input,'file2.txt');
     Assign(f,'file3.txt');
     Rewrite(f);
     Reset(input);
     Write('Введите новую сумму => ');
     Readln(find);
     For g:=1 To i-1 Do
           Begin
           Readln(input,s);
           Writeln(f,s);
           End;
     Readln(input,s);
     Writeln('Старая сумма  => ',s);
     Writeln(f,find);
     While Not Eof(input) Do
           Begin
           Readln(input,s);
           Writeln(f,s);
           End;
     Close(f);
     Close(input);
     Assign(input,'file2.txt');
     Assign(f,'file3.txt');
     Rewrite(input);
     Reset(f);
     While Not Eof(f) Do
           Begin
           Readln(f,s);
           Writeln(input,s);
           End;
     Close(f);
     Close(input);
     Write('Нажмите <Enter> - для продолжения или <Esc> - для выхода');
     Repeat
     ch:=ReadKey;If ch=Chr(13) Then Begin Goto 1; End;
     If ch=Chr(27) Then Until ch=Chr(27);
End.

Ещё раз, огромное спасибо!
P.S. Если у кого появиться сделать эту прогу по другому, буду только очень рад посмотреть ваши оригинальные идеи.
ВСЕМ ОСОБАЯ БЛАГОДАРНОСТЬ!

Автор: Fire_Rage 16.10.2003 7:24

Шлю ответное спасибо:
1) За то, что нашёл у меня ошибку(Извините, но я проги не проверяю не компе, могутбыть какие-нибудь ошибки). А то я совсем забыл, что выдаёт eof(f)
2)За то, что заключил прогу в код, а то я ну никак не могу понять, как это делается!

Автор: Gremlin 16.10.2003 11:52

Код просто заключается в тяги:
[code ][ /code]

Автор: Fire_Rage 18.10.2003 7:31

Понял.Спасибо