Суббота, 22.11.2025
Pascal 4 All
[ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

 

  • Страница 1 из 1
  • 1
Модератор форума: Seqular, Pavel  

Подумаем?
TexnarДата: Воскресенье, 18.11.2007, 21:54 | Сообщение # 1
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 1
Замечания: 0%
Статус: Offline
Привет! Тут попалась интересная задачка на файлы. Нужна небольшая помощь. Суть задачки в том что имеется два файла. Один с тестом любым. В нем слова могут быть разделены любыми знаками препинания. И есть второй файл в котором есть слова отделенные запятыми. Эти слова образуют пары. 1-ое слово заменяемое, а 2-ое заменяющее. Надо найти в 1-ом файле все заменяемые слова и заменить на заменяющие. Есть некие условия. В 1-ом файле длина строки не более 200 символов и длина слов не более 30 символов. Во 2-ом файле не более 40 слов(всего). Результат занести в третий файл. Я подумываю решать данную задачу через массивы. Т.е. забить весь файл в одномерный массив и тогда работать со сторчками. Просто с файлами не очень люблю работать. Подскажете что еще можно сделать?

Сообщение отредактировал Texnar - Воскресенье, 18.11.2007, 21:58
 
PavelДата: Воскресенье, 18.11.2007, 23:12 | Сообщение # 2
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Т.е. содержимое второго файла:
петя, петр
вася, василий

А первого: Петя пошел Вася тоже.

Результат: петр пошел василий тоже.

Я правильно тебя понял, Texnar?

 
PavelДата: Воскресенье, 18.11.2007, 23:15 | Сообщение # 3
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
И еще. Раз дан файл, то и работать надо именно с этой структурой. А если файл будет большой? Все в массив не вобьешь. Напиши пожалуйста попонятнее условия. А именно пример входных файлов и что должно получиться. А так работа с файлами практически ничем не отличается с работой со строками. Т.к. файлы у тебя текстовые.
 
TexnarДата: Понедельник, 19.11.2007, 00:41 | Сообщение # 4
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 1
Замечания: 0%
Статус: Offline
Вот полное условие:
Дан текстовый файл f1. Длина строки не более 200 символов. Слова в строках отделны друг от друга одним или несолькими пробелами и знаками препинания(любыми). Длина слова не более 30 символов. Файл f2 содержит не более 40 слов, которые разделыны запятыми. Эти слова образуют пары: каждое первое слово считается заменяемым, каждое второе заменяющим. Найти в файле f1 все заменяемые слова и заменить их на соответствующее заменяющие. Результат поместить в файл g.(считать что все данные вводяться коректно).

Пример текста до:
f1 - Ваня вел машину, а по тротуару идет Петя
f2 - Ваня,Саша,Петя,Оля

Файл после выполнения программы:
g - Саша вел машину, а по тротуару идет Оля

Да я подумал и забыл что массив не может быть бесконечным.

 
SeqularДата: Вторник, 20.11.2007, 07:01 | Сообщение # 5
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Texnar, Так намного понятнее. В ближайшее время что-нибудь придумаем!

Поддерживаю также проект сообщество молодых сисадминов
 
TexnarДата: Среда, 21.11.2007, 05:02 | Сообщение # 6
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 1
Замечания: 0%
Статус: Offline
Буду надеется.)))
 
SeqularДата: Суббота, 24.11.2007, 18:14 | Сообщение # 7
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Texnar, Вот, вроде то, что надо?
Code
Program Zamena;
Uses CRT;
Const file1 = 'f1.txt';
       file2 = 'f2.txt';
       file3 = 'g.txt';
       MaxWr = 40;
Var f1, f2: Text;
     g: Text;
     a,b: Array[1..MaxWr] of String;
     s: String;
     i, j: Byte;

{Создаем массив замены}
Procedure CreateArrays;
Begin
i := 0;
Assign(f1, file2);
ReSet(f1);
Readln(f1,s);
Repeat
Inc(i);
a[i] := Copy(s,1,Pos(',',s) - 1);
Delete(s,1,Pos(',',s));
b[i] := Copy(s,1,Pos(',',s) - 1);
Delete(s,1,Pos(',',s));
Until (Pos(',',s) = 0);
b[i] := s;
End;

