Использование процедур над множествами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Использование процедур над множествами



Пример 4. Организовать ввод элементов трех множеств A, B, C. Вычислить и напечатать множества A + B, B * C, C - A.

Program CalcSet;
type SetChar: Set Of Char;
var A, B, C: SetChar;
{Процедура ввода множества}
procedure EnterSet(Var D: SetChar);
var ch: Char;
begin
Writeln (‘Введите элементы множества, точка - конец ввода’);
Read (ch);
D:=[];
While ch<>‘.’ Do
begin

D:= D + [ch];

Read (ch);

end;

end;{EnterSet}
{Процедура вывода множества}
procedure PrintSet(D: SetChar);
var i: Byte;
begin

For i:= 0 To 255 Do
If Chr(i) in D Then Writeln(Chr(i))
end;{PrintSet}
begin {Основная программа}
Writeln (‘Введите элементы множества A’);
EnterSet(A);
Writeln (‘Введите элементы множества B’);
EnterSet(B);
Writeln (‘Введите элементы множества C’);
EnterSet(C);
PrintSet(A+B); PrintSet(B*C); PrintSet(C-A);
end.

Строки

String (строка) - это один из дополнительных типов данных, введенных в системе программирования. Структура данных типа String [ N ] аналогична структуре данных типа Array [1.. N ] Of Char. Количество символов в данных типа String [ N ] может быть любым от 1 до 255. К любому символу в строке можно обратиться точно также, как к элементу одномерного массива, указав имя строки и индекс. Есть несколько способов объявления строк:

Type str4=string[4]; {объявление нового типа – строка

из четырёх символов}

Const n=4;

Var S1:string; {переменной S1 присваивается

строковый тип. S1 – строка из 255

символов по умолчанию}

S2:str4; {переменной S2 присваивается

созданный тип. S2– строка из 4 символов}

S3:string[n]; {S3 – строка из четырёх

символов}

В системе Паскаль для работы со строками предусмотрен ряд процедур и функции:

К строкам можно применять операцию “+” - сцепление, например:

st:=‘a’ + ‘b’;
st:= st + ‘c’; {st содержит ‘abc’}

Copy(s, i, N) - функция типа String; копирует из строки s N символов, начиная с символа с номером i.

Delete(s, i, N) - процедура; удаляет N символов в строке s, начиная с символа с номером i.

Insert(st, s, i) - процедура; вставляет подстроку st в строку s, начиная с символа с номером i.

Length(s) - функция типа Integer; возвращает длину строки s.

Pos(st,s) - функция типа Integer; отыскивает в строке s первое вхождение подстроки st и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращается 0.

Str(x:[width[: decimals]], s) - процедура; преобразует число x вещественного или целого типов в строку символов s так, как это делает процедура Writeln перед выводом.

Val(s,x,code) - процедура; преобразует строку символов s во внутреннее представление целой или вещественной переменной x, которое определяется типом этой переменной; параметр code содержит ноль, если преобразование прошло успешно, и тогда в x помещается результат преобразования, в противном случае он содержит номер позиции в строке st, где обнаружен ошибочный символ, и в этом случае содержимое x не меняется; ведущие пробелы в строке st должны отсутствовать.

Операции отношения =, <>, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо с учетом внутренней кодировки символов.

 

Задания на лабораторную работу

1. Что будет выведено на экран в результате работы программы?
Program Main;
var a,b,c,d: Integer;
function f (Var b: Integer; c: Integer): Integer;
var d: Integer;
begin
a:=2; b:=b+1; d:=3; c:=b-a;
Writeln(a,b,c,d); f:=d;
end;
begin

a:=0; b:=0; c:=0; d:=0;
d:=f(a,b); Writeln(a,b,c,d);
end.

2. Что будет выведено на экран в результате работы программы:

Program st;

const a: array[1..8] of char=’abcrcaab’;

var i:integer; k:string;

Begin

k:=’’;

for i:=8 downto 2 do

