Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Организация практических занятийСтр 1 из 5Следующая ⇒
Организация практических занятий По изучению основ структурного программирования (примеры решенных задач)
Тема 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 и т.п.
Алгоритм решения: ввод исходных данных, необходимые вычисления, вывод результатов на экран. Программа:
Тема 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. Пояснение: составим три программы, т.е. решим данную задачу с использованием трех различных циклических конструкций.
Пример 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; {локальные переменные: 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.
Организация практических занятий По изучению основ структурного программирования (примеры решенных задач)
Тема 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; просмотров: 58; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.174.95 (0.692 с.) |