Удалить из файла символы между первой гласной и последней согласной буквой - PascalABC.NET
Формулировка задачи:
Значит есть файл типа Char, нужно записать туда любые символы, кроме 0 (0 терминал). Нахожу в нем первую глас. и последнюю согл., нахожу их позиции и после этого нужно удалить всё, что находится между ними и записать оставшиеся символы в файл. Собственно с этим у меня и проблема, не знаю как удалить из этого файла всё, что находится между ними, сказали, что это можно сделать просто путем перемещения символов с последнего согласного и далее к началу первой согласной, а потом удалить оставшийся хвост через Truncate, но может можно и по-другому. Не используя дополнительных файлов, а буквы искать только английские. Вот код:
П.С задавал уже подобный вопрос, но там был текстовый файл, а тут типизированный файл, там решение кардинально другое.
Листинг программы
- Uses crt; const
- glas=['e','y','u','i','o','a'];
- sogl=['q','w','r','t','p','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'];
- var
- s,v,m:char;
- i,p,x,q,gl,so:integer;
- t:file of char;
- begin
- assign(t, '123.dat');
- rewrite(t);
- writeln('Введите символы: ');
- repeat
- readln(s);
- if s<>char(48) then write(t,s);
- until s=char(48);
- writeln;
- close(t);
- reset(t);
- x:=0;
- while not eof(t) do begin
- x:=x+1;
- read(t,s);
- if s in glas then begin
- if q<>1 then begin
- gl:=x;
- q:=1;
- v:=s;
- end;
- end;
- if s in sogl then begin
- so:=x;
- p:=1;
- m:=s;
- end;
- end;
- if q=0 then begin
- writeln('Не найдена гласная!');
- end else begin
- writeln('Первая гласная = ', v, ', eе индекс = ', gl);
- end;
- if p=0 then begin
- writeln('Не найдена согласная!');
- end else begin
- writeln('Последняя согласная = ', m, ', eе индекс = ', so);
- end;
- close(t);
- if (q<>0) and (p<>0) then begin
- end;
- reset(t);
- {if (p<>1) or (q<>1) then close(t) Тут нужно удалить середину путем замены
- else begin}
- reset(t);
- for i:=1 to filesize(t) do
- begin
- read(t,s); // А тут уже нужно вывести этот файл с удаленной серединкой
- write(s);
- end;
- reset(t);
- readln;
- end.
Решение задачи: «Удалить из файла символы между первой гласной и последней согласной буквой»
textual
Листинг программы
- const
- glas=['e','y','u','i','o','a'];
- sogl=['q','w','r','t','p','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'];
- var s,v,m:char;
- i,j,g1,sp,k:integer;
- t:file of char;
- begin
- assign(t, '123.dat');
- rewrite(t);
- writeln('Введите символы: ');
- repeat
- readln(s);
- if s<>'0' then write(t,s);
- until s='0';
- writeln('Содержание исходного файла');
- reset(t);
- g1:=-1;//индекс первой гласной
- sp:=-1;//индекс последней согласной
- for i:=0 to filesize(t)-1 do
- begin
- read(t,s);
- if (s in glas)and(g1=-1) then
- begin
- v:=s;
- g1:=i;
- end
- else if s in sogl then
- begin
- m:=s;
- sp:=i;
- end;
- write(s:2);
- end;
- writeln;
- if g1=-1 then writeln('Не найдена гласная!')
- else writeln('Первая гласная = ', v, ', eе индекс = ', g1);
- if sp=-1 then writeln('Не найдена согласная!')
- else writeln('Последняя согласная = ', m, ', eе индекс = ', sp);
- if (g1<>-1)and(sp<>-1)then
- begin
- k:=abs(sp-g1)-1;//количество элементов удалить
- if k=0 then write('Между найденными элементами нет других элементов')
- end;
- if (g1=-1)or(sp=-1)or(k=0) then
- begin
- close(t);
- writeln('Файл не меняется');
- readln;
- exit;
- end;
- //обменяем местами если второй иендкс ментше первого
- if sp<g1 then
- begin
- i:=g1;
- g1:=sp;
- sp:=i;
- end;
- reset(t);//возвращаемся в начало файла
- for i:=1 to k do//к раз
- for j:=g1+1 to filesize(t)-2 do//сдвигаем конец файла к g1
- begin
- seek(t,j+1);
- read(t,s);
- seek(t,j);
- write(t,s);
- end;
- seek(t,filesize(t)-k);//встаем на к от конца файла
- truncate(t); //обрезаем файл
- reset(t);//опять в начало и читаем
- writeln('Удаление элементов между первым гласным и последним согласным:');
- while not eof(t) do
- begin
- read(t,s);
- write(s:2);
- end;
- close(t);
- end.
Объяснение кода листинга программы
Список действий:
- Задание констант для гласных и согласных букв.
- Объявление переменных для работы с файлом и его содержимым.
- Открытие файла для чтения и записи.
- Ввод символов из файла с помощью цикла repeat-readln.
- Проверка каждого введенного символа на гласность или согласность.
- Если символ является гласным и первая гласная еще не найдена, то сохраняем символ в переменной v и первую гласную в переменной g1.
- Если символ является согласным и последняя согласная еще не найдена, то сохраняем символ в переменной m и последнюю согласную в переменной sp.
- Запись каждого символа в файл с помощью write(s:2).
- Вывод содержимого файла до удаления элементов.
- Если первая гласная не найдена, то выводится сообщение
Не найдена гласная!
. - Если последняя согласная не найдена, то выводится сообщение
Не найдена согласная!
. - Если первая и последняя гласные успешно найдены, то вычисляется количество символов между ними и сохраняется в переменной k.
- Если k=0, то выводится сообщение
Между найденными элементами нет других элементов
. - Если первая гласная не найдена, последняя согласная не найдена или k=0, то файл не изменяется и выводится сообщение
Файл не меняется
. - Если sp меньше g1, то меняются местами значения g1 и sp.
- Файл сбрасывается в начало.
- Если k>0, то выполняется два вложенных цикла для удаления k символов между первой гласной и последним согласным.
- Файл закрывается и открывается заново для чтения.
- Выводится сообщение
Удаление элементов между первым гласным и последним согласным:
и содержимое файла. - Файл закрывается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д