Удалить из файла символы между первой гласной и последней согласной буквой - PascalABC.NET
Формулировка задачи:
Значит есть файл типа Char, нужно записать туда любые символы, кроме 0 (0 терминал). Нахожу в нем первую глас. и последнюю согл., нахожу их позиции и после этого нужно удалить всё, что находится между ними и записать оставшиеся символы в файл. Собственно с этим у меня и проблема, не знаю как удалить из этого файла всё, что находится между ними, сказали, что это можно сделать просто путем перемещения символов с последнего согласного и далее к началу первой согласной, а потом удалить оставшийся хвост через Truncate, но может можно и по-другому. Не используя дополнительных файлов, а буквы искать только английские. Вот код:
П.С задавал уже подобный вопрос, но там был текстовый файл, а тут типизированный файл, там решение кардинально другое.
Решение задачи: «Удалить из файла символы между первой гласной и последней согласной буквой»
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 символов между первой гласной и последним согласным.
- Файл закрывается и открывается заново для чтения.
- Выводится сообщение
Удаление элементов между первым гласным и последним согласным:и содержимое файла. - Файл закрывается.