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

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

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

 
 Ответить  Открыть новую тему 
> Re: Задачка для ПАСКАЛЯНТОВ!
сообщение
Сообщение #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 -


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


Новичок
*

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

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


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

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

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


Новичок
*

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

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


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


Новичок
*

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

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


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

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


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


Новичок
*

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

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


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


...
*****

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

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


Проге место в исходниках сайта  ;D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


...
*****

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

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


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


Новичок
*

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

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


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


Новичок
*

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

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


Мужики, я тут долга мучался над этой задачей и понял, что без массива здесь никак не обойтись. Вот с поиском по массиву у меня не лады.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Новичок
*

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

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


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


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


Гость






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


Новичок
*

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

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


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


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

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

 





- Текстовая версия 28.09.2020 0:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name