- •Московский государственный социальный университет академия информатики и информационных технологий
- •Введение
- •Часть. Основы программирования на Си
- •1.1. Структура простейшей Си-программы
- •1.2. Данные в Си и операции над ними
- •1.2.1. Свойства ячейки памяти. Переменные и константы
- •1.2.2. Типы данных в Си
- •1.2.3. Правила записи констант в Си
- •1.2.4. Описание переменных и именованных констант в Си.
- •1.2.5. Выражения в Си
- •1.3. Операторы преобразования данных
- •1.3.1. Общие положения
- •1.3.2. Функция форматного выводаprintf()
- •1.3.3. Функция форматного вводаscanf()
- •1.4. Разработка программ на Си
- •1.4.1. Понятие о качестве программы и основные технологические принципы разработки программ
- •1.4.2. Алгоритм и способы его записи.
- •1.4.3. Изображение алгоритмов в виде блок-схем
- •1.4.4. Базовые структуры алгоритмов и их кодирование на Си.
- •1. Следование
- •2. Разветвление (развилка)
- •If (условие)
- •If (условие)
- •3. Цикл
- •1.4.4. Примеры разработки программ
- •1.5. Массивы и указатели
- •1.5.1. Понятие массива. Основные правила работы с массивами в Си
- •1.5.2. Примеры программ с массивами.
- •1.5.3. Инициализация массивов
- •1.5.4. Указатели в Си10
- •1.5.5. Связь массивов с указателями в Си
- •Часть. Функции и многофайловые программы в Си
- •2.1. Общие сведения о подпрограммах и функциях
- •2.2. Функции си
- •2.2.1. Описание функции
- •2.2.2. Обращение к функции
- •2.2.3. Место описания функции в программе
- •2.2.4. Примеры программ, использующих функции
- •2.3. Краткие сведения о препроцессоре Си
- •2.3.2.Директива макроопределения #define
- •2.3.3. Директива #include включения файлов
- •2.3.4. Директивы условной компиляции
- •2.415. Многофайловые си-программы
- •2.4.1. Структура программы на Си. Область действия переменных
- •2.4.2. Время жизни и класс памяти переменных
- •Описатели класса памяти
- •2.4.3 Понятие о файле проекта
- •Часть. Обработка символьной информации и документов сложной структуры
- •3.1. Обработка символьной информации на Си
- •3.1.1. Символьный тип
- •3.1.2. Работа со строками символов в Си. Строковые литералы. .
- •3.1.3. Функции и макросы для работы с символьной информацией
- •3.1.4. Примеры программ
- •3.2. Тип "структура" в Си
- •Структура
- •3.3. Файлы в Си
- •3.3.1. Общие понятия.
- •3.2.Функции Си для работы с файлами
- •3.3.3. Примеры программ, использующих файлы
- •Литература
- •Содержание
3.2. Тип "структура" в Си
Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: платежные ведомости (фамилии и имена - символьная информация, денежные суммы - числовая), карточки больных в поликлинике, библиотечная информация. Для программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом является структурав Си ( в Паскале запись).
Структурная переменная, или просто структура, состоит из нескольких переменных (называемых полями), возможно, разного типа.
Структура
|
тип "структура" (шаблон) |
переменная типа "структура" |
|
Описание шаблона: |
Описание структурной переменной |
|
typedef struct{ Тип1 Список1ИменПолей; |
structИмяШаблона ИмяПеременной |
|
Тип2 Список2ИменПолей; |
|
|
. . . |
|
|
ТипN СписокNИменПолей; |
ключевое structслово не нужно пpи |
|
} ИмяШаблона |
использовании typedef |
|
или struct ИмяШаблона |
|
|
{ Тип1 Список1ИменПолей;¦ |
|
|
Тип2 Список2ИменПолей; |
|
|
. . . |
|
|
ТипN СписокNИменПолей; |
|
|
} ; |
|
Пример. Характеристики книги: автор (author), название (title), год издания (year), цена (price), описываются шаблоном BOOK.
typedef struct {char author[20]; char title[44];/*описание*/
int year; float price} BOOK; /*шаблона BOOK*/
/*или можно описать тот же самый шаблон так:
struct BOOK {char author[20]; char title[44];
int year; float price} ;*/
struct BOOK b;/*описание структурной переменной b*/
Память, занимаемая структурой, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти структуры можно использовать операцию sizeof(). Шаблон ВООК, например, описывает структуру размером памяти 70.
Обращение к полю структурной переменной:
ИмяСтруктуры.ИмяПоляили АдресСтруктуры->ИмяПоля
.(точка) и -> являются операциями, соответственно, прямого и косвенного выбора компоненты структурированной переменной.
Например,
struct BOOK a,*pnta=&a;...
a.author="Byron"; pnta->author="Byron"; /*эквивалентные операторы*/
Пример.Задача примера 2 п.3.1.4 в нижеприведенной программе выполнена с использованием структур (а не строк).
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{ /*структура сведений об игрушках*/
typedef struct {int nu;/*номер*/
char name[30];/*наименование*/
int minage,maxage;/*мин. и макс. возраст ребенка*/
double rub /*стоимость*/;}TOYS;
TOYS toy;/*переменная типа записьTOYS */
double max; /*максимальная стоимость*/
char namemax[30];/*название самого дорогого конструктора*/
int n /*число игрушек*/,i/*номер игрушки*/;
puts("Введите число наименований игpушек");
scanf("%d",&n);
max=0;
for (i=0; i<n;i++)
{toy.nu=i+1;
/*в цикле ввод сведений об игрушках и проверка условий*/
fflush(stdin); /*очистка буфера устройства ввода послеscanf */
printf(" Введите сведения об игpушке с номеpом %2d\n",toy.nu);
puts("наименование");
gets(toy.name);
puts("мин. и макс. возpаст и стоимость");
scanf("%d%d%lf",&toy.minage,&toy.maxage,&toy.rub);
if ((strstr(toy.name,"констpуктоp")!=NULL ||
strstr(toy.name,"Констpуктоp")!=NULL) &&
(toy.maxage <= 7) &&
(toy.rub>max))
{max=toy.rub;
strcpy(namemax,toy.name);
}
}
if (max==0)
puts(" Констpуктоpов для детей до семи лет нет");
else
{ printf("Cамый доpогой констpуктоp для детей до семи лет\n");
printf( " %s стоит %8.0f pублей\n",namemax,max);
}
}
В Си существует еще один сложный тип, описание которого формально похоже на структуру. Это тип ( и переменная) объединение.
Объединение - это переменная, содержащая поля разного типа, помещаемые в одно и то же место памяти. По существу объединение дает способ различной интерпретация содержимого памяти. Описание шаблона (типа) объединения и переменной этого типа выполняется также, как для структуры, только вместо ключевого слова structиспользуетсяunion. Размер памяти, занимаемой объединением, равен максимальному из размеров полей.