Begin
CreateArrays;
ClrScr;
Assign(f1, file1);
ReSet(f1);
Assign(g, file3);
ReWrite(g);
While Not Eof(f1) do
       Begin
       Readln(f1,s); {Считали строку}
       For j := 1 to i do
           Begin
           If (Pos(a[j],s) > 0) then
              Begin
              Insert(b[j],s,Pos(a[j],s));
              Delete(s,Pos(a[j],s),Length(a[j]));
              End;
           End;
       Writeln(g,s);
       End;
Close(f1);
Close(g);
End.
Прикрепления: f1.txt (0.1 Kb) · f2.txt (0.1 Kb) · ZAMENA.pas (1.0 Kb)


Поддерживаю также проект сообщество молодых сисадминов
 
SeqularДата: Суббота, 24.11.2007, 18:16 | Сообщение # 8
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
В файлах ДОС-кодировка. С программой работают нормально. Для просмотра содержимого поменяйте шрифт на "Terminal" в блокноте.

Поддерживаю также проект сообщество молодых сисадминов
 
TexnarДата: Воскресенье, 25.11.2007, 21:18 | Сообщение # 9
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 1
Замечания: 0%
Статус: Offline
Спасибо большое))) Остальное если что сам додумаю.

Кстати могу выкладывать потихоньку свои проги которые делаю по заданиям. Нужно???

Сообщение отредактировал Texnar - Воскресенье, 25.11.2007, 21:41
 
PavelДата: Понедельник, 26.11.2007, 09:37 | Сообщение # 10
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Не помешало бы. Создай тему. Скидывай туда, а мы поюзаем и решим об их размещении в раздел задачник. cool
 
TexnarДата: Суббота, 05.01.2008, 04:13 | Сообщение # 11
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 1
Замечания: 0%
Статус: Offline
И снова всем привет. Задачи свои потом выложу. Главное сейчас сессия.
Но возникла одна маленькая проблема с задачей. Сразу говорю она немного уже исправлена.
В задаче теперь надо сделать так, что бы исходная строка была не ограничена.
Пример:
f1 a b a b a b a b a b a b a b ...... и так далее до 200 символов
f2 a,a1111111111111111,b,111111111111111111
Понятное дело что даже в строку 255 символов не поместиться. Довольно много вариантов перепробовал не получается помогите плиз.
Вот код программы:

Добавлено (04.01.2008, 21:12)
---------------------------------------------

Code
Program Zhivykh_22;
Const MaxWr = 20;
       znaks=':;.,!?-" ';
Type
       str2 = string[255];
       simvol=string[1];
       slovo=string[30];
       mas = Array[1..MaxWr] of slovo;
       str = string[200];

Procedure ReadNameofFile(var f1,f2,g:text);
var nazv1,nazv2,nazv3:str;
Begin
      Writeln('‚ўҐ¤ЁвҐ Ё¬п д ©«  б ⥪б⮬: ');
      readln(nazv1);
      Writeln('‚ўҐ¤ЁвҐ Ё¬п д ©«®ў б® б«®ў ¬Ё: ');
      Readln(nazv2);
      Writeln('‚ўҐ¤ЁвҐ Ё¬п д ©«  Єг¤  Ўг¤Ґв § ЇЁб ­ १г«мв в: ');
      readln(nazv3);
      Assign(f1,nazv1);
      Assign(f2,nazv2);
      Assign(g,nazv3);
      {$I-}
      Reset(f1);
      Reset(f2);
      {$I+}
end;

procedure schitat_slovo(var f2:text; var sl:slovo);
var
  sim:simvol;
