- •Предисловие
- •Знакомство с языком C
- •Структура программы
- •Пример простой программы
- •Более сложный пример
- •Контрольные вопросы
- •Основные понятия, объявление переменных, типы данных
- •Объявление переменных
- •Примеры описаний переменных:
- •Основные типы данных
- •Производные типы.
- •Контрольные вопросы
- •Ввод/вывод с помощью функций printf() и scanf().
- •Модификаторы спецификаций преобразования используемые в функции printf()
- •Применение функции scanf()
- •Контрольные вопросы
- •Операции
- •Простейшие арифметические операции
- •Операция присваивания
- •Использование в выражениях операндов разных типов
- •Операции преобразования типов
- •Дополнительные арифметические операции
- •Дополнительные операции присваивания
- •Операции отношения
- •Логические операции
- •Приоритеты операций
- •Таблица 3. Таблица приоритетов рассмотренных выше операций
- •Контрольные вопросы
- •Операторы
- •Оператор-выражение
- •Ветвление
- •Условный оператор
- •Оператор switch
- •Оператор break
- •Циклы
- •Цикл while
- •Цикл do…while
- •Цикл for
- •Другие операторы
- •Оператор continue
- •Оператор goto
- •Оператор вызова функции
- •Контрольные вопросы
- •Обработка числовых последовательностей
- •Последовательная обработка
- •Обработка числовых последовательностей
- •Примеры
- •Контрольные вопросы
- •Последовательная обработка символьных данных
- •Символьные данные
- •Последовательная обработка символов
- •Функции getchar( ) и putchar( )
- •Контрольные вопросы
- •Обработка массивов
- •Массивы
- •Объявление массива
- •Использование и обработка массивов
- •Примеры
- •Контрольные вопросы
- •Указатели и динамические массивы
- •Указатели
- •Динамическое выделение памяти
- •Статические и динамические массивы
- •Контрольные вопросы
- •Подпрограммы
- •Описание подпрограмм
- •Параметры подпрограмм
- •Область действия переменных
- •Примеры
- •Контрольные вопросы
- •Рекурсивные функции
- •Понятие рекурсивной функции
- •Контрольные вопросы
- •Символьные строки и функции обработки строк
- •Посимвольная обработка строк
- •Пример программы
- •Контрольные вопросы
- •Структуры
- •Тип данных структура
- •Контрольные вопросы
- •Работа с файлами
- •Примеры
- •Контрольные вопросы
- •Массивы и функции как параметры
- •Указатели на функции
- •Массивы и указатели
- •Указатели и двумерные массивы
- •Пример
- •Технологии программирования
- •Структурное программирование
- •Модульное программирование
- •Объектно-ориентированное программирование
- •Компонентное программирование
- •Структурная декомпозиция задачи и разработка алгоритмов и программ методами сверху вниз и снизу вверх
- •Контрольные вопросы
- •Модульное программирование
- •Работа с графикой на языке C и модуль graphics.h
- •Типы видео мониторов и их режимы
- •Инициализация графики
- •Система координат
- •Основные графические функции
- •Функции рисования
- •Функции изменения параметров рисования
- •Шаблоны линий
- •Шаблоны закраски
- •Задание на расчетно-графическую работу
- •Порядок выполнения работы
- •Задание
- •Задание для вариантов 1-11
- •Задание для вариантов 12-20
- •Задание для вариантов 21-40
- •Пример исходных данных для вариантов 12-16
- •Задание для вариантов 41-60
- •Варианты индивидуальных заданий
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 21
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Вариант 31
- •Вариант 32
- •Вариант33
- •Вариант 34
- •Вариант 35
- •Вариант 36
- •Вариант 37
- •Вариант 38
- •Вариант 39
- •Вариант 40
- •Вариант 41
- •Вариант 42
- •Вариант 43
- •Вариант 44
- •Вариант 45
- •Вариант 46
- •Вариант 47
- •Вариант 48
- •Вариант 49
- •Вариант 50
- •Вариант 51
- •Вариант 52
- •Вариант 53
- •Вариант 54
- •Вариант 55
- •Вариант 56
- •Вариант 57
- •Вариант 58
- •Вариант 59
- •Вариант 60
- •Задания на курсовую работу
- •Требования к курсовой работе
- •Этапы разработки программ
- •Содержание отчета по курсовой работе
- •Задания к курсовой работе
- •Литература
- •Функции консольного ввода/вывода
- •Функции обработки строк
- •Функции преобразования данных
Структуры
Тип данных структура
Если массив – это совокупность однотипных элементов, то структура объединяет логически связанные данные разных типов.
При использовании структурных переменных вначале нужно описать тип (или шаблон) структуры, а затем структурные переменные. Тип структуры задает порядок следования отдельных элементов (полей) в структуре и их типы. Описание структурного типа имеет вид:
struct имя_типа
{ Описание элементов
};
Точка с запятой в конце описания обязательна. Например:
struct |
|
ANKETA |
/* фамилия и инициалы */ |
|
{ |
char |
|
fio[20]; |
|
|
int |
|
gr; |
/* год рождения */ |
}; |
char |
adr[40]; |
/* адрес */ |
|
|
|
|
|
|
struct |
|
BOOK |
/* автор книги */ |
|
{ |
char |
|
author[40]; |
|
|
char |
|
name [50]; |
/* название */ |
|
int |
year; |
/* год издания */ |
|
}; |
int |
pages; |
/* число страниц */ |
|
|
|
|
|
Здесь ANKETA и BOOK - это имена типов структур, а не переменных. При описании типов память под структуры не выделяется.
Описание структурной переменной на языке C имеет вид:
struct |
имя_типа |
имя_переменной; |
|
||
Например: |
|
|
|
|
|
struct ANKETA a1; |
|
|
|
||
struct BOOK |
b1,b2; |
|
массив из 100 структур типа BOOK*/ |
||
struct BOOK |
mb[100]; /* |
||||
struct ANKETA |
*p1; |
/* |
указатель на |
структуру типа ANKETA */ |
|
struct BOOK *p2 = &b2; |
|
/* указатель |
на структуру типа BOOK, |
||
|
|
|
|
ссылающийся |
на переменную b2 */ |
106
При объявлении структурных переменных на языке C++ ключевое слово struct обычно опускается, например:
ANKETA |
a1; |
|
|
|
|
BOOK |
b1,b2; |
|
|
|
|
Каждая структурная переменная будет состоять из полей, |
|||||
перечисленных при описании типа структуры. |
|
|
|||
a1 |
|
b1 |
b2 |
||
|
fio |
|
author |
|
author |
|
gr |
|
name |
|
name |
|
adr |
|
year |
|
year |
|
|
|
|||
|
|
|
pages |
|
pages |
|
|
|
|
||
|
|
|
|
|
|
При объявлении структурных переменных можно их инициализировать, например:
struct BOOK b3 = { “Толстой Л.Н.”, ”Война и мир”, 1995, 1650};
Для однотипных структур определена операция присваивания:
b1=b3;
mb[0]=b3;
Другие операции целиком над структурами выполнять нельзя. Например, сравнение структур или ввод/вывод нужно выполнять
поэлементно. |
|
|
Для обращения к отдельным элементам |
(полям) структурных |
|
переменных используется операция выбора “.” или “->” : |
||
<имя |
переменной>.<имя элемента> |
|
<имя |
указателя> -> <имя элемента> |
|
Пример
/* ввод значения структурной переменной b2 типа BOOK*/ gets(b2.author);
gets (b2.name);
scanf(“%d%d”, &b2.year, &b2.pages);
Пример
struct ANKETA a2; strcpy(a2.fio, “Иванов А.В.”); а2.gr = 1980;
107
strcpy(a2.adr, “ул.Пушкина, д.10, кв.5”);
Пример
struct BOOK *p3 = &b3;
printf (“%s, %s, %d г., %d с.\n”, p3->author, p3->name, p3->year, p3->pages);
Результат на экране:
Толстой Л.Н., Война и мир, 1995 г., 1650 с.
Если структурные переменные используются только в одной функции программы, то можно совместить описание переменных с описанием типа. При этом имя типа можно не задавать, например:
struct
{ char fio[20]; int gr;
char adr[40];
}a1, a2, *p1;
Память под структурную переменную может быть выделена динамически, при выполнении программы, например:
struct BOOK *p4;
p4 = (struct BOOK *) malloc (sizeof (struct BOOK));
Такая структура имени не имеет; обращаются к ней с помощью указателя p4, например:
gets (p4->name);
Пример
/* Программа определения числа дней, прошедших с начала года до указанного месяца */
#include <stdio.h> #include <string.h>
struct |
MONTH |
/* название месяца */ |
|
{ |
char *name; |
||
}; |
int |
days; |
/* число дней */ |
|
|
|
|
int |
main() |
|
|
{ |
struct MONTH |
year[12] = |
|
|
|||
|
{ |
{“январь”, 31}, |
108
|
{“февраль”, 28}, |
|
||
|
{“март”, 31}, |
|
||
|
|
… |
|
|
|
{“декабрь”, 31} |
|
||
|
}; |
m[9]; |
/* название заданного месяца */ |
|
|
char |
*/ |
||
int |
int |
n = 0; |
/* число дней до зад. месяца |
|
i; |
|
/* индекс очер. эл-та массива year */ |
||
puts (“\nВведите название месяца”); |
|
|||
gets (m); |
|
|
|
|
for (i=0; i<12 && strcmp (m, year[i].name)); i++) |
|
|||
n += year[i].days; |
|
|||
if (i==12) |
puts (“Неверное название”); |
|
||
else |
printf (“Число прошедших дней: %d”, n ); |
|
||
return 0; |
|
|
|
|
} |
|
|
|
|
Контрольные вопросы
1. Определите результат выполнения фрагмента программы:
struct A { int a,b; };
struct A s = {10, 20}; printf (“%d”, s.a + s.b);
2. |
Определите результат выполнения фрагмента программы: |
||
struct |
int |
b; |
|
{ |
char a[10]; |
||
} |
s = {“Москва”, |
155}; |
|
printf (“%d, %s”, |
s.b, |
s.a); |
3. |
Объявлены переменные: |
||
struct |
A |
|
|
{ int x; |
|
||
|
float |
y; |
|
} s, *p = &s; |
|||
|
Как можно полям x, y объявленной структурной переменной присвоить |
||
значения 10 и 5.5? |
|||
4. |
Определите результат выполнения фрагмента программы: |
||
struct |
A |
char y[10]; |
|
{ |
int |
x; |
|
} |
s, |
*t |
= &s; |
t –>x = 2006; |
|||
strcpy |
(t –>y, “май”); |
||
printf |
(“%s |
%d”, s.y, s.x); |
109
5.Опишите структуру из 4-х полей:
•признак того, можно ли изменять другие поля (равен 1 или 0);
•массив из 100 пятибуквенных слов;
•целое число;
•вещественное число.
Опишите структурную переменную и указатель на эту переменную.
6.Опишите массив из 30 записей (структур). Каждая запись состоит из 4-х полей, описывающих часть анкетных данных спортсмена:
•фамилия, имя и отчество;
•год рождения;
•рост в метрах (например, 1.85);
•вес в кг.
7.Определите результат выполнения фрагмента программы:
int |
F (int a, |
int |
b) |
{ |
if (a<b) return |
a+b; |
|
|
return a-b; |
|
|
}
void main()
{struct
{ int n1, n2;
}s = {30, 20};
printf (“%d”, F(s.n1, s.n2));
…
}
110