4 Блок-схема
Так
Ні
Присвоєння змінної файлу
n=1, q=1
Відкриття файлу для зчитування
5 Таблиця ідентифікації
Позначення у програмі |
Пояснення |
words |
Масив рядкового типу для слів |
symvols |
Масив рядкового типу для розділових знаків |
f1 |
Файлова змінна |
str |
Змінна ряд кового типу для запису тексту з файлу |
word |
Змінна рядкового типу для формування слова перед занесенням в масив |
symvol |
Змінна рядкового типу для збереження розділових знаків перед занесенням в масив |
len |
Змінна для збереження значення довжини зчитаного рядка |
і, j |
Лічильники циклу |
q,n |
Лічильники масиву слів, та масиву розділових знаків |
e |
Змінна для перевірки виконання програми |
a |
Константа зі значенням усіх голосних латинських букв |
inf |
Константа з інформацією про програму |
way |
Змінна в якій міститься шлях до файлу |
let |
Константа з значенням всіх латинських букв |
6 Код програми
program files;
uses crt;
const inf='Vodvud Andriy CS-23';
a=['a','e','y','u','i','o'];
let=['a'..'z','A'..'Z'];
var words,symvols:array[1..70] of string;
f1:text;
way,str,word,symvol:string;
n,len,i,j,q:integer;
e:boolean;
begin
clrscr;
Writeln('vvedit shlah do faylu');
readln(way);
assign(f1,way);
n:=1; q:=1;
reset(f1);
while not eof(f1) do
begin
readln(f1,str);
len:=length(str);
i:=1;
while i<=len do
if str[i] in let then
begin
word:=str[i];
inc(i);
while (i<=len) and (str[i] in let) do
begin
word:=word+str[i];
inc(i);
end;
words[q]:=word;
inc(q);
end else begin
symvol:=str[i];
inc(i);
while(i<len) and not (str[i] in let) do
begin
symvol:=symvol+str[i];
inc(i);
end;
symvols[n]:=symvol;
inc(n);
end;
end;
writeln(inf);
writeln;
for i:=1 to q do
write(words[i]+symvols[i]);
for i:=1 to q do
begin
word:=words[i];
if word[length(word)] in a then
begin
e:=true;
readkey;
clrscr;
writeln(inf);
writeln;
for j:=1 to i-1 do
write(words[j]+symvols[j]);
textcolor(red);
write(words[i]+symvols[i]);
textcolor(7);
for j:=i+1 to q do
write(words[j]+symvols[j]);
writeln;
writeln('bucv y slovi:',length(words[i]));
end
else e:=false
end;
if e=false then writeln('V faily nemay sliv, scho zacinchuuytsa na golosnu bukvu');
readln;
end.
7 Опис програми
Дана програма здійснює дії над текстови файлом. Стандартне задання в програмі файлової змінної здійснюється таким чином:
Var f1: text;
Для роботи з файлом використовувались наступні процедури:
Assign( f1, 'TEXT.DAT’);
де f1- змінна файлового типу, а рядковий вираз ‘TEXT.DAT’ містить повну назву файла, яка задовольняє вимогам операційної системи, або повний шлях до файлу;
Reset(f1); відкриває вже існуючий файл f1;
В даній програмі є константи і змінні. Константами називаються елементи даних, значення яких розміщені в описовій частині програми і в процесі виконання програми не змінюються (к=3):
const inf='Vodvud Andriy CS-23';
a=[‘a’,’e’,’y’,’u’,’i’,’o’]; {Всі голосні букви}
let=['a'..'z','A'..'Z']; {Всі можливі латинські букви}
Змінними називаються величини, які можуть змінювати свої значення в процесі виконання програми. Задання змінних в програмі здійснюється таким чином: Var f1: text; {Задання файлової змінної}
words,symbols:array[1..100] of string;
way,str,word,symbol:string;
n,len,i,j,q:integer;
e:boolean;
Після приєднання до файлу файлової змінної, та відкриття файлу з нього зчитуються дані за допомогою команди
Readln (f1,str), коли вона виконається в рядкову змінну str заноситься перший рядок текстового файлу, але оскільки не відомо скільки в файлі рядків, то ця команда записана в циклі:
while not eof(f1) do {Цикл виконується до завершення файлу}
begin
readln(f1,str); {Зчитування рядка тексту в змінну}
len:=length(str); {Визначає довжину рядка}
Для того, по натисканню довільної клавіші програма по черзі виділяла кожне з слів тексту, у яких перша і остання літери збігаються я вирішив занести всі слова та всі розділові знаки в два різні масиви : words, sumbols.
Наступний код програми демонструє занесення слів в масив words:
i:=1; {Присвоюю лічильнику цикла початкове значення}
while i<=len do {В даному циклі аналізується кожний символ з зчитаного рядка }
if str[i] in let then {Якщо даний символ буква, то вона повинна бути записана в змінну word і сформувати початок слова}
begin
word:=str[i]; {Запис літери в змінну}
inc(i); {Береться наступний символ}
while (i<=len) and (str[i] in let) do {В цьому циклі продовжується аналіз кожного символу, і якщо символ буква, і ще не досягнутий кінець рядка, то літери будуть послідовно записуватись формуючи слово}
begin
word:=word+str[i];
inc(i);
end; {Якщо попадається не буква то даний цикл зупиняється, і сформоване перед цим слово з змінної word заноситься в цикл words}
words[q]:=word;
inc(q); {Щоб елементи масиву записувались послідовно, я ввів
лічильник q, також він рахує скільки всього символівє в тексті}
end
Якщо символ не буква, а розділовий знак, або пропуск, то він по аналогії з записом слів в масив записується в масив символів:
else begin
symbol:=str[i]; {Якщо символ не задовольняє умову записану вище (if str[i] in let then ), то він автоматично записується в змінну symbol }
inc(i); {Береться наступний сивол}
while (i<len) and not (str[i] in let) do
begin
symbol:=symbol+str[i]; {Якщо попадаються два, або більше символів підряд (наприклад пропуск та крапка) , то вони записуються один за одним, формуючи один елемент }
inc(i); {Береться наступний сивол}
end;
symbols[n]:=symbol; {Якщо рядок закінчився, або попалася літера, значення з змінної symbol записується в масив.}
inc(n); { По аналогії з записом в масив слів я використав окремий лічильник, щоб значення записувались послідовно}
end;
end;
Тепер в програмі сформовано два масиви , з словами, для того, щоб виконати умову задачі, та з розділовими знаками, для того, щоб текст, який виводиться на екран відповідав тексту в файлі.
Вивід на екран результату виконання відбувається таким чином.
writeln(inf); {Вивід на екран інформації про програму}
writeln; {Пропуск рядка}
for i:=1 to q do {Так, як індекси слів, та індекси розділових знаків збігаються, на екран виведеться весь текст в правильній послідовності символів }
write(words[i]+symbols[i]); {Спершу виводиться слово, а тоді знак(ки) з відповідним йому індексом}
for i:=1 to q do {В цьому циклі відбувається остаточний вивід програми, згідно з завданням}
begin
word:=words[i]; {Змінній word, присвоюється значення слова з масиву, для того, щоб визначити слова, які закінчуються на голосну букву}
if word[length(word)] in a then
begin
e:=true; {Змінна для перевірки, чи не виконується програма}
readkey; {Якщо перша і остання літери слова однакові, і слово не складається з однієї літери, то очікується на натиснення клавіші}
clrscr; {Очишчення екрану}
writeln(inf); {Вивід інформацції на екран}
writeln;
for j:=1 to i-1 do {В цьому циклі відбувається вивід на екран
всіх слів та розділових знаків, які стоять перед знайденим словом (яке задовільняє умову)}
write(words[j]+symbols[j]);
textcolor(red); {Зміна кольору тексту який буде виводитись надалі на червоний}
write(words[i]+symbols[i]); {Вивід на екран, знайденого слова червони кольором}
textcolor(7); {Зміна кольору виведення тексту на стандартний}
for j:=i+1 to q do {В цьому циклі виводяться всі слова та розділові знаки, які лежать після знайденого слова}
write(words[j]+symbols[j]);
writeln;
writeln(‘bucv u slovy: ',length(words[i])); {Також за умовою задачі потрібно виводити кількість букв у слові, яке задовольняє умову, що закінчуються на голосну букву }
end;
end;
if e=false then writeln('V faily nemay sliv, scho zakinchuutsa na golosnu bukvu'); { Якшо ні одного слова, яке задовольняє умову немає, то про це виводиться повідомлення}
readln;
end.
В свою програму я підключив модуль CRT', який містить засоби керування дисплеєм та клавіатурою комп'ютера. Процедури, з модуля CRT, використані в програмі:
ClrScr-повністю очищає екран і поміщає курсор в лівий верхній кут. TextColor(Color:byte)- встановлює колір символів, які виводяться
