Организация практических занятий 


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



ЗНАЕТЕ ЛИ ВЫ?

Организация практических занятий



Организация практических занятий

По изучению основ

структурного программирования
на языке Pascal

(примеры решенных задач)

 

Тема 1. Линейные программы.. 2

Тема 2. Разветвляющиеся программы.. 4

Тема 3. Циклические программы.. 6

Тема 4. Обработка данных строкового типа. 12

Темы 5 - 8. Система типов языка Pascal. Перечисляемый тип, тип-диапазон, множественный тип. 17

Тема 9. Массивы в языке Pascal 19

Тема 11. Подпрограммы в языке Pascal 24

Тема 12. Тип данных запись (Record) 26

Тема 13. Работа с файлами в языке Pascal 29

Тема 14. Динамические переменные в языке Pascal 38

 

 


Тема 1. Линейные программы

Примеры решаемых задач

Пример 1. Составить программу, которая вычислит площадь и периметр прямоугольного треугольника, если известны его катеты.

Составим модель данной задачи. Исходными данными являются длины катетов A и B. Это числа (могут быть как целыми, так и вещественными). Результат: площадь S и периметр P (действительные числа). Для вычисления периметра необходимо предварительно вычислить длину гипотенузы C (действительное число).

Алгоритм решения: ввод исходных данных, необходимые вычисления, вывод результатов на экран.

Программа:

Program Triangle; {Заголовок программы}

Uses Crt; {Подключение модуля CRT}

Var A, B: Integer; {Описание всех переменных}

S, P, C: Real;

Begin { Начало исполняемой части программы }

Clrscr; { Очистка экрана }

Write(‘Введите длину 1-го катета’); { Ввод исходных данных }

Readln (A);

Write(‘Введите длину 2-го катета’);

Readln (B);

C:=Sqrt (Sqr (A)+Sqr (B)); { Вычисление длины гипотенузы }

S:=A*B/2; { Вычисление площади треугольника }

P:=A+B+C; { Вычисление периметра }

Writeln (‘Площадь ’, S:7:2); { Вывод результатов на экран }

Writeln (‘Периметр ’, P:7:2); { (:7:2 – формат вывода – 7 позиций на экране будет отведено на вывод всего числа, 2 позиции – на вывод его дробной части)}

Readln { Задержка программы до нажатия клавиши <Enter> }

End.

Пример 2. Составить программу, которая вычислит сумму цифр введенного четырехзначного целого числа.

Составим модель данной задачи. Исходными данными является целое число A. Результат: сумма цифр S. Для вычисления сумы цифр необходимо сначала выделить четыре цифры введенного числа: первая цифра – количество тысяч (результат деления числа на 1000 нацело), последняя цифра вычисляется как остаток от деления введенного числа на 10 и т.п.

Алгоритм решения: ввод исходных данных, необходимые вычисления, вывод результатов на экран.

Программа:

Program Digits; Uses Crt; Var A, D1,D2,D3,D4,S: Integer; Begin   Clrscr; Write (‘Введите 4-значное число’); Readln (A); D1:=A div 1000; D2:=A div 100 mod 10; D3:=A div 10 mod 10; D4:=A mod 10; S:=D1+D2+D3+D4; Writeln (‘Сумма цифр числа ’, S); Readln End. {Заголовок программы} {Подключение модуля CRT} {Описание всех переменных} {Начало исполняемой части программы} {Очистка экрана}   {Ввод исходного числа} {Вычисление первой цифры} {Вычисление второй цифры} {Вычисление третьей цифры} {Вычисление четвертой цифры} {Вычисление суммы цифр} {Вывод результата на экран} {Задержка до нажатия <Enter>} {Конец программы}

Тема 2. Разветвляющиеся программы

Примеры решаемых задач

Пример 1. Составить программу, которая определит большее из двух введенных чисел.

Программа:

Program maximum;

Uses Crt;

Var A, B: Integer;

Begin

Clrscr;

Write (‘Введите два числа ’);

Readln (A, B);

If A>B

Then Writeln (‘Большее число ’, A)

Else If B>A

Then Writeln (‘Большее число ’, B)

Else Writeln (‘Числа равны’);

Readln

End.

Пример 2. Составить программу, которая вводит число, обозначающее количество лет, и выводит для этого числа наименование «год», «года» или «лет». Например, «14 лет», «183 года», «31 год».

Составим модель данной задачи. Исходным данным является целое число A. Результат: наименование. Наименование зависит от последней цифры введенного числа: 1 - «год»; 2,3,4 – «года», 0,5,6,7,8,9 – «лет». Исключением являются числа, две последних цифры которых составляют число от 11 до 14 – в этом случае требуемым наименованием будет «лет» («12 лет»).

Алгоритм решения:

ввод числа А;

вычисление числа В из двух последних цифр числа А;

если В лежит в интервале от 11 до 14,

то писать наименование «лет»

иначе

выделить последнюю цифру числа А (обозначим С);

если С=1, то вывести наименование «год»;

