Записи (Record) в Рascal ABC
Автор: Комкова М.С.
Учитель информатики, гимназия МИИТ, г.Москва.
Понятие
Запись – это структура, состоящая из фиксированного числа компонент, называемых полями.
Данные одного поля разных записей имеют один и тот же тип , а разных полей могут иметь разные типы.
Общий вид описания типа record :
type t = record
id11, id12, …: type1;
id21, id22, …: type2;
……………… .
end;
здесь id – идентификаторы полей; type – типы полей; t – имя типа.
Пример.
Данные комплексного вида можно описать переменной типа record .
type complex = record
re, im: real end;
var c: complex;
здесь complex – имя типа, а c – имя переменной. Переменная c состоит из двух полей: re и im , имеющих один и тот же тип (real). Эти поля переменной c обозначаются как c.re и c.im .
Пример.
Даты каких-либо событий можно описать следующим образом:
type date = record
month: 1..12;
day: 1..31;
year: integer
end;
var d: date;
В этом примере описан тип date и переменная d , принадлежащая этому типу.
Например, чтобы заслать в d дату 12.01.2003, надо выполнить следующие операторы:
d.month := 1;
d.day := 12;
d.year := 2003;
Пример.
Вычислить сумму s двух комплексных чисел x = 2 + 7i и y = 6 + 3i (т.е. x, y, s: complex;).
x.re := 2.0;
x.im := 7.0;
y.re := 6.0;
y.im := 3.0;
s.re := x.re + y.re;
s.im := x.im + y.im;
Запись может быть компонентой других структур.
Например, введем тип family(семья: отец, мать, 1-й ребенок, 2-й ребенок):
type family = (father, mother, child1, child2);
var birthday: array[family] of date;
где date – описанная выше запись.
Для занесения даты рождения, например, mother, достаточно выполнить операторы:
birthday[mother].month := 5;
birthday[mother].day := 1;
birthday[mother].year := 1965;
Сортировка номеров строк матрицы по убыванию сумм строк
Задача:
Упорядочить номера строк матрицы по убыванию сумм элементов срок. Вывести на экран отсортированные номера строк и соответствующие им суммы.
Алгоритм решения задачи:
В данном случае элементы самой матрицы сортировать не надо. Требуется сортировка номеров строк. Следовательно, они должны быть сохранены в какой-либо структуре и связаны с суммами строк. Можно создать два одноразмерных массива, в одном хранить номера строк, в другом - соответствующие им суммы. При сортировке второго массива перестановки также выполнять в первом.
Однако проще использовать массив записей, где каждая запись имеет два поля: номер строки и ее сумму. В таком случае сортировка элементов массива выполняется по полю суммы. В отличие от варианта с использованием двух массивов, здесь переставлять вслед за сортировкой сумм соответствующие им номера строк не требуется, так как сортируются записи, в которых номера и суммы объединены в одну структуру.
Код программы:
const N = 7; M = 5;
type row = record
sum: word;
id: byte;
end;
var arr: array[1..N,1..M] of word;
rows: array[1..N] of row; i,j: byte;
b: row; begin randomize;
for i:=1 to N do begin rows[i].sum := 0;
rows[i].id := i;
write(i,' -');
for j:=1 to M do
begin
arr[i,j] := random(9) + 1;
write(arr[i,j]:2);
rows[i].sum := rows[i].sum + arr[i,j];
end;
writeln;
end;
for i:=1 to N-1 do
for j:=1 to N-i do
if rows[j].sum
begin
b := rows[j];
rows[j] := rows[j+1];
rows[j+1] := b;
end;
writeln('Строки по убыванию сумм: ');
for i:=1 to N do
writeln(rows[i].id,' - ',rows[i].sum);
end.
Вывести на экран фамилии студентов, чей балл выше среднего по группе.
Задача:
Описание переменных:
arr_studs – группа студентов; average – средний балл в группе.
average then writeln(arr_studs[i].sname); readln end . " width="640"
Код программы:
type
studs = record
sname: string [25];
eval: integer ;
end ;
var
arr_studs: array [1..15] of studs;
sum: integer ;
average: real ;
i,n: byte ;
begin
write('Количество студентов: ');
readln(n);
sum := 0;
for i:=1 to n do
with arr_studs[i] do begin
write(i,'-й студент: ');
readln(sname);
write(' Оценка: ');
readln(eval);
sum := sum + eval;
end ;
average := sum / n;
writeln;
writeln('Студенты с оценкой выше средней:');
for i:=1 to n do
if arr_studs[i].eval average then
writeln(arr_studs[i].sname);
readln
end .
Программа, определяющая количество дней в месяце.
Задача:
Алгоритм решения задачи:
Переменная d имеет тип данных запись и содержит два поля: year – для хранения года и month – для месяца.
Пользователь вводит год и месяц.
Оператор выбора case по номеру месяца определяет количество дней в нем. Ситуация осложняется тем, что в феврале может быть как 28 дней, так и 29 (в високосный год).
Год является високосным, если делится без остатка на 4 и при этом не является последним годом столетия, за исключением того столетия, которое без остатка делится на 400.
Код программы:
type date = record
year:1900..2100;
month:1..12
end ;
var d: date;
begin
write('Год: ');
readln(d.year);
write('Месяц: ');
readln(d.month);
case d.month of
4,6,9,11:
writeln('В этом месяце 30 дней');
1,3,5,7,8,10,12:
writeln('В этом месяце 31 день');
2:
if (d.year mod 400 = 0) or
(d.year mod 100 0) and (d.year mod 4 = 0) then
writeln('В этом месяце 29 дней')
else
writeln('В этом месяце 28 дней');
end ;
readln;
end .
Задания с обработкой записей (самостоятельная работа)
1. Ввести оценки студента по 5 экзаменам. Определить средний балл и подсчитать количество удовлетворительных, хороших и отличных оценок. Напечатать название предмета, если есть «неуд».
2. Дан список студентов и оценка каждого на экзамене (оценки на N экзаменах). Подсчитать количество удовлетворительных оценок, хороших, отлич- ных и средний балл в группе. Напечатать фамилии неуспевающих студентов.
3. Дан список студентов группы. Заполнить его следующими сведениями: фамилия, имя, отчество; имеет ли компьютер (если имеет, то какой и с какого года). Подсчитать сколько студентов имеют ПК.
4. Сформировать пополняемую базу данных «Континент – страны», в которой указать столицы, численность населения, крупные города. Организовать поиск страны по городу, стран или городов на континенте.
5. Сформировать список студентов группы, в котором указать фамилию (имя, отчество); город, в котором получил среднее образование (номер школы, если обучался в Омске). Подсчитать, сколько в группе иногородних студентов.
6. В файле задан список книг (автор, название, год издания). Разработать программу выбора книг, выпущенных ранее заданного года.
7. Сформировать телефонный справочник. По номеру организовать поиск владельца, и наоборот.
8. Сформировать запись «Даты – праздники». Организовать в программе ввод дат, подсчитать число праздничных дней и рабочих.
9. Сформировать запись «английское слово – перевод». Вводя слово (английское или русское), найти перевод или выдать сообщение «нет в словаре». По возможности предусмотреть пополнение словаря.
10. Сформировать запись «операторы PascalABC»: оператор, действие. Подсчитать их количество и число операторов, имеющих повторяющиеся ключевые слова.
Источники:
- http:// pascalabc.net
- http:// www.cyberforum.ru/pascalabc/thread60683.html
- http:// kooptex.ru/files/Pascal%20abc%20%F0%E8%F1%F3%ED%EA%E8.html
- http://www.studfiles.ru/preview/2687651 /
- http://www.proshkolu.ru/club/pascalabc/blog/23268 /
- http://idunaurok.ru/nashi-materialy/informatika/ программируем-на- abs-pascal- простейшие-задач. html
- http:// danfa.org/viewtopic.php?t=213
- http://www.tehnari.ru/f41/t61456 /
- http://www.studfiles.ru/preview/2687651/page:8 /