IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Re: Задачка для ПАСКАЛЯНТОВ!
trminator
сообщение 25.11.2002 18:41
Сообщение #1


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Примерно так
Код
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


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 18)
Elected
сообщение 9.10.2003 6:21
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


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

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

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


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Спасибо за прогу 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, а не все города.

Заранее благодарен,
Алексей.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 9.10.2003 8:35
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Я решил поставленную задачу, не прошло как говориться и
пол года. Но всё же спасибо тебе 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 10.10.2003 8:09
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Как сделать вышеуказанную задачу на паскале при помощи массива?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Nightmare
сообщение 10.10.2003 14:13
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 48
Пол: Мужской

Репутация: -  1  +


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

Но в любом случае - не забывайте, что общий размер описанных переменных не может превышать 64К (т.е. порядка 250 экземпляров типа String).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Fire_Rage
сообщение 11.10.2003 3:33
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 26

Репутация: -  0  +


Немножко подправим 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(Кто не идёт вперёд, идёт назад)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 13.10.2003 5:28
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Спасибо Fire_Rage! Программа действительно выполняет поставленную задачу!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 13.10.2003 9:23
Сообщение #9


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Проге место в исходниках сайта  ;D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 13.10.2003 11:19
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Привет, Паскалянтам!
Более сложная задача. Даны два текстовых файла. В одном записаны города, а в другом денежные суммы этих городов. Например:
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.

Можно сделать такую прогу без применения массива?
Заранее благодарен,
Алексей.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 14.10.2003 7:50
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Код

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 городов. Выдержал ли бы массив такого или нет?
                                                           ???
Я наверное уже достал всех своей проблемой, но больше ни кто не поможет!
Заранее благодарен,
Алексей.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
AlaRic
сообщение 14.10.2003 11:59
Сообщение #12


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Посетителям: просьба листинг прог заключать в КОД - кнопка при ответе!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 14.10.2003 12:43
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Просьба выполнена, я все проги заключил в КОД!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 14.10.2003 12:48
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Мужики, я тут долга мучался над этой задачей и понял, что без массива здесь никак не обойтись. Вот с поиском по массиву у меня не лады.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Fire_Rage
сообщение 15.10.2003 4:18
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 26

Репутация: -  0  +


Код
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(Кто не идёт вперёд, идёт назад)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Elected
сообщение 15.10.2003 7:45
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Огромное спасибо, 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. Если у кого появиться сделать эту прогу по другому, буду только очень рад посмотреть ваши оригинальные идеи.
ВСЕМ ОСОБАЯ БЛАГОДАРНОСТЬ!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Fire_Rage
сообщение 16.10.2003 3:24
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 26

Репутация: -  0  +


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


--------------------
QUI NON PROFICIT, DEFICIT(Кто не идёт вперёд, идёт назад)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Gremlin
сообщение 16.10.2003 7:52
Сообщение #18


Гость






Код просто заключается в тяги:
[code ][ /code]
 К началу страницы 
+ Ответить 
Fire_Rage
сообщение 18.10.2003 3:31
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 26

Репутация: -  0  +


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


--------------------
QUI NON PROFICIT, DEFICIT(Кто не идёт вперёд, идёт назад)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 22:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"