если С=2 или С=3 или С=4, то вывести наименование «года»;

если С=0 или С в интервале от 5 до 9, то вывести наименование «лет».

Программа:

Program Years;

Uses Crt;

Var A, B, C: Integer;

Begin

Clrscr;

Write (‘Введите число ’);

Readln (A);

B:= A mod 100;

If (B>=11) And (B<=14)

Then Writeln (A, ‘ лет’)

Else Begin

C:= A mod 10;

Case C Of

1: Writeln (A, ‘ год’);

2, 3, 4: Writeln (A, ‘ года’);

0, 5..9: Writeln (A, ‘ лет’)

End

End;

Readln

End.


Примеры решаемых задач

Пример 1. Составить программу, которая выведет на экран числа от 1 до N.

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

Цикл с предусловием Цикл с постусловием Цикл со счетчиком
Program Numbers; Uses Crt; Var k, n: Integer; Begin Clrscr; Write(‘Введите N ’); Readln(n); k:=1; While k<=n do Begin Writeln(k); k:=k+1 End; Readln End. Program Numbers; Uses Crt; Var k, n: Integer; Begin Clrscr; Write(‘Введите N ’); Readln(n); k:=1; Repeat Writeln(k); k:=k+1 Until k=n+1; Readln End. Program Numbers; Uses Crt; Var k, n: Integer; Begin Clrscr; Write(‘Введите N ’); Readln(n); For k:=1 To n Do Writeln(k); Readln End.

Пример 2. Составить программу, которая будет запрашивать пароль до тех пор, пока не будет введен верный ответ.

Программа:

Program Password;

Uses Crt;

Const Pass=’паскаль’;   { верный ответ }

Var S: String;

Begin

Clrscr;

Repeat

Write (‘Пароль ’);

Readln (S);   { вводим пароль }

If S <> Pass Then Writeln(‘Неверно!’)

Until S=Pass;   { цикл закончен, если ввели верный пароль }

Writeln (‘Верно!’);

Readln

End.

Пример 3. Составить программу, которая выведет на экран все положительные члены арифметической прогрессии с разностью D= -1.5 и первым членом A.

Программа:

Program Progress;

Uses Crt;

Const D= -1.5; { Константа – разность прогрессии }

Var A: Real; { В А будут храниться по очереди все члены прогрессии }

Begin

Clrscr;

Write (‘Введите первый член прогрессии ’);

Readln (A);

While A > 0 Do {пока очередной член прогрессии положителен}

Begin

Writeln(A); { печатаем число – член прогрессии }

A:= A + D { вычисляем следующий член прогрессии и записываем его в ту же переменную А }

End;

Readln

End.

Пример 4. Составить программу, которая вычислит общее количество «5», «4», «3» и «2», полученных студентами группы за экзамен по программированию, а также средний балл за экзамен, если известны количество студентов в группе и отметки каждого из них. 

Программа:

Program Students;

Uses Crt;

Var N, K, K5, K4, K3, K2, S, M: Integer;

{ N – количество студентов в группе,

K – счетчик всех студентов,

K5 – счетчик «5»,

K4 – счетчик «4»,

K3 – счетчик «3»,

K2 – счетчик «2»,

S – сумма всех отметок,

M – отметка очередного студента }

Sb: Real; { Sb – средний балл за экзамен }

Begin

Clrscr;

Write (‘Сколько студентов в группе? ’);

Readln (N);

For K:= 1 To N Do { перебираем всех студентов }

Begin

Writeln (‘введите отметку ’, K, ‘студента ’);

Readln (M); {В переменную М вводим все отметки по очереди}

S:= S+M; { В переменной S накапливается сумма всех отметок}

Case M Of { Увеличиваем нужный счетчик }

5: K5:= K5 + 1;

4: K4:= K4 + 1;

3: K3:= K3 + 1;

2: K2:= K2 + 1

End

End;

Sb:= S / N;      { Вычисляем средний балл }

Writeln (‘Количество «5» ’, К5);

Writeln (‘Количество «4» ’, К4);

Writeln (‘Количество «3» ’, К3);

Writeln (‘Количество «2» ’, К2);

Writeln (‘Средний балл группы за экзамен ’, Sb:5:2);

Readln

End.

Пример 5. Составить программу, которая определит наибольшее из N вводимых чисел.

Алгоритм поиска экстремума (максимума или минимума) числовой последовательности: сначала вводится первое число, оно полагается максимальным (или минимальным). После этого вводятся все остальные числа (от 2-го до N-го), каждое из них сравнивается с максимумом (минимумом), и если оно больше (меньше), то максимуму (минимуму) присваивается введенное число.

Программа:

Program Maximum;

Uses Crt;

Var Max, X: Real;

K, N: Integer;

Begin

Clrscr;

Write (‘Сколько чисел? ’);

Readln (N);

Write (‘Введите первое число ’);

Readln (Max);

For K:= 2 To N Do      

Begin

Writeln (‘Введите ’, K, ‘ число ’);

Readln (X);   

If X > Max Then Max:= X

