Файл: 1. Лекции Паскаль (Часть 1).doc

Добавлен: 19.10.2018

Просмотров: 4454

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Оглавление

1.Стандартные типы данных

1.1.Структура программы

1.2.Описание стандартных типов данных

Целый тип

Вещественный тип

Символьный тип

Булевский тип

Перечисляемый тип

1.3.Выражения

Лабораторная работа №1

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

Лабораторная работа № 1.

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

Постановка задачи

Описание используемых стандартных функций.

Программы № 15.а

Программы № 15.б

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

2. Операторы языка.

2.1. Составной и пустой операторы.

2.2.Условный оператор.

2.3.Операторы повторений.

2.4.Оператор выбора

2.5.Практические задания.

Лабораторная работа № 2

Решение уравнений и неравенств с использованием условного оператора.

Лабораторная работа № 2, вариант № 8.

Решение уравнений и неравенств с использованием условного оператора.

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

Лабораторная работа № 3.

Построение таблиц функций.

Лабораторная работа № 3, вариант № 8.

Построение таблиц функций.

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

Лабораторная работа № 4.

Организация циклов в программе.

Лабораторная работа № 4, вариант № 8.

Организация циклов в программе.

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

3.Численные методы.

3.1.Метод итераций

3.2.Метод Ньютона

3.3. Метод половинного деления.

Лабораторная работа № 5

Решение нелинейных уравнений.

Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом итераций.

Описание метода итераций:

Текст программы.

Распечатка результатов работы программы в следующем виде:

Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом Ньютона.

Описание метода Ньютона:

Блок-схема метода Ньютона:

Текст программы.

Распечатка результатов работы программы в следующем виде:

Лабораторная работа № 5, вариант № 3.

Решение нелинейных уравнений методом половинного деления.

Описание метода половинного деления:

Блок-схема метода половинного деления:

Текст программы.

Распечатка результатов работы программы в следующем виде:

Метод Монте-Карло (метод статистических испытаний)

5. Массивы.

5.1. Процедуры и функции.

5.2. Одномерные массивы.

5.2.1. Описание массивов.

5.2.2. Классы задач по обработке массивов.

5.2.2.1. Однотипная обработка всех или указанных элементов массивов.

5.2.2.2. Задачи, в результате решения которых изменяется структура массива.

5.2.2.3. Обработка нескольких массивов одновременно.

5.2.2.4. Поисковые задачи для массивов.

5.2.2.5. Сортировка массивов.

5.2.2.5.1. Сортировка вставкой

5.2.2.5.2. Сортировка выбором

5.2.2.5.3. Сортировка обменом («пузырьковая сортировка»)

5.2.2.5.4. Сортировка фон Неймана (слиянием)

5.2.2.5.5. Шейкер-сортировка

5.3. Двумерные массивы.

5.3.1. Описание двумерных массивов.

5.3.2. Сортировка двумерных массивов

Лабораторная работа № 4.

Работа с массивами чисел.

Образец выполнения задания.

Лабораторная работа № 4.

Работа с массивами чисел.

Варианты заданий.

6. Обработка строк.

6.1. Функции обработки строк.

6.2. Процедуры обработки строк.

Лабораторная работа № 7.

Обработка строк.

Лабораторная работа № 7, вариант № 8.

Обработка строк.

7. Комбинированные типы. Оператор присоединения

7.1. Записи

7.2. Оператор присоединения

Лабораторная работа № 8.

Работа с комбинированными типами данных.

Лабораторная работа № 8, вариант № 8.

Работа с комбинированными типами данных.

8. Множественные типы данных.

8.1. Множества.

Лабораторная работа № 9.

Работа с множественными типами данных.

Лабораторная работа № 9, вариант № 3.

Работа с множественными типами данных.

Варианты заданий.

Лабораторная работа № 10.

Операции над множествами.

Лабораторная работа № 10.

Операции над множествами.

Варианты заданий.

if (s[i]<>’ ’)and(s[i+1]=’ ’) {выделение слов}

then begin

ss:=ss+s[i];

j:=j+1;a[1, j]:=ss;a[2, j]:=’0’; {в первую строку}

ss:=’ ’; {записываем слово}

end; {‘0’ во второй строке означает, что слово встретилось впервые}

else if s[i]<>’ ’ then ss:=ss+s[i];

for i:=1 to j-1 do

for k:=i+1 to j do

if (a[2,i]<>’1’)and(a[2,k]<>’1’)and(a[1,i]=a[1,k]) then a[2,k]=’1’; {нашли совпавшие слова}