begin
  sl:='';
  repeat
   read(f2,sim); {„® вҐе Ї®а Ї®Є  ­Ґ ¤®©¤Ґ¬ ¤® § Їпв®©}
   sl:=sl+sim;               {бзЁв вм бЁ¬ў®« Ё ¤®Ў ўЁвм Є б«®ўг}
  until (sim=',') or eoln(f2);
  if not(eoln(f2)) then {Ґб«Ё нв® Ўл«® ­Ґ Ї®б«Ґ¤­ҐҐ б«®ў®}
   delete(sl,length(sl),1);   {г¤ «Ёвм § Їпвго Ё§ Є®­ж  нв®Ј® б«®ў }
end;

Procedure CreateArrays(var f2:text; var zamenyemie,zamenyushie:mas; var kolvo:integer);
var
  mode:byte;
  sl:slovo;
Begin
  mode:=1;
  kolvo:=0;
  while not(eoln(f2)) do   {Ї®Є  ­Ґ ¤®©¤Ґ¬ ¤® Є®­ж  бва®ЄЁ}
  begin
   schitat_slovo(f2,sl);{бзЁв вм б«®ў®}
   if mode=1 then {Ґб«Ё нв® § ¬Ґ­пҐ¬®Ґ б«®ў®}
   begin
    inc(kolvo);
    zamenyemie[kolvo]:=sl;{¤®Ў ўЁвм ҐЈ® ў ¬ ббЁў § ¬Ґ­пҐ¬ле б«®ў}
    mode:=2; {б«Ґ¤го饥 б«®ў® § ¬Ґ­по饥}
   end
   else              {Ё­ зҐ § ¬Ґ­по饥 б«®ў®}
   begin
    zamenyushie[kolvo]:=sl; {¤®Ў ўЁвм ў ¬ ббЁў § ¬Ґ­пойЁе б«®ў}
    mode:=1;  {б«Ґ¤го饥 б«®ў® Ўг¤Ґв § ¬Ґ­пҐ¬®Ґ}
   end;
  end;
End;

function posznak(s:str; start:integer):integer;
{?饬 Ї®§ЁжЁо ЇҐаў®Ј® §­ Є  ­ зЁ­ п б § ¤ ­®© Ї®§ЁжЁЁ}
var
  i:integer;
begin
  i:=start;
  while (pos(copy(s,i,1),znaks)=0) and (i<=length(s)) do {Ї®Є  ­Ґ ¤®бвЁЈ­гв Є®­Ґж бва®ЄЁ
                Ё ­Ґ ­ ©¤Ґ­ §­ Є}
   i:=i+1;{ᬮваҐвм б«Ґ¤гойЁ© бЁ¬ў®«}
  posznak:=i;{ў®§ўа вЁвм Ї®§ЁжЁо}
end;

function proverka_na_ne_odni_znaki(s:str):boolean;
{Їа®ўҐаЄ  ­  в® зв® ў бва®ЄҐ ­Ґ ®¤­Ё §­ ЄЁ}
var
   i:integer;
begin
  proverka_na_ne_odni_znaki:=false;
  for i:=1 to length(s) do {ЇҐаҐЎҐаҐ¬ ўбҐ бЁ¬ў®«л}
   if pos(copy(s,i,1),znaks)=0 then {Ґб«Ё бЁ¬ў®« ­Ґ ­ ©¤Ґ­ б।Ё §­ Є®ў}
    proverka_na_ne_odni_znaki:=true; {ўҐа­гвм Їа ў¤г}
end;

1-ая часть

Добавлено (04.01.2008, 21:13)
---------------------------------------------

Code
function zamenaslov(var s1:str; word1,word2:slovo):str2;
var
  prom:str2;
  stroka:string[202];
  prom2:integer;
