- •Язык программирования Си
- •7. Понятие о препроцессоре языка Си 29
- •8. Операторы языка Си и приемы программирования 30
- •9. Массивы. Адресная арифметика языка Си 51
- •Правила записи программы на языке Си
- •Правила формального описания синтаксиса языка программирования
- •Идентификаторы языка Си
- •Понятие о типах данных.
- •Системы счисления. Представление данных в эвм.
- •Основные типы данных языка Си
- •Правила записи констант различных типов
- •Беззнаковый тип для целых данных
- •Символьные строки
- •Понятие функции
- •Стандартная функция printf
- •Стандартная функция scanf
- •Операции и выражения
- •Простейшие арифметические операции
- •Операция присваивания
- •Оператор-выражение
- •Использование в выражениях операндов разных типов
- •Операции преобразования типов
- •Стандартные математические функции
- •Простейшие функции, определяемые программистом
- •Дополнительные арифметические операции
- •Дополнительные операции присваивания
- •Битовые операции
- •Операции отношения
- •Логические операции
- •Операция определения размера данных
- •Приоритеты операций
- •Понятие о препроцессоре языка Си
- •Операторы языка Си и приемы программирования
- •Оператор цикла while
- •Условный оператор и условная операция
- •1) Короткие операторы:
- •2) Группы коротких операторов:
- •3) Длинные группы операторов:
- •Запись алгоритмов с помощью диаграмм Несси - Шнейдермана (структограмм )
- •Некоторые приемы программирования
- •Оператор прерывания цикла
- •Оператор продолжения цикла
- •Пример организации простейшего меню
- •Множественный выбор. Оператор переключения
- •Оператор цикла do-while.
- •Перечисления. Работа с клавиатурой ibm pc
- •Пример организации светового меню
- •Массивы. Адресная арифметика языка Си
- •Описание массива
- •Ввод-вывод массива
- •Инициализация массива
- •Программа вычисления длины строки символов
- •Двумерные массивы (массивы массивов)
- •Адресная арифметика языка Си
- •Указатели и одномерные массивы
- •Указатели и двумерные массивы
- •Указатели и функции
- •Оператор typedef
- •Дополнительные описания указателей для ibm pc
- •Непосредственная работа с экранной памятью
- •Дополнительные сведения о функциях
- •Области видимости и глобальные данные
- •Время жизни переменных и классы памяти языка Си
- •Передача аргументов в функцию
- •Возврат значений из функций
- •Работа с динамической памятью
- •Стандартные функции управления динамической памятью
- •Пример использования динамической памяти
- •Особенности работы с двумерными массивами
- •Пересчет индексов вручную
- •Массивы с постоянной длиной строки
- •Общий случай двумерного массива
- •Особенности работы с массивами большого размера
- •Модульное программирование в системе Turbo c
- •Обеспечение корректной стыковки модулей
- •Создание библиотек функций
- •Некоторые библиотечные функции языка Си
- •Функции консольного ввода/вывода (уникальны для tc)
- •Функции обработки строк.
- •Функции распознавания вида символа
- •Функции преобразования данных
- •Структуры языка c.
- •Описание структуры
- •1 Способ
- •2 Способ
- •Трактовка имени структуры.
- •Доступ к элементу структуры.
- •Инициализация структур.
- •Структуры и функции.
- •Поля бит в структурах.
- •Объединения.
- •Дополнительные сведения о препроцессоре языка c.
- •Условное выражение.
- •Приоритеты и направления операций.
- •Динамические данные.
- •Линейные списки.
- •Организация данных в виде стека.
- •Организация данных в виде очереди.
- •Организация данных в виде деревьев.
- •Библиотека ввода-вывода языка c.
- •Открытие потока.
- •Закрытие потока.
- •Предопределенные указатели потоков.
- •Функции ввода-вывода.
Объединения.
Объединяются ключевым словом union. Способы описания такие же, как и в случае структур, только вместо слова struct используется слово union.
union {int a; long b;} pr;
Для переменной pr выделяется память, достаточная для хранения самого длинного элемента объединения, т. е. в нашем примере - 4 байта.
Если использовать pr.a, то выделенная память будет использоваться как int, в случае pr.b как long. Однако, участок памяти один и тот же. Поэтому одновременно существовать pr.a и pr.b не могут. Ответственность за некорректное использование памяти лежит на программисте. Объединения используются для экономии памяти:
union {int bc[100]; double kk[20];} cc;
На все отводится 200 байт.
int bc[100] 200 байт
______________________________
|----------------------------|
double kk[20] (160 байт)
Одновременно работать с массивом cc.bc и cc.kk нельзя.
Объединения нельзя инициализировать.
Дополнительные сведения о препроцессоре языка c.
Препроцессор обрабатывает текст программы перед компиляцией.
Включение файлов (рассмотрено ранее):
#include <conio.h> - файл из специального каталога;
#include "d:\\user\\ff.h" - файл ищется по правилам MS DOS.
Текстовые подстановки (рассматривалось ранее):
#define N 21
#define ABC (a*b*c+\
d*sin(x))
\ - переход на следующую строку.
Создание макросов.
#define SQR(x) ((x)*(x))
В результирующую строку подставляется фактическая строка x. Например, если в тексте программы встречается SQR(y), то после макрораскрутки получим ((y)*(y)). Скобки нужны для того, чтобы не получилось недоразумений, например
#define SQR(x) x*x
SQR(y+2); превратится в
y+2*y+2;
Конечно, это не то, что хотелось.
Отмена ранее созданного имени:
#undef SQR.
Условная компиляция:
#if константное выражение
.
. строки программы
.
#else
.
. строки программы
.
#endif
Если константное выражение истинно, то в программу будут включены строки из первого блока, иначе из второго.
Пример:
#define DEBUG 1
.
.
.
#if DEBUG
printf("%d", x);
#endif
Можно проверить наличие или отсутствие какого-либо имени:
#ifdef имя (если имя определено, то истина)
.
.
.
#else
.
.
.
#endif
#ifndef имя (если имя не определено)
.
.
.
#else
.
.
.
#endif
Это свойство широко используется в библиотечных включаемых файлах, чтобы избежать противоречия. Например, в conio.h имеются следующие строки:
#ifndef COLORS
enum COLORS {BLACK, ...};
#endif
Условное выражение.
Эта конструкция языка C в некоторых случаях позволяет заменить оператор if и сократить запись программы.
БНФ:
условное выр = выр0 "?" выр1 ":" выр2
Значение условного выражения равно выр1, если выр0 не равно 0 и выр2 впротивном случае.
Пример:
a = b>c ? b:c; тоже самое, что
if (b>c) a=b; else a = c;
С помощью условного выражения можно, например, определить макросы max и min:
#define max(x,y) ((x)>(y) ? (x):(y))
#define min(x,y) ((x)<(y) ? (x):(y))
При этом макросы max и min будут работать для любых типов арифметических данных.
Например:
a = max(b,c);