s:=’ ’;

for i:=1 to j do

if a[2,i]<>’1’ then s:=s+a[1,i]+’ ’;

writeln(‘Результат : ’,s);

end.

Результаты выполнения программы:


Введите строку: жили были жили

Результат: жили были



Варианты заданий.

  1. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Упорядочить слова предложения в алфавитном порядке.


  1. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Найти самое длинное слово в предложении.


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



  1. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Вывести на экран все слова, преобразовав каждое при этом следующим образом: первую букву слова заменить последней.


  1. Задано предложение, состоящее из слов, разделённым одним или несколькими пробелами. Выяснить какая буква встречается чаще всего.


7. Комбинированные типы. Оператор присоединения

7.1. Записи

Комбинированный тип характеризует объекты, называемые записями. Запись – это сложная переменная с несколькими компонентами. В отличие от массивов компоненты записи (поля) могут иметь разные типы и доступ к ним осуществляется не по индексу, а по имени поля. При определении комбинированного типа задаются имя и тип каждого поля.

Тип имеет следующую структуру:


type <имя_типа> = RECORD <сп_полей> END;


где RECORD, END – зарезервированные слова (запись, конец);

<имя_типа> -- правильный идентификатор;

<сп_полей> -- список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой.

К каждому компоненту записи можно обратиться, используя имя переменной типа записи и имя поля, разделенных точкой.

Пример: type СотрФирм = RECORD

ФИО: array [1..10] of char;

Оклад: integer;

Адрес: RECORD

Улица : array [1..10] of char;

Ндома,Нкв : integer;

END;

END;

var сотф : СотрФирм;

или

var сотф :RECORD

ФИО: array [1..10] of char;

Оклад: integer;

Адрес: RECORD

Улица : array [1..10] of char;

Ндома,Нкв : integer;

END;

END;

Обращение : сотф.Оклад:=1344;

сотф.Адрес.Ндома:=12;

сотф.Адрес.Нкв:=34;


7.2. Оператор присоединения

Приведенные операторы присваивания при обращении к записям можно записать компактно, если использовать оператор присоединения, имеющий вид:


WITH <список перем_записей, полей> DO <оператор>.

Имена переменных-записей и полей, указанные в заголовке оператора присоединения, можно опускать при обращении к компонентам записей в области действия оператора WITH:

Пример: Обращение: with сотф do Оклад:=1344;

или

with сотф do begin

Оклад:=1344;

Адрес.Ндом:=12;

Адрес.Нкв:=34;

end;

При определении того или иного комбинированного типа имена отдельных полей могут совпадать с именами переменных. Путаницы при использовании этих переменных и соответствующих полей записи не происходит в силу того, что в частичной переменной-записи указывается и имя собственной переменной-записи. Однако при использовании оператора присоединения может возникнуть недоразумение, связанное с тем, что внутри него имена переменных-записей опускаются. Возникает вопрос: что обозначает имя внутри оператора присоединения, если и у соответствующей переменной-записи присутствует поле с таким именем, и в разделе переменных введена в употребление переменная с таким же именем? В языке Паскаль этот конфликт решается так: предпочтение отдаётся именам полей записи, т.е. считается, что внутри оператора присоединения соответствующий идентификатор обозначает имя поля, а не имя переменной.

Пусть, например, в разделах описания типов и описания переменных введены в употребление следующие комбинированные типы и переменные:

Type студ=record

Фам,Имя,Отч:array [1..16] of char;

Пол: (муж,жен);

Группа:101..520;

Стип:boolean;

End;

сотр=record

Фам,Имя,Отч:array [1..16] of char;

Пол: муж..жен;

Должность:(мнс,нс,снс,асс,доц,проф);

Зарплата:integer;

End;

Var X:Студ;

Y:Сотр;

Тогда в следующем фрагменте программы, использующем оператор присоединения:

With X,Y do begin

Пол:=муж;

Имя:=’Александр’;

Стипендия:=true;

Группа:=108;

End;

Поля Пол и Имя относятся к переменной Y типа Сотр, так как эта переменная в списке переменных-записей заголовка оператора присоединения фигурирует после переменной X типа Студ, имеющей одноимённые поля Пол и Имя. Кроме того, в этом фрагменте имя Степендия в теле оператора присоединения трактуется как имя поля переменной X, а вне его как имя переменной целого типа.