End;

Writeln (‘Наибольшее из введенных чисел ’, Max);

Readln

End.

Пример 6. Составить программу, которая рисует в алфавитно-цифровом режиме звездное небо из N разноцветных звезд, расположенных на экране случайным образом.

Указание: Для решения данной задачи необходимо использовать специальную функцию – датчик случайных чисел. Она вызывается следующим образом: Random (N). Датчик случайных чисел возвращает случайное целое число из интервала от 0 до N-1. Таким образом, после выполнения команды

A:= Random (10);

значением переменной А будет какое-то число (неизвестное заранее) из интервала от 0 до 9. Для того, чтобы при каждом запуске программы генерировалась новая последовательность случайных чисел, необходимо перед вызовом функции Random выполнить инициализацию датчика случайных чисел. Она выполняется командой Randomize (т.е. вызывается процедура с таким именем).

Кроме того, для решения данной задачи может потребоваться использование следующих процедур из модуля CRT:

1. ClrScr; - очистка экрана;

2. TextColor(c); - цвет выводимого текста, 0 £ с £ 15. Параметр С – это номер цвета (см. Приложение 1).

3. TextBackGround(c); - цвет фона, 0 £ с £ 7. Параметр С – это номер цвета (см. Приложение 1).

4. GotoXY(x,y); - позиционирование курсора в точку с координатами (x,y): 1 £ x £ 80, 1 £ y £ 25 (или 1 £ y £ 40 в зависимости от установленного максимального количества строк в алфавитно-цифровом режиме).

5. Delay(n); - приостановка (задержка) работы программы на n миллисекунд.

Программа:

Program Sky;

Uses Crt;

Var n, i, x, y, c: Integer;

Begin

ClrScr;

Write (‘Сколько звезд будет на небе? ’);

Readln (n);

ClrScr;

Randomize;

For i:= 1 To n Do

Begin

x:= random (80) + 1;

y:= random (24) + 1;

c:= random (15) + 1;

TextColor (c);

Gotoxy (x, y);

Write (‘ * ’)

end;

Readln

End.


Примеры решаемых задач

Пример 1. Составить программу, которая определит, сколько раз заданная буква встречается во введенном предложении.

Программа:

Program S1;

Uses Crt;

Var P: String [80]; { предложение }

B: Char;     { буква }

K, N, M: Integer; 

Begin

Clrscr;

Write (‘Введите предложение ’);

Readln (P); { ввели предложение }

Write (‘Введите букву ’);

Readln (B); { ввели букву }

M:=0;     { обнулили счетчик заданных букв }

N:= Length (P); { определили длину предложения }

For K:= 1 To N Do { перебираем все символы предложения

от первого до последнего }

If P[K]=B { если К-ый символ строки Р равен заданной букве}

Then M:= M+1; { увеличиваем счетчик букв }

Writeln (‘Буква  ’, B, ‘ встречается в предложении ’, M, ‘ раз’);

                       { вывели результат на экран }

Readln

End.

Пример 2. Составить программу, которая заменит во введенной строке один заданный символ на другой.

Программа:

Program S2;

Uses Crt;

Var P: String [80];  { строка}

B1, B2: Char; { буквы }

K, N, M: Integer; 

Begin

Clrscr;

Write (‘Введите строку текста ’);

Readln (P); { ввели исходную строку }

Write (‘Введите символ, который надо заменить ’);

Readln (B1); { ввели первый символ }

Write (‘На что заменять? ’);

Readln (B2); { ввели второй символ }

N:= Length (P); { определили длину предложения }

For K:= 1 To N Do  { перебираем все символы предложения

от первого до последнего }

If P[K]=B1     { если К-ый символ строки Р равен первому символу }

Then P[K]:= B2;       { записываем на К-е место в строку Р второй символ }

Writeln (‘Получилась строка: ’, P); { вывели результат на экран }

Readln

End.

Пример 3. Составить программу, которая определит количество слогов во введенном слове.

Модель: количество слогов в слове равно количеству гласных букв в нем. Следовательно, нужно вычислить количество гласных букв во введенной строке.

Программа:

Program S3;

Uses Crt;

Const Glas = ‘АЕЁИОУЫЭЮЯаеёиоуыэюя’; { константа содержит все

гласные буквы }

Var W: String [20]; { слово }

K, N, M: Integer; 

Begin

Clrscr;

Write (‘Введите слово ’);

Readln (W);     { ввели слово }

N:= Length (W); { определили длину слова }

M:= 0;           { обнулили счетчик слогов }

For K:= 1 To N Do  { перебираем все буквы слова от первого

до последнего }

If Pos (W[K], Glas) > 0 { если К-ая буква слова W – гласная

(т.е.содержится в константе Glas) }

Then M:= M+1;    { увеличиваем счетчик слогов }

Writeln (‘В слове ’, M, ‘ слогов’); { вывели результат на экран }

Readln

End.

Пример 4. Составить программу, которая удаляет все пробелы из введенной строки.

Программа:

Program S4;

Uses Crt;