If a[i]<’c’ then k:=k+a[i];

Write (k);

end.

3. Дан текст. Напечатать его, предварительно преобразовав его следующим образом:

а) все вхождения ‘abc’ заменить на ‘def’;

б) удалить первое вхождение ‘w’, если такое есть;

в) удалить все вхождения ‘th’;

г) заменить на ‘ks’ первое вхождение ‘x’, если такое есть;

д) после каждой буквы ‘g’ добавить букву ‘u’;

е) заменить все вхождения ‘ph’ на ‘f’, а все вхождения ‘ed’ на ‘ing’.

4. Описать функцию Min(A,B) вещественного типа, находящую минимальное из двух вещественных чисел A и B. С помощью этой функции найти минимальные из пар чисел A и B, A и C, A и D, если даны числа A, B, C, D.

5. Организовать ввод элементов трех множеств A, B, C. Построить и вывести на печать множества A-B-C,B-A-C, A*B*C, A+B+C с подсчетом числа элементов в каждом из них. Задание выполнить с использованием процедур.

Задания на самостоятельную работу

Задание 1 предложено для решения всем вариантам. Задания из пунктов 2 и 3 выбираются по номеру варианта.

Задание 1. Дан текст. Между соседними словами - не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу:

а) перенести первую букву в конец слова;

б) перенести последнюю букву в начало слова;

в) удалить из слова все последующие вхождения первой буквы;

г) удалить из слова все предыдущие вхождения последней буквы;

д) оставить в слове только первые вхождения каждой буквы;

е) если слово нечетной длины, то удалить его среднюю букву.

Задание 2. Номер варианта соответствует номеру задания.

1. Дана строка. Вывести строку, содержащую те же символы, но расположенные в обратном порядке.

2. Дана строка. Вывести коды ее первого и последнего символа.

3. Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя преобразовать в число, то вывести 0.

4. Дано целое число. Вывести набор символов, содержащий цифры этого числа в исходном1|обратном2 порядке.

5. Даны два числа: N1 и N2, и две строки: S1 и S2. Получить из этих строк новую строку, объединив N1 первых символов строки S1 и N2 последних символов строки S2.

6. Даны две строки: S1 и S2. Проверить, содержится ли строка S2 в строке S1. Если да, то вывести номер позиции, начиная с которой S2 содержится в S1, если нет, то вывести 0.

7. Даны две строки: S1 и S2. Определить количество вхождений строки S2 в строку S1.

8. Дана строка S и символ C. Удвоить каждое вхождение символа C в строку S.

9. Даны строки S1, S2 и символ C. После каждого вхождения символа C в строку S1 вставить строку S2.

10. Даны строки S1, S2 и символ C. Перед каждым вхождением символа C в строку S1 вставить строку S2.

11. Даны три строки: S1, S2, S3. Заменить в строке S1 первое вхождение строки S2 на S3.

12. Дана строка-предложение, содержащая избыточные пробелы. Преобразовать ее так, чтобы между словами был ровно один пробел.

13. Дана строка из нескольких коротких предложений. Заменить точки и запятые в этой строке на «!» и «-».

14. Дан текст. Исключить из него символы, расположенные между скобками ‘(‘, ‘)’. Сами скобки тоже должны быть исключены. Предполагается, что внутри каждой пары скобок нет других скобок.

15. Дана текст. Преобразовать его по следующему правилу: если нет символа ‘*’, то оставить его без изменения, иначе заменить каждый символ, встречающийся после первого вхождения символа ‘*’, на символ ‘-’.

Задание 3.

В заданиях данной подгруппы требуется реализовать процедуры или функции с числовыми параметрами типа integer и real. Входные параметры этих типов обычно описываются как параметры-значения.

1. Описать процедуру Minmax(A,B), записывающую в переменную A минимальное из значений A и B, а в переменную B — максимальное из этих значений (A и B — вещественные параметры, являющиеся одновременно входными и выходными). Используя четыре вызова этой процедуры, найти минимальное и максимальное из чисел A, B, C, D.

