
- •Основы программирования на языке Си.
- •Достоинства языка Си.
- •Будущее языка Си.
- •Использование языка Си.
- •Использование текстового редактора для подготовки программ.
- •Исходные и выполняемые файлы
- •Пример простой программы на языке Си
- •Структура простой программы
- •2. Лекция: Данные, символьные строки, директива #define.
- •Основные типы данных
- •Описание различных типов, переменные и константы
- •Символьные строки
- •Препроцессор языка Си
- •3. Лекция: Операции.
- •Основные операции
- •Дополнительные операции
- •Перечень операций языка Си
- •Операции, уровень приоритета которых равен 1
- •Операции, уровень приоритета которых равен 2
- •Операции, уровень приоритета которых равен 3
- •Операции, уровень приоритета которых равен 4
- •Операции, уровень приоритета которых равен 5
- •Операции, уровень приоритета которых равно 6
- •Операции, уровень приоритета которых равен 7
- •Операция, уровень приоритета которой равен 8
- •Операция, уровень приоритета которой равен 9
- •Операция, уровень приоритета которой равен 10
- •Операция, уровень приоритета которой равен 11
- •Операция, уровень приоритета которой равен 12
- •Операция, уровень приоритета которой равен 13
- •Операция, уровень приоритета которой равен 14
- •Операция, уровень приоритета которой равен 15
- •Примеры простых задач
- •4. Лекция: Операторы.
- •Выражения
- •Простейшие выражения
- •Операторы
- •Составные операторы
- •Оператор цикла while
- •10 Км. В последующие дни он проезжал со скоростью,
- •Изучение и использование функций printf( ) и scanf( )
- •Применение функции scanf( )
- •Подведем итог.
- •5. Лекция: преобразование типов.
- •Эквивалентность типов
- •Преобразование типов
- •Разбор программы
- •Операция приведения
- •Неявное преобразование типа
- •Арифметические преобразования
- •Явные преобразования типов
- •Синтаксис типов
- •6. Лекция: функции и переключение ввода-вывода
- •Ввод и вывод одного символа
- •Чтение одной строки
- •Чтение файла
- •Переключение и работа с файлами
- •7. Лекция: Выбор вариантов.
- •Выбор вариантов
- •Оператор if
- •Расширение оператора if
- •Операции отношения
- •Логические операции
- •Операция условия: ?:
- •Множественный выбор
- •8. Лекция: Циклы и другие управляющие средства. Структурное программирование.
- •Структурное программирование
- •Цикл с предусловием
- •Цикл со счетчиком
- •Цикл с постусловием
- •Другие управляющие операторы
- •9. Лекция: Функции.
- •Создание и использование функций
- •Аргументы функции
- •Возвращение значений
- •Локальные переменные
- •Нахождение адресов
- •Указатели, первое знакомство
- •Функции с переменным количеством аргументов
- •10. Лекция: Классы памяти и разработка программ.
- •Классы памяти и область действия
- •Автоматические переменные
- •Внешние переменные
- •Статические переменные
- •Внешние статические переменные
- •Регистровые переменные
- •11. Лекция: Препроцессор языка Си.
- •Общие сведения
- •Символические константы: #define
- •Использование аргументов с #define
- •Макроопределение или функция?
- •Включение файла: #include
- •Условная компиляция
- •12. Лекция: Массивы и указатели.
- •Указатели и массивы
- •Массивы
- •Указатели
- •Динамические объекты
- •Создание динамических объектов
- •Доступ к динамическим объектам
- •Связь между указателями и массивами
- •Инициализация массивов и классы памяти
- •Функции, массивы и указатели
- •Операции с указателями
- •13. Лекция: Символьные строки и функции над ними.
- •Строковые константы
- •Массивы символьных строк и их инициализация
- •Массив и указатель: различия
- •Указатели и строки
- •Ввод-вывод строк
- •Обработка строк
- •14. Лекция: Структуры.
- •Определение структурных переменных
- •Доступ к компонентам структуры
- •Поля битов в структурах
- •Объединения
- •Перечисления
- •Переменные структуры
- •Указатели и структуры
- •Массив структур
- •Переименование типов
- •15. Лекция: Библиотека языка Си и файлы ввода-вывода.
- •Стандартные библиотечные функции
- •Связь с файлами
- •Текстовые файлы с буферизацией
- •Распределение памяти
- •16. Лекция: Функции в примерах.
- •Функция получения случайных чисел
- •Поиск узлов из простых чисел
- •Матрица инцидентности
- •Структуры данных
- •Все операции со стеком
Другие управляющие операторы
Операторы, определяющие циклические вычисления, которые мы рассмотрели, и условные операторы if, if-else и switch, являются важнейшими средствами управления выполнением программы на языке Си. Они должны использоваться для реализации общей структуры программы. Три оператора, рассматриваемые ниже, обычно рассматриваются реже, поскольку слишком частое их использование ухудшает читаемость программы, увеличивает вероятность ошибок и затрудняет ее модификацию. Никлаус Вирт дал определение структурного программирования, как программирования без goto.
Оператор break
Оператор break используется для выхода из оператора while, do, for, switch, непосредственно его содержащего. Управление передается на оператор, следующий за оператором, из которого осуществлен выход. Оператор break имеет форму
break;
Пример:
while((ch=getchar()) != EOF)
/* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */
{
if(ch=='\n')
break; putchar(ch);
}
Работа цикла полностью прекращается, как только при вводе встречается символ "новая строка".
Оператор continue
Оператор continue служит для пропуска оставшейся части выполняемой итерации цикла, непосредственно его содержащего. Если условиями цикла допускается новая итерация, то она выполняется, в противном случае цикл завершается. Оператор continue имеет следующую форму:
continue;
Пример:
while((ch=getchar()) != EOF)
/* читается символ ch=getchar(). Если он не совпадает с EOF, выполняется тело оператора while */
{
if(ch=='\n')
continue;
putchar(ch);
}
В версии с оператором continue просто пропускаются символы "новая строка", а выход из цикла происходит, только когда читается признак EOF.
Оператор goto
Оператор goto предназначен для безусловной передачи управления к оператору с указанной меткой. Он имеет следующую форму:
goto метка;
Керниган и Ритчи считают оператор goto "чрезвычайно плохим" средством и предлагают применять его как можно реже или не применять совсем. Приведем пример записи оператора:
goto part1;
Чтобы этот оператор выполнялся правильно, необходимо наличие другого оператора, имеющего метку part1. В этом случае запись оператора начинается с метки, за которой следует двоеточие:
part1: printf("точка перехода\n");
! |
Избегайте использовать goto! С тех пор как Дейкстра опубликовал свой знаменитый труд "Вредность оператора GOTO", специалисты бились над методами структурного программирования. Полное описание структурного программирования выходит за рамки этого курса лекций, однако отметим, что нужно очень осторожно использовать операторы: goto, break, continue, return. |
Если без операторов goto, break, continue, return никак не обойтись, то при использовании goto переходите вперед по коду, а не назад.
Оператор break лучше не использовать для преждевременного выхода из цикла, его полезно использовать внутри оператора switch.
Оператор continue нежелательно использовать для модификации логики циклов.
Почему нежелательно использовать функции со многими операторами return. Один из принципов структурного программирования состоит в том, что программа должна иметь одну точку входа и одну точку выхода. Функции со многими операторами return более сложны для чтения, чем те, которые имеют лишь один оператор return в конце тела функции.