Работа с целыми и действительными числами. Форматированный ввод-вывод чисел. Управляющие инструкции. Использование стандартных математических функций.
1.1. Типы данных и переменные.
Тип данных определяется как множество значений и множество операций, допустимых над этими значениями. Значения данных хранятся в памяти компьютера. Переменная это область памяти, которая используется для хранения значений данных определенного типа. Отсюда следует, что каждая переменная характеризуется своим адресом и длиной, которая зависит от типа хранимых данных. В языках программирования высокого уровня адрес переменной представляется символическим именем. Поэтому можно сказать, что переменная это поименованная область памяти, используемая для хранения данных определенного типа. Для упрощения терминологии часто символическое имя переменной называют просто переменной.
1.2. Объявление целочисленных и действительных переменных.
В языке программирования С целочисленные переменные имеют тип int и объявляются следующим образом:
int a;
int i, j, k;
То есть тип числа ставится перед переменной, которая обозначает это число. Во второй строке объявлено сразу несколько переменных целочисленного типа. В этом случае переменные разделяются запятыми.
В языке программирования С для хранения символов используются переменные типа char. Объявляются переменные этого типа следующим образом:
char c;
Тип char также считается числовым типом данных. Над данными этого типа разрешены те же операции, что и над данными типа int.
В языке программирования С действительные числа хранятся в переменных, которые могут иметь тип float или тип double. Переменные типа double имеют в два раза больший диапазон значений, чем переменные типа float. Объявляются действительные переменные следующим образом:
float a;
double b, c;
При объявлении переменные могут инициализироваться. Для этого используется операция присваивания переменной некоторого значения. В следующих примерах показаны варианты инициализации переменных.
int a = 2, b = 3;
int c = a + b; // c = 5
char a = ‘a’;
float a = 1.2f; // f обозначает float
double b = 2.3;
double c = a + b; // с = 3.5
1.3. Арифметические операции над числами.
Над целочисленными данными разрешается выполнять следующие операции:
+ сложение,
– вычитание,
* умножение,
/ деление,
% деление по модулю.
В языке программирования С символические обозначения этих операций называются операторами. В следующем примере показано различие между операторами / и %.
int a = 5, b = 2;
int c;
c = a / b; // c = 2;
c = a % b; // c = 1
Операторы + и – являются как бинарными, так и унарными, то есть могут применяться как к одному, так и к двум операндам. Кроме того, целочисленные переменные могут быть операндами следующих унарных операторов:
++ инкремент, то есть увеличение значения числа на единицу,
— декремент, то есть уменьшение числа на единицу.
Эти операторы могут быть как префиксными, так и постфиксными, то есть записываться как перед операндом, так и после него. Следующий пример демонстрирует различие между префиксными и постфиксными операциями инкремента и декремента:
int c, a = 1, b = 1;
c = ++a; // c = 2, a = 2
c = b++; // c = 1, b = 2
То есть значение префиксной операции вычисляется перед вычислением значения выражения, а значение постфиксной операции вычисляется после вычисления значения выражения.
Над данными типа float и double разрешается выполнять следующие операции:
+ сложение,
– вычитание,
* умножение,
/ деление.
Если результат арифметической операции над числами необходимо поместить в первый операнд этой операции, то для этих целей используются следующие сокращенные обозначения арифметических операций: +=, -=, *=, /=, %=. Например, прибавление к числу a некоторого числа b может быть записано следующим образом:
a += b; // эквивалентно a = a + b;
1.4. Форматированный ввод и вывод чисел.
Для форматированного ввода данных с консоли используется функция scanf. Для форматированного вывода данных на консоль используется функция printf. Прототипы этих функций описаны в заголовочном файле stdio.h. О заголовочных файлах и стандартных библиотеках будет рассказано позже. Пока же рассмотрим пример программы, в котором с консоли вводятся два целых числа, а затем на консоль выводится их сумма.
#include <stdio.h>
int main()
{
int a, b;
// выводим текстовое сообщение
printf(“Input two integers: “);
// вводим два целых числа
scanf(“%d %d”, &a, &b);
// выводим сумму этих чисел
printf(“a + b = %d\n”, a + b);
return 1;
}
Немного поясним работу функций scanf и printf. Первым параметром этих функций является строка, которая будет форматироваться при вводе или выводе данных. Если в каком-то месте этой строки нужно вставить символьное представление целого числа, то на это место ставится спецификация ввода или вывода целого числа, которая в обоих случаях имеет вид %d. Следующие за строкой параметры функции scanf представляют собой адреса переменных, в которые нужно ввести целое число. Заметим, что операция взятия адреса переменной обозначается символом ‘&’. В свою очередь следующие за строкой параметры функции printf представляют собой просто целые числа, которые нужно вставить в строку для вывода на консоль.
В связи с этим примером также заметим, что управляющий символ \n в форматируемой строке функции printf используется для перевода курсора в новую строку консоли.
Эта программы должны компилироваться, редактироваться и запускаться на выполнение из среды разработки Visual Studio. В этом случае после завершения программы на консоль выводится сообщение, которое говорит о том, что для продолжения работы необходимо нажать любую клавишу. Если программа запускается из файлового менеджера, то для того чтобы задержать завершение программы для просмотра результатов её работы можно перед инструкцией return вставить функцию _getch(), прототип которой описан в заголовочном файле conio.h. Однако заметим, что эта функция не является стандартной.
Подобным образом выполняется и ввод-вывод действительных чисел. Только для действительных чисел типа double используются следующие спецификации: %lf – для ввода с консоли и %f – для вывода на консоль. Следующий пример демонстрирует форматированный ввод и вывод действительных чисел.
#include <stdio.h>
#include <conio.h>
int main()
{
double a = 0, b = 0;
// выводим текстовое сообщение
printf(“Input two real numbers: “);
// вводим два действительных числа
scanf(“%lf %lf”, &a, &b);
// выводим сумму этих чисел
printf(“a + b = %f\n”, a + b);
// выводим сообщение о завершении работы программы
printf(“Press any key to exit.\n”);
// ждем нажатия клавиши
_getch();
return 1;
}
Сделаем следующее замечание относительно этих программ. Каждая программа на языке С должна содержать функцию main, которая должна возвращать целочисленное значение. При запуске приложения операционной системой управление всегда передается функции main. Более подробно работа с функциями будет рассмотрена в одной из следующих лабораторных работ.
В заключение этого параграфа отметим, что для вывода на консоль русского текста нужно перекодировать выводимый текст в кодовую таблицу, зашитую в компьютере. Для этого нужно вызвать функции перекодировки OS Windows, прототип которых описан в заголовочном файле <windows.h>. Как это делается, показано в демонстрационных примерах, которые прилагаются к лабораторной работе.
1.5. Логические операторы и операторы сравнения.
В языке программирования С определены следующие логические операторы:
! логическое отрицание,
&& логическая операция ‘и’,
| | логическая операция ‘или’.
Отметим, что операндами логических операций могут быть значения любого типа. При этом считается, что нулевому значению соответствует логическое значение ‘ложь’, а любое другое значение соответствует логическому значению ‘истина’.
Для сравнения числовых значений используются следующие операторы сравнения:
== равно,
!= не равно,
> больше,
< меньше,
>= больше или равно,
<= меньше или равно.
Если условие сравнения выполняется, то результатом оператора сравнения является целое число 1, в противном случае – число 0. Например, можно написать следующее выражение для сравнения числовых данных:
(a > b) && (b != c) | | (c == d)
1.6. Условные инструкции if и if-else.
Для управления ходом выполнения программы нужно использовать управляющие инструкции языка программирования С, некоторые из которых рассматриваются ниже.
Для проверки истинности некоторого условия используется управляющая инструкция
if (выражение)
инструкция
которая работает следующим образом. Если значение выражения истинно, то выполняется инструкция, следующая за выражением. Иначе, ничего не выполняется. Например, следующая инструкция увеличивает значение числа a на единицу, только если это число меньше нуля.
if ( a < 0 )
++a;
Если необходимо выбрать одно из действий в зависимости от значения логического выражения, то для этой цели используется управляющая инструкция
if (выражение)
инструкция
else
инструкция
В следующем примере число a увеличивается на единицу, если оно меньше нуля, и уменьшается на единицу в противном случае.
if ( a < 0 )
++a;
else
–a;
1.7. Инструкции цикла while и do-while.
Для выполнения некоторых действий в цикле до тех пор, пока значение некоторого логического выражения остается истина, используются управляющие инструкции
while (выражение)
инструкция
и
do
инструкция
while (выражение)
В этих случаях логическое выражение после ключевого слова while также называется условием продолжения цикла. В первом случае условие продолжения цикла проверяется перед выполнением инструкции, а во втором случае – после выполнения инструкции. Использование инструкций цикла while и do-while показано в следующих примерах.
while ( a < 0 )
++a;
или
do
++a;
while ( a < 0);
Для принудительного выхода из циклов while и do-while используется инструкция break. Например,
while ( a < 0 )
{
++a;
if (a > b) // если a > b, то выходим из цикла while
break;
}
Для перехода на исполнение следующего цикла, не ожидая завершения исполнения текущего цикла, используется инструкция continue. Например,
while ( a < 0 )
{
++a;
if (a > b) // если a > b, то переходим на начало цикла while
continue;
–b;
}
Как видно из определений, возможно вложение управляющих инструкций друг в друга.
1.8. Инструкция цикла for.
Для выполнения циклических действий, которые зависят от значения некоторой переменной, удобно использовать управляющую инструкцию
for (выражение_1; выражение_2; выражение_3)
инструкция;
где
выражение_1 описывает инициализацию цикла и вычисляется только один раз перед началом цикла;
выражение_2 описывает условие, которое проверяется каждый раз перед выполнением инструкции; если значение этого выражения истинно, то инструкция выполняется, в противном случае цикл заканчивается;
выражение_3 вычисляется после каждой итерации цикла.
Например, следующая программа выводит на консоль последовательные значения целочисленной переменной.
#include <stdio.h>
int main()
{
for (int i = 0; i < 3; ++i)
printf(“i = %d\n”, i);
printf(“\n”);
return 1;
}
Для принудительного выхода или для продолжения цикла for также как и для циклов while и do-while используются инструкции break и continue соответственно.
1.9. Инструкция выбора switch.
Инструкция выбора switch передает управление другой инструкции в зависимости от значения некоторого выражения. В общем случае инструкция switch имеет следующий вид:
switch (выражение)
{
case константа_1: инструкции
case константа_2: инструкции
…
default: инструкции
}
и работает следующим образом. Сначала вычисляется значения выражения. Затем это значение сравнивается с константами. Управление передается на метку, для которой это сравнение дает значение истина. Если значение выражения не совпадает ни с одной из констант, то управление передается инструкции с меткой default. А если этой метки нет, то происходит выход из блока switch. Для принудительного выхода из блока switch используется инструкция break.
Сделаем некоторые важные замечания относительно использования инструкции switch. Во-первых, выражение и константы в инструкции switch должны иметь целочисленный тип. Во-вторых, никакие две константы не могут иметь одинаковое значение. В следующей программе приведен пример использования инструкции switch.
#include <stdio.h>
int main()
{ char c;
printf(“Input any char ‘a’ or ‘b’: “);
scanf(“%c”, &c);
switch (c)
{
case ‘a’:
printf(“You input ‘a’.\n”);
break;
case ‘b’:
printf(“You input ‘b’.\n”);
break;
default:
printf(“You input a different letter.\n”);
}
return 1;
}
1.10. Блоки.
Часто в теле управляющих инструкций необходимо выполнить сразу несколько других инструкций. Для этой цели инструкции объединяются в блок инструкций или просто блок. Начало и конец блока отмечаются соответственно символами ‘{‘ и ‘}’. Особо отметим, что после окончания блока ставить точку с запятой не нужно. Например, блок внутри управляющей инструкции if может выглядеть следующим образом:
if ( a < 0 )
{
–a;
c = a + b;
}
1.11. Стандартная библиотека математических функций.
В языке программирования С имеется стандартная библиотека, которая содержит основные функции, используемые при математических расчетах. Эти функции могут быть разбиты на следующие группы:
тригонометрические функции:
double acos(double x) возвращает арккосинус числа x,
double asin(double x) возвращает арксинус числа x,
double atan(double x) возвращает арктангенс числа x,
double atan2(double y, double x) возвращает арктангенс числа y/x,
double cos(double x) возвращает косинус числа x,
double sin(double x) возвращает синус числа x,
double tan(double x) возвращает тангенс числа x;
экспоненциальные и логарифмические функции:
double cosh(double x) возвращает косинус гиперболический числа x,
double exp(double x) возвращает экспоненту числа x,
double frexp(double x, int *а) находит такую мантиссу m и экспоненту e числа x, что x = m * 2^e и 0.5 £ m < 1.0; потом возвращает m, а по адресу а записывает е,
double ldexp(double x, int e) возвращает число x *2^e,
double log(double x) возвращает натуральный логарифм числа x,
double log10(x) возвращает логарифм числа x по основанию 10;
double sinh(double x) возвращает синус гиперболический числа x,
double tanh(double x) возвращает тангенс гиперболический числа x,
степень и корень:
double pow(double x, double y) возвращает x в степени y,
double sqrt(double x) возвращает квадратный корень из x;
остальные функции:
double modf(double x, int *a) возвращает дробную часть числа x, а по адресу a записывает целую часть этого числа,
double ceil(double x) возвращает наименьшее целое, которое больше x,
double fabs(double x) возвращает абсолютное значение числа x,
double floor(double x) возвращает наибольшее целое число, которое меньше x,
double fmod(double x, double y) возвращает остаток от деления x на y.
Для использования математических функций в программу необходимо включить заголовочный файл math.h. Например, следующая программа сначала вводит число x, затем вычисляет синус этого числа и выводит его на консоль.
#include <stdio.h>
#include <math.h>
int main()
{
double x = 0;
printf(“Input a real number: “);
scanf(“%lf”, &x);
printf(“sin x = %f\n”, sin(x));
return 1;
}