
- •«Алгоритмические языки и программирование»
- •Часть 1
- •Часть 1. «Язык программирования с» (опорний конспект лекций).
- •Содержание
- •6. Понятие о препроцессоре языка Си 25
- •7. Операторы языка Си и приемы программирования 26
- •1.Правила записи программы на языке Си
- •2.Идентификаторы языка Си
- •3.Понятие о типах данных.
- •3.1.Основные типы данных языка Си
- •3.2.Правила записи констант различных типов
- •3.3.Беззнаковый тип для целых данных
- •3.4.Символьные строки
- •4.Понятие функции
- •4.1.Стандартная функция printf
- •4.2.Стандартная функция scanf
- •5.Операции и выражения
- •5.1.Простейшие арифметические операции
- •5.2.Операция присваивания
- •5.3.Оператор присваивания
- •5.4.Использование в выражениях операндов разных типов
- •5.5.Операции преобразования типов
- •5.6.Стандартные математические функции
- •5.7.Простейшие функции, определяемые программистом
- •5.8.Дополнительные арифметические операции
- •5.9.Дополнительные операции присваивания
- •5.10.Операции отношения
- •5.11.Логические операции
- •5.12.Операция определения размера данных
- •5.13.Приоритеты операций
- •6.Понятие о препроцессоре языка Си
- •7.Операторы языка Си и приемы программирования
- •7.1.Оператор цикла while
- •7.2.Условный оператор и условная операция
- •7.3.Некоторые приемы программирования
- •7.4.Оператор прерывания цикла
- •7.5.Оператор продолжения цикла
- •7.6.Пример организации простейшего меню
- •7.7.Множественный выбор. Оператор переключения
- •7.8.Оператор цикла do-while.
- •7.9.Перечисления
- •7.10.Пример организации светового меню
- •8.Массивы. Адресная арифметика языка Си
- •8.1.Описание массива
- •8.2.Ввод-вывод массива
- •8.3.Инициализация массива
- •8.4.Программа вычисления длины строки символов
- •8.5.Двумерные массивы (массивы массивов)
- •8.6.Адресная арифметика языка Си
- •8.7.Указатели и одномерные массивы
- •8.8.Указатели и двумерные массивы
- •8.9.Указатели и функции
- •8.10.Оператор typedef
- •9.Дополнительные сведения о функциях
- •9.1.Области видимости и глобальные данные
- •9.2.Время жизни переменных и классы памяти языка Си
- •9.3.Передача аргументов в функцию
- •9.4.Возврат значений из функций
- •10.Работа с динамической памятью
- •10.1.Стандартные функции управления динамической памятью
- •10.2.Пример использования динамической памяти
- •10.3.Особенности работы с двумерными массивами
- •10.3.1.Пересчет индексов вручную
- •10.3.2.Массивы с постоянной длиной строки
- •10.3.3.Общий случай двумерного массива
- •10.4.Особенности работы с массивами большого размера
- •11.Модульное программирование в системе Turbo c
- •11.1.Обеспечение корректной стыковки модулей
- •11.2.Создание библиотек функций
- •12.Некоторые библиотечные функции языка Си
- •12.1.Функции консольного ввода/вывода (уникальны для tc)
- •12.2.Функции обработки строк.
- •12.3.Функции распознавания вида символа
- •12.4.Функции преобразования данных
7.4.Оператор прерывания цикла
Предыдущая программа имеет существенный недостаток: перебираются все значения синуса, хотя цикл можно остановить, когда появится первое отрицательное значение. Этот недостаток можно исправить, как показано в следующем фрагменте:
x = xn;
minus = 0;
while( x < xk && !minus )
{
...
}
В языке Си есть специальный оператор для прерывания цикла. Это оператор break;. Выполнение его в программе немедленно прерывает цикл, в котором он находится и управление передается на следующий за циклом оператор. Используя оператор break, цикл предыдущей программы можно переписать в виде:
x = xn;
minus = 0;
while( x < xn )
{
if( sin(x) < 0 ) { minus = 1; break; }
x += h;
}
7.5.Оператор продолжения цикла
Оператор "continue;" вызывает переход к следующей итерации цикла, т.е. к очередной проверке условия. Естественно, все операторы тела цикла, находящиеся между continue и концом тела цикла пропускаются:
while(
... )
{
...
if(...)
continue;
... /* операторы пропускаются */
}
Операторы break и continue позволяют избавиться от необходимости применения оператора goto, поэтому последний в этом методическом пособии не рассматривается.
7.6.Пример организации простейшего меню
Современный стиль программирования предписывает использовать в программах различного рода меню, которые предоставляют пользователю возможность выбора одного из предложенных действий.
Пример. Следующая программа вычисляет sin(x), cos(x), tan(x) в зависимости от выбора пользователя:
#include <math.h>
#include <stdio.h>
/* Организация простейшего меню */
void main ( void )
{
int loop; /* Флаг, который сигнализирует о конце работы */
int choice; /* Текущий выбор пункта меню */
double fun, x; /* Значения функции и аргумента */
printf( "\nВведите аргумент x=" );
scanf( "%lf", &x );
loop=1;
while ( loop )
{
printf ( "\n Введите номер функции:\n" );
printf ( "1. sin(x)\n2. cos(x)\n" );
printf ( "3. tan(x)\n4. Конец работы\n" );
scanf ( "%d", &choice );
if (choice==1) fun=sin(x);
else if (choice==2) fun=cos(x);
else if (choice==3) fun=tan(x);
else if (choice==4) { loop=0; continue; }
else { printf( "Неверный выбор\n" ); continue; }
printf( "Значение функции %lf\n", fun );
}
}
Данная программа выводит на экран дисплея список возможных действий. Пользователь должен выбрать нужное, введя его номер.
Для управления выходом из цикла и организации конца работы программы используется флаг loop.
7.7.Множественный выбор. Оператор переключения
В предыдущей программе осуществлялся так называемый "множественный выбор", когда в зависимости от значения некоторой переменной целого типа выбиралось одно из нескольких действий.
Для осуществления подобных операций в языке Си существует специальный оператор переключатель switch. Используя этот оператор, вместо вложенных if в предыдущей программе можно записать следующую конструкцию:
switch ( choice )
{
case 1 : fun=sin(x); break;
case 2 : fun=cos(x); break;
case 3 : fun=tan(x); break;
case 4 : loop=0; break;
default: printf( "Неверный выбор\n" ); break;
}
Здесь ключевое слово case (случай) указывает на то, что следующая константа является значением переменной choice, для которого выполняются соответствующие действия.
Оператор break; осуществляет выход из оператора switch, а не из цикла. Именно поэтому для выхода из цикла пришлось использовать специальный флаг loop.
Ключевое слово default ( умолчание ) означает, что следом записаны действия, выполняющиеся, если значение choice не совпадет ни с одной из констант, указанных за case.
Оператор switch в общем виде выглядит так:
switch ( выражение )
{
case константа : { оператор }
case константа : { оператор }
[ "default" : { оператор } ]
}
В качестве выражения можно использовать любое выражение, имеющее символьный или целый тип. Константы тоже должны быть символьного или целого типа, например case 4 , case 'A'.
Допускается использовать несколько констант для пометки одной группы операторов, например
case 2 :
case 4 :
case 8 : f = sin(x); break;
Если группа операторов не завершается оператором break, то будут выполняться все последующие операторы независимо от наличия case с константами до ближайшего break или другого оператора, прерывающего естественную последовательность действий. Иными словами ключевое слово case с константой надо рассматривать как метку для передачи управления. Так, в следующем операторе
switch( ch )
{
case 'A' :
case 'B' : x++;
case 'C' :
case 'D' : f = sin(x); break;
case 'E' : f = cos(x); break;
}
будет вычислено f=sin(x+1), при ch равном 'A' или 'B'; f=sin(x), при ch равном 'C' или 'D'; f=cos(x), при ch равном 'E'.
При использовании оператора switch необходимо внимательно следить за правильностью написания ключевого слова default и за тем, чтобы между ключевым словом case и числовой константой обязательно имелся пробел. В противном случае, эти конструкции будут приняты за правильно записанные метки для оператора goto, и компилятор не выдаст никакой диагностики.