Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций по курсу 'Информатика'.doc
Скачиваний:
7
Добавлен:
14.07.2019
Размер:
483.84 Кб
Скачать

Структуры.

Моделирование других объектов требует введения специального понятия – структура.

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

Рассмотрим работу со структурой на примере. Нужно составить базу данных по результатам сессии.

фамилия

баллы

1

Иванов

3 4 5 2

2

Петров

4 4 3 3

Сформируем шаблон структуры.

Назовем нашу структуру – stud.

struct stud { int n ; // описание первого поля структуры – номер по списку.

char name [10] ; // описание второго поля – фамилия.

Int ball [4] ; // описание третьего поля – оценки.

}

Описание переменных типа stud. В разных версиях языка возможны два варианта, с использованием ключевого слова struct и без него.

struc stud a, b, c ;

stud a, b, c ;

Инициализация структуры.

stud a={ 1, “ Абрамов “, 3, 4, 5, 5 } ;

Заполнять структуру можно явно или вводить с экрана.

a.n = 1 ;

a.ball[0]= 3 ; // явное заполнение оценок.

a.ball[1]= 4 ;

a.ball[2]= 5 ;

a.ball[3]= 5 ;

gets( a..name ) ; // ввод с экрана фамилии.

Можно задать массив структур, т.е. список группы.

stud spis [25] ;

Фрагмент программы, реализующий ввод списка группы с экрана.

for ( i=0 ; i<25 ; i++ )

{

spis[i].n = i+1 ;

printf (“ \n введите фамилию “ ) ;

gets ( spis[i].name ) ;

printf (“ \n введите оценки“ ) ;

for ( k=0 ; k<4 ; k++)

scanf( “ %d”, &spis[i].ball[k]) ;

}

Переставим местами фамилии 5-го и 10-го студента. Фрагмент программы будет выглядеть так.

char x ;

for ( i=0 ; i<10 ; i++)

{

x = spis[5].name[i] ;

spis[5].name[i]= spis[10].name[i] ;

spis[10].name[i] = x ;

}

Главные задачи с использованием структур – это задачи сортировки и поиска. Структуры являются основным «кирпичиком» формирования баз данных.

Иногда с использованием структур можно элегантно решать и простые задачи.

Сосчитать число дней от начала года до текущего. Обычно такая задача решается с использованием оператора case.

struc mouth { int n ; int k } // n – номер месяца, k – число дней в нем.

int sum, ch, mm ;

struc mouth m[12] = {1, 31, 2, 28, 3, 31 … 12, 31} ;

scanf( “%d”, &ch) ; // ввод текущей даты, ch – число, mm – месяц.

scanf( “%d”, &mm) ;

for ( i=0 , sum=0 ; i<mm-2 ; i++0

sum+= m[i].k ; // количество дней во всех месяцах до текущего

sum+= ch ;

printf ( “ %d”, sum) ;

СЛОЖНЫЕ ДИНАМИЧЕСКИЕ СТРУКТУРЫ.

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

СТЕК.

Стек используется при создании компилятора. При работе с рекурсией, значения всех параметров в момент вызова функции кладутся в стек. С использованием стека вычисляется любое арифметическое выражение. Стек формируется и работает по принципу - последний пришел – первый ушел.

Адрес информация

Следующего

Верхушка стека

Пустая ссылка

Операции, определенные над стеком:

1. Если стек пуст, то создать его.

2. Добавить в стек, только наверх.

3. Извлечь из стека, если не пуст, только верхушку.

4. Ходить по стеку, иcкать, проверять внутри его – нельзя!

Рассмотрим задачу – создать стек и удалить из него все символы до «а».

struct st { char n ; // описание элемента стека как записи с 2 полями, информационным - n

st *next ; // и адресным – next.

}

main ()

{

st *ps, *pp=NULL ; // описание переменных указывающих на элемент стека.

char c ; // NULL – пустая ссылка, адрес.

do

{ ps= new st ; // создание новой записи ( элемента стека)

printf ( “ \n, введите информационный элемент стека “) ;

scanf ( “%c”, &c) ;

// заполнение полей записи

(*ps).n=c ; // можно эту операцию записать иначе ps->n=c ;

(*ps).next=pp ;

pp=ps ; // делаем эту запись предыдущей.

printf ( “\n, будите продолжать ? ( да=1) “) ;

}

while( getch()==’1’) ;

printf (“\n, верхушка стека %c”, (*pp).n) ;

// удаление всех символов до ‘a’.

w hile(((*ps).n!=’a’)&&((*ps).next!=NULL))

{ pp=(*ps).next ;

delete ps ;

ps=pp ;

}

printf(‘\n верхушка стека после удаления %c”, (*pp).n) ;

}