Var S: String [80]; { исходная строка }

K: Integer; 

Begin

Clrscr;

Write (‘Введите строку  ’);

Readln (S); { ввели строку }

While Pos(‘  ‘, S)>0 Do     { пока в строке S есть пробелы }

Begin

K:= Pos (‘  ‘, S); { определили позицию первого пробела

в строке S }

Delete (S, K, 1) { удалили пробел из строки S }

End;

Writeln (‘Получилась строка ’, S); { вывели результат на экран }

Readln

End.

Пример 5. Составить программу, которая определяет количество слов во введенном предложении и выводит их на экран в столбик, если слова разделены произвольным набором разделителей.

Модель: Разделитель – пробел либо знак препинания. Условие начала слова: на i-м месте находится разделитель, на i+1 – буква (т.е. не разделитель). Условие конца слова: на i-м месте находится не разделитель (т.е. буква), на i+1 – разделитель. Исключение могут составлять первое и последнее слова предложения. Применим искусственный прием: допишем в начало и конец введенного предложения по одному пробелу (пробел – это один из разделителей).

Алгоритм: Будем рассматривать символы парами, запоминать позицию в которой слово началось. Если слово закончилось, необходимо увеличить счетчик слов, выделить слово из предложения и вывести его на экран.

Программа:

Program S5;

Uses Crt;

Const R = ‘.,!?-():;’; { записали в константу все разделители }

Var S, W: String;  { S – предложение, W – очередное слово }

N, K, L, A, B: Integer;

Begin

ClrScr;

Write (‘Введите предложение ’);

Readln (S); { ввели предложение }

S:= ‘  ‘+S+’  ‘; { дописали пробелы в начало и конец предложения }

N:= 0;     { обнулили счетчик слов }

For K:= 1 To Length (S) - 1 Do { перебираем все символы предложения от первого до предпоследнего }

Begin

A:= Pos(S[K], R);         { входит ли K-й символ в разделители}

B:= Pos(S[K+1], R); {входит ли K+1-й символ в разделители}

If (A>0) And (B=0)    { если слово началось }

Then L:= K +1; { запоминаем позицию начала слова }

If (A=0) And (B>0)    { если слово закончилось }

Then Begin

N:= N+1; { считаем его }

W:= Copy (S, L, K-L+1); { выделяем слово }

Writeln (W)    { выводим слово на экран }

End

End;

Writeln (‘В предложении ’, N, ‘ слов ’); { выводим количество слов}

Readln

End.

 

 


Темы 5 - 8. Система типов языка Pascal. Перечисляемый тип,
тип-диапазон, множественный тип

Примеры решаемых задач

Пример 1. Составить программу, которая выведет на экран числа от 1 до 9 в случайном порядке.

Алгоритм: Будем использовать множество для хранения тех чисел, которые уже выведены на экран. Сначала это множество пустое. Затем девять раз должны повторяться следующие действия: выбор случайного числа (функция Random) осуществляется до тех пор, пока не будет выбрано число, которого нет в множестве; после чего это число выводится на экран и включается в множество.

Программа:

Program S1;

Uses Crt;

Type     Numbers = 1..9; { тип-диапазон }

    SetNumbers = Set Of Numbers; { тип–множество чисел (от 0 до 9) }

Var Sn: SetNumbers;

    I, N: Numbers;

Begin

Clrscr;

Randomize; { инициализируем датчик случайных чисел }

Sn:= [ ];              { множество выбранных чисел – сначала пустое }

For I:= 1 To 9 Do { девять раз повторяем следующие действия: }

Begin

Repeat                        { повторяем формирование }

N:= random(9) + 1 { целого числа из интервала от 1 до 9}

Until not N in Sn;           {пока не получим число, которого нет в множестве Sn }

Writeln (N);     { выводим полученное число на экран }

Include(Sn, N)   { включаем это число в множество Sn }

End;

Readln

End.


Примеры решаемых задач

Пример 1. Составить программу, которая сформирует случайным образом массив из 20 целых чисел и:

а) выведет его в одну строку на экране;

б) выведет элементы массива, стоящие на четных местах и вычислит их сумму;

в) вычислит количество нечетных элементов;

г) упорядочит элементы массива по убыванию.

Программа:

Program М1;

Uses Crt;

Type     Numbers = Array [1..20 ] Of Integer; {}

Var A: Numbers;

I, J, S, K, P: Integer;

Begin

Clrscr;

Randomize; { инициализируем датчик случайных чисел }

For I:= 1 To 20 Do { заполняем массив А случайными числами от 0 до 99}

A [ I ]:= Random (100);

{ Задача (а) }

Writeln (‘Получили массив:’); { выводим полученный массив на экран }

For I:= 1 To 20 Do

Write (A [ I ]: 3);

Writeln; { переводим курсор в следующую строку экрана }

{ Задача (б) }

Writeln (‘Элементы на четных местах: ’);

S:= 0; { Обнулили сумму }

For I:= 1 To 20 Do

