Практикум по основам программирования. Язык Паскаль
.pdfляется новый элемент списка. В конце программы упорядоченный список распечатывается.
П р о т о к о л р а б о т ы п р о г р а м м ы :
ВВОДИ ПЕРВОЕ НАЗВАНИЕ МАТЕМАТИКА ВВОДИ ОЧЕРЕДНОЕ НАЗВАНИЕ АЛГЕБРА
ВВОДИ ОЧЕРЕДНОЕ НАЗВАНИЕ ФИЗИКА ВВОДИ ОЧЕРЕДНОЕ НАЗВАНИЕ
ЯЯЯЯЯЯЯЯЯЯ
КАТАЛОГ УЧЕБНИКОВ: АЛГЕБРА МАТЕМАТИКА ФИЗИКА
Данная программа правильно работает на тех ЭВМ, на которых множество русских букв упорядочено по алфавиту. В противном случае операции отношения над строками, содержащими русские буквы, дают не правильный результат. Для реализации операций отно шения в соответствии с русским алфавитом на таких ЭВМ необходимо создавать вспомогательное программ ное обеспечение. Этот вопрос выходит за рамки дан ного учебного пособия.
В а р и а н т ы з а д а н и я
Составить список учебников для N-ro кур са, указав название, фа милию автора, год изда ния, цену, тираж и упо рядочить его по задан ному признаку.
N курса Название поля
I Фамилия автора
IIНазвание
ШГод издания
IV |
Цена |
V |
Тираж |
Составить список кабинетов техникума для М-го этажа, указав название кабинета, но мер комнаты, количест во посадочных мест и упорядочить его по за данному признаку.
М этажа Название поля
I Название кабинета 11 Номер комнаты III Количество мест
ш
Це л ь з а д а н и я
1.Ознакомление с возможностью выполнения опера ции исключения элементов из списка.
2.Закрепление навыков использования переменных ссылочных типов данных.
П о с т а н о в к а з а д а ч и Составить список учебной группы, содержащий не
менее 15 учащихся. Указать для каждою учащегося оценки, полученные на последних четырех экзаменах.. Разработать программу, которая вводит с терминала данные о каждом учащемся, заносит эту информацию в однонаправленный список. Обработать список соглас но конкретному варианту.
С о д е р ж а н и е о т ч е т а
1.Постановка задачи.
2.Список группы учащихся с оценками.
3.Текст программы и результаты ее выполнения.
4.Выводы.
М е т о д и ч е с к и е у к а з а н и я При выполнении задания следует ознакомиться с
приведенной ниже программой. Программа ИСКЛ вво дит данные о каждом учащемся, строит список, а за тем удаляет из списка элементы, относящиеся к неус певающим учащимся.
PROGRAM ИСКЛ(INPUT.OUTPUT)j TYPE ДАННЫЕ-RECORD
ФИО!PACKED ARRAYC1..7] OF CHAR; ОЦЕНКИ!ARRAYC1..43 OF INTEGER
END| ССЫЛКА-ТЗАПИСЬ; ЗАПИСЬ-RECORD
CCiССЫЛКА|
YiДАННЫЕ
END;
VAR HAH(SIfS2iССЫЛКА; NfI,JtINTEGER; BEGIN
WRITELN('ВВОДИ КОЛИЧЕСТВО ФАМИЛИИ В СПИСКЕ'); READLN(N)|
NEW(Si); HAHt-Sl;
FOR Ix—1 TO N DO
BEGIN
SIT.CCI—NIL|
WRITELN( ВВОДИ ФАМИЛИИ ИЗ 7 БУКВ И ОЦЕНКИ’)| FOR J«-l ТО 7 DO READ (SIT-Y. ФИОСЛ) ;
FOR Ji-1 TO 4 DO READ(SIT* Y.ОЦЕНКИСJI)| READLN; S2i-81| NEW(S1)|
IF ION THEN S2T.CCI-S1 ELSE DISPOSE(SI)
END; (• ЗАКОНЧЕНО ФОРМИРОВАНИЙ СПИСКА *)
SI:=НАЧ; REPEAT
FOR IJ=1 TO 4 DO
IF Sit.У.ОЦЕНКИС13=2 THEN
IF Sl-НАЧ THEN НАЧ:=Slt.CC ELSE S2t.CC:=SIt.CC;
S2i=S1| (• S2 - ССЫЛКА НА ПРЕДЫДУЩИЙ ЭЛЕМЕНТ *) sii=sit.cc
UNTIL 51=NILI (• ЗАКОНЧЕНО ИСКЛЮЧЕНИЕ ИЗ СЛИСКА •) (* ПЕЧАТЬ СПИСКА *)
WRITELN<' СПИСОК УСПЕВАЮЩИХ УЧАЩИХСЯ *)| S11 =НАЧ| WHILE SIONIL DO
BEGIN WR1ТЕ(S11.Y.ФИО);
FOR Il=l TO 4 DO WRITEC ',Sit.Y.ОЦЕНКИСI3I2)| WRITELN|
SI:=Slt.CC
Данную программу можно записать и с использо ванием оператора присоединения. При этом следует помнить, что в области действия оператора присоеди нения нельзя изменять элементы списка переменныхзаписей, указанные в заголовке.
П р о т о к ол р а б о т ы п р о г р а м м ы ИСКЛ:
ВВОДИ КОЛИЧЕСТВО ФАМИЛИЙ В СПИСКЕ
3
ВВОДИ ФАМИЛИЮ ИЗ 7 БУКВ И ОЦЕНКИ КОТОВ 4 4 5 2 ВВОДИ ФАМИЛИЮ ИЗ 7 БУКВ И ОЦЕНКИ СОМОВ 5 5 5 5
ВВОДИ ФАМИЛИЮ ИЗ 7 БУКВ И ОЦЕНКИ ТОКАРЕВ 3 4 4 3 СПИСОК УСПЕВАЮЩИХ УЧАЩИХСЯ СОМОВ 5 5 5 5 ТОКАРЕВ 3 4 4 3
В а р и а н т ы з а д а н и я Исключить из списка элементы, относящиеся к
учащимся, у которых:
1.Средний балл меньше среднего балла группы.
2.Средний балл меньше 4,5.
3.Средний балл больше 4.
4.Все оценки 5.
5.Одна оценка 4, а остальные-5 .
6.Оценка, полученная на первом экзамене,-2 .
7.Оценка, полученная на втором экзамене,-5 .
8.Нет удовлетворительных и неудовлетворительных оценок.
из
9. Больше одной оценки 2.
10. Одна оценка 3, а остальные- 4 и 5. Распечатать оставшийся список.
ЗАДАНИЕ 3. ВЫПОЛНЕНИЕ ОПЕРАЦИЙ НАД СПИСКОВЫМИ СТРУКТУРАМИ
Це л ь з а д а н и я
1.Ознакомление с возможностями представления строк
символов в виде списков.
2. Закрепление навыков выполнения операций над списками.
П о с т а н о в к а з а д а ч и Ввести с терминала строку символов, формируя из
ее элементов однонаправленный список. Обработать список согласно конкретному варианту и распечатать результат.
С о д е р ж а н и е о т ч е т а
1.Постановка задачи.
2.Входная строка символов.
3.Текст программы.
4.Выходная строка символов.
5.Анализ допущенных ошибок.
М е т о д и ч е с к и е у к а з а н и я При выполнении задания следует ознакомиться с
приведенной ниже программой. Программа ОБРАБ формирует однонаправленный список из входной стро ки. В поле данных каждого элемента списка записыва ется отдельный символ. В программе производится анализ первого символа входной строки: если это бук ва ’А’, то в конец списка добавляется еще одна буква ’А’, иначе из списка исключаются все буквы ’А’. Полу ченный результат выводится на печать.
PROGRAM ОБРАБ(INPUT,OUTPUT)| TYPE ССЫЛКА-ТЭЛЕМЕНТ|
ЭЛЕМЕНТ"RECORD
NlССЫЛКА| SiCHAR
END)
VAR HAH,ТЕК,PR,iССЫЛКА| PC,C«CHAR| BEGIN
READLNj WRITE (*->')J READ(C>f PC*-C;
NEW(HAH)| НАЧТ.Si—C| HAHT.W|-NIL| PRI-HAH| WHILE NOT EOLN DO
BEGIN READ(C)| NEW(ТЕК)| PRT.Wl-TEKf TEKf.Wi-NILf TEKT.Si —C| PRi-TEK
END|
IF PC- A* THEN BEGIN («ДОБАВЛЕНИЕ В КОНЕЦ СПИСКА БУКВЫ А*) ТЕК« —НАЧ|
WHILE TEKT.WONIL DO TEKi-TEKt.W; NEW(PR)| TEKf.Wt —PR|
PRT.Wi-NIL| PRt.Sl-'A* END
ELSE BEGIN (* УДАЛЕНИЕ ИЗ СПИСКА ВСЕХ БУКВ А») ТЕК* —НАЧ|
WHILE TEKONIL DO BEGIN
IF TEKT.S-A* THEN PRt.W:-TEKT.W ELSE PRi-ТЕК|
ТЕК»-TEKT.W END
END|
(* печать измененной строки *> ТЕК» —НАЧ|
WRITELN<* ИЗМЕНЕННАЯ СТРОКА *>| WHILE TEKONIL DO
BEGIN WRITE(TEKT.S)| ТЕК*-TEKT.W END} WRITELN
END.
П р о т о к о л р а б о т ы п р о г р а м м ы ОБРАБ:
= > ROLDAAA1234ATXAAA ИЗМЕНЕННАЯ СТРОКА ROLD1234TX
В а р и а н т ы з а д а н и я
1.Удалить первые два символа строки.
2.Удалить последние три символа строки.
3.Удалить все буквы К.
4.Удвоить все символы *.
5.Добавить в конец строки слово END.
6.Поменять местами первый и последний символы строки.
7.Поменять местами первый и второй символы стро
ки.
8.Поменять местами последний и предпоследний символы строки.
9. Подсчитать в строке число букв А и В, и если букв А больше, чем букв В, то удалить в строке все символы В.
10. Подсчитать число символов в строке, и если чйсло нечетное, то удалить символ, стоящий посередине строки.
Г Л А В А 9
ПРОЦЕДУРЫ И ФУНКЦИИ
Процедуры и функции аналогичны программам в миниа тюре и имеют общее название - подпрограммы. Приме нение подпрограмм дает возможность уменьшать число повторений одной и той же последовательности опера торов, а также конструировать программу как набор от дельных подпрограмм. Это позволяет получить более логичный процесс программирования. В программе опи сание процедур и функций должно располагаться между разделами переменных и операторов. Каждая процедура или функция определяется только один раз, но может использоваться многократно.
Структура процедур и функций аналогична структуре полной программы на языке ПАСКАЛЬ. В процедурах и функциях могут быть описаны собственные метки, кон станты, типы, собственные переменные и даже собст венные процедуры и функции. Внутренние описания дол жны следовать в том же порядке, что и разделы основ ной программы.
9.1. ОПИСАНИЕ ПРОЦЕДУРЫ. ОПЕРАТОР ПРОЦЕДУРЫ
Описание каждой процедуры начинается с заголов ка, в котором задаются имя процедуры и список фор мальных параметров с указанием их типов. Процедура может быть и без параметров, тоща в заголовке указы вается только ее имя. С помощью параметров осуще ствляется передача исходных данных в процедуру, а также передача результатов работы обратно в вызвав шую ее программу.
Общая форма записи заголовка процедуры:
PRO CED U RE <имя>(<список формальных параметров>);
Список формальных параметров может включать в себя параметры-значения, параметры-переменные (перед ними должно стоять служебное слово VAR), па раметры-процедуры (перед ними должно стоять слу жебное слово PROCEDURE) и параметры-функции (пе ред ними должно стоять служебное слово FUNCTION). После заголовка процедуры следуют разделы в том же порядке, что и в программе.
Вызов и выполнение процедуры осуществляются при помощи оператора процедуры:
<имя процедуры>(< список фактических пара метров >);
Между формальными и фактическими параметра ми должно быть полное соответствие, т. е. формаль ных и фактических параметров должно быть одинако вое количество; порядок следования фактических и формальных параметров должен быть один и тот же; тип каждого фактического параметра должен совпадать с типом соответствующего ему формального параметра.
При вызове процедуры сначала передаются пара метры, при этом параметры-значения передаются по значению, а параметры-переменные - по ссылке. Ос новное отличие этих способов передачи параметров за ключается в том, что присваивания значений парамет-1 ру-переменной внутри процедуры одновременно вы полняются и для соответствующего аргумента (факти ческого параметра). Таким образом, параметры, в кото рые записываются результаты работы процедура, дол жны передаваться только по ссылке. Параметры, через которые в процедуру передаются исходные данные, пе редаются по значению.
Например, ниже приведена программа, которая в первой вводимой с терминала строке подсчитывает ко личество точек, а во второй - количество букв ’А\ Под счет символов реализован в процедуре ПОДСЧЕТ.
PROGRAM ПОД (INPUT ,OUTPUT); CONST ТОЧКА= *.
VAR SsINTEGER;
PROCEDURE ПОДСЧЕТ(СИМ:CHAR; VAR КОЛ:INTEGER); VAR C:CHAR;
BEGIN КОЛ:=0; WRITELN<'ВВОДИ СТРОКУ«>*>; REPEAT READ(C);
IF С=СИМ THEN КОЛ:=КОЛ+1 UNTIL EOLN
END;
BEGIN READLN;
ПОДСЧЕТ <ТОЧКА,S); WRITELN('КОЛИЧЕСТВО ТОЧЕК=',S:3);
ПОДСЧЕТ(*A ',S); WRITELN('КОЛИЧЕСТВО БУКВ=A ',S:3)
END.
Процедура ПОДСЧЕТ имеет два формальных па раметра: СИМ - входной параметр (параметр-значение) определяет символ, который подсчитывается в строке, и КОЛ - выходной параметр (параметр-переменная), через который передается в основную программу коли чество подсчитанных символов. Для того чтобы ре зультат работы процедуры ПОДСЧЕТ был доступен в про1рамме, он передается по ссылке.
Фактический параметр, соответствующий формаль ному параметру СИМ, при первом вызове процедуры задается именем константы, определенной в основной программе, а при втором вызове-в явном виде. Обе формы задания правильны, так как в качестве факти ческого параметра, передаваемого по значению, может использоваться произвольное выражение соответствую щего типа.
Процедуры возвращают результат в основную про грамму не только при помощи параметров-перемен ных, но и непосредственно изменяя глобальные пере- 'менные. Переменные, описанные в основной програм ме, являются глобальными по отношению к внутрен ним процедурам и функциям. Переменные, описанные внутри процедур и функций, называются локальными.
Они порождаются при каждом входе в процедуру и уничтожаются при выходе из этой процедуры, т. е. ло кальные переменные существуют только при выполне нии процедуры и недоступны в основной программе. Например, переменная С символьного типа, описанная в процедуре ПОДСЧЕТ, является локальной, а пере менная S целого типа, описанная в основной програм ме, является глобальной.
Изменим процедуру ПОДСЧЕТ таким образом, чтобы она передавала результат своей работы через глобальную переменную S.
PROGRAM ПОД1(INPUT,OUTPUT);
CONST ТОЧКА= *
VAR S:INTEGER;
PROCEDURE ПОДСЧЕТ(СИМ sCHAR);
VAR C:CHAR;
BEGIN S:=0; MRITELN('ВВОДИ СТРОКУ=>);
REPEAT READ(C>;
IF С=СИМ THEN Ss =S+1
UNTIL EOLN
END;
BEGIN READLN; ПОДСЧЕТ(ТОЧКА);
MRITELN <'КОЛИЧЕСТВО ТОЧЕК= ,5:3); ПОДСЧЕТ('A *);
MRITELN( КОЛИЧЕСТВО БУКВ A=',S:3)
END.
Программы ПОД и ПОД1 работают одинаково. Для каждой конкретной задачи программист может выбирать тот или иной способ передачи результатов работы процедуры в вызвавшую ее программу. Однако, в сложных программных комплексах не рекомендуется
Этот оператор и определяет значение, вырабатываемое
функцией.
Вызов и выполнение функции производятся при вычислении значения указателя функции, который входит в некоторое выражение. После выполнения функции выработанный ею результат используется в качестве значения указателя функции в том выраже нии, в которое входит этот указатель. При вызове функции передача фактических параметров произво дится так же, как и при вызове процедуры.
9.3.'ВОПРОСЫ И УПРАЖНЕНИЯ
1.Для чего предназначены процедуры?
2.Что включает в себя заголовок процедуры?
3.Чем отличаются формальные и фактические пара метры?
4.Чем отличаются локальные и глобальные перемен ные?
5.Для чего предназначены функции?
6.Что включает в себя заголовок функции?
7.Какая разница между процедурой и функцией?
8*. Написать функцию поиска максимального элемен та одномерного массива, содержащего не более N ве щественных чисел.
9*. Написать процедуру упорядочения по невозраста нию массива, содержащего не более N вещественных чисел.
10. Можно ли для упорядочения массива (п. 9) вместо процедуры использовать функцию?
11*. Известно, что в разделах типов и переменных за даны:
TYPE |
ДЕНЬНЕДЕЛИ= (ПОН,ВТОР .СРЕДА ,ЧЕТВ ,ПЯТИ,СУББ,BQCKP>| |
|
НОМЕР=1..7; |
VAR |
Ns НОМЕР} |
Написать функцию, которая по номеру N опреде ляет соответствующее название дня недели.
12*. Написать функцию, которая по заданному призна ку обеспечивает поиск либо большего, либо меньшего из двух заданных целых чисел.
13*. Найти ошибки в следующей программе. Объяс
нить, какие правила языка ПАСКАЛЬ при этом нару шены: