Приоритеты операций в языке C
Порядок вычисления выражений
У каждой операции имеется приоритет. Если в выражении несколько операций, то первой будет выполнена операция с более высоким приоритетом. Если же операции одного и того же приоритета, они выполняются слева направо.
Например, в выражении
2 + 3 * 6
сначала будет выполнено умножение, а затем сложение;соответственно, значение этого выражения — число 20.
В выражении
x = y + 3
вначале выполняется сложение, а затем присваивание, поскольку приоритет операции присваивания ниже, чем приоритет операции сложения.
Для данного правила существует исключение: если в выражении несколько операций присваивания, то они выполняются справа налево. Например, в выражении
x = y = 2
сначала будет выполнена операция присваивания значения 2 переменной y. Затем результат этой операции – значение 2 – присваивается переменной x.
Для того чтобы изменить последовательность вычисления выражений, можно воспользоваться круглыми скобками. Часть выражения, заключенная в скобки, вычисляется в первую очередь. Значением
(2 + 3) * 6
будет 30.
Скобки могут быть вложенными, соответственно, самые внутренние выполняются первыми:
(2 + (3 * (4 + 5) ) – 2)
8. Элементарный ввод-вывод в языке C. Спецификации преобразования
#INCLUDE <STDIO.H>
в файле STDIO.H определяются некоторые макросы и переменные,
используемые библиотекой ввода/вывода.
Программа чаще всего содержит 4 части:
- объявление переменных;
- ввод исходных данных;
- обработка данных (вычисления);
- вывод результата.
Перед вводом данных необходимо вывести на экран подсказку.
Для ввода данных используют функцию scanf.
scanf ( "%d%d", &a, &b ) "%d%d"-формат ввода &a, &b– адреса переменных
Формат ввода – это строка в кавычках, в которой перечислены один или несколько
форматов ввода данных:
%dввод целого числа (переменная типа int)
%fввод вещественного числа (переменная типа float)
%сввод одного символа (переменная типа char)
-После формата ввода через запятую перечисляются адреса ячеек памяти, в которые на-
до записать введенные значения. Почувствуйте разницу:
aзначение переменной a
&aадрес переменной a
Для вывода чисел и значений переменных на экран используют функцию printf
printf ( "Результат: %d + %d = %d \n", a, b, c );
содержание скобок при вызове функции printfочень похоже на функцию scanf
Пример программы
#include <stdio.h>
#include <conio.h>
main()
{
int a, b, c; // объявление переменных
printf ( "Введите два целых числа \n" ); // подсказка для ввода
scanf ( "%d%d", &a, &b ); // ввод данных
c = a + b; // вычисления (оператор присваивания)
printf ( "Результат: %d + %d = %d \n", a, b, c ); // вывод результата
getch(); Задержка до нажатия любой клавиши выполняется функцией getch().
}
.
Условный операторы.
Оператор IF - ELSE используется при необходимости сде-
лать выбор. Формально синтаксис имеет вид
IF (выражение)
оператор-1
ELSE
оператор-2,
Где часть ELSE является необязательной. Сначала вычисля-
ется выражение; если оно "истинно" /т.е. значение выражения
отлично от нуля/, то выполняется оператор-1. Если оно ложно
/значение выражения равно нулю/, и если есть часть с ELSE,
то вместо оператора-1 выполняется оператор-2.
Позволяют организовать ветвления в программе
If – else позволяет выбрать один оператор или группу операторов из двух
If позволяет выполнить оператор или группу операторов или пропустить
If(x>3)
y=2
ELSE свя-
зывается с ближайшим предыдущим IF, не содержащим ELSE.
Например, в
IF ( N > 0 )
IF( A > B )
Z = A;
ELSE
Z = B;
Вложенные условные операторы
Оператор if является вложенным, если он вложен, т.е. находится внутри другого оператора if или else. В практике программирования вложенные условные операторы используются довольно часто. Во вложенном условном операторе фраза else всегда ассоциирована с ближайшим if в том же блоке, если этот if не ассоциирован с другой фразой else. Например:
if(i)
{
if(j) statement 1;
if(k) statement 2; /* этот if */
else statement 3; /* ассоциирован с этим else */
}
else statement 4; /* ассоциирован с if(i) */
Оператор switch
Если надо выбрать один из нескольких вариантов в зависимости от значения некоторой
целой или символьной переменной, можно использовать несколько вложенных операторов if,
но значительно удобнее использовать специальный оператор switch
Оператор множественного выбора switchсостоит из заголовка и тела оператора, заклю-
ченного в фигурные скобки.
В заголовке после ключевого слова switchв круглых скобках записано имя переменной
(целой или символьной). В зависимости от значения этой переменной делается выбор ме-
жду несколькими вариантами.
Каждому варианту соответствует метка case, после которой стоит одно из возможных
значений этой переменной и двоеточие; если значение переменной совпадает с одной из
меток, то программа переходит на эту метку и выполняет все последующие операторы. Оператор breakслужит для выхода из тела оператора switch.
Если значение переменной не совпадает ни с одной из меток, программа переходит на
метку default(по умолчанию, то есть если ничего другого не указано). Можно ставить две метки на один оператор, например, чтобы программа реагировала как
на большие, так и на маленькие буквы, надо в теле оператора switchнаписать так:
case 'а':
case 'А':
printf("\nАнтилопа"); break;
case 'б':
case 'Б':
printf("\nБарсук"); break;
и так далее
scanf("%c", &c); // ввести букву
switch ( c ) // заголовок оператора выбора
{
case 'а': printf("\nАнтилопа"); break;
case 'б': printf("\nБарсук"); break;
case 'в': printf("\nВолк"); break;
default: printf("\nНе знаю я таких!"); // по умолчанию
}
Оператор цикла while
Очень часто заранее невозможно сказать, сколько раз надо выполнить какую-то опера-
цию, но можно определить условие, при котором она должна заканчиваться. Такое задание на
русском языке может выглядеть так: делай эту работу до тех пор, покаона не будет закончена
Цикл whileиспользуется тогда, когда количество повторений цикла заранее неизвестно
и не может быть вычислено.
• Цикл whileсостоит из заголовка и тела цикла.
• В заголовке после слова whileв круглых скобках записывается условие, при котором
цикл продолжает выполняться. Когда это условие нарушается (становится ложно), цикл
заканчивается.
Если условие неверно в самом начале, то цикл не выполняется ни разу (это цикл с преду-
словием).
• Если условие никогда не становится ложным (неверным), то цикл никогда не заканчива-
ется; в таком
// выводим числа от 0 до 4:
int i = 0;
while( i < 5 )
{
printf( "%d ", i );
i++;
}
Оператор цикла do-while
Существуют также случаи, когда надо выполнить цикл хотя бы один раз, затем на каждом
шагу делать проверку некоторого условия и закончить цикл, когда это условие станет ложным.
Для этого используется цикл с постусловием(то есть условие проверяется не в начале, а в
конце цикла). Не рекомендуется применять его слишком часто, поскольку он напоминает такую
ситуацию: прыгнул в бассейн, и только потом посмотрел, есть ли в нем вода.
Цикл состоит из заголовка do, тела цикла и завершающего условия.
• Условие записывается в круглых скобках после слова while, цикл продолжает выпол-
няться, пока условие верно; когда условие становится неверно, цикл заканчивается.
• Условие проверяется только в конце очередного шага цикла (это цикл с постусловием),
таким образом, цикл всегда выполняется хотя бы один раз.
Иногда надо выйти из цикла и перейти к следующему оператору, не дожидаясь оконча-
ния очередного шага цикла. Для этого используют специальный оператор break. Можно также
сказать компьютеру, что надо завершить текущий шаг цикла и сразу перейти к новому шагу (не
выходя из цикла) — для этого применяют оператор continue.
do { // начало цикла
printf ( "\nВведите натуральное число:" );
scanf ( "%d", &N );
}
while ( N <= 0 ); // условие цикла «пока N <= 0»
Оператор цикла for
Цикл forиспользуется тогда, когда количество повторений цикла заранее известно или
может быть вычислено.
• Цикл forсостоит из заголовка и тела цикла.
• В заголовке после слова forв круглых скобках записываются через точку с запятой три
выражения:
o начальные значения: операторы присваивания, которые выполняются один раз перед
выполнением цикла;
o условие, при котором выполняется следующий шаг цикла; если условие неверно,
работа цикла заканчивается; если оно неверно в самом начале, цикл не выполняется ни
одного раза (говорят, что это цикл с предусловием, то есть условие проверяется перед
выполнением цикла);
действия в конце каждого шагацикла (в большинстве случаев это операторы при-
сваивания).
for ( i = 1; i <= N; i ++) // цикл: для всех i от 1 до N
{
printf ( "Квадрат числа %d равен %d\n", i, i*i);
}
Пример бесконечного цикла:
FOR (;;) {
...
}
является бесконечным циклом, о котором предполагается, что
он будет прерван другими средствами (такими как BREAK или
RETURN).
Вложенные циклы
for( выражение1; выражение2; выражение3 )
for( выражение4; выражение5; выражение6 )
оператор;
Одна из проблем, связанных с вложенными циклами — организация досрочного выхода из них. Для этого есть оператор досрочного завершения цикла(break).
Существует возможность организовать цикл внутри тела другого цикла. Такой цикл будет называться вложенным циклом. Вложенный цикл по отношению к циклу в тело которого он вложен будет именоваться внутренним циклом, и наоборот цикл в теле которого существует вложенный цикл будет именоваться внешним по отношению к вложенному. Внутри вложенного цикла в свою очередь может быть вложен еще один цикл, образуя следующий уровень вложенности и так далее. Количество уровней вложенности как правило не ограничивается.
Пример(Ввод b вывод матрицы)
for(i=0;i<n;i++) //ввод
for(j=0;j<n;j++)
{
printf("Введите массив a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++) //вывод
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
Одномерный массив.
Массив - набор объектов одинакового типа, имеющих одно имя, доступ к которым осуществляется по индексам. Количество индексов определяет размерность.
Размерность массива — количество индексов, которые необходимо задать одновременно для доступа к элементу массива.
задается константой вот так:
int a[5];
Элементы массива запоминаются в памяти последовательно.
a[0]
a[1]
. . .
a[4]
Свойства одномерного массива:
-один и тот же тип
-все элементы в памяти располагаются друг за другом
-индекс первого элемента - 0
-имя массива определяет адрес начала массива (адрес первого элемента - const).
Реализация ввода элементов массива:
int a[5], i;
for( i=0; i<5; i++ )
{
printf( "\n эл-т %d: ", i );
scanf( "%d", &a[i] );
}
Инициализация массива при описании:
int x[4] = { 5, 2, 1, 8 };
// размерность можно не указывать:
int x[ ] = { 5, 2, 1, 8, 9, 75 };
int A[4] = { 2 }; // последние три элементы равны 0
Двумерные массивы
Имя двумерного массива является указателем константы на массив указателей констант.
int x[3][4]
С элементами двумерного массива можно работать с помощью индексов
int [i][j]
Первый индекс – номер строки, второй индекс – номер столбца. Количество байт памяти, которое необходимо для хранения массива, вычисляется по формуле
Колич. байт = <размер типа данных>*<колич. строк>*<колич. столбцов>
В памяти компьютера массив располагается непрерывно по строкам, т.е. а[0][0], a[0][1], a[0][2], a[1][0].
Элементы многомерного массива располагаются таким образом, что значение последнего индекса изменяется в первую очередь.
#include <stdio.h>
const int n = 10;
int main(void)
{
int i, j, a[n][n];
for ( i = 0; i < n; i ++ )
for ( j = 0; j < n; j ++ )
{ // цикл по всем элементам
printf("Введите a[%d][%d] ", i ); // подсказка для ввода A[i]
scanf ("%d", &a[i][j]); // ввод A[i]
}
for ( i = 0; i < n; i ++ )
{
for ( j = 0; j < n; j ++ )
printf(“%d”, a[i][j])
printf(“\n”);
}
}