begin
  stroka:=' '+s1+' ';
  prom:='';
  while (length(stroka)>0) and proverka_na_ne_odni_znaki(stroka) and (pos(word1,stroka)>0) do
   {Ї®Є  бва®Є  ­Ґ Їгбв  Ё ў ­Ґ© ᮤҐа¦ вбп б«®ў  Ё ᮤҐа¦Ёвбп ЁбЄ®¬ п Є®¬ЎЁ­ жЁп(word1)}
  begin
   prom2:=pos(word1,stroka);{­ е®¤Ё¬ Ї®§ЁжЁо ­ з «  б®ўЇ ¤Ґ­Ёп}
   if pos(copy(stroka,prom2-1,1),znaks)>0 then{ЇаҐ¤л¤гйЁ© бЁ¬ў® §­ Є(Є®¬ЎЁ­ жЁп бв®Ёв ў ­ з «Ґ)}
   begin
    if pos(copy(stroka,prom2+length(word1),1),znaks)>0 then { Ґб«Ё Ї®б«Ґ Є®¬ЎЁ­ жЁЁ бв®Ёв ⮦Ґ §­ Є(
      б«®ў® бв®Ёв ў Є®­жҐ)}
    begin
     {Є®¬ЎЁ­ жЁп ®в¤Ґ«Ґ­  §­ Є ¬Ё бЇа ў  Ё б«Ґў }
     delete(stroka,prom2,length(word1));{г¤ «пҐ¬ б«®ў®}
     insert(word2,stroka,prom2);{§ ¬Ґ­пҐ¬ ­  ­г¦­®Ґ}
     prom:=prom+copy(stroka,1,posznak(stroka,prom2)-1);{¤®Ў ў«пҐ¬ ў ­®ўго бва®зЄг}
                    {ўбҐ ®в ­ з «  ¤® Є®­ж  б«®ў  }
     delete(stroka,1,posznak(stroka,prom2)-1);{ г¤ «пҐ¬ бЄ®ЇЁа®ў ­­го з бвм}
    end
    else
    begin
     {Ї®б«Ґ Є®¬ЎЁ­ жЁЁ бв®Ёв ­Ґ §­ Є   бЁ¬ў®«}
     prom:=prom+copy(stroka,1,posznak(stroka,prom2)-1);
     delete(stroka,1,posznak(stroka,prom2)-1);
    end;
   end
   else
   begin
    {ЇҐаҐ¤ Є®¬ЎЁ­ жЁҐ© бв®Ёв бЁ¬ў®«}
    prom:=prom+copy(stroka,1,posznak(stroka,prom2)-1);
     delete(stroka,1,posznak(stroka,prom2)-1);
   end;
  end;
  prom:=prom+stroka;{¤®Ў ў«пҐ¬ ®бв в®Є}
  zamenaslov:=prom;
end;

procedure zamenaslov_f(var f,g:text; const zamenyemie,zamenyushie:mas; kolvo:integer);
var
  s:str;
  s2:str2;
  i:integer;
begin
  while not(eof(f)) do {ЇҐаҐЎЁа Ґ¬ бва®ЄЁ ў д ©«Ґ}
   begin
    readln(f,s);
     for i:=1 to kolvo do
      begin
       s2:=zamenaslov(s,zamenyemie[i],zamenyushie[i]);{ЁйҐ¬ ў бва®ЄҐ д ©«  f1 § ¬Ґ­пҐ¬лҐ б«®ў  Ё § ¬Ґ­пҐ¬ ­  § ¬Ґ­по饥 б«®ў®}
      end;
     writeln(g,s2);         {Ё § ЇЁб вм ў ­®ўл© д ©«}
   end;
end;

Var f1, f2: Text;
     g: Text;
     zamenyemie,zamenyushie: mas;
     kolvo:integer;

Begin
ReadNameofFile(f1,f2,g);                             {Ї®«гз Ґ¬ Ё¬Ґ­  д ©«®ў Ё Ї®Їлв Ґ¬бп ®вЄалвм д ©« ¤ ­­ле}
if IOResult<>0 then                    {…б«Ё ­Ґг¤ з­® в®}
     begin
       writeln('ЋиЁЎЄ  ў Ё¬Ґ­Ё д ©« (®ў)');           {ўлў®¤Ё¬ б®®ЎйҐ­ЁҐ}
       readln;
     end
