- •Предисловие.
- •1. Введение.
- •1.1. История создания языка си.
- •1.2. Стандарты языка си.
- •2. Основные сведения, необходимые для создания программ на языке си.
- •2.1 Процесс создания исполняемого файла.
- •2.2 Распределение памяти программы.
- •2.3 Некоторые основные понятия.
- •2.4 Данные.
- •2.5 Структура простой программы.
- •3. Определение размеров типов данных и объектов.
- •4. Строки и строковые константы.
- •5. Директива препроцессора # define.
- •6. Функции форматированного ввода – вывода.
- •6.1 Функция форматированного вывода printf().
- •6.2 Функция форматированного ввода scanf().
- •7. Операции и операторы.
- •7.1 Арифметические операции
- •7.4 Порядок выполнения операций.
- •8. Выражения и операторы
- •8.1 Выражения.
- •8.2 Операторы.
- •8.3 Составные операторы.
- •8.4 Преобразование типов.
- •8.5 Операция приведения типов.
- •9. Функции ввода и вывода символов.
- •9.1 Функции getchar() и putchar().
- •9.2 Функции getch() и getche().
- •9.3 Ввод и вывод последовательности символов.
- •9.4 Подсчет символов, вводимых с клавиатуры.
- •9.5 Вывод символов из вводимого с клавиатуры файла.
- •9.6 Переключение ввода-вывода данных.
- •10. Принятие решений.
- •10.1 Оператор если (if).
- •10.2 Оператор если - иначе (if else).
- •10.3 Множественный выбор на основе операторов if, else.
- •10.5 Приоритеты операций отношения.
- •10.6 Логические операции (and, or, not).
- •10.7 Операция условия ?:.
- •10.8 Множественный выбор на основе операторов switch, break, default.
- •11. Циклы.
- •11.1 Цикл пока (while).
- •11.2 Цикл для (for).
- •11.4 Операция запятая ,.
- •11.5 Цикл делай пока (do while).
- •11.6 Вложенные циклы.
- •11.7 Операторы выход из структуры (break), продолжение (continue), безусловный переход (to go).
- •Литература.
- •Оглавление.
10.2 Оператор если - иначе (if else).
Оператор if-else дает возможность выбрать одно из двух действий.
Общий вид оператора if-else:
if (выражение условия) оператор else оператор
Если выражение истинно, то выполняется первый оператор, а если ложно, то выполняется оператор, следующий за ключевым словом else.
Операторы могут быть простыми или составными (тогда используются фигурные скобки).
/* ПРОГРАММА:
cod_mes.c – кодировка сообщений путем увеличения кода символов на 1.
*/
/*#############################################*/
/*============================= include */
#include<stdio.h>
/*============================= main() */
main()
{/*.---------------------------.begin main() */
char ch;
while((ch = getchar()) != EOF)
{/*.---------------------------.begin while */
if(ch =='\n' ) putchar(ch); /* символ новая строка не меняется */
else
putchar(ch + 1); /* заменить остальные символы */
}/*.---------------------------.end while) */
return 0;
}/*.---------------------------.end main() */
/*#############################################*/
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.
Сообщение будет состоять из символов, код которых будет увеличен на 1.
ПОЯСНЕНИЯ К ПРОГРАММЕ.
Код символа новая строка останется неизменным.
***************************************************************
10.3 Множественный выбор на основе операторов if, else.
Когда надо сделать выбор более, чем из двух вариантов конструкция if-else принимает более сложную форму.
/* ПРОГРАММА:
price_el – стоимость электроэнергии.
Расценки, назначаемые за коммунальные услуги некоторыми компаниями, зависят от количества потребляемой энергии.
Первые 240 кВт/ч: 0.05418 долл. за кВт/ч
Следующие 300 кВт/ч: 0.07047 долл. за кВт/ч
Свыше 540 кВт/ч: 0.09164 долл. за кВт/ч
*/
/*#############################################*/
/*============================= include */
#include<stdio.h>
/*============================= define */
#definе RATE1 0.05418 /* тариф за первые 240 кВт/ч */
#define RATE2 0.07047 /* тариф за следующие 300 кВт/ч */
#define RATE3 0.09164 /* тариф за потребление свыше 540 кВт/ч */
#define BASE1 13.00 /* плата за первые 240 кВт/ч */
#define BASE2 34.14 /* плата за первые 540 кВт/ч */
#define BREAK1 240.0 /* величина первого условия ветвления */
#define BREAK2 540.0 /* величина второго условия ветвления */
/*============================= main() */
main()
{/*.---------------------------.begin main() */
float kwh; /* количество использованных кВт/ч */
float bill; /* плата */
printf(" Укажите, пожалуйста, количество использованных кВт/ч.\n");
scanf(" %f, &kwh);
/* количество кВт/ч до 240 */
if (kwh < BREAK1) bill = RATEl * kwh;
/* количество кВт/ч между 240 и 540 */
else if(kwh < BREAK2) bill = BASE1 + RATE2*kwh;
/* количество кВт/ч свыше 540 */
else bill = BASE2 + RATE3*kwh;
printf(" Плата за %.1f кВт/ч составляет $%1.2f. \n", kwh, bill);
return 0;
}/*.---------------------------.end main() */
/*#############################################*/
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.
Программа вычисляет плату за электроэнергию в зависимости от количества потребляемой энергии.
ПОЯСНЕНИЯ К ПРОГРАММЕ.
-
Для обозначения тарифов были использованы символические константы, которые поэтому оказались собранными в одном месте. Если электрическая компания изменит свои расценки (а это может случиться), то такое расположение констант не позволит нам забыть скорректировать какую-нибудь из них.
-
Мы задали в символическом виде и константы, соответствующие граничным значениям потребляемой мощности. Они также подвержены изменениям.
-
Управляющая логика программы реализуется путем выбора одной из трех расчетных формул в зависимости oт значения переменной kwh.
-
Программа в процессе выполнения может достичь первого употребления else только в том случае, если величина переменной kwh больше или равна 240. Поэтому строка else if(kwh < BREAK2) эквивалентна требованию, чтобы значение kwh было заключено между 240 и 540, это мы и указали в комментарии к программе.
-
Совершенно аналогично последнее употребление else может быть достигнуто, только если значение kwh больше или равно 540.
-
Наконец, отметим, что константы BASE1 и BASE2 представляют собой величину платы за первые 240 или 540 кВт/ч электроэнергии соответственно. Поэтому требуется только прибавить дополнительную плату за количество потребляемой электроэнергии, превышающее эти величины.
***************************************************************
ПРИМЕЧАНИЕ 1.
Можно использовать подряд любое количество конструкций else if.
if (score < 1000) bonus = 0;
else if (score < 1500) bonus = 1;
else if (score < 2000) bonus = 4;
else bonus = 6;
Этот фрагмент взят из игровой программы, где переменная bonus представляет собой количество дополнительных очков (bonus), получаемых игроком для следующей партии в зависимости от счета (score) предыдущей партии.
ПРИМЕЧАНИЕ 2.
Оператор else соответствует ближайшему оператору if, кроме тех случаев, когда имеются фигурные скобки.
/* ФРАГМЕНТ ПРОГРАММЫ:
/*=============*/
if(number > 6)
{
if(number < 12) printf (“ 6 < number. < 12\n”);
}
else
printf("6 > number. \n");
/*=============*/
РЕЗУЛЬТАТ РАБОТЫ ФРАГМЕНТА ПРОГРАММЫ.
number: результат работы фрагмента:
5 6 > number.
10 6 < number. < 12
15 .
10.4 ОПЕРАЦИИ ОТНОШЕНИЯ ( < <= => > == != ).
Операции отношения используются в выражениях условия операторов while и for. Эти oпeраторы проверяют, истинно или ложно данное выражение. В языке Си значение "истина" соответствует 1, а значение "ложь" соответствует 0. В языке Си имеются шесть операций отношения.
ОПЕРАЦИИ ОТНОШЕНИЯ.
Операция отношения |
Смысл операции отношения |
< |
Меньше |
<= |
меньше или равно |
== |
Равно |
>= |
больше или равно |
> |
Больше |
!= |
не равно |
ПРИМЕЧАНИЕ.
В языке Си нельзя использовать знак = вместо ==. С помощью операции присваивания = некоторое значение присваивается переменной слева от знака равенства. Операция присваивания изменяет значения переменной в левой части. С помощью операции отношения равно == проверяется, равно ли выражение, стоящее слева от знака, выражению справа от него. Операция равно не изменяет значения переменной в левой части.
canoes = 3 присваивает значение 3 переменной canoes.
canoes == 5 проверяет, равняется ли значение переменной canoes 5.
В ряде случаев компилятор не сможет обнаружить ошибки, связанной с неправильным использованием знаков этих операций, что приведет к ошибочным результатам.
Примеры операций отношения:
if(number < 6) printf(" Ваше число слишком мало.\n" );
while(сh!= '$') сount ++;
if(total == 100) printf(" Вы набрали максимум очков!\n");
if (ch > 'м') printf(" Отправьте этого человека по другому маршруту \n");
-
В условных выражениях разрешается использовать также и символы, причем при сравнении их берется машинный код (ASCII).
-
Использовать операции отношения для сравнения строк не разрешается (для этого используются специальные функции).
-
Операции отношения можно использовать также при работе с числами с плавающей точкой. Однако при сравнениях этих чисел рекомендуется ограничиться лишь операциями < и >, т.к. ошибки округления могут привести к тому, что числа окажутся неравными, хотя по логике они должны быть равны. Например, произведение 3 и 1/3 равно 1.0, но если мы представим 1/3 в виде 6 разрядной десятичной дроби, то произведение будет равно 0,999999, что не равняется в точности 1.
/* ПРОГРАММА:
true_false_1.c – истина – ложь.
*/
/*#############################################*/
/*============================= include */
#include<stdio.h>
/*============================= main() */
main()
{/*.---------------------------.begin main() */
int true, false;
true = (10 > 2); /* отношение истинно */
false = (10 = =2); /* отношение ложно */
printf("true = %d; false = %d\n" , true, false);
return 0;
}/*.---------------------------.end main() */
/*#############################################*/
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.
true = 1 false = 0
ПОЯСНЕНИЯ К ПРОГРАММЕ.
В языке Си значение "истина" соответствует 1, a значение "ложь" соответствует 0.
***************************************************************
/* ПРОГРАММА:
true_false_2.c – истина – ложь.
*/
/*#############################################*/
/*============================= include */
#include<stdio.h>
/*============================= main() */
main()
{/*.---------------------------.begin main() */
if(1) printf(" 1 соответствует истине. \n" );
else printf(" 1 не соответствует истине. \n");
if(0) printf(" 0 не означает ложь. \n");
else printf(" 0 означает ложь. \n");
return 0;
}/*.---------------------------.end main() */
/*#############################################*/
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.
1 соответствует истине.
0 означает ложь.
ПОЯСНЕНИЯ К ПРОГРАММЕ.
1 должна рассматриваться как истинное утверждение, а 0 - как ложное. Поэтому, в первом операторе if должна выполниться первая ветвь (ветвь if), а во втором операторе if - вторая ветвь (ветвь else).
***************************************************************
Из приведенных примеров следует, что в качестве проверочных значений оператора if можно использовать 1 и 0. Спрашивается, можно ли использовать для этой цели другие числа. Если да, что при этом происходит?
/* ПРОГРАММА:
true_false_3.c – истина – ложь.
*/
/*#############################################*/
/*============================= include */
#include<stdio.h>
/*============================= main() */
main()
{/*.---------------------------.begin main() */
if (200) printf("200 - это истина. \n");
if(-33) printf("-33 - это истина. \n");
return 0;
}/*.---------------------------.end main() */
/*#############################################*/
РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ.
200 - это истина.
-33 - это истина.
ПОЯСНЕНИЯ К ПРОГРАММЕ.
В языке Си числа 200 и -33 тоже рассматриваются как "истина". Вообще, все ненулевые величины принимаются в качестве "истины" и только 0 - как "ложь".
***************************************************************
ПРИМЕЧАНИЕ.
Строку if(goats !=0) можно заменить строкой if(goats), поскольку выражение (goats != 0) и выражение (goats) оба примут значение 0, или "ложь", только в том случае, если значение переменной goats равно 0. Смысл второй формы записи менее очевиден, чем первой. Однако, в результате компиляции она оказывается более эффективной, так как при реализации программы требует меньшего числа машинных операций.