2. Описать функцию Min(A,B,C) вещественного типа, находящую минимальное из трех вещественных чисел A, B и C. С помощью этой функции найти минимальные из наборов (A,B,C), (A,B,D), (A,C,D), если даны числа A, B, C, D.

3. Описать функцию Max(A,B,C) вещественного типа, находящую максимальное из трех вещественных чисел A, B и C. С помощью этой функции найти максимальные из наборов (A,B,C), (A,B,D), (A,C,D), если даны числа A, B, C, D.

4. Используя функцию Min(A,B,C), описать процедуру Min1(A,B,C,D) вещественного типа, находящую минимальное из четырех вещественных чисел A, B, C и D. С помощью этой функции найти минимальные из наборов (A,B,C,D), (A,B,C,E), (A,C,D,E), если даны числа A, B, C, D, E.

5. Используя функцию Max(A,B,C), описать процедуру Max1(A,B,C,D) вещественного типа, находящую максимальное из четырех вещественных чисел A, B, C и D. С помощью этой функции найти максимальные из наборов (A,B,C,D), (A,B,C,E), (A,C,D,E), если даны числа A, B, C, D, E.

6. Организовать ввод элементов множеств A и B. Проверить совпадают или не совпадают множества; является ли одно множество подмножеством другого. Вывести оба множества.

7. Организовать ввод элементов множеств A и B. Выполните над множествами операции пересечения, объединения и разности. Полученные результаты вывести в виде новых множеств на экран.

8. Организовать ввод элементов множеств A и B. Выполнить над множествами операции: =, <>, <=, >=, IN. Вывести на экран оба множества и полученные результаты работы над множествами.

Вычислить значение заданного выражения, используя процедуры и функции.

9. ;

10. ;

11. ;

12. ;

13. ;

14. ;

15. ;

 

Таблица вариантов для задания

Вариант Задания Вариант Задания Вариант Задания
  1, 8   6, 13   5, 11
  2, 9   7, 14   6, 12
  3, 10   2, 15   7, 13
  4, 11   3, 9   1, 14
  5, 12   4, 10   3, 8

 


ЛАБОРАТОРНАЯ РАБОТА №5

Тема. Записи.

Цель. Научиться писать программы на языке Паскаль с использованием типа запись. Описание записей. Операции над записями.

 

Теория.

Запись - это структура данных, состоящая из фиксированного числа компонент, называемых полями. Каждое поле имеет свой идентификатор и тип. К компонентам записи возможен прямой доступ и они могут выборочно обновляться. Идентификатор в самой записи должен быть уникальным. Для обращения к отдельным полям записи указываются составные имена: имя записи, после которого ставится точка и записывается идентифика­тор поля. Запись можно передавать в качестве параметра процедуры или функции, но зна­чением функции запись быть не может.

Тип Запись используются для организации разнотипных данных. Он вводится с помощью ключевого слова record. Описание записей имеет следующий вид:

Type <имя_типа>= record

Список полей 1: тип 1; {Описание 1-го поля

записи;}

Список полей 2: тип 2; {Описание 2-го поля

записи;}

…..

Список полей n: тип n; {Описание n-го поля

записи;}

[ Case ключ выбора of

значение 1:(полей 1: тип 1);

…]

End;

Var A: arrya [1..1O] of <имя_типа>;

B: <имя_типа>;

Поля записи могут быть любого типа, кроме файлового.

 

Пример 1. Пример объявления типа запись и ввода значений.

type Men = Record

FIO,Adress: string;

Year: byte;

end;

var A,B: Men;

Begin

A.FIO:='Иванов И.И.';

A.Adress:='пp. Ленина, д. 40, кв. 10';

A.Year:=1981;

end.

Пример 2. Программа "Адресная книжка".

Program Adress_Book;

uses Crt;

Type

AdressItem = record

Fio: String;

Adress: String;

Phone: LongInt;

Email: String;

end;

Var

Book: Array [1..10] of Adressitem;