Приведём ещё один пример, иллюстрирующий трактовку оператора присоединения. Пусть имеются описания переменных:

Var R1:record A,B,C:integer; end;

R2:record A,D:integer;

B:record C,E:integer;end;

end;

Тогда оператор присоединения


With R1,B,R2 do

Begin A:=1; B:=2; C:=3; D:=4; E:=5; end;


эквивалентен составному оператору


begin R1.A:=1; R1.B:=2; R1.C:=3; R2.D:=4; R2.B.E:=5; end;


Рекомендуется внимательно проанализировать каждый оператор присваивания и чётко понять, почему именно такие частичные переменные фигурируют в составном операторе, эквивалентном оператору присоединения.


Лабораторная работа № 8.

Работа с комбинированными типами данных.

Цель задания:
  1. Получение навыков в организации ввода/вывода значений комбинированного типа данных.

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


Постановка задачи:
  1. Существует некоторая фирма, которая образована в 1991 году. Составить список сотрудников этой фирмы, содержащей 20 человек. Список должен содержать следующие сведения для каждого сотрудника: ФИО, дату рождения, год поступления в фирму, оклад, адрес (улица, номер дома и квартиры). Информацию о каждом сотруднике оформить в виде записи. Записи объединить в массив.

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


Содержание отчета:
  1. Постановка задачи для конкретного варианта.

  2. Исходные данные.

  3. Текст программы.

  4. Результаты выполнения программы.





Образец выполнения задания.

Лабораторная работа № 8, вариант № 8.

Работа с комбинированными типами данных.

Постановка задачи для конкретного варианта:

1. Существует некоторая фирма, которая образована в 1991 году. Составить список сотрудников этой фирмы, содержащей 20 человек. Список должен содержать следующие сведения для каждого сотрудника: ФИО, дату рождения, год поступления в фирму, оклад, адрес (улица, номер дома и квартиры). Информацию о каждом сотруднике оформить в виде записи. Записи объединить в массив.

2. Составить программу, которая выполняет ввод и печать списка сотрудников, фамилии которых начинаются с буквы Т, и их даты рождения. Ввод и печать оформить в виде процедур.

Исходные данные:

Анисимов Петр Иванович

Родился 23.1.1960

В фирме с 1991 года

Зарплата 15000 рублей

Проживает по адресу:

Улица Ленина 12-45

Синилов Сергей Анатольевич Родился 14.5.1964

В фирме с1991 года

Зарплата 14500 рублей

Проживает по адресу:

Улица Мира 67-19

Шорапов Евгений Владимирович

Родился 28.2.1969

В фирме с 1991 года

Зрплата 14000

Проживает по адресу:

Улица Левченко 84-37

Бажин Никита Андреевич

Родился 3.9.1963

В фирме с 1991года

Зарплата 13500 рублей

Проживает по адресу:

Улица Вагонная 94-36

Созинов Алексей Петрович

Родился 13.12.1964

В фирме с 1991года

Зарплата 13000 рублей

Проживает по адресу:

Улица Куйбешева 68-83

Малышев Василий Владимирович

Родился 18.6.1968

В фирме с 1991года

Зарплата 12500 рублей

Проживает по адресу:

Улица Охотников 8-3

Мельникова Лариса Анатольевна

Родилась 11.2.1959

В фирме с 1991 года

Зарплата 12000 рублей

Проживает по адресу:

Улица Кирова 83-56

Тихонов Сергей Генадьевич

Родился 30.3.1967

В фирме с 1991года

Зарплата 11500 рублей

Проживает по адресу:

Улица Автозаводская 42-88

Еговцев Иван Артурович

Родился 18.9.1968

В фирме с 1991года

Зарплата 11000 рублей

Проживает по адресу:

Улица Дзержинского 23-69

Ползунова Елена Андреевна

Родилась 15.10.1962

В фирме с 1991 года

Зарплата 10500 рублей

Проживает по адресу:

Улица Дружбы 28-75

Михайлов Артем Егоровну

Родился 2.11.1970

В фирме с 1992 года

Зарплата 10000 рублей

Проживает по адресу:

Улица Невская 13-46

Смирнов Никита Владимирович

Родился 3.8.1968

В фирме с 1992 года

Зарплата 9500 рублей

Проживает по адресу:

Улица Болотная 59-38

Токарев Надежда Александровна

Родилась 4.7.1970

В фирме с 1992 года

Зарплата 9000 рублей

Проживает по адресу:

Улица Кочегаров 75-63

Маслова Нина Михайловна