If I mod 2 = 0 { Если у элемента четный НОМЕР }

 Then Begin

Write (A [ I ]: 3); { то выводим его }

S:= S + A [ I ]  { и накапливаем сумму }

End;

Writeln; { переводим курсор в следующую строку экрана }

Writeln (‘ Их сумма ’, S); { выводим значение суммы }

{ Задача (в) }

K:= 0; { Обнулили счетчик нечетных элементов в массиве }

For I:= 1 To 20 Do

If A [ I ] mod 2 <> 0 { Если ЭЛЕМЕНТ нечетный }

 Then K:= K + 1; { то увеличиваем значение счетчика }

Writeln (‘ Количество нечетных элементов ’, К);

{ выводим значение счетчика }

{ Задача (г) }

{ Сортируем массив А по убыванию }

For I:= 1 To 19 Do

For J:= I + 1 To 20 Do

If A[ J ] > A[ I ] Then

Begin

P:= A[ I ]; {меняем местами i-ый и j-ый элементы массива А}

A[ I ]:= A[ J ]; { для этого используем переменную p }

A[ J ]:= P 

End;

Writeln (‘Получили массив:’); {выводим упорядоченный массив на экран}

For I:= 1 To 20 Do

Write (A [ I ]: 3);

Readln

End.

Пример 2. Составить программу, которая сформирует случайным образом двумерный массив N x N целых чисел и:

а) выведет его на экран в виде матрицы;

б) выведет элементы массива, стоящие над главной диагональю;

в) вычислит суму элементов, стоящих на побочной диагонали;

г) вычислит суммы столбцов.

 

Пояснение:

Если элемент M [i, j] двумерного массива M размера n x n расположен на главной диагонали, то i = j (номер строки равен номеру столбца).

Если элемент M [i, j] двумерного массива M размера n x n расположен на побочной диагонали, то i + j = n + 1 (сумма его индексов равна n + 1).

Программа:

Program М2;

Uses Crt;

Type     Numbers = Array [1..20, 1..20 ] Of Integer;

{ Тип - двумерный массив 20 х 20 }

Var A: Numbers;

    N, I, J, S: Integer;

Begin

Clrscr;

Write (‘Введите количество строк и столбцов ’);

Readln(N);

Randomize; { инициализируем датчик случайных чисел }

For I:= 1 To N Do { Организуем цикл по строкам }

For J:= 1 T N Do { Организуем цикл по столбцам }

A [ I,J]:= Random (100); { заполняем массив А случайными числами }

{ Задача (а) }

Writeln (‘Получили массив:’); { выводим массив на экран }

For I:= 1 To N Do

Begin

For J:= 1 To N Do

Write (A [I, J]: 3); {выводим все элементы i-ой строки в одну строку на экране}

Writeln { переводим на экране курсор на следующую строку}

End;

{ Задача (б) }

Writeln (‘Элементы над главной диагональю:’);

For I:= 1 To N Do

Begin

For J:= 1 To N Do

If J >= I { Eсли элемент на главной диагонали или над ней, }

Then Write (A [I, J]: 3) { то выводим его}

Else Write(‘  ‘:3); { иначе выводим три пробела }

Writeln { переводим на экране курсор на следующую строку}

End;

{ Задача (в) }

S:= 0;

For I:= 1 To N Do

For J:= 1 To N Do

If J + I = N + 1 { Eсли элемент на побочной диагонали }

Then S:= S + A [I, J]; { то накапливаем сумму }

Writeln (‘Сумма элементов побочной диагонали ’, S);

{ Задача (г) }

For J:= 1 To N Do { организуем цикл по столбцам }

Begin

S:= 0; { обнуляем сумму для каждого столбца }

For I:= 1 To N Do { цикл по строкам }

S:= S + A [I, J]; { накапливаем сумму элементов столбца }

Writeln (‘ Сумма элементов ’, J, ‘ столбца ’, S) { выводим на экран значение суммы }

End;

Readln

End.


 

Примеры решаемых задач

Пример 1. Составить программу, которая вычислит значение выражения

am + bn +(a - b) m + n.

Вычисление степени числа оформить в виде подпрограммы.

Пояснение. Составим и сравним две программы: с использованием процедуры и функции вычисления степени числа.

Программа:

program calc_proc;

uses crt;

var a, b, m, n, s1, s2, s3, s: integer;

procedure stepen (x, y: integer; var z: integer);

{процедура возводит число x в степень y, результат записывает в z }

{т.е. в процедуре описано правило вычисления z = xy }

var i: integer; { локальная переменная для организации цикла }

begin

z:= 1;

for i:= 1 to y do z:= z * x

end;

begin

clrscr;

write(‘Введите a, b, m, n ’);

readln(a, b, m, n);

{ три раза вызываем процедуру stepen для вычисления трех слагаемых }

stepen(a, m, s1); { вычислили s1 как am }

stepen(b, n, s2); { вычислили s2 как bn }

stepen(a-b, m+n, s3); { вычислили s3 как (a-b)m+n }

s:= s1 + s2 + s3; { вычислили сумму трех слагаемых }

writeln(‘Значение выражения ’, s);

readln

end.

program calc_func;

uses crt;

var a, b, m, n, s: integer;

function stepen (x, y: integer): integer;

{ функция возводит число x в степень y }

{ т.е. описано правило вычисления stepen = xy }

var i,z: integer; {локальные переменные:
i для организации цикла, z для вычисления произведения }

begin

z:= 1;

for i:= 1 to y do z:= z * x;

stepen:= z { присвоили имени функции вычисленное значение }

end;

begin

clrscr;

write(‘Введите a, b, m, n ’);

readln(a, b, m, n);

{ три раза вызываем функцию stepen для вычисления трех слагаемых }

s:= stepen(a, m) + stepen(b, n) + stepen(a-b, m+n, s3);

writeln(‘Значение выражения ’, s);

readln

end.

Тема 12. Тип данных запись (Record)

Примеры решаемых задач

Пример 1. Составить программу, которая обрабатывает информацию о студентах (фамилия, номер группы, рейтинг):

а) вводит такую информацию;

б) выводит список студентов заданной группы;

в) выводит список студентов в порядке убывания рейтинга.

Пояснение: Для хранения данных будем использовать массив записей с информацией о студентах. (При решении этой задачи можно и не использовать тип запись, а написать программу, обрабатывающую три массива. Без использования типа Record трудно обойтись при обработке файлов – см. следующую тему.)

Программа:

Program Record_Student;

Uses Crt;

Const N = 100; { N - максимальное количество студентов }

Type Stud = Record {данные об одном студенте–запись из трех полей:}

Name: String; { фамилия}

Group: Integer; { номер группы}

Rating: Real   { рейтинг }

End;

Students = Array [1..N] Of Stud; { данные обо всех студентах - }

                                                   { это массив записей }

Var St: Students;   { список студентов – массив записей }

K, M, L, Gr: Integer;

Pst: Stud; { промежуточная переменная, необходимая для того, }

{чтобы менять местами два элемента массива при его сортировке}

Begin

ClrScr;

{ а) Ввод данных о студентах }

Write (‘Сколько студентов ’);

Readln (M);

For K:= 1 To M Do

With St [K] Do { вводим все поля записи St[K] }

Begin

Write (‘Введите фамилию ’,K,’ студента ‘);

Readln (Name);

Write (‘Введите номер его группы ‘);

Readln (Group);

Write (‘Введите его рейтинг ‘);

Readln (Rating)

End;

{ б) Вывод списка заданной группы }

Write (‘Список какой группы требуется ’);

Readln (Gr);

Writeln(‘Список группы № ‘,Gr);

For K:= 1 To M Do { просматриваем весь список }

With St [K] Do

If Group = Gr     { если номер группы студента равен требуемому}

Then Writeln (Name:20);  { то печатаем его фамилию }

{ в) Сортировка студентов по их рейтингу }

For K:= 1 To M – 1 Do

For L:= K + 1 To M Do

If St[L]. Rating > St[K]. Rating

Then Begin

Pst:= St[L];

St[L]:=St[K];

St[K]:=Pst

End;

{ вывод отсортированного списка}

Writeln (‘Список студентов в порядке убывания рейтинга:’);

For K:= 1 To M Do

Writeln (Name:20, Group:5, Rating:7:2);

Readln

End.


Примеры решаемых задач

Пример 1. Составить программу, которая:

а) запишет в файл Message. txt текстовое сообщение;

б) прочитает из файла Message. txt текстовое сообщение и выведет его на экран.

Пояснение. Для решения этой и подобной задач лучше составлять две отдельные программы: первая программа формирует файл, вторая – его обрабатывает.

Программы:

Program A;

Uses Crt;

Var s: string; { переменная s для хранения текстового сообщения }

f: text;              { f – файловая переменная }

Begin

Clrscr;

Assign (f, ’Message. txt’); { связывание файловой переменной f с файлом ’Message. txt’, который будет создан в текущей папке }

Rewrite(f); { открыли файл для записи }

Write (‘Введите текст сообщения ‘);

Readln (s); { ввели в переменную s текст сообщения }

Writeln (f, s);{ записали в файл содержимое переменной s }

Close (f); { закрыли файл }

Writeln (‘Файл создан’);{ вывели на экран поясняющее сообщение }

Readln

End.

Program B;

Uses Crt;

Var m: string; { переменная m для хранения текстового сообщения }

t: text;     { t – файловая переменная }

Begin

Clrscr;

Assign (t, ’Message. txt’); { связывание файловой переменной f с файлом ’Message. txt’, который существует в текущей папке }

Reset (t);   { открыли файл для чтения }

Readln (t, m); { считали из файла t в переменную s текст сообщения}

Writeln (‘Сообщение:', m); { вывели на экран текст сообщения }

Close (t);   { закрыли файл }

Readln

End.

Пример 2. Составить программу, которая:

а) запишет в файл Students.txt список студентов группы (фамилия и год рождения);