Nums, I: Byte;

Code: Integer;

C: Char;

Quit: Boolean;

{ процедура добавления новой записи }

Procedure New_Item;

Var

F, A, Em: String;

Ph: LongInt;

Begin

ClrScr; {модуль очистки экрана}

Inc(Nums);

if Nums > 10 then begin

Write('Максимальное количество записей!');

exit; {выход из процедуры}

end;

Writeln('Запись N', Nums); Writeln;

Write('Введите ФИО: ');

Readln(F);

Write('Введите адрес: ');

Readln(A);

Write('Введите телефон: ');

Readln(Ph);

Write('Введите E-mail: ');

Readln(Em);

Writeln;

with Book[Nums] do begin

Fio:= F;

Adress:= A;

Phone:= Ph;

Email:= Em;

end;

Write('Новая запись успешно добавлена!');

end;

{ процедура отображения данных отдельной записи }

Procedure List_Item(N: Byte);

Begin

if N > Nums then begin

Write('Неправильный номер записи');

exit; {выход из процедуры}

end;

With Book[N] do begin

Writeln('Запись N', N); Writeln;

Writeln('ФИО: ', Fio);

Writeln('Aдрес: ', Adress);

Writeln('Tелефон: ', Phone);

Writeln('E-mail: ', Email);

Writeln;

end;

Readln;

end;

{основная программа}

Begin

Quit:= False;

Nums:= 0;

Repeat

ClrScr;

Writeln('Программа "Записная книжка"');

Writeln('==========================='); Writeln;

Writeln('Записи: ');

Writeln('--------------------');

if Nums = 0 then Writeln('Записей нет. Книжка пуста.')

Else

For I:= 1 to Nums do

Writeln(I, ' - ФИО: ', Book[I].Fio);

Writeln('--------------------'); Writeln; Writeln;

