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