- •Предисловие
- •Знакомство с языком 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
- •Задания на курсовую работу
- •Требования к курсовой работе
- •Этапы разработки программ
- •Содержание отчета по курсовой работе
- •Задания к курсовой работе
- •Литература
- •Функции консольного ввода/вывода
- •Функции обработки строк
- •Функции преобразования данных
Технологии программирования
В проектировании и программировании активно применяются следующие технологии:
•Структурное программирование.
•Модульное программирование.
•Объектно-ориентированное программирование.
•Компонентное программирование.
Структурное программирование
Э. Дэйкстра (60-е годы):
Для любой простой программы можно построить функционально эквивалентную ей структурную программу, т.е. программу, сформированную на основе фиксированного базисного множества, включающего:
•структуру последовательного действия,
•структуру выбора одного из двух действий
•структуру цикла, то есть многократного повторения некоторого действия с проверкой условия остановки повторения.
Простая программа – ровно один вход и один выход.
Базисные конструкции:
Стандартизация и линейность программы – снижение сложности.
126
Некоторые соображения:
•Алгоритм должен иметь 1 вход и 1 выход.
•Никаких goto.
•Нет зависимости от языка программирования.
•Ясен набор операторов, который необходим в языках программирования.
Модульное программирование
Основная идея: разбиваем сложную задачу на подзадачи, каждую из них при необходимости разбиваем снова и т.д.
Получаем простые задачи, их решаем, объединяем.
Структурное программирование – универсальный базис алгоритмических конструкций.
Модульное программирование – специфичный для задачи базис из модулей.
•Более высокий уровень абстракции.
•Настройка на конкретную задачу.
•Возможности повторного использования.
•Возможности коллективной разработки – разделение труда.
Объектно-ориентированное программирование
Дальнейшая борьба со сложностью. Технология работает с этапа анализа: Анализ – Проектирование – Программирование. В основе – объектная модель и объектная декомпозиция.
Основные принципы объектной модели:
•абстракция;
•инкапсуляция;
•иерархия (наследование, агрегация);
•полиморфизм;
•модульность.
127
Объектная декомпозиция (в отличие от алгоритмической): элементы проекта – классы и объекты (а не алгоритмы). И только потом данные и алгоритмы.
Компонентное программирование
Компонентное программирование – развитие объектно-
ориентированной идеологии.
Введен следующий уровень абстракции – классы объединяются в
компоненты.
Основной принцип компонентного программирования: сборка приложения из готовых компонент, в общем случае написанных на разных языках.
Компонент:
•программный код в виде самостоятельного модуля
•может быть использован в неизменном виде
•может допускать настройку
•обладает поведением (функциональностью).
Компонент изолирован от внешнего мира своим интерфейсом – набором методов (их сигнатурами).
Компонентная программа – набор независимых компонент, связанных друг с другом посредством интерфейсов.
Структурная декомпозиция задачи и разработка алгоритмов и программ методами сверху вниз и снизу вверх
Любая сложная система состоит из более мелких частей, таким же образом можно представить любой алгоритм или программу. На первом этапе проектируемый алгоритм представляется в виде одного блока. Затем определяется структура этого блока, исходный алгоритм разбивается на части и т.д. На рисунке представлены нисходящая (сверху вниз) и восходящая (снизу вверх) технологии алгоритмизации.
128
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
А |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
В |
|
|
|
|
|
|
|
|
С |
|
|
|
|
|
|
D |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Е |
|
|
F |
|
|
G |
|
|
H |
|
I |
|
J |
|
K |
|
L |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Сверху вниз |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Снизу вверх |
||||||
Рис. Нисходящая и восходящая технологии алгоритмизации |
||||||||||||||||||||||||||||||
Часто отдельные |
|
части |
|
сложной |
программы |
оформляют в виде |
отдельных подпрограмм. При разработке программы по принципу «сверху вниз» вначале проектируется алгоритм главной программы (функции main), на втором этапе – блоков или подпрограмм, вызываемых из главной программы, затем – блоков или подпрограмм следующего уровня и т.д.
Задача. Сортировка числовой последовательности.
Дано целое n и вещественные x1, x2, ..., xn. Составить программу печати заданных вещественных чисел в порядке возрастания (не убывания).
Тест. |
|
|
|
|
|
Вход: |
|
|
|
|
|
Введите количество чисел |
5 |
|
|
|
|
Введите числа |
12.5 |
6 |
14 -3 |
10 |
|
Выход: |
|
|
|
|
|
Упорядоченные числа: |
-3.0 |
6.0 |
10.0 |
12.5 |
14.0 |
Разработаем алгоритм программы нисходящим методом.
Для хранения данных нужен массив. Исходные данные вводятся в
массив, там сортируются по возрастанию, а затем выводятся. Оформим в виде отдельных подпрограмм ввод данных и сортировку массива.
Функциональную структуру программы можно представить в виде дерева, как показано на рисунке ниже.
129
main
|
|
Vvod |
|
|
Sort |
|
|
|
|
|
|
|
|
|
Рис. Функциональная структура программы |
|||||
|
1 этап. Разработка алгоритма функции main(). |
|||||
|
Алгоритм (на псевдокоде): |
|||||
1. |
n = Vvod(x); |
// Ввод n и массива x |
||||
2. |
Sort (x,n); |
// Сортировка массива x по возрастанию; |
||||
3. |
Вывод сортированного по возрастанию массива x; |
2 этап. Детализируем шаги алгоритма. Это можно делать в любом порядке. Начнем, например, с вывода упорядоченного массива x.
// 3. Вывод массива x
Вывод заголовка "Упорядоченные числа:";
for (i=0; i<n; i++)
Вывод x[i];
Теперь рассмотрим алгоритм функции ввода данных. int Vvod (float x[])
{
Ввод n;
for (i=0; i<n; i++)
Ввод x[i];
Возврат n;
}
Осталось рассмотреть функцию сортировки массива x. Существует много различных методов сортировки массивов. Рассмотрим метод
последовательного нахождения максимума.
Вначале наибольший элемент ищется среди всех n элементов, после чего происходит перестановка его с последним элементом. Далее максимальный
130
элемент ищется уже среди n-1 элементов и меняется местами с предпоследним элементом. Затем эта процедура повторяется для n-2 элементов и т.д. Последний раз наибольший элемент находится из первых двух элементов и переставляется местами со вторым элементом.
2.5 |
6 |
14 |
-3 |
10 |
//рассматривается n элементов |
2.5 |
6 |
10 |
-3 |
14 |
|
2.5 |
6 |
10 |
-3 |
//рассматривается n-1 элементов |
|
2.5 |
6 |
-3 |
10 |
|
|
2.56 -3 // рассматривается n-2 элементов
2.5 -3 6
2.5 -3 |
// рассматривается n-3 элементов |
-3 2.5
|
Алгоритм функции сортировки массива x по возрастанию: |
|||
|
void Sort(float x[], int n) |
|||
|
{ for (k=n-1; k>0; k--) |
|
||
|
{ Определение максимума среди элементов |
|||
|
|
x[0], ... , x[k] |
и |
|
|
|
его индекса imax. |
|
|
|
|
Обмен: x[imax] <--> x[k]; |
||
|
} |
|
|
|
|
3 этап. Рассмотрим определение максимума среди элементов x[0], ... , |
|||
x[k] |
и |
его индекса imax. |
|
|
|
imax =0; |
|
||
|
for (i |
=1; i <= k; i++) |
|
|
|
|
if |
(x[i] > x[imax]) |
imax = i; |
|
Программа: |
|
||
#include <stdio.h> |
|
|||
#define |
NMAX 100 /* Макс-е количество входных чисел */ |
|||
/* Функция ввода данных * / |
|
|||
int |
Vvod (float x[]) |
|
||
{ |
|
|
|
|
131