Родилась 7.3.1966

В фирме с 1993 года

Зарплата 8500 рублей

Проживает по адресу:

Улица Васнецова 49-92

Молчановский Ильнар Ирекович

Родился 9.8.1969

В фирме с 1993 года

Зарплата 8000 рублей

Проживает по адресу:

Улица Лебедева 34-81

Корягина Нина Плахова Родилась 10.2.1970

В фирме с 1994 года

Зарплата 7500 рублей

Проживает по адресу:

Улица Калинина 24-12

Егорова Пелагея Луповна Родилась 12.1.1971;

В фирме с 1996 года

Зарплата 7000 рублей

Проживает по адресу:

Улица Нефтяников 47-38

Гаспер Валентина Александровна

Родилась 16.11.1972

В фирме с 1998 года

Зарплата 6500 рублей

Проживает по адресу:

Улица Докучаево 75-94

Теплоухов Юрий Леонидович

Родился 25.5.1978

В фирме с 2000 года

Зарплата 6000 рублей

Проживает по адресу:

Улица Заречная 28-47

Кирьянов Антон Алексеевич

Родился 28.8.1968

В фирме с 1993 года

Зарплата 12700 рублеу

Проживает по адресу:

Улица Кислотная 26-14







Текст программы:


program lab8{ вариант № 8};

type man=record

fio:record fameli,name,och:string[15];end;

date:record day,mes,god:integer;end;

godpos:integer;

many:integer;

adres:record ul:string[15];

dom,kv:integer;end;

end;

var sot:array [1..20] of man;

n:integer;

symb:string[1];

procedure vvod;

begin

for n:=1 to 20 do

begin

writeln(‘Вводим данные на сотрудникa номер:’,n);

write(‘Фамилия’);

readln(sot[n].fio.fameli);

write(‘Имя’);

readln(sot[n].fio.name);

write(‘Отчество’);

readln(sot[n].fio.och);

writeln(‘Дата рождения’);

write(‘День’);

readln(sot[n].date.day);

write(‘Месяц’);

readln(sot[n].date.mes);

write(‘Год’);

readln(sot[n].date.god);

write(‘Год поступления в фирму’);

readln(sot[n].godpos);

write(‘Заработная плата’);

readln(sot[n].many);

writeln(‘Адрес проживания’);

write(‘Улица’);

readln(sot[n].adres.ul);

write(‘Номер дома’);

readln(sot[n].adres.dom);

write(‘Номер квартиры’);

readln(sot[n].adres.kv);

end;

end;

procedure list(n:integer);

begin

writeln('--------------------------------------------------------------------------------');

write(sot[n].fio.fameli,' ',sot[n].fio.name,' ',sot[n].fio.och);

writeln(' Дата рождения ',sot[n].date.day,'/',sot[n].date.mes,'/',sot[n].date.god);

writeln;

end;

begin

vvod; {процедура ввода исходных данных}

writeln('Распечатать список сотрудников, фамилии которых начинаются с буквы Т');

writeln(' и их даты рождения.');

writeln;

for n:=1 to 20 do begin

symb:=copy(sot[n].fio.fameli,1,1);

if symb='Т' then list(n);

end;

end.





Результаты выполнения программы:


Распечатать список сотрудников, фамилии которых начинаются с буквы Т

и их даты рождения.

--------------------------------------------------------------------------------

Тихонов Сергей Геннадьевич Дата рождения 30/3/1967

--------------------------------------------------------------------------------

Токарева Надежда Александровна Дата рождения 4/7/1970

--------------------------------------------------------------------------------

Теплоухов Юрий Леонидович Дата рождения 25/5/1978

--------------------------------------------------------------------------------

Конец данных , нажмите Enter.