else                    {Ё­ зҐ}
    begin
     rewrite(g);                    {®вЄалў Ґ¬ ўл室­®© д ©« ­  ЇҐаҐЇЁбм}
     CreateArrays(f2,zamenyemie,zamenyushie,kolvo);   {§ Ї®«­пҐ¬ ¬ ббЁў б § ¬Ґ­пҐ¬л¬Ё Ё § ¬Ґ­пойЁ¬Ё}
                    {б«®ў ¬Ё,   в Є¦Ґ ЇҐаҐбзЁв вм Ёе}
     ZamenaSlov_f(f1,g,zamenyemie,zamenyushie,kolvo); {§ ¬Ґ­пҐ¬ б«®ў  § ¬Ґ­пҐ¬лҐ ­  § ¬Ґ­пойЁҐ Ё б®е࠭塞 ў ­®ў®¬ д ©«Ґ}
     Close(f1);
     close(f2);                    {б®е࠭塞 ¤ ­­лҐ}
     Close(g);
    End;
End.

2-ая часть.
З.Ы. keyrus у меня не установлен, так что иероглифы место алгоритма и коментариев.

Сообщение отредактировал Texnar - Суббота, 05.01.2008, 04:14
 
SeqularДата: Суббота, 05.01.2008, 10:36 | Сообщение # 12
Хранитель
Группа: Администраторы
Сообщений: 859
Репутация: 35
Статус: Offline
Texnar, Как обойтись без кейруса - читай в FAQ на сайте, там писали, как русифицировать.. А исходники сохраняй в кодировке DOS (cp866). Над задачей подумаем, но лучше ее в новую тему вынеси!

Поддерживаю также проект сообщество молодых сисадминов
 
TexnarДата: Суббота, 05.01.2008, 21:54 | Сообщение # 13
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 1
Замечания: 0%
Статус: Offline
Code
Program Zhivykh_22;
Const MaxWr = 20;
       znaks=':;.,!?-" ';
Type
       str2 = string[255];
       simvol=string[1];
       slovo=string[30];
       mas = Array[1..MaxWr] of slovo;
       str = string[200];

Procedure ReadNameofFile(var f1,f2,g:text);
var nazv1,nazv2,nazv3:str;
Begin
      Writeln('Введите имя файла с текстом: ');
      readln(nazv1);
      Writeln('Введите имя файлов со словами: ');
      Readln(nazv2);
      Writeln('Введите имя файла куда будет записан результат: ');
      readln(nazv3);
      Assign(f1,nazv1);
      Assign(f2,nazv2);
      Assign(g,nazv3);
      {$I-}
      Reset(f1);
      Reset(f2);
      {$I+}
end;

procedure schitat_slovo(var f2:text; var sl:slovo);
var
  sim:simvol;
begin
  sl:='';
  repeat
   read(f2,sim); {До тех пор пока не дойдем до запятой}
   sl:=sl+sim;               {считать символ и добавить к слову}
  until (sim=',') or eoln(f2);
  if not(eoln(f2)) then {если это было не последнее слово}
   delete(sl,length(sl),1);   {удалить запятую из конца этого слова}
end;

Procedure CreateArrays(var f2:text; var zamenyemie,zamenyushie:mas; var kolvo:integer);
var
  mode:byte;
  sl:slovo;
Begin
  mode:=1;
  kolvo:=0;
  while not(eoln(f2)) do   {пока не дойдем до конца строки}
  begin
   schitat_slovo(f2,sl);{считать слово}
   if mode=1 then {если это заменяемое слово}
   begin
    inc(kolvo);
    zamenyemie[kolvo]:=sl;{добавить его в массив заменяемых слов}
    mode:=2; {следующее слово заменяющее}
   end
   else              {иначе заменяющее слово}
   begin
    zamenyushie[kolvo]:=sl; {добавить в массив заменяющих слов}
    mode:=1;  {следующее слово будет заменяемое}
   end;
  end;
End;

function posznak(s:str; start:integer):integer;
{Ищем позицию первого знака начиная с заданой позиции}
var
  i:integer;
begin
  i:=start;
  while (pos(copy(s,i,1),znaks)=0) and (i<=length(s)) do {пока не достигнут конец строки
                и не найден знак}
   i:=i+1;{смотреть следующий символ}
  posznak:=i;{возвратить позицию}
end;

function proverka_na_ne_odni_znaki(s:str):boolean;
{проверка на то что в строке не одни знаки}
var
   i:integer;