б) обработает файл Students.txt следующим образом:

- выведет на экран список студентов группы;

- выведет список студентов заданного года рождения;

- допишет в файл информацию о новом студенте.

Программы:

Program A;

Uses Crt;

Var fam: string; { переменная fam для хранения фамилии студента }

year, n, k: integer; { переменная year для хранения года рождения}

f: text;              { f – файловая переменная }

Begin

Clrscr;

Assign (f, ’Students. txt’); { связывание файловой переменной f с файлом ’Students. txt’, который будет создан в текущей папке }

Rewrite(f); { открыли файл для записи }

Write (‘Введите количество студентов в группе ‘);

Readln (n); 

For k:=1 To n Do

Begin

Write(‘Введите фамилию ’,k,’-го студента ’);

Readln (fam);  { Ввели в переменную fam фамилию }

Writeln (f, fam); { записали в файл фамилию студента и символ Eoln }

Write(‘Введите год его рождения ’);

Readln (year); { Ввели в переменную year год рождения }

Writeln (f, year) { записали в файл год рождения студента и символ Eoln }

End;

Close (f); { закрыли файл }

Writeln (‘Файл создан’); { вывели на экран поясняющее сообщение}

Readln

End.

Program B;

Uses Crt;

Var fam: string; { переменная fam для хранения фамилии студента }

year, n,: integer; { переменная year для хранения года рождения }

f: text;              { f – файловая переменная }

Begin

Clrscr;

Assign (f, ’Students. txt’); { связываем файловую переменную f с файлом ’Students. txt’, который будет создан в текущей папке }

{ а) вывод на экран содержимого файла ’Students. txt’ }

Reset (f); { открываем файл для чтения }

Writeln (‘Список группы ‘);

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, fam); { читаем из файла фамилию и символ Eoln }

Readln (f, year);{ читаем из файла год рождения и символ Eoln}

Writeln (fam:20, year: 5)  { печатаем фамилию и год рождения }

End;

Close (f); { закрываем файл }

{ б) поиск в файле студентов заданного года рождения }

Write (‘Задайте нужный год рождения ’);

Readln (x); { вводим год для поиска }

Reset (f); { снова открываем файл для чтения}

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, fam); { читаем из файла фамилию и символ Eoln }

Readln (f, year);{ читаем из файла год рождения и символ Eoln}

If year = x then { если год рождения очередного студента равен требуемому }

Writeln (fam) { выводим фамилию на экран }

End;

Close (f); { закрываем файл }

{ в) дополнение файла данными о новом студенте }

Write (‘Введите фамилию нового студента ’);

Readln (fam);      

Write (‘Введите год его рождения ’);

Readln (year);

Append (f); { открываем файл для дополнения }

Writeln (f, fam); { дописываем в файл  новую фамилию (и Eoln) }

Writeln (f, year); { дописываем в файл  год рождения (и Eoln) }

Close (f); { закрываем файл }

Readln

End.

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

Пример 3. Составить программу, которая:

а) запишет в файл Price список товаров (название и цена);

б) обработает файл Price следующим образом:

- выведет на экран прайс-лист;

- изменит цену товара с заданным наименованием;

- допишет в файл данные о новом товаре (предварительно проверив, что в файле информации о таком товаре нет).

Программы:

Program A;

Uses Crt;

Type tovar = Record

name: String;

price: Real

End;

Var t: tovar; { переменная t для хранения информации об очередном товаре }

f: File Of tovar; { f – файловая переменная }

k, n: Integer;

Begin

Clrscr;

Assign (f, ’Price’); { связывание файловой переменной f с файлом ‘Price’, который будет создан в текущей папке }

Rewrite(f); { открыли файл для записи }

Write (‘Введите количество товаров в списке ‘);

Readln (n); 

For k:=1 To n Do

Begin

Write (‘Введите наименование ’,k,’-го товара ’);

Readln (t.name); { запросили значение первого поля записи }

Write (‘Введите цену товара ’);

Readln (t.price); { запросили значение второго поля записи }

Writeln (f, t)       { записали в файл запись t }

End;

Close (f); { закрыли файл }

Writeln (‘Файл создан’); { вывели на экран поясняющее сообщение}

Readln

End.

Program B;

Uses Crt;

Type tovar = Record

name: String;

price: Real

End;

Var t: tovar; { переменная t для хранения информации об очередном товаре }

f: File Of tovar; { f – файловая переменная }

k, n: Integer;

nt: String;

new_price: Real;

new_t: tovar;

Begin

Clrscr;

Assign (f, ’Price’); { связывание файловой переменной f с файлом ‘Price’, который будет создан в текущей папке }

{ вывод на экран содержимого файла }

Reset (f); { открыли файл }

Writeln (‘Прайс – лист: ‘);

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, t); { прочитали из файла очередную запись в переменную t }

Writeln (t.name:20, t.price:10:2) { вывели на экран значения полей записи – наименование и цену товара }

End;

Close (f); { закрыли файл }

{ изменение цены отдельного товара }

