Информационные источники (основные учебники по предмету)

Мая группа № 13 (Информатика и ИКТ)

Урок № 77

Тема программы: Комбинированный тип данных.

Тема урока: Комбинированный тип данных. Записи. Объявление переменной комбинированного типа.

Цель: ввести понятие «Запись»;рассмотреть основные приемы создания комбинированных типов данных.

ПЛАН

1. Теоретические сведения

1) Прослушать видео по ссылке https://videouroki.net/video/35-kombinirovannyj-tip-dannyh.html

2) Написать конспект используя материал лекции.

 

2. Решения задач

Теоретические сведения.

Комбинированным называется структурный тип данных, который состоит из фиксированного числа величин различных типов, которые называются полями. Сами же объекты комбинированного типа данных называются записями.

Для того, чтобы использовать данные комбинированного типа в программе, тип записи сначала описывается в разделе описания типов – type. Для этого в начале указывается имя описываемого типа. После имени, через пробел, следует знак равенства, а после него, через пробел, записывается служебное слово record. На следующей строке, на расстоянии одного пробела от имени типа, следует описание полей записи. Для этого указывается имя поля, после которого следует двоеточие. После двоеточия указывается тип поля. Это может быть любой тип данных, кроме файлового. После типа поля следует точка с запятой. Таким же образом в следующих строках описываются и следующие поля. Имена полей в одной записи не должны совпадать. После того как все поля записи описаны, следует служебное слово end, после которого следует точка с запятой.

Type

<имя типа> = record

<имя поля 1>: <тип поля 1>;

<имя поля 2>, <имя поля 3>: <тип поля 2>;

end;

Описание комбинированного типа данных

Дальше в разделе описания переменных объявляется переменная или массив элементов описанного типа.

Var

<имя переменной>: <имя типа>;

Объявление переменной комбинированного типа

После этого чтобы обратиться к одному из полей записи указывается сначала имя записи, то есть имя объявленной переменной или элемента массива описанного типа, после которого ставится точка и указывается имя необходимого поля записи. То есть, как и в реальной жизни, сначала следует выбор объекта, а потом одной из его характеристик.

<имя переменной>.<имя поля>

Обращение к полю записи

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

Теперь, когда мы определились с необходимой информацией об учащихся, опишем тип данных. Назовём его uchenik. Дальше, через пробел, запишем знак равенства, а после него, через пробел, служебное слово record и сразу на следующей строке служебное слово end и точку с запятой. Между словами record и end опишем поля типа. В начале опишем поле для хранения фамилии и инициалов ученика. Назовём его fio. Через двоеточие после имени укажем тип поля. Очевидно, что это будет строковый тип данных – string. Предположим, что фамилия и инициалы ученика не займут больше 20 символов, поэтому укажем соответствующую максимальную длину строки. Дальше опишем 2 поля, в которых будет храниться рост и вес ученика. Назовём их соответственно rost и ves. Будем указывать их в сантиметрах и килограммах, целыми положительными числами. Очевидно, что для этого нам будет достаточно типа byte. В следующем поле будет содержаться дата рождения ученика. Назовём его dr. Однако очевидно, что для описания даты нам нужно будет не одно, а 3 числа. Поэтому позже для него опишем ещё один комбинированный тип, который так и назовём – data.

uchenik = record

fio: string [20];

rost, ves: byte;

dr: data;

end;

Описание типа uchenik

Так как тип data используется нами при описании типа uchenik, опишем его выше уже описанного нами типа. Это также будет комбинированный тип данных. Опишем его поля. Это будут численные поля. Первое поле будет содержать день. Назовём его d, и укажем его принадлежащим к ограниченному типу данных, содержащему целые числа на промежутке от 1 до 31. Второе поле назовём m, оно будет содержать номер месяца, поэтому укажем его принадлежащим к ограниченному типу, содержащему целые числа от 1 до 12. Третье поле – g будет содержать номер года, укажем его принадлежащим к целочисленному типу word. Таким образом, мы описали тип данных для хранения информации об ученике школы.

data = record

d: 1..31;

m: 1..12;

g: word;

end;

Описание типа data

Мы разобрались с тем, как описывается комбинированный тип данных, но у вас мог возникнуть вопрос: «Как удобнее организовать ввод данных комбинированного типа, ведь эти данные могут иметь значительный объём, а их ввод с клавиатуры – долгий процесс, при котором достаточно легко допустить ошибку, причём в этом случае всё придётся начинать сначала?». Поэтому для ввода данных лучше заранее создать текстовый файл, в котором данные, необходимые для решения задачи, будут записаны определённым образом. Рассмотрим структуру файла, в котором записаны данные об учениках школы. Обратим внимание, что данные для каждой новой записи находятся в отдельных строках, а данные отдельных полей разделяются пробелами. При этом фамилии и инициалы учеников записаны также в отдельных строках. Это нужно потому, что при считывании строковой переменной, из файла считываются все данные до признака конца строки.

Структура файла с данными комбинированного типа

Решение задач

Задача 1. Написать программу, которая обрабатывает информацию о мальчиках школы и отбирает среди тех, кто родился в 2002 году кандидатов в баскетбольную команду школы, а также определяет среди кандидатов самого высокого. Рост кандидата в баскетбольную команду должен быть не меньше 170 сантиметров, а соотношение его роста и веса должно быть в промежутке от 2 до 2.8. Данные об учениках хранятся в файле, имя которого пользователь вводит с клавиатуры.

Напишем программу для решения задачи. Назовём её basketbolisty. Комбинированные типы данных, которые будут использоваться в программе уже описаны, поэтому опишем необходимые нам переменные. Прежде всего нам необходима переменная, для хранения данных о текущем ученике, назовём её student. Также нам понадобится переменная для хранения данных о самом высоком кандидате в баскетбольную команду. Назовём её basketbolist. Обе они будут принадлежать к описанному нами типу uchenik. Также нам потребуется файловая переменная, назовём её f, и строка в которой будет храниться имя файла – fn, и логическая переменная, с помощью которой мы будем определять есть ли кандидаты в баскетбольную команду, назовём её p.

Напишем логические скобки. Тело программы будет начинаться с того, что мы выведем на экран сообщение о том, что это программа, отбирающая кандидатов в баскетбольную команду школы и запрос на ввод имени файла, в котором хранятся данные о мальчиках школы. Дальше будет следовать оператор readln для считывания имени файла в строку fn и оператор assign, назначающий файловой переменной f файл, имя которого записано в строке fn. С помощью оператора rest откроем файл, назначенный переменной f, для чтения. Напишем оператор readln с параметром Эф, для того, чтобы пропустить первую строку файла, в которой написана шапка таблицы. Теперь обратимся к полю rost в записи basketbolist и присвоим ему значение 0, так как ни одного кандидата в баскетбольную команду мы ещё не отобрали. Присвоим переменной p значение false, предположив, что мы не найдём ни одного кандидата в баскетбольную команду.

Дальше напишем цикл, в котором мы будем считывать данные очередного мальчика и определять, является ли он кандидатом в баскетбольную команду. Это будет цикл с предусловием. Условием продолжения его работы будет то, что не достигнут конец файла, то есть not (eof (f)). В логических скобках запишем тело цикла. Оно будет начинаться со считывания данных очередного ученика. То есть запишем оператор readln для считывания из файла f для записи Студент значения поля fio. Теперь запишем оператор readln для считывания из файла для записи student полей: rost, ves, а также dr. d, dr. m и dr. g.

Теперь напишем условный оператор, который определяет, является ли ученик, данные которого мы только что считали, кандидатом в баскетбольную команду. В скобках запишем первую часть его условия – значение поля g в поле dr записи student равно 2002. Дальше запишем союз and и в скобках вторую часть условия – значение поля rost записи student больше 170. Дальше запишем союз and и в скобках напишем третью часть условия, которое также будет состоять из двух частей. В скобках запишем первую часть: значение поля rost записи student делённое на значение поля ves записи student больше или равно 2. После союза and запишем последнюю часть условия: соотношения роста и веса студента меньше либо равно 2.8.

Если это условие выполняется, то ученик является кандидатом в баскетбольную команду, поэтому после слова then в логических скобках запишем операторы, которые будут выполняться в этом случае. Запишем условный оператор, в котором в качестве условия с отрицанием будет записано значение переменной p. После слова then в этом условном операторе в логических скобках запишем два оператора: оператор writeln, который выводит на экран сообщение «Кандидаты в баскетбольную команду» с двоеточием, и оператор, присваивающий переменной p значение true. Этот условный оператор может сработать всего один раз, когда мы найдём первого кандидата в команду. Он выведет заголовок будущего вывода, и присвоит p значение «Истина», так как у нас есть кандидаты в команду. Напишем для вывода данных кандидата на экран, оператор writeln, который будет выводить на экран значение поля fio записи sudent. Точно также дополним оператор для вывода остальных полей записи: rost, ves, а также dr. d, dr. m и dr. g.

