- •Предисловие
- •Знакомство с языком 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
- •Задания на курсовую работу
- •Требования к курсовой работе
- •Этапы разработки программ
- •Содержание отчета по курсовой работе
- •Задания к курсовой работе
- •Литература
- •Функции консольного ввода/вывода
- •Функции обработки строк
- •Функции преобразования данных
Модульное программирование
Технология модульного программирования предполагает разбиение программы на отдельные части – модули. Модуль может содержать одну или несколько взаимосвязанных функций и общие для функций данные. Каждый модуль помещается в отдельный файл (с расширением .c или .cpp) и компилируется автономно. Получившиеся в результате компиляции объектные модули объединяются в единый исполняемый модуль (exe-файл) с помощью компоновщика (Linker).
Разбиение программы на модули уменьшает время перекомпиляции программы и облегчает процесс отладки, позволяя отлаживать программу по частям. Чем более независимы модули, тем легче отлаживать программу.
Одна из основных задач – хорошо продумать интерфейс модулей. Интерфейсом модуля являются заголовки всех функций и описания доступных извне типов, переменных и констант.
Описания глобальных типов данных, констант, переменных и прототипы всех функций лучше поместить в отдельный заголовочный файл с
расширением |
.h , а в |
остальные файлы (с расширением .c |
или .cpp) |
|
включать эти |
описания |
с помощью директивы |
#include |
“имя.h” . |
Глобальные переменные, правда, лучше не использовать (тогда интерфейс каждой функции будет полностью определяться ее заголовком).
При разработке многомодульных программ нужно создавать проект (файл с расширением .prj). В проекте указывают, из каких файлов состоит программа. Это могут быть исходные файлы с расширением .c или .cpp, или объектные файлы с расширением .obj (полученные в результате компиляции исходных модулей), или библиотеки объектных модулей (файлы с расширением .lib). Заголовочные файлы (с расширением .h) в проекте не указывают, они должны быть в том же каталоге, в котором содержатся модули программы.
134
Создание проекта
В Turbo C 2.0 файл проекта создается пользователем вручную. Создайте новый файл (выберите в меню File | New). Введите имена
файлов программы, включаемых в проект (каждое имя с новой строки или разделяя имена пробелами). Сохраните этот файл проекта, указав после имени расширение .prj.
В Borland C++ 3.1 файл проекта создается системой в диалоге с пользователем.
Выберите в меню Project | Open project… . Откроется окно диалога “Open Project File”. В поле списка “Files” этого окна выберите нужный каталог. Затем введите имя проекта с расширением .prj в поле “Open Project File” и нажмите клавишу [Enter] или кнопку “OK”.
Рис. Окно диалога “Open Project File”
Далее выберите в меню Project | Add item или нажмите клавишу [Insert], чтобы добавить в проект файлы. В появившемся окне диалога (рис.10.2) в поле “Name” введите имя файла или выберите его из списка “Files” и нажмите кнопку “Add”. После добавления в проект всех имен файлов нажмите кнопку “Done”.
135
Рис. Окно диалога “Add to Project List”
Открытие и работа с проектом
В Borland C++ 3.1 для открытия проекта выберите в меню Project | Open project… и в появившемся окне диалога введите или выберите имя своего файла проекта.
Нажмите клавиши Ctrl – F9 (или выберите в меню команды Run | Run), чтобы запустить компиляцию, компоновку и выполнение программы. При этом неважно, текст какого файла находится в окне редактирования (можно вообще файлы программы не открывать, если они не будут редактироваться).
Пример создания многомодульной программы
Рассмотрим пример программы из лабораторной работы № 8, которая формирует список идентификаторов.
Создадим заголовочный файл “spisok.h”, который будет содержать директивы препроцессора, описание типа элемента списка и прототипы функций (подпрограмм):
#include <stdio.h>
136
#include |
<stdlib.h> |
|
|
#include |
<string.h> |
|
|
#include |
<conio.h> |
|
|
#define |
MAXDL |
9 |
(с признаком |
/* макс. |
длина идентификатора |
||
конца |
'\0' ) |
*/ |
элемента списка */ |
struct |
EL_SP |
/* тип |
{ char id [MAXDL];/* идентификатор */ struct EL_SP *sled;
/* ссылка на следующий элемент */
};
void Vkl ( struct EL_SP **p, char t_id[] ); void PechSp ( struct EL_SP *p );
Каждую функцию программы поместим в отдельный файл, добавив в начало директиву #include “spisok.h”.
Файл “Vkl.c”:
#include "spisok.h" |
*/ |
/*------------------------------------------------- |
/* функция включения очередного идентиф. в список */
/*------------------------------------------------- |
*/ |
void Vkl ( struct EL_SP **p, char t_id[] ) |
|
/* Вх. данные: *p |
- указатель списка |
идентификаторов в |
лексикографическом порядке, |
t_id - включаемый |
в список (текущий) ид-р */ |
/* Вых. данные: *p |
*/ |
{struct EL_SP *pt,/* указатель включаемого эл-та */
*k,*j; |
/* указатели |
очередного и предыдущего |
|
|
элементов |
списка |
*/ |
/* выделение памяти для нового эл-та списка */
pt = (struct EL_SP *) malloc(sizeof(struct EL_SP)); strcpy(pt->id, t_id);
if (*p==NULL || strcmp(pt->id,(*p)->id) < 0) { /* включение ид-ра в начало списка */
pt->sled=*p; *p=pt;
}
else
{ /* поиск элемента списка, после которого нужно включить идентификатор */
k=*p;
while (k!=NULL && strcmp(pt->id,k->id)>=0) { j=k; k=k->sled;
}
/* включение эл-та *pt после элемента *j */ j->sled=pt; pt->sled=k;
}
137
}
Файл “PechSp.c”:
#include "spisok.h" |
|
*/ |
|
/*-------------------------------------------------- |
функция печати |
списка |
|
/* |
*/ |
||
/*-------------------------------------------------- |
|
|
*/ |
void PechSp ( |
struct EL_SP *p |
) |
*/ |
/* Вх. данные: |
p - указатель |
начала списка |
{struct EL_SP *i;
/* указатель текущего элемента списка */ printf ("\nРезультат:\n");
for ( i=p; i!=NULL; i=i->sled ) puts (i->id);
}
Файл “main.c”:
#include "spisok.h" |
*/ |
|
/* |
---------------------------------------------О С Н О В Н А Я П Р О Г Р А М М А |
|
/* |
*/ |
|
/*--------------------------------------------- |
|
*/ |
main()
{struct EL_SP *p; unsigned n ; unsigned i ; char t_id[MAXDL];
/* указатель начала списка |
*/ |
|
/* количество идентификаторов |
*/ |
|
/* |
параметр цикла |
*/ |
/* |
текущий идентификатор |
*/ |
printf ("\nВведите число идентификаторов\n n=");
scanf ("%u",&n); |
пропуск символа "перевод строки" */ |
|
getchar(); |
/* |
|
p=NULL; |
/* |
список пока пуст */ |
printf("Введите |
идентификаторы "); |
printf("после каждого нажимайте клавишу <Enter>\n"); for ( i=1; i<=n; i++ )
{gets (t_id);
Vkl (&p,t_id); /* включение ид-ра в список */
}
PechSp (p); /* печать списка */
printf ("\nДля завершения нажмите любую клавишу\n"); getch();
}
Создадим файл проекта с именем “spisok.prj”, содержащий имена файлов программы:
Vkl.c
138
PechSp.c
main.c
Откроем проект “spisok.prj” и запустим программу на выполнение. В результате компиляции программы для каждого исходного модуля будет получен объектный модуль (файлы “Vkl.obj”, “PechSp.obj”, “main.obj”), а
затем редактор связей создаст из них выполнимый модуль “spisok.exe”. При повторном запуске программы, если исходные файлы не
изменялись, перекомпиляция программы не происходит. Если вы измените текст какого-либо исходного файла, выполните команду меню Compile | Make, чтобы перекомпилировать только этот файл программы (а не все) и получить новый exe-файл.
Если какие-то модули программы изменяться уже не будут, можно в проект включить не исходные модули, а объектные. Изменим файл проекта, заменив файлы с подпрограммами на их объектные модули:
Vkl.obj
PechSp.obj
main.c
Снова выполним программу.
Можно объектные файлы программы, которые не будут больше изменяться, поместить в отдельную библиотеку (файл с расширением .lib). Для создания библиотеки служит программа-библиотекарь tlib из системы
Turbo C или Borland C++.
Создадим библиотечный файл “spisok.lib”, содержащий файлы “Vkl.obj” и “PechSp.obj”. Для этого вызовем программу-библиотекарь, введя в
командной строке MS DOS следующую команду:
tlib spisok.lib + Vkl + PechSp
Заменим в файле “spisok.prj” объектные модули на библиотечный модуль:
Spisok.lib
main.c
и снова выполним программу.
139
Контрольные вопросы
Что такое модуль?
Что такое проект? Какие файлы можно включать в проект? Для чего нужны заголовочные файлы?
Как создать библиотеку объектных модулей?
140