Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по основам программирования. Язык Паскаль

.pdf
Скачиваний:
9
Добавлен:
15.11.2022
Размер:
6.27 Mб
Скачать

ляется новый элемент списка. В конце программы упорядоченный список распечатывается.

П р о т о к о л р а б о т ы п р о г р а м м ы :

ВВОДИ ПЕРВОЕ НАЗВАНИЕ МАТЕМАТИКА ВВОДИ ОЧЕРЕДНОЕ НАЗВАНИЕ АЛГЕБРА

ВВОДИ ОЧЕРЕДНОЕ НАЗВАНИЕ ФИЗИКА ВВОДИ ОЧЕРЕДНОЕ НАЗВАНИЕ

ЯЯЯЯЯЯЯЯЯЯ

КАТАЛОГ УЧЕБНИКОВ: АЛГЕБРА МАТЕМАТИКА ФИЗИКА

Данная программа правильно работает на тех ЭВМ, на которых множество русских букв упорядочено по алфавиту. В противном случае операции отношения над строками, содержащими русские буквы, дают не­ правильный результат. Для реализации операций отно­ шения в соответствии с русским алфавитом на таких ЭВМ необходимо создавать вспомогательное программ­ ное обеспечение. Этот вопрос выходит за рамки дан­ ного учебного пособия.

В а р и а н т ы з а д а н и я

Составить список учебников для 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*. Найти ошибки в следующей программе. Объяс­

нить, какие правила языка ПАСКАЛЬ при этом нару­ шены: