Структуры в Си-программах. Семантика и синтез

Содержание

Слайд 2

1. Способы описания (объявления) структуры. Примеры. Описание всякой структуры в программе

1. Способы описания (объявления) структуры. Примеры.
Описание всякой структуры в программе начинается

с ключевого слова struct и в простейшем случае имеет следующий формат:
struct {member-declaration list}
identifier <,identifier ... >;
struct есть ключевое слово языка Си, а в угловые скобки (<>) заключена необязательная часть конструкции.
member-declaration list - одно или более описаний переменных, каждая из которых называется элементом структуры, а identifier - имя переменной, определяемой как имеющей тип структура (называется экземпляром структуры).
Слайд 3

15.11.2012 Когда объявлявляется структура, то для нее компилятор выделяет память, в

15.11.2012

Когда объявлявляется структура, то для нее компилятор выделяет память, в которой

могут размещатся элементы (поля ) разных типов

ниже объявлена более
сложная структура:

поля

Слайд 4

15.11.2012 //объявлена структура A //тогда после нее пусть дано такое описание:

15.11.2012

//объявлена структура A
//тогда после нее пусть дано такое описание:
struct A

d; //объявление переменной d, которая содержит
//в себе две величины: символьный массив с именем b, //переменную целого типа с именем count
Слайд 5

15.11.2012

15.11.2012

Слайд 6

15.11.2012 2. Доступ к элементам структуры. Адресные выражения. Примеры. d={“может”, 7};//d-структура

15.11.2012

2. Доступ к элементам структуры. Адресные выражения. Примеры.
d={“может”, 7};//d-структура
cout << d.B<<“

”<// т.е. доступ выполнен по правилу:
//имя_структуры . имя_элемента
Слайд 7

15.11.2012 //Далее показан доступ (извлечение из структуры): a.strel=&ch; Экземпляры структуры

15.11.2012

//Далее показан доступ (извлечение из структуры): a.strel=&ch;

Экземпляры структуры

Слайд 8

3. Примеры программ , использующих структуры.

3. Примеры программ , использующих структуры.

Слайд 9

15.11.2012 Cтруктуры нельзя присваивать или копировать как целое. Структуры не могут

15.11.2012

Cтруктуры нельзя присваивать или копировать как целое. Структуры не могут быть

переданы функциям или возвращены ими. Но на указатели структур эти ограничения не накладываются.

/*Пример программы: сложение комплексных чисел*/
#include // прототип функций ввода\выода (printf, puts, scanf и др.)
#include // прототип функции getch ()
typedef struct // определение и объявление структуры typedef- задание
// структурного типа
{ //начало описания
int real; //список описания структуры
int imag;
} //конец описания
complex; //complex – объявление переменной структурного типа
void main () //объявление главной функции
{ //начало описания главной функции main()
complex c1, c2, c3, read (); //переменные комплексного типа и функция
void add (complex, complex, complex*), print (complex); //объявление прототипа
// функций add и print;
c1 = read (); //чтение с клавиатуры числовых данных
c2 = read();
add (c1, c2, &c3);
printf ("при сложении "); print (c1); printf (" и "); print (c2);
printf ("\nполучилось "); print (c3);
getch (); //задержка экрана
}//end main(), не главные функции ниже

! Протестировать
самостоятельно

Слайд 10

15.11.2012 complex read () //тип функции complex {// ------------------------ complex c;//

15.11.2012

complex read () //тип функции complex
{// ------------------------
complex c;// |

puts ("введите действительную и мнимую части числа:"); /* функция
выводит текст */
scanf ("%d%d", &(c.real), &(c.imag));//читает с клавиатуры
return c; // и записывает введённые с клавиатуры данные в память
} //
------------------------
void print (complex c) //функция печати комплексных чисел
{
printf ("%d+i*(%d)", c.real, c.imag);
}
void add (complex c1, complex c2, complex*c3) //функция подсчёта суммы
// комплексных чисел
{
c3-> real = c1.real + c2.real; //c3 присваивается сумма действит. чисел
c3-> imag = c1.imag + c2.imag; //затем сумма мнимых чисел
}
Слайд 11

15.11.2012 Пример записи данных в сложную структуру mybox //простая структура типа

15.11.2012

Пример записи данных в сложную структуру mybox

//простая структура типа coord

для хранения координат точки:
struct coord {
int x;
int y;
}
//сложная структура rectangle, содержащая две структуры, которые
//задают противоположные углы прямоугольника,
//объявляется экземпляр структуры
struct rectangle {
struct coord topleft;
struct coord bottomrt;
} mybox;

//помещение (запись) значений в поля mybox:
mybox.toplеft.x = 100; mybox.bottomrt.x = 300;
mybox.bottomrt.y = 400; mybox.topleft.y = 200;

Слайд 12

15.11.2012 Пример фрагмента программы: //Вычисление длины, ширины и площади //прямоугольника по

15.11.2012

Пример фрагмента программы:
//Вычисление длины, ширины и площади
//прямоугольника по данным предыдущей структуры

width=

mybox.bottomrt.x - mybox.topleft.x;
length = mybox.bottomrt.y - mybox.topleft.y;

// Вычисление площади прямоугольника
area = width * length;

Слайд 13

15.11.2012

15.11.2012

Слайд 14

15.11.2012

15.11.2012

Слайд 15

15.11.2012

15.11.2012

Слайд 16

15.11.2012

15.11.2012

Слайд 17

6. Структуры и функции (изучить самостоятельно !) Совершенно очевидно, что отдельные

6. Структуры и функции
(изучить самостоятельно !)
Совершенно очевидно, что отдельные элементы

структур, являющиеся простыми переменными или указателями произвольного типа, могут быть использованы в качестве аргументов при обращении к функциям.
Однако более важным является вопрос о возможности передачи через аппарат формальных/фактических параметров структур в целом. Эту операцию наиболее естественно осуществить, используя понятие указателя на структуру.
Для иллюстрации технических деталей, связанных с передачей и обработкой структур, рассмотрим фрагмент программы, отыскивающей в сводном каталоге книгу, имеющую наиболее ранний год издания. Общая организация данных, необходимая для решения этой задачи, может быть представлена при помощи структурного шаблона BOOK.
Слайд 18

//Пример программы с именем BOOK #include #define MAX 300 struct BOOK

//Пример программы с именем BOOK
#include
#define MAX 300
struct BOOK

{ char author[30]; // Автор книги
char title[256]; // Название книги
int year; // Год издания
int pages; // Количество страниц
};
/* Поиск самой старой книги */
int find(book) struct BOOK *book;
{ int cnt, min;
min = book->year;
for (cnt = 0; cnt < MAX; cnt++, book++)
if (book->year < min) min = book->year;
return (min);
}