Обработка структур данных

Характеристика структурного типа данных и их обработка: массивы; строки; множества; файлы (определение текстового файла; его структура и обработка; запись в файл; чтение из файла); основные правила работы с типизированными и нетипизированными файлами.

Рубрика Программирование, компьютеры и кибернетика
Вид учебное пособие
Язык русский
Дата добавления 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.2016

  • ASP – внутренняя технология, позволяющая подключать программы к 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.