- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Оператор switch (переключатель)
Общая форма записи:
switch (выражение)
{
case <значение 1>: <операторы 1>
case <значение 2>: <операторы 2>
case <значение 3>: <операторы 3>
. . .
default : <операторы def>
}
Если значение выражения равно значение 1, то выполняются операторы 1, если значение 2, то выполняются операторы 2 и т.д. Если значение выражения не совпадает ни с одним <значение i>, и включена конструкция default, то будут выполняться операторы def. Для завершения данного case используется оператор break. В противном случае будут выполняться последовательно все операторы внутри switch.
Пример: ввод дня недели в целом формате и печать дня недели в символьном виде.
main()
{
int i;
do
{
scanf("%d",&i);
switch(i)
{
case 1: printf("Понедельник\n");
break;
case 2: printf("Вторник\n");
break;
case 3: printf("Среда\n");
break;
case 4: printf("Четверг\n");
break;
case 5: printf("Пятница\n");
break;
case 6: printf("Суббота\n");
break;
case 7: printf("Воскресенье\n");
}
}
while((i>0)&&(i<8));
}
Операторы передачи управления
Они предназначены для изменения последовательности выполнения операторов программы.
Оператор return
Общая форма записи:
return <выражение>;
Этот оператор осуществляет выход из функции в вызвавшую ее функцию и передает ей значение выражения (если оно нужно). Если этот оператор выполняется в функции main, то передается управление в вызвавшую ее программу (или ДОС).
Оператор break
Общая форма записи:
break;
Осуществляется выход из любого оператора цикла (for,while, do ... while).
Пример: выход из бесконечного цикла при достижении заданного значения. Программа вычисляет и печатает значение величины от 0 с шагом 0,1 и ее квадрата до тех пор, пока значение квадрата не превысит 100000.
main()
{
double a,b;
a=0.;
while (1) /* можно использовать также конструкцию for(;;) */
{
b=a*a;
if (b>100000.) break;
printf("\na=%f b=%f",a,b);
a+=0.1;
}
}
Оператор continue
Общая форма записи:
continue;
Производится пропуск всех операторов до конца цикла (for, while, do...while) и продолжается выполнение цикла.
Пример: смена знаков элементов массива, меньших нуля, и уменьшение на 5, если <5.
main()
{
int f[10],d;
/* ввод значений элементов массива и их проверка */
for (d=0; d<10; d++)
{
printf("\n Введите %d-й элемент массива: ",d+1);
scanf("%d",&f[d]);
if (f[d]>=5) continue;
if (f[d]<0) f[d]=-f[d];
else f[d]-=5;
}
. . .
}
Оператор goto
Общая форма записи:
goto (имя метки);
Переход на оператор с указанной меткой.
Имя метки записывается следующим образом: идентификатор метки, затем двоеточие. Идентификатор метки не описывается, его имя подчиняется тем же требованиям, что и имена объектов программы.
Пример:
goto lb1;
. . .
lb1: a+=6;
. . .
В программе, написанной на языке С, всегда можно избежать использования этого оператора.
Условный оператор
Общая форма записи:
<выражение 1> ? <выражение 2> : <выражение 3>
Если выражение 1 верно, то вычисляется выражение 2, в противном случае выражение 3.
Пример: тот же, что и в операторе continue.
main()
{
int f[10],d;
/* ввод значений элементов массива и их проверка */
for (d=0; d<10; d++)
{
printf("\n Введите %d-й элемент массива: ",d+1);
scanf("%d",&f[d]);
if (f[d]>=5) continue;
f[d]=(f[d]<0) ? -f[d] : f[d]-5;
}
. . .
}
Функции
В С все подпрограммы рассматриваются как функции. Все функции возвращают значения, за исключением случаев, когда не указан тип функции. В этом случае она считается пустой.
Имена функций подчиняются тем же требованиям, что и имена остальных объектов в программе.
При определении функций используются два стиля: классический и современный.
Классический формат определения функции имеет вид:
<тип> <имя функции>(имена параметров через запятую)
определение параметров;
{
локальные описания;
операторы;
}
Примеры:
1. функция, вычисляющая значение sin(x)+4*cos(x).
double tr(x)
double x;
{
return (sin(x)+4.*cos(x));
}
main()
{
double x,y;
x=1.6;
y=tr(x);
printf("\nsin(x)+4*cos(x) при x=%f равно %f",x,y);
}
2. функция, выводящая на экран сообщение "ошибка".
_err()
{
printf("\nошибка");
}
main()
{
_err();
}
Примечания:
а. Если функция, не возвращающая значений, не имеет оператора return; , то выполнение ее заканчивается при достижении закрывающей скобки функции и происходит возврат в вызвавшую ее функцию или в ДОС.
б. Все данные символьного типа при передаче в функцию преобразуются к целому типу (со знаком или без соответственно).
в. Все данные типа float при передаче в функцию преобразуются к типу double.
Современный формат определения функции (расширенная версия С, предложенная комитетом ANSI) имеет вид:
<тип> <имя функции>(информация о параметрах через запятую)
{
локальные описания;
операторы;
}
Пример 1 из предыдущего раздела:
double tr(double x)
{
return (sin(x)+4.*cos(x));
}
main()
{
double x,y;
x=1.6;
y=tr(x);
printf("\nsin(x)+4*cos(x) при x=%f равно %f",x,y);
}
Пример: Вычисление факториала
long fact(int i)
{
int j;
long k;
k=1;
for (j=2; j<=i; j++) k*=j;
return(k);
}
main()
{
int i=10;
printf("\n%d! = %ld",i,fact(i));
}
Пример: Вычисление факториала с использованием рекурсии. Рекурсия - это прием программирования, при котором какая-либо функция в ходе своего выполнения вызывает сама себя. В данном примере используется формула n!=n[(n-1)!], где 0!=1.
long fact(int i)
{
if (i<=1) return 1L;
else return i*fact(i-1);
}
void main(void)
{
int i=10;
printf("\n%d! = %ld",i,fact(i));
}
Примечание: в качестве типа функции, если функция не возвращает никаких значений, допустимо описать ее тип как void. Пустой список параметров тоже можно описать как void.