Обработка структур данных
Характеристика структурного типа данных и их обработка: массивы; строки; множества; файлы (определение текстового файла; его структура и обработка; запись в файл; чтение из файла); основные правила работы с типизированными и нетипизированными файлами.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | учебное пособие |
Язык | русский |
Дата добавления | 23.05.2014 |
Размер файла | 247,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
max:=sl; {запоминаем его, если оно длиннее предыдущего.}
End;
Writeln;
Writeln(max); {Выводим результат.}
Readkey;
END.
Задача №8. Выделить самое длинное слово в строке другим цветом.
Решение задачи сводится к тому, что слово максимальной длины другим цветом выводится поверх уже выведенной строки. Поэтому, приводить строку к виду "слово - пробел" не целесообразно, а просто нужно запоминать позицию слова в строке.
Алгоритм решения:
- ввести строку;
- внешний цикл организовать "по строке",
а внутренние циклы (их два) - один "по пробелам", второй "по слову":
- в цикле "по слову" формировать слово;
- после цикла проверить длиннее ли оно предыдущего и запомнить
его и его место расположения в строке.
Справка.
Смотри справку задачи №7.
Uses Crt;
Var
st:String; {Исходная строка.}
max:String; {Слово максимальной длины.}
sl:String; {Текущее слово.}
i:Byte; {Позиция символа в строке.}
n:Byte; {Позиция текущего слова в строке.}
i_max :Byte; {Позиция самого длинного слова в строке.}
BEGIN
ClrScr; {Чистим экран.}
Writeln('Введите строку'); {Выводим запрос на ввод строки.}
Readln(st); {Вводим исходную строку.}
ClrScr; {Чистим экран перед выводом результата.}
GoToXY(1,10); {Устанавливаем курсор в нужную позицию экрана.}
Write(st); {Выводим строку текущим цветом.}
{Находим в строке слово максимальной длины.}
max:=''; {Чистим строку для слова максимальной длины.}
i:=1; {Обработку строки начинаем с первой позиции.}
While i<=Length(st) do {Пока не конец строки:}
Begin
While (st[i]=' ') And (i<=Length(st)) do {организовываем цикл по пробелам,}
Inc(i); {изменяем позицию в строке;}
sl:=''; {готовим переменную для слова, очищая ее,}
n:=i; {запоминаем текущую позицию начала слова,}
While (st[i]<>' ') And (i<=Length(st)) do{организовываем цикл по символам}
Begin {(по слову), в котором}
sl:=sl+st[i]; {формируем слово из рядом стоящих символов}
Inc(i); {и изменяем позицию в строке;}
End;
If Length(sl)>Length(max) Then Begin {сравниваем полученное слово и,}
max:=sl; {если оно длиннее предыдущего, запоминаем его}
i_max:=n; {и позицию слова.}
End;
End;
{Выводим слово поверх уже выведенной строки.}
GoToXY(i_max,10); {Устанавливаем курсор.}
TextColor(3); {Устанавливаем цвет.}
Write(max); {Выводим слово поверх уже выведенной строки.}
Readkey; {Задержка результата до нажатия ENTER.}
END.
Задача №9. Ввести строку и вывести на экран порядковый номер буквы в алфавите.
Алгоритм решения:
- константой задаем массив заглавных букв алфавита, куда заносим порядковый номер каждой буквы;
- вводим строку;
- преобразуем ее к "заглавным";
- строим два цикла: один по строкам; второй по буквам алфавита;
- проверяем равенство символа строки и буквы алфавита;
- если равны, выводим номер буквы в алфавите.
Справка:
1). Для перевода к "заглавным" использовать функцию UpCase.
2). В цикле по буквам параметр цикла должен быть символьного типа.
Uses Crt;
Const
Symb:Array['A'..'Z'] Of Byte=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,24,25,26);
Var
st:String; {ST - вводимая строка.}
i :Byte; {I - параметр цикл.}
ch:Char; {CH - параметр цикла по буквам.}
BEGIN
ClrScr;
Writeln('Введите строку:'); {Выводим запрос на ввод.}
Readln(st); {Вводим строку.}
For i:=1 To Length(st) Do {Цикл по строке преобразования к "заглавным".}
st[i]:=UpCase(st[i]); {Преобразуем к "заглавным".}
For i:=1 To Length(st) Do {Цикл по строке сравнения символов строки.}
For ch:='A' To 'Z' Do {Цикл по буквам алфавита.}
If st[i]=ch Then {Сравниваем символ строки и буквы алфавита.}
Write(symb[ch],' '); {Выводим порядковый номер буквы алфавита.}
Readkey; {Задержка вывода на экране.}
END.
Задача №10 Подсчитать, сколько раз встретился каждый символ в тексте.
Для ввода текста предусмотреть массив строк.
Алгоритм решения:
- опишем массив целого типа, размерность которого соответствует всем символам;
- введем текст;
- внешний цикл организуем по тексту (по массиву);
- внутренний цикл организуем по строке текста;
- т.к. у каждого символа в массиве есть «свое место», взяв символ строки, накапливаем прямо в массив;
- организуем вывод результата только тех символов массива, количество которых не равно 0.
Справка:
1). Массив нужно описать следующим образом:
Var
symb:Array[#0..#255] of Byte;
Такое описание массива говорит о том, что массив размером во всю таблицу ASCII кодов. Данные, которые будут храниться в массиве (кол-во каждого символа), целого типа. Значит:
в SYMB['a'] - количество букв а,
в SYMB['B'] - количество букв В и т.д.
2). При вводе строк текста лучше организовать цикл до ввода пустой строки:
n:=0; {Номер строки.}
Repeat {Начало цикла ввода строк текста.}
readln(st); {Вводим строку.}
If st<>'' Then Begin {Если строка не пустая,}
inc(n); {увеличиваем нумерацию строк в массиве,}
text[n]:=st; {заносим строку в массив.}
End;
Until st=''; {Цикл закончит работу, когда введем пустую строку.}
Uses Crt;
Var
symb:Array[#0..#255] of Byte; {Массив для хранения количества}
{повторений символа.}
text:Array[1..20] Of String[80]; {Массив строк текста.}
St:String[80]; {Вводимая строка.}
S,I,j,n:Byte; {S - счетчик символов; I - параметр цикла(позиция в строке);}
{J - строка текста; N - количество введенных строк.}
ch:Char; {Символ строки.}
BEGIN
ClrScr;
{ Формирование массива строк.}
n:=0; {Номер строки.}
Repeat {Начало цикла ввода строк текста.}
Readln(st); {Вводим строку.}
If st<>'' Then {Если строка не пустая,}
Begin
Inc(n); {увеличиваем нумерацию строк в массиве,}
text[n]:=st; {заносим строку в массив.}
End;
Until st=''; {Цикл закончит работу, когда введем пустую строку.}
{ Подсчет частоты каждого символа в тексте.}
For ch:=#0 To #255 Do {Цикл для обнуления массива.}
symb[ch]:=0; {В каждый элемент массива заносим 0.}
For j:=1 to n Do {Организовываем цикл по тексту }
{(по строкам массива).}
For i:=1 To Length(text[j]) do {Организовываем цикл по строке.}
Begin
Ch:=text[j,i]; {Берем один символ строки,}
Inc(symb[ch]); {накапливаем счетчик символа и заносим в массив}
{на отведенное данному символу место в массиве.}
End;
{ Вывод результата на экран.}
For ch:=#0 To #255 Do {Цикл по всем символам ASCII кода.}
If symb[ch]<>0 Then {Если символ был,}
If ch=' ' Then Write('пр.-',symb[ch]:3,' ') {выводим, сколько раз символ}
Else Write(ch:3,'-',symb[ch]:3,' ');{встретился.}
Readkey; {Задержка вывода на экране.}
END.
4. МНОЖЕСТВА
4.1 Теоретические сведения
Множественный тип данных относится к структурным типам. Понятие множества в математике и Паскале имеют много общего.
Но! В математике множество - это любая совокупность объектов, выбранная из универсального множества и, элементы могут иметь разный тип - число, буква, кошка, яблоко, тазик и т.д. (Универсальное множество - это множество, содержащее все элементы).
Множественный тип в Паскале - это совокупность элементов одного типа, называемого базовым. Числа могут входить только в числовое множество; буквы - в символьное; кошка, мышка - в множество «зверюшки».
Базовый тип не должен иметь более 256 значений и порядковые номера элементов множества должны входить в диапазон от 0…255.
В силу этого базовый тип множества не может быть:
ѕ коротким целым (-128…127);
ѕ целым (-32768…32767);
ѕ длинным целым (-2147483648…2147483647)\;
ѕ словом (0…65535).
Фактически из целочисленных типов можно использовать Byte.
Описание множественного типа.
Описание множественного типа выполняется с использованием зарезервированного слова Set (набор, комплект):
ѕ с использованием Type
Type
CharSet=Set of Char; {множество на базе символьного типа}
SymbSet=Set of #0..#255; {множество на базе символьного}
ByteSet= Set of Byte; {на базе целочисленного типа Byte (0..255) }
DaySet= Set of (Sun,Mon,Tue,Wed,Thu,Fri,San); {множество дней}
ProgSet=Set of (Paskal,Ci,Java,Basic); {множество языков программирования}
Var
Ch: CharSet;
Symb: SymbSet;
B: ByteSet;
Day: DaySet;
Prog: ProgSet;
ѕ без использования Type
Var
Ch: Set of Char; {множество на базе символьного типа}
Symb: Set of #0..#255; {множество на базе символьного}
B: Set of Byte; {на базе целочисленного типа Byte (0..255) }
Day: Set of (Sun,Mon,Tue,Wed,Thu,Fri,San); {множество дней}
Prog: Set of (Paskal,Ci,Java,Basic); {множество языков программирования}
Переменная множественного типа может принимать как все значения множества, так и одно ил несколько.
Данные множественного типа задаются через запятую в квадратных скобках:
1) С использованием констант в области описаний (Const).
Не типизированных
Const
Lettrs=[`A'..'Z']; {буквы } Day=[Sun,Mon,Tue,Wed,Thu,Fri,San];{дни недели}
Workday=[Mon,Tue,Wed,Thu,Fri]; {рабочие дни}
Evend=[2,4,6,8]; {четные числа}
Типизированных
Const
Letters:Set of `A'..'Z'=[`A','E','I','O','U','Y]]; {гласные буквы}
Hexdigits:Set of `0'..'Z'=[`0'..'9','A'..'F','a'..'f']; {символы диапазонов}
2) Присвоением.
Var
Ch: Set of Char; {множество на базе символьного типа}
BEGIN
Ch:=[`A'..'Z'];
END.
Распределение памяти для элементов множественного типа.
Любой элемент множества имеет одно свойство - наличие или отсутствие его в множестве. Так как любой элемент может присутствовать в множестве только в 1-ом экземпляре, и его повторное включение в множество не проходит, в оперативной памяти отводится место с учетом этого свойства. Если максимальное количество элементов равно 256, то любое (самое большое) множество не может занимать больше 32 байт:
ѕ для 8-ми элементов множества нужен 1 байт памяти;
ѕ для 256 элементов -32 байта (256:8=32).
Пусть в программе описан множественный тип, базовым которого есть набор 26 символов от `A'..'Z'.
Uses Crt;
Type
Letters=Set of `A'..'Z';
Var
Mn: Letters;
Ch:Char;
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
BEGIN
MN:=[`P','A','S','C','M','L'];
END.
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
Вывод элементов множественного типа.
Данные множественного типа не могут быть параметрами процедур Read и Write, т.е. не могут участвовать в операторах ввода и вывода.
Для определения наличия элемента в множестве используется оператор IN, возвращающий истинное значение True, если элемент присутствует в множестве и ложное значение False, если такого элемента нет.
Поэтому, для вывода элементов множества нужно организовать цикл по элементам базового типа и проверять наличие элементов множества.
For ch:='A' to `Z' do
If Ch IN Mn Then Write (Ch,' `);
Операции над элементами множественного типа.
Операция |
Действие |
Стандартная процедура |
Типы операндов |
Логическая операция |
|
+ |
объединение |
Include(var s;i); |
Множества с совместимыми типами |
OR |
|
- |
разность |
Exclude(var s;i); |
- |
||
* |
пересечение |
AND |
В процедурах Include(var s;i); и Exclude(var s;i);
S - Переменная множественного типа;
I - элемент включения в множество или исключения из него.
Так как множества отображаются в виде битового массива, то операции объединения, пересечения, разности двух множеств, сводятся к разрядным логическим операциям над последовательностью битов.
4.2 Задачи
Рассмотрим применение операций над множествами при решении задач.
1). Объединение.
Объединением двух множеств называется множество, содержащее элементы как одного, так и другого множеств.
Задача №1 Определить, какой товар имеется на двух складах (весь перечень товара).
Условно зададим товар:
ѕ на 1-ом складе A:=[1,2,3];
ѕ на 2-ом складе B:=[3,4,5,6];
ѕ выполним операцию объединения C:=A+B;
ѕ получим результат C = [1,2,3,4,5,6];
Uses Crt;
Var
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
|
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
C, A, B:Set of 1..9;
BEGIN
A:= [1,2,3];
B:= [3,4,5,6];
C:=A + B;
END.
OR (или) - в результате 0 тогда, когда оба бита 0.
В результате выполнения операции множество C = [1,2,3,4,5,6];
2). Пересечение.
Пересечением двух множеств называется множество, содержащее элементы, включенные в оба множества.
Задача №2 Определить, какой товар «залежался» на складах.
Условно зададим товар:
ѕ на 1-ом складе A:=[1,2,3];
ѕ на 2-ом складе B:=[3,4,5,6];
ѕ выполним операцию пересечения C:=A*B;
--- получим результат C= [3];
Uses Crt;
Var
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
|
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
C, A, B:Set of 1..9;
BEGIN
A:=[1,2,3];
B:=[3,4,5,6];
C:= A * B;
END.
AND - логическое «и», в результате 1-ца тогда, когда оба бита 1-цы.
В результате выполнения операции множество C = [3];
3). Разность.
Разностью двух множеств называется множество, содержащее элементы, первого (уменьшаемого), но не содержащиеся во втором множестве (вычитаемом).
Задача №3 Определить, какого товара нет на 2-ом складе.
Условно зададим товар:
ѕ на 1-ом складе A:=[1,2,3];
ѕ на 2-ом складе B:=[3,4,5,6];
ѕ выполним операцию вычитания C:=A-B;
--- получим результат C= [1,2];
Uses Crt;
Var
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
|
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
C,A,B:Set of 1..9;
BEGIN
A:=[1,2,3];
B:=[3,4,5,6];
C:= A -B;
END.
В результате выполнения операции множество C = [1,2];
Определить, какого товара нет на 1-ом складе.
Условно зададим товар:
ѕ на 1-ом складе A:=[1,2,3];
ѕ на 2-ом складе B:=[3,4,5,6];
ѕ выполним операцию вычитания C:= B -A;
--- получим результат C= [4,5,6];
Uses Crt;
Var
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
|
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
C,A,B:Set of 1..9;
BEGIN
A:=[1,2,3];
B:=[3,4,5,6];
C:=- B -A;
END.
В результате выполнения операции множество C = [4,5,6];
Задача №4 Ограничение работы цикла.
Uses Crt;
Var
Ch:Char;
BEGIN
Repeat
{…}
Write(`Продолжить Y/N');
Ch:=Readkey;
Until (Ch='N') Or (Ch='n');
{Используем условие}
END.
Задача №4. Формирование множеств. Просмотр множеств.
Uses Crt;
Var
A,B: Set of Byte;
C: Set of Char;
I:Byte;
Ch:Char;
BEGIN
B:=[]; A:=[];{пустое множество}
{формируем A из чисел 0..9 }
For i:=0 to 9 do
A:=A+[I];
{формируем В из кратных 4}
For I:=0 to 255 do
If (I mod 4)=0 Then B:=B+[I];
{формируем С из символов}
Repeat
Ch:=Readkey;
If Ch<>#27 Then C:=C+[CH];
Until Ch=#27
END.
Задача №5. Вывод символов, которые встретились в файле.
Uses Crt;
Var
F:Text; {файловая переменная}
Symb:Set of char; {множество символьного типа}
Ch:Char; {переменная чтения из файла}
BEGIN
Assign(F,'Proba.txt'); Reset(F); {открываем текстовый файл}
Symb:=[]; {множество пустое}
{Формируем множество}
While Not EoF(F) do
Begin
Read(F,Ch); {читаем символ}
If (Ch<>#10) AND (Ch<>#13) Then {если это не управляющие символы}
Symb:=Symb+[Ch]; {заносим в множество}
End;
{Просматриваем множество}
For Ch:=#0 to #255 do
If Ch IN Symb Then Write(Ch,' `);{если есть, то выводим}
Readkey;
END.
Задача №6. Отсортировать массив из 20-ти чисел по возрастанию, используя множество.
Алгоритм:
ѕ вводим элементы массива;
ѕ формируем из этих элементов массива множество [3 7 3 4 1 6 89 23];
ѕ перезаписываем в массив компоненты множества по возрастанию.
Справка.
1). Чтобы отсортировать массив по возрастанию, нужно построить цикл от 0..255 (от меньшего к большему), искать 0, 1, 2, 3, 4,…, 255 в множестве и заносить в массив. Первой отыщется 1, второй - 3, затем - 6 и т. д.: 7 23 34 89
2). Чтобы отсортировать массив по убыванию, нужно организовать цикл от большего к меньшему For I:= 255 downto 0 do
Множество [3 7 34 1 6 89 23]
Первой отыщется 89, второй - 34, затем -23 и т. д.: 7 6 3 1
Uses Crt;
Var
Mn: Set of Byte; {множество с базовым типом Byte }
I,J:Byte; {параметр цикла, индекс массива}
Mas:Array[1..20] of Byte;{массив из 20-ти элементов}
BEGIN
{Формируем массив и множество}
MN:=[];{пустое множество}
Writeln(`Введите элементы массива:');
For i:=1 to 20 do
Begin
Readln(mas[i]; {вводим элементы массива}
MN:=MN+[Mas[i]];{заносим их в множество}
End;
{Перезаписываем из множества в массив по возрастанию}
Writeln(`По возрастанию');
J:=0; {обнуляем индекс массива}
For I:=0 to 255 do
If I IN Mn Then {проверяем принадлежность множеству и если да}
Begin
Inc(J); {увеличиваем индекс массива}
Mas[J]:=I; {заносим в массив}
Write(Mas[J]:3,' `);{выводим элемент массива на экран}
End;
END.
Задача №7. Разделить удвоенные гласные в строке.
Uses Crt;
Const
ANGL:Set of Char=[A,a,E,e,O,o,I,i,U,u]; {Задаем множество гласных.}
Var
st:String; {Строка для ввода.}
i:Byte; {Позиция в строке.}
BEGIN
ClrScr; {Чистим экран.}
Writeln('Введите строку'); {Выводим запрос на ввод строки.}
Readln(st); {Вводим строку.}
i:=1; {Строку анализируем с первого символа.}
While i<=Length(st)-1 Do {Организуем цикл по строке}
Begin
If st[i]=st[i+1] Then {Сравниваем два рядом стоящие символы.}
If st[i] in ANGL Then {Если символ строки - гласная, то}
Begin
Insert('-',st,i+1); {вставляем между одинаковыми гласными дефис,}
Inc(i); {переходим на соседний символ строки.}
End;
inc(i); {Если не гласная, все равно переходим на соседний символ.}
End;
Writeln(st); {Выводим строку после вставки дефиса между гласными.}
Readkey; {Задерживаем результат на экране до нажатия клавиши ENTER}
END.
Задача №7. Прочитать файл и вывести на экран только латинские и русские буквы. Все остальные символы файла заменить при выводе пробелом.
Для решения этой задачи удобнее использовать множество, которое будет состоять только из букв латинского и русского алфавита. Тогда вся задача сводится к проверке каждого символа файла на принадлежность множеству.
Алгоритм:
- ввести имя обрабатываемого файла и открыть его;
- организовать цикл по всему файлу;
- читать строку;
- в цикле:
ѕ проверять каждый символ строки на принадлежность множеству;
ѕ заменять пробелом символ, не принадлежащий множеству;
- после преобразования строки, выводить ее на экран.
Uses Crt;
Const
mn=['A'..'Z','a'..'z','а'..'я','А'..'Я'];{Множество латинских и русских букв}
Var
i:Byte; {Позиция в строке}
f:Text; {Файловая переменная}
st,fname:String; {st - строка для чтения из файла и преобразования
fname - имя файла}
BEGIN
ClrScr;
Writeln('Введите имя файла:'); Readln(fname); {Вводим именя файла}
Assign(f,fname); Reset(f); {Связываем имя файла и открываем}
While NOT Eof(f) Do {Пока не конец файла}
Begin {Начало цикла по файлу}
Readln(f,st); {читаем строку из файла}
i:=1; {и, начиная с первого символа строки,}
While i<=Length(st) Do {в цикле по строке}
Begin {Начало цикла по строке}
If st[i] in mn Then st[i]:=st[i] {Если принадлежит - оставляем не меняя,}
Else st[i]:=' '; {не принадлежит - заменяем пробелом.}
Inc(i); {Увеличиваем позицю в строке}
End; {Конец цикла по строке}
Writeln(st); {Выводим преобразованную строку}
End; {Конец цикла по файлу}
Close(f);
Readkey;
END.
Задача №9. В файле разделить удвоенные глассные, вставив между ними "дефис".
В этой задаче нужно проверять одинаковы ли рядом стоящие символы строк файла и принадлежат ли множеству.
Обратите внимание на то, что при вставке "дефиса" в строку можно через него не "переступать". Просто на следующем шаге цикла по строке "дефис" будет сравниваться с рядом стоящим символом. Ничего страшного не произойдет.
Uses Crt;
Const
mn=['a','e','i','o','y','u','A','E','I','O','Y','U']; {Множество глассных}
Var
i:Byte;
f,f1:Text;
st,fname:String;
BEGIN
ClrScr;
Writeln('введите имя файла:'); Readln(fname);
Assign(f1,'fname1');Rewrite(f1);
Assign(f,fname);Reset(f);
While Not EOF(f) Do {Открываем цикл до конца файла}
Begin {Начало цикла по файлу}
Readln(f,st); {Читаем строку файла}
i:=1; {Начинаем с первого символа строки}
While i<Length(st) Do {Открываем цикл по строке}
Begin {Начало цикла по строке}
If (st[i]=st[i+1]) {Если рядомстоящие символы равны}
AND (st[i] In mn) Then {и принедлежат множеству,}
Insert('-',ST,I+1); {вставляем "дефис".}
inc(i); {переходим на соседний символ строки}
end; {Конец цикла по строке}
Writeln(f1,st); {Выводим строку в дополнительный файл}
End; {Конец цикла по файлу}
Close(f); Erase(f);
Close(f1); Rename(f1,fname);
END.
5. ФАЙЛЫ
5.1 Текстовые файлы.
5.1.1. Теоретические сведения:
1). Определение текстового файла.
Текстовый файл - это файл, информация в котором доступна к пониманию. Текстовый файл можно создать:
1) В любом текстовом редакторе. Вводим текст и сохраняем его под каким-либо именем.
2) Программным путем:
ѕ вводим информацию с клавиатуры и записываем в файл;
ѕ перезаписываем из одного в другой.
2). Структура текстового файла.
1) Text.txt 2) Text1.txt
Строка 1 (Enter) Cтрока 1 #13#10 Строка 1 (Enter) Cтрока 1 #13#10 Строка 2 (Enter) Cтрока 2 #13#10 или Строка 2 (F2) Cтрока 2#26_
_ (F2) #26
Курсор курсор
При нажатии Enter к информационной строке дописываются:
1) #13 - возврат каретки (перемещение курсора в 1-ую позицию строки).
2) #10 - перевод строки (перемещение курсора на другую строку экрана, файла).
3) #26 - конец файла.
Зачем они нужны?
#13, #10
1) для отделения записей одна от другой, которые имеют разную длину.
2) Для нормального читабельного расположения в файле.
#26 - чтобы не выйти за пределы файла и не пытаться читать информацию, когда файл закончился.
3). Обработка текстовых файлов.
Запись в файл.
Основные правила:
1) Для записи используются константы, переменные, выражения.
2) Процедура Writeln(F,St), где St - переменная строкового типа (String) автоматически дописывает #13#10 для перехода на новую строку и читабельности файла.
3) Вызов процедуры Writeln(F) пропустит пустую строку в файле.
4) При использовании Write(F,Ch), где Ch - переменная символьного типа (Char) читабельность файла нужно предусмотреть в программе.
Чтение из файла.
Основные правила:
1) При чтении используются только переменные, но не константы, выражения.
2) Для чтения лучше использовать функцию конца файла EOF(F).
3) При использовании Readln(F, St), где St - переменная типа String читаются данные текущей записи, а указатель устанавливается всегда в начало следующей записи; #13, #10 - не читаются.
4). Стандартные процедуры и функции, используемые при обработке текстовых файлов:
1) Процедура Append(Var F:Text); - открывает существующий текстовый файл для присоединения (файловая переменная должна быть связана с именем файла).
2) Процедура Flush(Var F:Text); -записывает в принудительном порядке на диск содержимое буфера текстового файла, открытого для записи, тем самым гарантируя, что после ее вызова в файл будут записаны все данные. Так как содержимое буфера записывается после выполнения процедуры Close(F), Flush целесообразно использовать в тех случаях, если точно нужно знать, что данные действительно записаны.
3) Процедура SetTextBuf(Var F:Text; Var Buf[;Size:Word]); позволяет назначить для текстового файла буфер большего размера, чем сандартный 128-байтовый, но не должен превышать 64Кб.
За чет увеличения буфера за одно обращение к диску будет передано Size - байт.
Обязательно вызывать после Assign до открытия Rewrite или Reset.
Uses Crt; BEGIN
Var Assign(F,Fname.txt);
F:Text; SetTextBuf(F, Buf[,Sizeof(Buf));
Buf:Array[1..2048] of Byte; {буфер} Reset(F);
St:String; {…}
END.
4) Функция EoLn(Var F:Text): Boolean; - возвращает True, если указатель текущей позиции находится за последним символом записи, т. е.указывает на #13.
5) Функция SeekEoLn(Var F:Text): Boolean; - возвращает True, если между указателем текущей позиции и #13 нет никаких символов, кроме пробелов.
6) Функция SeekEof(Var F:Text): Boolean; - отличается от Eof тем, что возвращает True в том случае, если между указателем текущей позиции и концом файла нет символов отличающихся от «пробел» , #13, #10, то есть перемещает указатель сразу в конец файла.
5.1.2. Задачи
Задача №1 Создание текстового файла, используя ввод строк с клавиатуры.
Uses Crt;
Var
F: Text; {файловая переменная}
S2: String[80]; {строковая переменная}
BEGIN
ClrScr;
Assign(f,'Text.txt');{связываем файловую пер. с им. ф.}
Rewrite(F); {открываем файл для записи}
Writeln(`Введите текст');
Repeat {в цикле:}
Readln(st); {вводим строку;}
If st<>'' Then {и если не пустая, то}
Writeln(F,st); {записываем в файл;}
Until st=''; {выход из цикла по пустой строке}
Close(F); {закрываем файл}
END.
Задача №2 Преобразовать текстовый файл, удалив из него все пробелы.
Т.к. преобразовать нужно текстовый файл, а, преобразованную строку нельзя записать в тот же самый файл на то же место, необходимо использовать дополнительный файл, который по окончанию преобразования, переименовать.
Алгоритм:
ѕ открыть файлы: один (исходный) - для чтения, другой (новый) - для записи;
ѕ организовать цикл «по файлу», в котором:
ѕ читать строку из исходного файла;
ѕ пока будут встречаться «пробелы» в строке, удалять их;
ѕ записать преобразованную строку в другой файл;
ѕ закрыть и удалить исходный файл;
ѕ закрыть и переименовать новый файл под именем исходного.
Справка:
1). Для того, что бы работать с текстовым файлом, нужно его открыть.
Для этого нужно использовать процедуры:
Assign(f,fname) - связывает файловую переменную с именем файла, имеет 2 парметра (f - файловая переменная, fname - имя файла);
Reset(f) - открывает существующий файл и устанавливает курсор в начало файла;
Rewrite(f1) - открывает новый файл и устанавливает курсор в начало файла.
2). После окончания работы с файлами, нужно их обязательно закрыть:
Close(f) - закрывает исходный файл;
Close(f1)- закрывает файл, в который записывали строки после
удаления пробелов.
3). Процедура Delete(st,pos(' ',st),1) поможет избавиться от лишних пробелов, удаляя из строки осторожно по одному пробелу с позиции, где обнаружено 2 пробела рядом.
4). Для удаления файла нужно использовать процедуру Erase(f), параметр которой и укажет, какой файл удалить.
5). Для переименования файла использовать процедуру Rename(f1,Fname), параметры которой говорят, какой файл переименовывать и под каким именем.
6). Для поиска пробелов в строке лучше использовать функцию поиска Pos(' ',st), параметрами которой будут:
ѕ что ищем - пробел (' ');
ѕ где ищем - в строке st..
7). Результат работы функции поиска - переменная целого типа, которая может принимать значение:
ѕ ноль, если поиск завершился неудачно;
ѕ позиции строки, если искомое есть в строке.
Uses Crt;
Var
f,f1:Text;
st,fname:String;
BEGIN
ClrScr;
Writeln('введите имя файла:'); {Выводим запрос на ввод имени файла}
Readln(fname); {Вводим имя файла}
Assign(f,fname); Reset(f); {Открываем существующий файл}
Assign(f1,'fname1');Rewrite(f1);{Открываем новый файл с именем 'fname1'}
While NOT EOF(f) Do {Цикл по файлу}
Begin {Начало цикла по файлу}
Readln(f,st); {Читаем строку исходного файла}
While Pos(' ',st)<>0 Do {Пока пробелы есть в строке}
Delete(st,pos(' ',st),1); {Удаляем пробел из строки, с позиции,}
{где встретился}
Writeln(f1,st); {Выводим строку в дополнительный файл}
End; {Конец цикла по файлу}
Close(f);Erase(f); {Закрываем исходный файл и удаляем его}
Close(f1);Rename(f1,Fname); {Закрываем полученный файл}
{и переименовываем}
END.
Задача №3 В текстовом файле оставить по одному пробелу.
Решение этой задачи аналогично предыдущей за исключение того, что нужно искать 2-а пробела в троке, а не один.
Алгоритм:
- открыть файлы;
- организовать цикл по всему файлу (While Not EOF(f) Do):
- читать его строки;
- удалять из них все лишние пробелы (если даже 2 - один из них лишний);
- записывать в другой файл;
- после окончания работы цикла по файлу, закрыть оба файла и,
с которого читали - удалить, а тот, куда записывали - переименовать.
Справка:
Смотри справку предыдущей задачи.
Uses Crt;
Var
st,fname:String; {st - строка для чтения из файла}
{fname - имя файла, который нужно преобразовать}
f,fl:Text; {f,fl- файловые переменные}
BEGIN
ClrScr;
Writeln('Вв.имя файла:');{Выводим запрос на ввод}
Readln(fname); {Вводим имя файла}
Assign(f,fname);Reset(f); {Открываем файл, откуда читать строки}
Assign(fl,'gh');Rewrite(fl); {Открываем файл, куда будем записывать строки}
{после преобразования}
While Not EOF(f) Do {Цикл работает пока дойдет до конца файла}
Begin
Readln(f,st); {Вводим строку из файла}
While Pos(' ',st)<>0 Do {Пока в строке встречается 2 пробела}
Delete(st,pos(' ',st),1); {удаляем на каждом шаге цикла один из них}
Writeln(fl,st); {Выводим преобразованную строку в дополн. файл}
End;
Close(f);Erase(f); {Закрываем исходный файл и удаляем его}
Close(fl);Rename(fl,fname); {Закрываем и переименовываем}
END.
Задача №4 Подсчитать, сколько раз встретилось слово, введенное с клавиатуры, в файле.
Алгоритм:
- ввести имя файла, который будем использовать для поиска;
- открыть файл;
- ввести слово, которое нужно найти;
- обнулить счетчик слов;
- организовать цикл по всему файлу:
ѕ читать строку:
ѕ осуществлять в ней поиск слова;
ѕ если искомое слово встречается, то добавлять в счетчик;
- вывести результат
- закрыть файл.
Справка:
1). Имя файла - переменная строкового типа.
2). Т.к. файл существует, то для открытия файла использовать процедуру Reset(f),
где f- файловая переменная типа Text, которую предварительно нужно связать с именем файла с помощью процедуры Assign(f,fname). Такая связь позволит в дальнейшем использовать файловую переменную при работе с файлом, не прибегая к имени файла.
3). Т.к. поиск слова нужно производить по всему файлу, то целесообразно организовать цикл While Not Eof(f) Do {Пока не конец файла делать}
Begin
...
End;
4). Для поиска слова в строке использовать функцию pos(sl,st), результатом
В одной строке может оказаться несколько таких слов. Поэтому для поиска использовать цикл While pos(sl,st)<>0 do
Begin
...
End;
Uses Crt;
Var
s:Byte; {Счетчик слов}
f:Text; {Файловая переменная}
sl,st,fname:String;{sl - слово, которое ищем;st - строка файла;Fname - имя ф.}
BEGIN
ClrScr; {Чистим экран}
Writeln('введите имя файла:');{Выводим запрос на ввод имени файла}
Readln(fname); {Вводим имя файла}
Assign(f,fname); {Связываем файловую переменную с именем файла}
Reset(f); {Открываем существующий файл}
Writeln('введите слово:'); {Выводим запрос на ввод слова}
Readln(sl); {Вводим слово}
s:=0; {Обнуляем счетчик слов}
While Not Eof(f) Do {Пока не конец файла}
Begin {начало цикла по строкам файла}
Readln(f,st); {читаем строку из файла.}
While pos(sl,st)<>0 do {Пока будет встречаться слово в строке,}
Begin
Inc(s); {увеличиваем счетчик слов,}
Delete(st,pos(sl,st),1); {удаляем из строки символ в позиции,}
{в которой слово найдено.}
End;
End; {Конец цикла по строкам файла}
Writeln('слово встретилось ',s,' раз(а)');{Выводим результат на экран}
Close(f); {Закрываем файл}
Readkey; {Задержка вывода на экране}
END.
Задача №5. Прочитать текстовый файл и вывести его на экран, выделив искомое английское слово другим цветом, предусмотреть постраничный вывод на экран.
Эту задачу, как и многие другие, можно решать разными способами.
Алгоритм решения этой задачи сводится к тому, что:
ѕ в цикле, прочитав строку из файла, выводим ее сразу на экран в определенную позицию текущим цветом;
ѕ обнаружив в строке искомое слово (функция pos(slovo,st)), находим позицию вхождения слова в строку и выводим в эту позицию поверх уже выведенной строки слово другим цветом.
Справка:
1). В тексте одно и то же слово может состоять из прописных букв, заглавных или
смешанное. Разумно, искомое слово и строку после чтения из файла преобразовать к прописным буквам. И только после преобразований, производить поиск.
2). Для преобразования к прописным буквам необходимо использовать функцию UpCase(slovo[i]), которая имеет один параметр - символ, который нужно преобразовать ( slovo[i]:=UpCase(slovo[i]); ).
3). Функция преобразовывает только английские буквы.
Uses Crt;
Var
f:Text; {f - файловая переменная}
Fname, st,slovo:String; {имя файла, строка чтения из файла; искомое слово }
y,i:Byte;{y - координата вывода строки, i - позиция вхождения слова в строку}
BEGIN
TextBackGround(0); TextColor(7);
ClrScr;
Write('Имя файла ? '); Readln(st); {Вводим имя файла}
Assign(f,st);Reset(f); {Открываем файл}
Write('Слово ? '); Readln(slovo); {Вводим слово}
For i:=1 To Length(slovo) Do
slovo[i]:=UpCase(slovo[i]); {преобразовываем слово к прописным}
ClrScr;
y:=1; {Устанавливаем начальную координату У для вывода}
While Not EOF(f) Do {Цикл работает до конца файла}
Begin {Начало цикла}
Readln(f,st); {Читаем из файла строку}
TextColor(7); {Задаем цвет для вывода всей строки}
GoToXY(1,y); Write(st); {Устанавливаем курсор и выводим строку}
For i:=1 To Length(st) Do {В цикле по слову}
st[i]:=UpCase(st[i]); {преобразовываем строку к прописным}
While pos(slovo,st)<>0 Do {Пока слово есть в строке, то}
Begin {Начало цикла поиска}
i:=pos(slovo,st); {Определяем место расположения слова в строке}
st[i]:=' '; {Заменяем символ строки на пробел}
TextColor(2); {Задаем цвет для вывода слова}
GoToXY(i,y); Write(slovo);{Устанавливаем курсор и выводим слово}
End; {Конец цикла поиска}
Inc(y); {Меняем координату У для последующего вывода}
If Y>24 Then Begin {Условие постраничного просмотра}
Readkey;{Задержим вывод страницы на экране}
Y:=1...
Подобные документы
Описание типизированных файлов. Принципы работы с файлами, создание и открытие на запись нового файла. Чтение из файла, открытие существующего файла на чтение. Определение имени файла. Запись в текстовый файл. Описание множества и операции над ними.
реферат [86,4 K], добавлен 07.02.2011Особенности строковых типов данных и их обработка. Записи как совокупность поименованных компонентов различных типов, основные принципы работы с ними. Массивы - элементы и массивы структур. Понятие и свойства объединений. Файлы и работа с ними в языке СИ.
презентация [73,1 K], добавлен 09.12.2013Создание программного продукта на языке Pascal в визуальной среде программирования Borland Developer Studio в консольном приложении. Разработка типизированного файла для записи данных и их вывод на экран, добавление данных в конец файла, поиск информации.
курсовая работа [1,0 M], добавлен 04.12.2011Структура программного комплекса. Ввод информации из заданного файла. Создание набора данных. Добавление элементов в конец набора данных. Просмотр всех элементов набора данных. Копирование информации из НД в заданный файл. Сортировка массива по номерам.
курсовая работа [630,5 K], добавлен 01.06.2014Цикл с выходом по выбору определенного пункта меню. Хранение данных о предметной области в текстовом файле. Загрузка данных из текстового файла, хранение, удаление, сохранение и обработка. Создание новой базы данных. Структура программного комплекса.
курсовая работа [1,1 M], добавлен 19.01.2016Процедура ввода исходных данных в программу, вывод результатов работы программы на экран. Принцип организации хранения логически связанных наборов информации в виде файлов. Параметры характеристики файла, способы обращения к нему, соглашения по типу.
реферат [14,5 K], добавлен 06.12.2011Проверка существования и статуса файла. Определение его размера. Открытие файла для чтения, записи, добавления. Закрытие файловых дескрипторов. Запись из переменной в файл. Загрузка файла из сети. Создание и удаление каталога. Функции работы с каталогами.
презентация [133,9 K], добавлен 21.06.2014Понимание хранилища данных, его ключевые особенности. Основные типы хранилищ данных. Главные неудобства размерного подхода. Обработка информации, аналитическая обработка и добыча данных. Интерактивная аналитическая обработка данных в реальном времени.
реферат [849,7 K], добавлен 16.12.2016Структура программного комплекса. Создание набора данных. Описание модуля funkcii.tpu. Копирование информации из НД в заданный файл. Сортировка массива по номерам. Просмотр элементов и вычисление среднего, минимума и максимума из заданного диапазона.
курсовая работа [626,6 K], добавлен 18.06.2014Представление (построение, создание) списка данных в виде линейного однонаправленного списка. Формирование массива данных. Вывод данных на экран. Алгоритм удаления, перемещения данных. Сортировка методом вставки. Алгоритм загрузки данных из файла.
курсовая работа [2,1 M], добавлен 16.05.2015Создание базы данных и ее системы управления. Динамическая информационная структура, двунаправленный список. Создание файла, содержащего сведения об абонентах телефонной сети. Вывод информации в файл для печати. Обработка информации в базе данных.
курсовая работа [1,7 M], добавлен 18.03.2013Описание программного комплекса, его структура и общая характеристика составных модулей. Механизм создания набора данных, поиск элементов по номеру. Методика просмотра элементов и вычисление среднего, минимума и максимума из заданного диапазона.
курсовая работа [239,6 K], добавлен 12.12.2013Содержание исходного набора данных. Основные причины возникновения выбросов. Главные алгоритмы кластеризации. Обработка и очистка файла. Описание его полей. Прямоугольная вещественнозначная матрица. Метрика Минковского. Математическое определение объекта.
курсовая работа [1,4 M], добавлен 25.10.2016ASP – внутренняя технология, позволяющая подключать программы к web-страницам и обеспечивать чтение и запись в базе данных. Код разработанной ASP-страницы и его описание. Внешний вид полученного ответа на запуск ASP-страницы. HTML-код файла отчета.
лабораторная работа [219,1 K], добавлен 05.04.2015Структура заданного исходного файла и структуры данных, соответствующие данным файла. Подпрограмма проверки принадлежности текста к одной из шести кодовых таблиц. Алгоритмы перекодировки файла в cp1251. Алгоритм сортировки записей исходного файла.
курсовая работа [63,7 K], добавлен 12.12.2010Основы проверки и расчета входных данных и вывода выходных данных программы, их блок-схемы. Реализация функции считывания числовых данных из файла, управление (создание, уничтожение и редактирование) визуальными компонентами во время выполнения программы.
контрольная работа [1,3 M], добавлен 12.06.2009Особенности создания и распечатки на принтере текстового файла (документа), содержащего таблицу, с использованием шрифта Times New Roman черного цвета размером 12 пунктов. Алгоритм создания справочно-поисковой системы и баз данных в Бейсик-программе.
контрольная работа [462,1 K], добавлен 04.04.2012Структура данных с указанием типов. Общая структурная схема программы. Алгоритмы сортировки вставками. Назначение make-файла. Функции управления программой; перемещения и корректировки введенных данных и их удаления справочника, загрузки данных из файла.
курсовая работа [1,3 M], добавлен 12.01.2016Реализация программы, разработанной в среде Turbo C++. Обработка динамической структуры данных, содержащей сведения об авторах книг. Моделирование работы со структурой как с базой данных. Метод сортировки и описание работы пользовательских подпрограмм.
курсовая работа [124,3 K], добавлен 23.12.2010Разработка программы "Игроки КХЛ 2012-2013" на языке С++ с использованием классов списков структур для обработки данных. Описание глобальных переменных, разработанных функций. Главное меню программы. Чтение данных из файла, их просмотр и сохранение.
курсовая работа [2,2 M], добавлен 17.03.2016