- •Основы программирования на языке С
- •Введение
- •1. Базовые понятия программирования
- •1.1. Алгоритмизация задачи
- •1.2. Схема алгоритма программы
- •1.3. Пример алгоритмизации
- •1.4. Этапы трансляции программы
- •2. Особенности языка С
- •2.1. Характеристики языка
- •2.2. Элементы языка
- •2.3. Стандартные типы данных
- •2.4. Компоненты простой программы
- •Вопросы для самопроверки
- •3. Выражения и операции
- •3.1. Операция и выражение присваивания
- •3.2. Бинарные арифметические операции
- •3.3. Операции увеличения (++) и уменьшения (--)
- •3.4. Преобразования типов при вычислении арифметических выражений
- •3.5. Тернарная или условная операция
- •3.6. Логические операции и операции отношения
- •3.7. Поразрядные (побитовые) операции
- •3.8. Операции сдвига
- •3.9. Операция sizeof
- •3.10. Операция следования
- •3.11. Сводная таблица операций языка С
- •Вопросы для самопроверки
- •4. Операторы
- •4.1. Оператор выражение
- •4.2. Пустой оператор
- •4.3. Объявления и составной оператор
- •4.4. Условный оператор
- •4.5. Оператор выбора switch
- •4.6. Циклы
- •4.7. Оператор break
- •4.8. Оператор безусловного перехода goto
- •4.9. Оператор continue
- •4.10. Оператор return
- •Вопросы для самопроверки
- •5. Массивы
- •5.1. Одномерные статические массивы
- •5.2. Объявление массива. Обращение к элементу массива
- •5.3. Инициализация массива
- •5.4. Многомерные массивы
- •5.5. Выход индекса за границы массива
- •5.6. Приемы работы с массивами в вычислительных задачах
- •5.7. Строка как массив символов
- •Вопросы для самопроверки
- •6. Указатели и ссылки
- •6.1. Понятие указателя
- •6.2. Операция получения адреса &
- •6.3. Операция разыменования (*)
- •6.4. Арифметика указателей
- •6.5. Применение указателей в выражениях
- •6.6. Указатели и массивы
- •6.7. Ссылочный тип данных
- •Вопросы для самопроверки
- •7. Время жизни и область видимости переменной
- •7.1. Общие понятия
- •7.2. Классы памяти
- •7.3. Вложенные блоки в программе
- •8. Функции
- •8.1. Общие понятия
- •8.2. Определение функции
- •8.3. Прототип функции
- •8.4. Переменные в функции
- •8.5. Передача параметров в функцию
- •Вопросы для самопроверки
- •9. Пользовательские типы данных
- •9.1. Структурный тип данных
- •9.2. Битовые поля
- •9.3. Объединения или смеси
- •9.4. Перечисления
- •Вопросы для самопроверки
- •10. Динамическая работа с памятью
- •10.1. Универсальный указатель void
- •10.2. Принципы работы с динамическими массивами
- •Вопросы для самопроверки
- •11. Ввод-вывод данных
- •11.2. Функции ввода-вывода библиотеки iostream
4. Операторы
Операторы языка программирования управляют процессом выполнения программы, то есть оператор сообщает компьютеру, как следует обрабатывать данные. Можно сказать, что программа состоит из последовательности операторов с добавлением знаков пунктуации. В составе языка С имеются операторы, обеспечивающие выполнение всего набора конструкций структурного программирования.
Все операторы языка С (кроме составных) заканчиваются знаком ";" (точкой с запятой). Операторы языка С можно условно разделить на следующие категории:
1. Структурные операторы – это наименьшая исполняемая единица программы, они служат основными строительными блоками программы. В конце каждого структурного оператора ставится ";", к ним можно отнести:
∙операторы ветвления (if, switch );
∙операторы цикла (for,while,do…while);
∙операторы перехода (break, continue, return, goto);
∙другие операторы (оператор "выражение", пустой оператор). 2. Операторы, используемые в выражениях.
∙Арифметические.
∙Сравнения.
∙Логические.
∙Битовые.
∙Специальные (присваивания, преобразования типов).
4.1. Оператор выражение
Любое выражение, которое заканчивается точкой с запятой, является оператором. В языке С выражения могут входить в состав различных операторов, либо использоваться самостоятельно. Выполнение оператора выражение заключается в его вычислении.
Примеры: |
|
b=a+5; |
/* b присвоить 5 */ |
t++; |
/* к t прибавить 1 */ |
printf("\n %s",mes); |
/* печать сообщения */ |
/* в следующем операторе результат не используется и потому компилятор выдаст предупреждение*/ (a+5)/7;
4.2. Пустой оператор
Пустой оператор состоит из символа ";". Этот оператор используется в двух случаях.
Во-первых – в составе других операторов (например в операторах do, for, while, if) в том месте, где по синтаксису необходим оператор, но по смыслу программы он не требуется.
Во-вторых – при необходимости пометить закрывающуюся фигурную скобку.
Синтаксис языка С требует, чтобы после метки обязательно следовал оператор. Фигурная же скобка оператором не является. Поэтому, если надо передать управление на фигурную скобку, необходимо использовать пустой оператор.
Пример: int main ( )
{
:
{if (...) goto F; /* переход на скобку */
{...
}
F: ; } /* помеченый пустой оператор */ return 0;
}
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
4.3. Объявления и составной оператор
Каждая переменная перед использованием должна быть объявлена. Объявление не только вводит новое имя в программу, но и кодирует разнообразную информацию о характеристиках переменной, связанной с этим именем, таких как тип, класс памяти, время жизни и некоторые другие.
При объявлении переменной компилятор выделяет память в соответствии с её типом, в этот момент переменная создается.
Так как объявления являются операторами языка, то могут использоваться там, где возможен любой другой оператор С++, напимер:
… |
|
s = 0.3; d /= s; |
// операторы- выражения |
char sim; |
// объявление переменной sim |
int k = 5; |
// объявление и задание начального значения переменной k; |
d = s+2*k; |
|
double f=s+d; |
// одновременное объявление и использование переменной f; |
f*=k;
Предполагается, что переменные s и d были объявлены ранее.
Составной оператор (или блок) представляет собой несколько операторов и объявлений, заключенных в фигурные скобки:
Обычно составным оператором называют оператор, не содержащий объявлений, а оператор с объявлениями называется блоком, но синтаксических отличий между ними нет.
Составной оператор должен использоваться там, где синтаксис языка требует наличие лишь одного оператора, а логика программы – сразу нескольких. Заметим, что в конце составного оператора точка с запятой не ставится.
Пример составного оператора:
{i=5;
c=sin(i*x);
c++;
}
Пример блока:
{ double y; y= i*sin(x);
printf ("\n %e",y);
}
4.4. Условный оператор
Оператор if позволяет разветвить вычислительный процесс на два варианта в зависимости от значения некоторого условия.
Имеется две формы условного оператора (схемы представлены на рис. 4.1.):
∙if (выражение) оператор1 else оператор2;
∙if (выражение) оператор.
Выполнение оператора if начинается с вычисления выражения. Далее выполнение осуществляется по следующей схеме:
1.если выражение истинно (отлично от 0), то выполняется оператор_1;
2.если выражение ложно (равно 0),то выполняется оператор_2;
3.если выражение ложно и отсутствует конструкция со словом else, то выполнение оператора if завершается.
true |
Условие |
false |
true |
Условие |
false |
|
|
||||
Блок |
|
Блок |
Блок |
|
|
операторов |
|
операторов |
операторов |
|
|
Рис. 4.1. Схемы условного оператора
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
Примеры: |
|
if (a > b) |
|
c = a - b; |
// выполняется, если a > b |
else c = b - a; |
// выполняется, если a < b |
… … |
|
if (i < j) |
|
i++; |
|
else |
|
{j = i - 3; i ++;} |
// выполняется блок операторов |
Воператорах if могут использоваться составные операторы (блоки операторов) там, где логика программы требует последовательности операторов. Допускается вложение оператора if, как в конструкцию if, так и в конструкцию else другого оператора if. Если во вложенных конструкциях фигурные скобки опущены, то компилятор связывает каждое ключевое слово else с наиболее близким if, для которого нет else.
Пример: int main ( )
{
int t=2, b=7, r=3; if (t>b)
{
if (b<r) r=b;
}
else r=t; return (0);
}
Врезультате выполнения этой программы r = 2, так как оператор else связан с первым оператором if. Если же в программе опустить фигурные скобки, стоящие после оператора if, то логика программы
изменится.
int main ( )
{
int t=2,b=7,r=3; if ( a>b )
if ( b<c ) t=b; else r=t; return (0);
}
В этом случае r = 3, так как ключевое слово else относится ко второму оператору if, который не выполняется, поскольку не выполняется условие, проверяемое в первом операторе if. Аналог программы можно записать в следующем виде:
int main ( )
{
int t=2,b=7,r=3; if ( a>b )
{if ( b<c ) t=b; else r=t;
}
return (0);
}
Количество вложенных операторов if не ограничено, следующий фрагмент программы и схема (рис. 4.2.) иллюстрирует это:
char ZNAC; int x,y,z;
if (ZNAC == '-') x = y - z;
else |
if (ZNAC == '+') x = y + z; |
|
else |
if (ZNAC == '*') x = y * z; |
|
|
else |
if (ZNAC == '/') x = y / z; |
... |
|
else …. |
|
|
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
|
|
|
условие 1 |
|
|
|
|
|
|||
|
true |
false |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
условие 2 |
|
|
|
|
|
|
|
|
true |
|
false |
|
||||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
Блок |
|
Блок |
|
|
|
|
Блок |
||||
операторов 1 |
|
операторов 2 |
|
|
|
|
операторов 3 |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 4.2. Схема вложенных операторов if
Пример показывает, что конструкции со вложенными операторами if, фактически обеспечивают выбор одного варианта из многих возможных, на блок-схеме каждая альтернатива выбора – это блок операторов. Однако такое решение представляется довольно громоздким и не всегда достаточно надежным. Другим
способом организации выбора из множества различных вариантов является использование специального оператора выбора switch.
4.5. Оператор выбора switch
Если в алгоритме присутствуют более трех вариантов (альтернатив) выбора, то следует использовать оператор switch. Его часто называют селективным оператором, переключателем или
оператором выбора. Оператор switch передает управление одному из нескольких помеченных специальными метками операторов в зависимости от значения целочисленного выражения. Специальные метки начинаются с ключевого слова case и являются целочисленными константами.
Оператор имеет следующий вид: switch (целое_выражение )
{ [объявления]
[case константное_выражение1:] [операторы]
[case константное_выражение2: ] [операторы]
. . .
[case константное_выражение n:] [операторы]
[default:] [операторы]
}
Выражение в круглых скобках, может быть любым допустимым выражением языка С, значение которого должно быть целым.
Схема выполнения оператора switch представлена на рис. 4.3.:
∙Вычисляется выражение в круглых скобках (назовем его селектором).
∙Значение селектора последовательно сравнивается с метками в теле оператора switch , если селектор и константное выражение метки равны, то управление передается оператору, помеченному данной меткой.
∙Если селектор не совпадает ни с одной меткой, то управление передается на оператор, помеченный словом default.
∙Если default отсутствует, то управление передается следующему за switch оператору.
Пример: int x;
...
switch (x)
{case 5: printf("x равно 5\n"); break;
case 2:
case 10: printf("x равно либо 2, либо 10\n");
|
break; |
default: |
rintf("x не равно 5, 2, 10\n"); |
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
break;
}
Рис. 4.3. Селективный оператор switch
Каждый вариант оператора switch начинается меткой (case 5, case 2, case 10 или default) и заканчивается оператором break. Исключение составляет вариант case 2: у которого нет "своих" операторов. Дело в том, что switch, выбрав один из вариантов, не заканчивает автоматически выполнение, дойдя до следующего варианта – он исполняет все операторы, идущие дальше, вплоть до конца своего блока или до ключевого слова break, которое прекращает выполнение оператора. Если мы уберем, например, первый break, то при х==5 увидим сначала сообщение от первого printf(), затем от второго.
Следующий пример показывает, что оператор switch представляет собой структуру, построенную по принципу меню, он содержит варианты условий и инструкции, которые следует выполнить в каждом конкретном случае.
Пример: Программа реализующая функции калькулятора "+" "-" "*" "/" #include <iostream.h>
#include <stdio.h> void main() { char znak; double x, y, z;
do {
cout<<"Задайте знак операции + - * / \n"; cin>>znak;
cout<<"Задайте x и y \n"; cin>>x>>y;
switch (znak)
{case '+': z= x + y; break; case '-': z= x - y; break; case '*': z= x * y; break; case '/': if ( y == 0 )
cout<<"Делить на нуль нельзя!\n";
else z = x / y; break;
default: { cout<<"Неизвестная операция!\n"; continue;
}
}
cout<<x<<znak<<y<<'='<<z<<endl;
}
while (znak!='&');
}
Программа запрашивает информацию (знак операции и два числа) и проводит соответствующую операцию, пока вместо знака не введут символ &. Если вводится знак, отличный от разрешённых ("+""- ""*""/"), то программа выдает сообщение об ошибке и начинает новый проход цикла (по директиве continue). При корректном вводе на экран выдается формула и результат вычисления.
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com