begin
  proverka_na_ne_odni_znaki:=false;
  for i:=1 to length(s) do {переберем все символы}
   if pos(copy(s,i,1),znaks)=0 then {если символ не найден среди знаков}
    proverka_na_ne_odni_znaki:=true; {вернуть правду}
end;

1-ая часть

Добавлено (05.01.2008, 14:54)
---------------------------------------------

Code
function zamenaslov(var s1:str; word1,word2:slovo):str2;
var
  prom:str2;
  stroka:string[202];
  prom2:integer;
begin
  stroka:=' '+s1+' ';
  prom:='';
  while (length(stroka)>0) and proverka_na_ne_odni_znaki(stroka) and (pos(word1,stroka)>0) do
   {пока строка не пуста и в ней содержатся слова и содержится искомая комбинация(word1)}
  begin
   prom2:=pos(word1,stroka);{находим позицию начала совпадения}
   if pos(copy(stroka,prom2-1,1),znaks)>0 then{предыдущий симво знак(комбинация стоит в начале)}
   begin
    if pos(copy(stroka,prom2+length(word1),1),znaks)>0 then { если после комбинации стоит тоже знак(
      слово стоит в конце)}
    begin
     {комбинация отделена знаками справа и слева}
     delete(stroka,prom2,length(word1));{удаляем слово}
     insert(word2,stroka,prom2);{заменяем на нужное}
     prom:=prom+copy(stroka,1,posznak(stroka,prom2)-1);{добавляем в новую строчку}
                    {все от начала до конца слова }
     delete(stroka,1,posznak(stroka,prom2)-1);{ удаляем скопированную часть}
    end
    else
    begin
     {после комбинации стоит не знак а символ}
     prom:=prom+copy(stroka,1,posznak(stroka,prom2)-1);
     delete(stroka,1,posznak(stroka,prom2)-1);
    end;
   end
   else
   begin
    {перед комбинацией стоит символ}
    prom:=prom+copy(stroka,1,posznak(stroka,prom2)-1);
     delete(stroka,1,posznak(stroka,prom2)-1);
   end;
  end;
  prom:=prom+stroka;{добавляем остаток}
  zamenaslov:=prom;
end;

procedure zamenaslov_f(var f,g:text; const zamenyemie,zamenyushie:mas; kolvo:integer);
var
  s:str;
  s2:str2;
  i:integer;
begin
  while not(eof(f)) do {перебираем строки в файле}
   begin
    readln(f,s);
     for i:=1 to kolvo do
      begin
       s2:=zamenaslov(s,zamenyemie[i],zamenyushie[i]);{ищем в строке файла f1 заменяемые слова и заменяем на заменяющее слово}
      end;
     writeln(g,s2);         {и записать в новый файл}
   end;
end;

Var f1, f2: Text;
     g: Text;
     zamenyemie,zamenyushie: mas;
     kolvo:integer;

Begin
ReadNameofFile(f1,f2,g);                             {получаем имена файлов и попытаемся открыть файл данных}
if IOResult<>0 then                    {Если неудачно то}
     begin
       writeln('Ошибка в имени файла(ов)');           {выводим сообщение}
       readln;
     end
else                    {иначе}
    begin
     rewrite(g);                    {открываем выходной файл на перепись}
     CreateArrays(f2,zamenyemie,zamenyushie,kolvo);   {заполняем массив с заменяемыми и заменяющими}
                    {словами, а также пересчитать их}
     ZamenaSlov_f(f1,g,zamenyemie,zamenyushie,kolvo); {заменяем слова заменяемые на заменяющие и сохраняем в новом файле}
     Close(f1);
     close(f2);                    {сохраняем данные}
     Close(g);
    End;
End.

2-ая часть.

Кодировку нужную я у себя не нашел(
Щас еще в новой теме пост сделаю!

Сообщение отредактировал Texnar - Суббота, 05.01.2008, 21:55
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2025
Используются технологии uCoz
javascript:;" rel="nofollow" onclick="loginPopupForm(); return false;