Reset (f); { открыли файл }

Write (‘Введите наименование товара, у которого меняется цена ‘);

Readln (name_t);

Write (‘Введите новую цену ‘);

Readln (new_p);

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, t); { прочитали из файла очередную запись в переменную t }

If t.name = nt  { если прочитанное из файла наименование товара совпадает с тем, у которого меняется цена, то}

Then Begin

t.price:= new_price; { меняем цену товара в записи t }

Seek (f, FilePos (f) -1); { устанавливаем указатель обратно на ту запись в файле, у которой изменили цену}

Write (f, t) { записываем переменную t с измененным значением поля price в файл }

End

End;

Close (f); { закрыли файл }

{ дописывание в конец файла информации о новом товаре }

Write (‘Введите наименование нового товара ‘);

Readln (new_t.name);

Write (‘Введите цену ‘);

Readln (new_t.price);

Reset (f); { открыли файл }

{ проверим, есть ли данные о таком товаре в файле }

flag:= false; { сначала считаем, что такого товара в файле нет }

While Not Eof (f) Do { пока не достигнут конец файла }

Begin

Readln (f, t); { прочитали из файла очередную запись в переменную t }

If  t.name = new_t.name { если прочитанное из файла наименование товара совпадает с тем, который хотим дописать в файл}

Then Flag:= True { запоминаем, что данные о таком товаре есть в файле}

End;

If Not flag { если данных о новом товаре в файле не найдено (т.е. значение переменной flag осталось равным false) }

Then Begin

Seek (f, FileSize (f));  { устанавили указатель в конец файла }

Write (f, new_t) { записали в файл данные о новом товаре}

End;

Close (f); { закрыли файл }

Writeln (‘Новые данные дописаны в файл’);

Readln

End.

Примечание. При проверке, есть ли в файле данные о новом товаре или нет, правильнее заголовок цикла While записать в виде:

While (Not Eof (f)) And (Not Flag)Do …

 

т.е. «пока не конец файла и товар не найден». Это означает, что просмотр файла будет выполняться либо до конца файла, либо до тех пор, пока в файле не будет найден новый товар.


Примеры решаемых задач

Пример 1. Составить программу, которая формирует стек из 10 элементов, а затем удаляет его из памяти.

Программа:

Program stack10;

Uses Crt;

Const n=10;

Type stack = ^elem;

elem = Record

num: Integer;

p: stack

End;

Var st,beg_st: stack;

i: Integer;

Begin

Clrscr;

beg_st:= nil;

For i:= 1 To n Do

Begin

New (st);

st^.p:= beg_st;

beg_st:= st;

Write ('введите ', i,' элемент стека ');

Readln (st^.num)

End;

Writeln ('в динамической памяти создан стек:');

st:= beg_st;

While st <> nil Do

Begin

Writeln (st^.num);

st:=st^.p

End;

Readln;

Writeln ('Освобождаем память - удаляем элементы стека из кучи ');

i:= n;

st:= beg_st;

While beg_st<>nil do

Begin

st:= beg_st;

Writeln ('Удалили ', i,' элемент ');

beg_st:= st^.p;

i:= i - 1;

Dispose (st);

End;

Readln

End.

 

Организация практических занятий

По изучению основ

структурного программирования
на языке Pascal

(примеры решенных задач)

 

Тема 1. Линейные программы.. 2

Тема 2. Разветвляющиеся программы.. 4

Тема 3. Циклические программы.. 6

Тема 4. Обработка данных строкового типа. 12

Темы 5 - 8. Система типов языка Pascal. Перечисляемый тип, тип-диапазон, множественный тип. 17

Тема 9. Массивы в языке Pascal 19

Тема 11. Подпрограммы в языке Pascal 24

Тема 12. Тип данных запись (Record) 26

Тема 13. Работа с файлами в языке Pascal 29

Тема 14. Динамические переменные в языке Pascal 38

 

 


Тема 1. Линейные программы

Примеры решаемых задач

Пример 1. Составить программу, которая вычислит площадь и периметр прямоугольного треугольника, если известны его катеты.

Составим модель данной задачи. Исходными данными являются длины катетов A и B. Это числа (могут быть как целыми, так и вещественными). Результат: площадь S и периметр P (действительные числа). Для вычисления периметра необходимо предварительно вычислить длину гипотенузы C (действительное число).

Алгоритм решения: ввод исходных данных, необходимые вычисления, вывод результатов на экран.

Программа:

Program Triangle; {Заголовок программы}

Uses Crt; {Подключение модуля CRT}

Var A, B: Integer; {Описание всех переменных}

S, P, C: Real;

Begin { Начало исполняемой части программы }

Clrscr; { Очистка экрана }

Write(‘Введите длину 1-го катета’); { Ввод исходных данных }

Readln (A);

Write(‘Введите длину 2-го катета’);

Readln (B);

C:=Sqrt (Sqr (A)+Sqr (B)); { Вычисле



Поделиться:


Последнее изменение этой страницы: 2021-04-05; просмотров: 57; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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