После этого мы проверим, является ли найденный кандидат в команду самым высоким, для этого сравним значение поля rost в записи student с соответствующим полем в записи basketbolist и если поле первой записи окажется больше, то присвоим переменной basketbolist значение переменной student. Такой оператор присваивания выполнится потому, что обе переменные принадлежат к типу uchenik. После цикла с помощью оператора close закроем файл и проверим, найден ли хотя бы один кандидат в баскетбольную команду. Для этого напишем условный оператор, условием которого будет значение переменной p. Если это условие выполняется, то мы нашли кандидатов в баскетбольную команду и после слова then запишем оператор write, который с соответствующим поясняющим сообщением будет выводить на экран фамилию, инициалы и рост самого высокого кандидата, которые содержатся в соответствующих полях записи Баскетболист. После слова else напишем оператор write, который будет выводить сообщение о том, что кандидатов в баскетбольную команду не найдено.

program basketbolisty;

Type

data = record

d: 1..31;

m: 1..12;

g: word;

end;

uchenik = record

fio: string [20];

rost, ves: byte;

dr: data;

end;

Var

student, basketbolist: uchenik;

f: text;

fn: string;

p: boolean;

Begin

writeln ('Программа, отбирающая кандидатов в баскетбольную команду школы. Введите имя файла, в котором хранятся данные о мальчиках школы.');

readln (fn);

assign (f, fn);

reset (f);

readln (f);

basketbolist.rost:=0;

p:=false;

while not (eof (f)) do

Begin

readln (f, student.fio);

readln (f, student.rost, student.ves, student.dr.d, student.dr.m, student.dr.g);

if (student.dr.g=2002) and (student.rost>=170) and ((student.rost/student.ves>=2) and (student.rost/student.ves<=2.8))

Then begin

if not (p)

Then begin

writeln ('Кандидаты в баскетбольную команду:');

p:=true;

end;

writeln (student.fio:22, student.rost:5, ' см.', student.ves:5, ' кг', student.dr.d:4, '.', student.dr.m:2);

if student.rost>basketbolist.rost

then basketbolist:=student;

end;

end;

close (f);

if p

then write ('Самый высокий кандидат: ', basketbolist.fio, basketbolist.rost:5, ' см.')

else write ('Кандидатов в команду не найдено.');

end.

Исходный код программы

Запустим программу на выполнение. Данные о мальчиках школы хранятся в заранее подготовленном нами файле Ученики.txt в каталоге по умолчанию. Программа вывела на экран фамилии кандидатов в баскетбольную команду, среди которых самым высоким является ученик по фамилии Борисов, рост которого составляет 188 сантиметров.

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

Программа работает правильно. Задача решена.

Задача 2.

Исходя из условия задачи, определить структуру комбинированного типа данных и типы полей. Исходные данные разместить в текстовом файле. В программе не использовать массив записей. Результаты выводить на экран и в текстовый файл.

Уровень 1

2. Из ассортимента конфет, выпускаемых кондитерской фабрикой, выбрать те, стоимость которых от 100 до 200 руб. за 1 кг. Указать срок их годности и номера магазинов, в которых они имеются в продаже.

Ход работы

    1. Инструктаж по ТБ.
    2. Выполнение практической работы.
    3. Проверка выполненной работы.

 

program konfeta;

uses crt;

const nmax=20;

type assort= record

naz:string[20];

stm:byte;

kmg:byte;

nom: array [1..nmax] of byte;

god:byte;

end;

var a: array [1..nmax] of assort;

n,i,j,k:byte;

Begin

clrscr;

Repeat

write('Количество наименований конфет до ',nmax,' n=');

readln(n);

until n in [1..nmax];

writeln('Введите информацию о конфетах:');

for i:=1 to n do

Begin

writeln('Наименование ',i);

with a[i] do

Begin

write(' Наименование: ');readln(naz);

Repeat

write(' Стоимость от 1 до 500: ');

readln(stm);

until stm in [1..500];

write('В скольки магазинах есть в продаже: ');

readln(kmg);

writeln('Введите номера магазинов через пробел:');

for j:=1 to kmg do

read(nom[j]);

readln;

write('Срок годности в месяцах:');readln(god);

end;

end;

k:=0;

writeln('Конфеты стоимостью от 100 до 200 рублей:');

for i:=1 to n do

if a[i].stm in [100..200] then

Begin

k:=1;

write(a[i].naz,' срок годности ',a[i].god,' номера магазинов ');

for j:=1 to a[i].kmg do

write(a[i].nom[j],' ');

writeln;

end;

if k=0 then write('Таких конфет нет');

readln

end.

Важно запомнить:

Комбинированный тип данных объединяет в себе компоненты различных типов, которые называются полями.

Величина комбинированного типа называется записью.

Поля записи могут иметь любой тип кроме файлового.

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

 

Домашнее задание: Проработать§ 29, ответить на вопросы 1-3.

Информационные источники (основные учебники по предмету)

Информатика. Базовый уровень: учебник для 10 класса / Семакин И. Г., Хеннер Е. К., Т.Ю. Шеина.- 5-е изд. — М.: БИНОМ. Лаборатория знаний, 2015. —264 с.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: