Привет! Тут попалась интересная задачка на файлы. Нужна небольшая помощь. Суть задачки в том что имеется два файла. Один с тестом любым. В нем слова могут быть разделены любыми знаками препинания. И есть второй файл в котором есть слова отделенные запятыми. Эти слова образуют пары. 1-ое слово заменяемое, а 2-ое заменяющее. Надо найти в 1-ом файле все заменяемые слова и заменить на заменяющие. Есть некие условия. В 1-ом файле длина строки не более 200 символов и длина слов не более 30 символов. Во 2-ом файле не более 40 слов(всего). Результат занести в третий файл. Я подумываю решать данную задачу через массивы. Т.е. забить весь файл в одномерный массив и тогда работать со сторчками. Просто с файлами не очень люблю работать. Подскажете что еще можно сделать?
Сообщение отредактировал Texnar - Воскресенье, 18.11.2007, 21:58
И еще. Раз дан файл, то и работать надо именно с этой структурой. А если файл будет большой? Все в массив не вобьешь. Напиши пожалуйста попонятнее условия. А именно пример входных файлов и что должно получиться. А так работа с файлами практически ничем не отличается с работой со строками. Т.к. файлы у тебя текстовые.
Вот полное условие: Дан текстовый файл f1. Длина строки не более 200 символов. Слова в строках отделны друг от друга одним или несолькими пробелами и знаками препинания(любыми). Длина слова не более 30 символов. Файл f2 содержит не более 40 слов, которые разделыны запятыми. Эти слова образуют пары: каждое первое слово считается заменяемым, каждое второе заменяющим. Найти в файле f1 все заменяемые слова и заменить их на соответствующее заменяющие. Результат поместить в файл g.(считать что все данные вводяться коректно).
Пример текста до: f1 - Ваня вел машину, а по тротуару идет Петя f2 - Ваня,Саша,Петя,Оля
Файл после выполнения программы: g - Саша вел машину, а по тротуару идет Оля
Да я подумал и забыл что массив не может быть бесконечным.
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.
В файлах ДОС-кодировка. С программой работают нормально. Для просмотра содержимого поменяйте шрифт на "Terminal" в блокноте. Поддерживаю также проект сообщество молодых сисадминов
И снова всем привет. Задачи свои потом выложу. Главное сейчас сессия. Но возникла одна маленькая проблема с задачей. Сразу говорю она немного уже исправлена. В задаче теперь надо сделать так, что бы исходная строка была не ограничена. Пример: f1 a b a b a b a b a b a b a b ...... и так далее до 200 символов f2 a,a1111111111111111,b,111111111111111111 Понятное дело что даже в строку 255 символов не поместиться. Довольно много вариантов перепробовал не получается помогите плиз. Вот код программы:
Texnar, Как обойтись без кейруса - читай в FAQ на сайте, там писали, как русифицировать.. А исходники сохраняй в кодировке DOS (cp866). Над задачей подумаем, но лучше ее в новую тему вынеси! Поддерживаю также проект сообщество молодых сисадминов
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;
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