Версия для печати темы
Форум «Всё о Паскале» _ Задачи _ 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
Понял.Спасибо