Writeln('''a'' - добавить запись');

Writeln('Номер - показать запись');

Writeln('Esc - выход');

Writeln;

Write('Ваш выбор: ');

C:= ReadKey;

case C of

'1'..'9': begin

Val(C, I, Code);

List_Item(I);

end;

'a': New_Item;

#27: Quit:= true;

end;

until Quit;

End.

Пример 3. Дан массив записей со следующей структурой:

- шифр группы;

- номер зачетной книжки;

- код дисциплины;

- оценка.

Требуется определить средний балл студентов группы 125 АТПП. При вводе массива последняя запись имеет шифр группы «99999».

program SRball;

type zap = record

shg: string [5];

nzk: integer;

kd: 1..100;

oc:2..5

end;

var mas: array [1..100] of ZAP;

k,n,i: byte;

sum: real;

Begin

i:=0;

Repeat

i:=i+1;

readln (mas [i]. shg, mas [i]. nzk, mas [i]. kd, mas [i]. oc)

until mas [i]. shg ='99999';

n:=I; sum:=0; k:=0;

for i:=1 to N do

if mas [i]. shg =’ 125 АТПП ’ then begin

sum:=sum+ mas [i]. oc;

inc(k);

end;

if k<>0 then sum:=sum/k;

writeln ('Средний балл в группе =', sum);

End.

 

В операторе ввода данных необходимо указать полное имя каждого поля, а не про­сто имя записи. Данные во входном потоке должны быть в соответствии с обычными пра­вилами.

Оператор присоединения. При обращении к компонентам записи используются составные имена. Для сокра­щения имен и повышения удобства работы с записями применяется оператор присоедине­ния with.

with < идентификатор переменной типа record > do < оператор >;

Тогда в операторе при ссылке на компоненты записи имя переменной можно опускать.

При использовании оператора присоединения фрагмент рассмотренной ранее про­граммы будет выглядеть:

Пример 4.

Begin

i:=0;

with mas [i] do begin

Repeat

i:=i+1;

readln (mas [i]. shg, mas [i]. nzk, mas [i]. kd, mas [i]. oc)

until mas [i]. shg ='99999';

n:=I; sum:=0; k:=0;

for i:=1 to N do

if mas [i]. shg =’ДK101’ then begin

sum:=sum+ mas [i]. oc;

inc(k);

end;

end;

if k<>0 then sum:=sum/k;

writeln ('Средний балл в группе =', sum);

End.

 

Задание на лабораторную работу

Описать структуру с именем PRICE,содержащую следующие поля:

¾ Название товара;

¾ Название магазина, в котором продается товар;

¾ Стоимость товара в руб.

Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE; записи должны быть размещены в алфавитном порядке по названиям товаров;

¾ Вывод на экран информации о товаре, название которого введено с клавиатуры;

¾ Если таких товаров нет, выдать на дисплей соответствующее сообщение.

Задание на самостоятельную работу. Вариант задания соответствует номеру.

1. а) Описать структуру с именем STUDENT, содержащую следующие поля:

¾ NAME- фамилия и инициалы;

¾ Номер группы;

¾ Успеваемость (массив из пяти элементов).

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию номера группы;

¾ Ввод на дисплей фамилий и номеров групп для всех студентов, включенных в массив, если средний балл студента больше 4,0;

¾ Если таких студентов нет, вывести соответствующее сообщение.

2. а) Описать структуру с именем STUDENT, содержащую следующие поля:

¾ NAME- фамилия и инициалы;

¾ Номер группы;

¾ Успеваемость (массив из пяти элементов).

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла;

¾ Ввод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5;

¾ Если таких студентов нет, вывести соответствующее сообщение.

3. а) Описать структуру с именем STUDENT, содержащую следующие поля:

¾ фамилия и инициалы;

¾ Номер группы;

¾ Успеваемость (массив из пяти элементов).

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящих из десяти структур типа STUDENT; записи должны быть упорядочены по алфавиту;

¾ Вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2;

¾ Если таких студентов нет, вывести соответствующее сообщение.

4. а) Описать структуру с именем STUDENT, содержащую следующие поля:

¾ Название пункта назначения рейса;

¾ Номер рейса;

¾ Тип самолета.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT; записи должны быть упорядочены по возрастанию номера рейса;

¾ Вывод на экран номеров рейсов и типов самолетов, вылетающих в пункт назначения, название которого совпало с названием, введенным с клавиатуры;

¾ Если таких рейсов нет, выдать на дисплей соответствующее сообщение.

5. а) Описать структуру с именем AEROFLOT, содержащую следующие поля:

¾ Название пункта назначения рейса;

¾ Номер рейса;

¾ Тип самолета.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;

¾ Вывод на экран пунктов назначения и номеров рейсов, обслуживаемых самолетом, тип которого введен с клавиатуры;

¾ Если таких рейсов нет, выдать на дисплей соответствующее сообщение.

6. а) Описать структуру с именем WORKER, содержащую следующие поля:

¾ Фамилия и инициалы работника;

¾ Название занимаемой должности;

¾ Год поступления на работу.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; записи должны быть размещены по алфавиту;

¾ Вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;

¾ Если таких работников нет, вывести на дисплей соответствующее сообщение.

7. а) Описать структуру с именем TRAIN, содержащую следующие поля:

¾ Название пункта назначения;

¾ Номер поезда;

¾ Время отправления.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN; записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;

¾ Вывод на экран информацию о поездах, время отправления которых введено с клавиатуры;

¾ Если таких поездов нет, выдать на дисплей соответствующее сообщение.

8. а) Описать структуру с именем TRAIN, содержащую следующие поля:

¾ Название пункта назначения;

¾ Номер поезда;

¾ Время отправления.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN; записи должны быть упорядочены по номерам поезда;

¾ Вывод на экран информацию о поездах, направляющихся в пункт, название клавиатуры которого введено с клавиатуры;

¾ Если таких поездов нет, выдать на дисплей соответствующее сообщение.

9. а) Описать структуру с именем TRAIN, содержащую следующие поля:

¾ Название пункта назначения;

¾ Номер поезда;

¾ Время отправления.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN; записи должны быть упорядочены по номерам поездов;

¾ Вывод на экран информации о поезде, номер которого введен с клавиатуры;

¾ Если нет таких поездов, выдать на дисплей соответствующее сообщение.

10. а) Описать структуру с именем MARSH, содержащую следующие поля:

¾ Название начального пункта маршрута;

¾ Название конечного пункта маршрута;

¾ Номер маршрута.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH, записи должны быть упорядочены по номерам маршрутов;

¾ Вывод на экран информации о маршруте, номер которого введен с клавиатуры;

¾ Если таких маршрутов нет, выдать на дисплей соответствующее сообщение.

11. а) Описать структуру с именем MARSH, содержащую следующие поля:

¾ Название начального пункта маршрута;

¾ Название конечного пункта маршрута;

¾ Номер маршрута.

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH, записи должны быть упорядочены по номерам маршрутов;

¾ Вывод на экран информации о маршруте, который начинается или кончается в пункте, название которого введено с клавиатуры;

¾ Если таких маршрутов нет, выдать на дисплей соответствующее сообщение.

12. а) Описать структуру с именем NOTE, содержащую следующие поля:

¾ Фамилии, имя;

¾ Номер телефона;

¾ День рождения (массив из трех чисел).

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть упорядочены по датам дней рождения;

¾ Вывод на экран информации о человеке, номер телефона которого введен с клавиатуры;

¾ Если такого нет, выдать на дисплей соответствующее сообщение.

13. а) Описать структуру с именем NOTE, содержащую следующие поля:

¾ Фамилии, имя;

¾ Номер телефона;

¾ День рождения (массив из трех чисел).

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть размещены по алфавиту;

¾ Вывод на экран информации о людях, чьи дни рождения приходятся на месяц, значение которого введено с клавиатуры;

¾ Если такого нет, выдать на дисплей соответствующее сообщение.

14. а) Описать структуру с именем NOTE, содержащую следующие поля:

¾ Фамилии, имя;

¾ Номер телефона;

¾ День рождения (массив из трех чисел).

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE; записи должны быть упорядочены по трем первым цифрам номера телефона;

¾ Вывод на экран информации о людях, чья фамилия введена с клавиатуры;

¾ Если такого нет, выдать на дисплей соответствующее сообщение.

15. а) Описать структуру с именем ZNAK, содержащую следующие поля:

¾ Фамилия, имя;

¾ Знак Зодиака;

¾ День рождения (массив из трех чисел).

б) Написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по датам дней рождений;

¾ Вывод на экран информации о человеке, чья фамилия введена с клавиатуры;

¾ Если такого нет, выдать на дисплей соответствующее сообщение.

16. а) Описать структуру с именем ZNAK, содержащую следующие поля:

¾ Фамилия, имя;

¾ Знак Зодиака;

¾ День рождения (массив из трех чисел).

б) написать программу, выполняющую следующие действия:

¾ Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK; записи должны быть упорядочены по датам дней рождений;

¾ Вывод на экран информации о людях, родившихся под знаком, наименование которого введено с клавиатуры;

¾ Если такого нет, выдать на дисплей соответствующее сообщение.

 


ЛАБОРАТОРНАЯ РАБОТА №6

Тема. Модульное программирование. Рекурсия.

Цель. Иметь представление о модульном программировании. Научиться писать пользовательские модули и применять стандартные. Типы подпрограмм. Передача данных в подпрограмме. Стандартная библиотека. Понятие рекурсии. Виды рекурсивных вызовов.

 

Теория.

Модульное программирование

Модуль - это подключаемая к программе библиотека ресурсов. Он может содержать описание типов, констант, переменных и подпрограмм. В модуль обычно объединяют связанные между собой ресурсы. Модули применяются либо как библиотеки, которые могут использоваться различными программами, либо разбиения сложной программы на составные части.

Модули можно разделить на стандартные, которые входят в состав системы программирования, и пользовательские, то есть создаваемые программистом. Чтобы подключить модуль к программе в Turbo Pascal, его требуется предварительно скомпилировать. Результат компиляции каждого модуля хранится на диске в отдельном файле с расширением .tpu.

Описание модулей:

Unit <имя_модуля>; {заголовок модуля}

Interface {интерфейсная секция модуля}

{описание глобальных элементов модуля (видимых из вне)}

Implementation {секция реализации модуля}

{ описание локальных (внутренних) элементов модуля }

Begin {секция инициализации}

{может отсутствовать}

End.

Модуль может использовать другие модули; для этого их надо перечислить в операторе Uses, который может находиться только непосредственно после ключевых слов interface или implementation.

В оболочках Borland Pascal with Objects и Turbo Pascal результат компиляции по умолчанию размещаются в оперативной памяти и на диск не записывается. Поэтому для сохранения скомпилированного модуля на диске требуется установить значение пункта Destination меню Compile в значение Disk. Компилятор создает файл с расширением. tpu, который надо переместить в специальный каталог, путь к нему указан в пункте Directories меню Options в поле Unit Directories. Кроме того, откомпилированный модуль может находиться в том же каталоге, что и использующие его программы, а также в библиотеке исполняющей системы. Поместить модуль в библиотеку исполняющей системы можно с помощью утилиты tpumover. exe, которая входит в состав системы программирования. Этот способ применяется для часто используемых и хорошо отлаженных модулей.

В интегрированной оболочке PascalABC.NET модули предназначены для разбиения текста программы на несколько файлов. В модулях описываются переменные, константы, типы, классы, процедуры и функции. Для того чтобы эти объекты можно было использовать в вызывающем модуле (которым может быть и основная программа), следует указать имя файла модуля (без расширения.pas) в разделе uses вызывающего модуля. Файл модуля (.pas) или откомпилированный файл модуля (.pcu) должен находиться либо в том же каталоге, что и основная программа, либо в подкаталоге Lib системного каталога программы PascalABC.NET.

Пример 1. Описания модуля. Вычисление среднего арифметического значения элементов массива.

Unit Arif;

Interface

Const n=10;

Type mas=array[1..n] of real;

Procedure Rarif(x:mas; var af:real);

Implementation

Procedure Ra rif(x:mas; var af:real);

Var i:integer;

Begin

af:=0;

for i:=1 to n do af:=af+x[i];

af:=af/n;

end;

End.

Использование модулей

Имя модуля следует указывать в разделе Uses программы. Можно записывать несколько имен модулей через запятую.

 

Пример 2. Использование модуля. Найти разность средних арифметических значений двух вещественных массивов.

 

Program A;

Uses Arif;

Var c,b:mas;

I:integer;

Dif,av_c,av_b:real

Begin

for i:=1 to n do read(c[i]);

for i:=1 to n do read(b[i]);

Rarif (c,av_c);

Rarif (b,av_b);

Dif:=av_c-av_b;

Writeln (‘Разность значений’,dif:6:2);

End.

 

Рекурсия

В общем случае рекурсией называется ситуация, когда какой-то алгоритм вызывает себя прямо или через другие алгоритмы в качестве вспомогательного. Сам алгоритм при этом называется рекурсивным. Понятно, что без конца такие вызовы продолжаться не могут, так как в противном случае получится бесконечный цикл. Поэтому при построении рекурсивного алгоритма предусматриваются случаи, когда результат вычисляется явно (непосредственно) без «самовызова».

Таким образом, любая рекурсия обязательно должна содержать два условия:

1) Вычисление результата через другие значения (для простейших случаев). Выполнение этого условия не должно повлечь за собой нового рекурсивного вызова.

2) Вычисление значения с помощью «самовызова» функции (рекурсивный вызов).

Пример 3. Широко известно рекурсивное определение факториала:

Здесь n - неотрицательно.

Решение. В первой строке определения явно указано, как вычислить факториал, если аргумент равен нулю или единице. В любом другом случае для вычисления n! необходимо вычислить предыдущее значение (n-1)! и умножить его на n. Уменьшающееся значение гарантирует, что в конце концов возникнет необходимость найти 1! или 0!, которые вычисляются непосредственно.

 

program Recursiya;

var n: integer; { исходное значение }

function fact(i:integer):integer;

Begin

if (i=1) or (i=0) then fact:= 1

else fact:= fact(i-1)*i;

end;

Begin

write('Введите нужное значение n ');

readln(n);

writeln('Факториал ',n,' равен ',fact(n))

end.

 

Задание на лабораторную работу

Вычисление n!. Использовать полученный модуль для вычисления , где n,m –целые числа. Вычисление факториала – рекурсивная функция.

 

Задание на самостоятельную работу.

При оформлении данного задания следует указать последовательность ваших действий при создании модуля, а также распечатать, как текст модуля, так и тест программы. Номер задачи соответствует номеру варианта.

1. Написать модуль по вычислению произведения элементов массива. Массив – целочисленный, одномерный. Количество элементов массива – 9.

2. Написать модуль по вычислению суммы элементов массива. Массив – вещественный, одномерный. Количество элементов массива - 7

3. Написать модуль по вычислению суммы чётных элементов массива Массив – целочисленный, одномерный. Количество элементов массива - 10

4. Написать модуль по вычислению суммы нечётных элементов массива. Массив – целочисленный, одномерный. Количество элементов массива - 8

5. Написать модуль по вычислению произведения чётных элементов массива Массив – целочисленный, одномерный. Количество элементов массива - 11

6. Написать модуль по вычислению произведения нечётных элементов массива. Массив – целочисленный, одномерный. Количество элементов массива - 9

7. Написать модуль по вычислению произведения положительных чисел массива. Массив – целочисленный, одномерный. Количество элементов массива - 9

8. Вычисление tg(x). Использовать полученный модуль для вычисления функции

9. Вычисление Ctg(x). Использовать полученный модуль для вычисления функции

10. Написать модуль – возведения в степень n числа a. Используя данный модуль вычислить значения функции

11. Найти координаты верши­ны параболы у = ах2 + bх + с, где a и b – суммы четных и нечётных элементов целочисленного массива из 10 элементов. В модуль оформить программу вычисления а

12. Написать модуль для определения площади треугольника. Использовать данный модуль при определении суммы площадей n треугольников, стороны и высоты которых вводят с клавиатуры.

13. Написать модуль для определения площади трапеции. Использовать данный модуль при определении суммы площадей n трапеций, стороны и высоты которых вводят с клавиатуры.

14. Написать модуль для определения периметра прямоугольника. Использовать данный модуль при определении произведения периметров n прямоугольников, стороны и высоты которых вводят с клавиатуры.

15. Описать функцию Fact(N) целого типа в модуле, для вычисления значения "двойного факториала": N!! = 2·4·6·...·N, если N — четное (N > 0 — параметр целого типа). С помощью этой функции вычислить двойные факториалы десяти данных чисел.

 

Изучить все стандартные модули TP и PascalABC.NET. Оформить самостоятельную работу.


ЛАБОРАТОРНАЯ РАБОТА №7

Тема. Работа с файлами

Цель. Научиться писать программы для работы с файлами. Уметь описывать файловые переменные, использовать подпрограммы для работы с файлами.

 

Теория.

Классификация файлов

В программе существует три класса файлов - типизированные, бестиповые и текстовые, - которые позволяют считывать большие объемы данных непосредственно с диска, не вводя их с клавиатуры.

Текстовыми - называют файлы, состоящие из любых символов. Они органи­зуются по строкам, каждая из которых заканчивается символом «конец стро­ки». Конец самого файла обозначается символом «конец файла». При записи информации в текстовый файл, просмотреть который можно с помощью лю­бого текстового редактора, все данные преобразуются в символьный тип и хра­нятся в этом виде.



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 554; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.5.239 (0.352 с.)