Варианты заданий.

  1. Распечатать анкетные данные сотрудников, имеющих срок службы больше 5 лет.

  2. Распечатать анкетные данные сотрудников, которым больше 25 лет.

  3. Распечатать анкетные данные сотрудников, у которых улица начинается с буквы С.

  4. Распечатать ФИО сотрудников, у которых улица начинается с буквы М, и номер дома больше 5.

  5. Распечатать анкетные данные сотрудников, месяц рождения которых больше 6 и фамилия начинается с буквы Л.

  6. Распечатать анкетные данные сотрудников, упорядоченные по ФИО и Улицам.

  7. Распечатать список сотрудников, фамилии которых начинаются с буквы А, и их оклад.

  8. Распечатать список сотрудников, фамилии которых начинаются с буквы В и Г, и год их поступления в фирму.

  9. Распечатать фамилии и даты рождения сотрудников, имеющих номер квартиры меньше 35.

  10. Распечатать список сотрудников, упорядоченный по адресам (т.е. по улице, номерам дома и квартиры).

  11. Упорядочить список сотрудников по году поступления в фирму и распечатать его.

  12. Вычислить средний оклад сотрудников и распечатать список сотрудников, имеющих оклад выше среднего.

  13. Вычислить средний оклад сотрудников и распечатать список сотрудников, имеющих оклад ниже среднего.

  14. Вычислить средний оклад сотрудников и распечатать список сотрудников, имеющих оклад, равный среднему.

  15. Упорядочить список сотрудников фирмы по году рождения и распечатать его.

  16. Распечатать список сотрудников, упорядоченный по алфавиту.

  17. Распечатать список сотрудников, упорядоченный по месяцу рождения.

  18. Распечатать список сотрудников, фамилии которых начинаются с буквы Р, упорядоченный по году рождения.

  19. Распечатать анкетные данные сотрудников, упорядоченные по дате рождения.

  20. Распечатать ФИО и адреса сотрудников, которые проработали в фирме меньше года.

  21. Распечатать ФИО сотрудников, оклад которых выше среднего в 1.2-1.5 раза.

  22. Распечатать ФИО сотрудников, в названии улиц которых есть буква А.

  23. Распечатать ФИО и номера домов сотрудников, у которых номера квартир начинаются с 3, 4, 5, 6, 7, 8.

  24. 25) Распечатать ФИО и дату рождения сотрудников, у которых номера домов меньше 20, а номера квартир больше 5.




8. Множественные типы данных.

8.1. Множества.


Множества - это наборы однотипных логически связанных друг с другом объектов.

Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество, не содержащие элементов, называется пустым). Именно непостоянством количества своих элементов множества отличаются от массивов и записей.

Два множества являются эквивалентными тогда и только тогда, когда все элементы одинаковы причем порядок следования элементов в множестве безразличен.

Описание типа множества имеет вид:

<имя типа>=SET OF <базовый тип>,

где <имя типа> - правильный идентификатор;

SET,OF - зарезервированные слова;

<базовый тип> - базовый тип элементов множества, в качестве

которого может использоваться любой порядковый тип, кроме

WORD, LONGINT, INTEGER.

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

Операции над множествами:

- Пересечение множеств. Результатом операции пересечения двух множеств А*В будет множество С, состоящее только из тех элементов которые принадлежат, как множеству А, так и множеству В.

Пример: [1,2,3,4]*[3,4,5,6] результат [3,4]




С = А * В

А В С: = А * В




+ - Объединение множеств. Результатом операции объединения множеств А+В будет множество С , включающее как все элементы множества А, так и все элементы множества В.

Пример: [1,2,3,4]+[3,4,5,6] результат [1,2,3,4,5,6]




А В С = А В

С: = А + В


- Разность множеств. Результатом операции разности двух множеств А-В, будет множество С, состоящее только из тех элементов множества А, которые не входят в множество В.

Пример: [1,2,3,4]-[3,4,5,6] результат [1,2]



С = А \ В

А В С: = А - В



Результатом операции сравнения А=В будет TRUE, а операции

А< >В будет FALSE, только тогда, когда А и В содержат одни и те же элементы.

Результатом операции сравнения А<=B будет TRUE, если множество А является подмножеством множества В.

Результатом операции сравнения A>=B будет TRUE, если множество А включает в себя все элементы множества В.

Результатом операции принадлежности Х in A будет TRUE, если значение Х какого либо порядкового типа Т является элементом множества А того же типа Т.



A Х А

If X in A thin





Пример операций принадлежности и объединения множеств.

PROGRAM Dem_Set_Type;

USES Crt;

TYPE SetType =set of char;

{объявление отдельного типа для передачи параметров в My function}

VAR Myset, Set1, Set2 :Settype;

CH :char;

FUNCTION Myfunction (Var set: Set type) : char;


VAR Flag: char;

BEGIN

REPEAT

Flag:=UpCase(ReadKey);

UNTIL Flag IN Var Set;

Writeln(‘ Правильно!!!’);

Myfunction := Flag;

END;

BEGIN

MySet:= [‘Y’,’N’];

Writeln(‘Допускаются ответы только Y или N’);

CH:= Myfunction (myset);

Set1:=[‘K’];