![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
trminator |
![]()
Сообщение
#1
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Примерно так
Код 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. Сообщение отредактировано: volvo - 17.12.2004 14:26 -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
![]() ![]() |
Elected |
![]()
Сообщение
#2
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Привет Паскалянтам!
Помогите сделать прогу на паскале. Дан текстовый файл с городами в таком виде: МОСКВА ВОРОНЕЖ БЕЛГОРОД САНКТ-ПЕТЕРБУРГ САМАРА ИЖЕВСК АРХАНГЕЛЬСК Необходимо создать программу, которая бы выводила на экран именно тот город, который вы внесете с клавиатуры, но поиск города из текстового файла должен осуществляться по одной, двум, трем и т.д. буквам названия города, т.е.: На экране появляется строка "ВВЕДИТЕ НАЗВАНИЕ ГОРОДА =>", Вы хотите найти город МОСКВА, набираете "М" и на экране должна высветится "МОСКВА" или любой первый город на букву "М" в текстовом файле, т.е. если набрать "СА", то сначала высветится "САНКТ-ПЕТЕРБУРГ", а если набрать уже "САМ", то "САМАРА". С уважением, Алексей. |
Elected |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Спасибо за прогу 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 |
![]()
Сообщение
#4
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Я решил поставленную задачу, не прошло как говориться и
пол года. Но всё же спасибо тебе 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 |
![]()
Сообщение
#5
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Как сделать вышеуказанную задачу на паскале при помощи массива?
|
Nightmare |
![]()
Сообщение
#6
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 48 Пол: Мужской Репутация: ![]() ![]() ![]() |
Если заранее известно количество строк в списке, то его можно засунуть не в файл, а в массив. В противном случае нужно использовать либо связанный список динамически распределённых строк, либо какую-либо реализацию динамического массива.
Но в любом случае - не забывайте, что общий размер описанных переменных не может превышать 64К (т.е. порядка 250 экземпляров типа String). |
Fire_Rage |
![]()
Сообщение
#7
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 26 Репутация: ![]() ![]() ![]() |
Немножко подправим 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. Сообщение отредактировано: volvo - 17.12.2004 14:27 -------------------- QUI NON PROFICIT, DEFICIT(Кто не идёт вперёд, идёт назад)
|
Elected |
![]()
Сообщение
#8
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Спасибо Fire_Rage! Программа действительно выполняет поставленную задачу!
|
AlaRic |
![]()
Сообщение
#9
|
... ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: ![]() ![]() ![]() |
Проге место в исходниках сайта ;D
|
Elected |
![]()
Сообщение
#10
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Привет, Паскалянтам!
Более сложная задача. Даны два текстовых файла. В одном записаны города, а в другом денежные суммы этих городов. Например: 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 |
![]()
Сообщение
#11
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Код 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 |
![]()
Сообщение
#12
|
... ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: ![]() ![]() ![]() |
Посетителям: просьба листинг прог заключать в КОД - кнопка при ответе!
|
Elected |
![]()
Сообщение
#13
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Просьба выполнена, я все проги заключил в КОД!
|
Elected |
![]()
Сообщение
#14
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Мужики, я тут долга мучался над этой задачей и понял, что без массива здесь никак не обойтись. Вот с поиском по массиву у меня не лады.
|
Fire_Rage |
![]()
Сообщение
#15
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 26 Репутация: ![]() ![]() ![]() |
Код 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. -------------------- QUI NON PROFICIT, DEFICIT(Кто не идёт вперёд, идёт назад)
|
Elected |
![]()
Сообщение
#16
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Репутация: ![]() ![]() ![]() |
Огромное спасибо, 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 |
![]()
Сообщение
#17
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 26 Репутация: ![]() ![]() ![]() |
Шлю ответное спасибо:
1) За то, что нашёл у меня ошибку(Извините, но я проги не проверяю не компе, могутбыть какие-нибудь ошибки). А то я совсем забыл, что выдаёт eof(f) 2)За то, что заключил прогу в код, а то я ну никак не могу понять, как это делается! -------------------- QUI NON PROFICIT, DEFICIT(Кто не идёт вперёд, идёт назад)
|
Gremlin |
![]()
Сообщение
#18
|
Гость ![]() |
Код просто заключается в тяги:
[code ][ /code] |
Fire_Rage |
![]()
Сообщение
#19
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 26 Репутация: ![]() ![]() ![]() |
Понял.Спасибо
-------------------- QUI NON PROFICIT, DEFICIT(Кто не идёт вперёд, идёт назад)
|
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 22:55 |