- •Рецензенты:
- •Лекция 1 Основные понятия языка с
- •Первая программа
- •Переменные языка с
- •Имя переменной
- •Объявление константы
- •Операции языка с
- •Лекция 2 Операторы языка с Условный оператор
- •Оператор switch
- •Циклы Цикл for
- •Циклы while и do-while
- •Оператор безусловного перехода
- •Использование операторов break, continue и goto в циклах
- •Операция условие ?
- •Лекция 3 Массивы
- •Инициализация массивов
- •Массивы символов. Строки
- •Функции для работы со строками
- •Лекция 4 Указатели
- •Объявление указателей
- •Операции над указателями
- •Связь указателей и массивов
- •Массивы указателей
- •Инициализация указателей
- •Лекция 5 Функции языка с
- •Объявление функции
- •Оператор return
- •Прототипы функций
- •Функции c произвольным числом параметров
- •Область действия и область видимости переменной
- •Классы памяти
- •Параметры и аргументы функции
- •Лекция 6 Типы, определяемые пользователями
- •Структура
- •Перечислимый тип
- •Переименование типов-typedef
- •Лекция 7 Модели памяти и препроцессор языка с Модели памяти
- •Препроцессор языка с
- •Директива #define
- •Список рекомендуемой литературы
- •Оглавление
- •Программирование на языках высокого уровня: с
- •428015 Г.Чебоксары, Московский просп., 15
Лекция 6 Типы, определяемые пользователями
Кроме известных нам типов данных, язык С позволяет создавать еще 5 типов данных:
1) структуры (structure);
2) объединения (union);
3) перечислимый тип (enumeration);
4) поля битов (bit fields);
5) с помощыо оператора typedef создать новое имя для уже существующего.
Структура
Структура объединяет несколько переменных, возможно, разного типа. Переменные, которые объединены структурой называются членами или полями структуры.
Пример определения структуры
Struct student {
Char name[20];
Char group[10];//FM-l1-96 |
Char adress[50];
}
Объявление структуры является оператором и поэтому в конце должна стоять точка с запятой. При этом пока никакая переменная не объявлена. Выделение памяти под переменную не произошло. Под именем student задан частный вид структуры, то есть задан шаблон структуры и определен новый тип struct student. Для того чтобы объявить конкретные переменные типа struct student, нужно записать struct student stud1, stud2;
Теперь объявлены две переменные stud1. stud2 типа struct student. Компилятор автоматически выделит под них место в памяти компьютера. Под каждую из переменных выделяется непрерывный участок памяти. Задание шаблона структуры и объявление переменных может производиться в одном операторе.
Struct student{
Char name [20];
Char group[10];//FM-l1-96
Char adress[50];
}stud 1, stud2;
Здесь одновременно задается структура с именем student и объявляются переменные stud1, stud2. Доступ к конкретному элементу структуры осуществляется с помощью операции “.” (точка). Например, studl. name== “Иванов”;
Структуры, как и переменные другого типа могут объединяться в массивы структур, например:
Struct sludent{
Char name [20];
Char group[10];//FM-ll-96
Char adress[50];
Int marks[4]:
} slud[10];
Тогда доступ к элементам структуры будет, например, в функции main осуществляться следующим образом :
For(int i=1; i<=10; i++) {
Printf( "input name");
gets(Stud[i].name);
Printf (“inpul grоuр");
gets(Stud[i|.group);
Printf(“input adres");
gets(Stud|i].adres);
for(int j=1; j<5; j++) gets(stud[i].mark[j] );
}
Вот как будет выглядеть программа, осуществляющая работу со структурой:
Программа 6.1:
#include<stdio.h>
void main() {
struct student {
char name[20];
chаг group[10];//FM-11-96
char adress[50];
int marks[4];
} stud [2];
char string[4][8]= {"alg",”matan","istor"."inform"};
fог(int i =1 ; i<=2; i++);{
printf("input name \n");
gets(stud [i] |.name);
printf("input group \n");
gets(stud[i].group);
printf(" input adres \n");
gets(stud[i] .adress);
for (int j=1; j<5; j++) {
printf(“inpul mark for %s \n", string[j]);
scanf(“ %d'”, &stud[i].marks[j] );
} } }
Естественно, ведя работу со структурами, удобно записывать значение нолей в файл и соответственно считывать сведения из файла. Приведем пример использования текстового файла для записи и чтения данных на основе предыдущей программы.
Программа 6.2:
#include <stdio.h>
#include <stdlib.h>
void main () {
FILE *f;
struct student {
char name[20];
char group|10];//FM-ll-96
char adress[50];
char marks[4][4];
} stud [2];
char string[4][7]={"alg","matan","istor","inform"};
f=fopen ("dan.dat", "w");
for(int i=0; i<2; i++) {
printf'( "input name \n");
gets(stud[ i ].name);
fprintf(f," %s \n". stud[i].name);
printf( "input group \n");
gets(slud[i].group);
fprintf(f," %s\n", stud[i].group);
printf(“input adres \n");
gets(stud[ i ].adress);
fprintf(f. " %s \n", stud[i].adress);
for(int j=0; j<4; j++){
printf("iriput mark for %)S \n", string[j]);
gets(stud[i|.marks[j| );
fprintf(f,”%s \n". stud[i].marks[j]);
}
}
fclose (f); }
Для объединений также разрешена операция ->, если обращаются к объединению с помощыо указателя.
Программа, приведенная ниже, выдает на экран двоичный код ASCII символа, вводимого с клавиатуры.
Программа 6.3:
#include <stdio.h>
#include <conio.h>
/* Использование нолей битов и объединений */
struct byte {
int b1: 1
int b2: 1
int b3 1
int b4 1
int b5 1
int b6 1
int b7 1
int b8 1
/* Определена структура - битовое поле */
union bits { char ch;
struct byte bit;
} u /* Определено объединение */
void decode (union bits b); /*прототип функции*/
main (void)
{ do {
b.ch = getche ();
printf (“: “);
decode (u);
} while (u.ch !=’q’);
return 0; }
void decode (union bits b) {
if (b. bit. b8) printf (“1”);
else printf(“0”);
if(b.bit.b7) printf("1");
else printf("0");
if(b.bit.b6)printf("l");
else printf("0");
:if(b.bit.b5)printf("l");
else printf("0");
if(b.bit.b4)printf("l");
else printf("0");
if(b.bit.b3)printf("l");
else printf("0");
if(b.bil.b2)printf("1");
else printf("0");
if(b.bit.bl)printf("l");
else printf("0");
printf('|n");
