Теория:
IДробные числа
В прошлом уроке мы прошли целые числа: как они хранятся, считываются, выписываются и обрабатываются в языке программирования С/С++. Но в математике целые числа занимают лишь малую часть среди всех чисел. Потому что есть ещё и дробные числа, и они, конечно же, тоже есть и в языке программирования С/С++.
Хранение дробных чисел
Дробные числа хранятся в переменных типа double
(от англ. double — двойной). Данный тип так называется, потому что для хранения дробного числа необходимо использовать две ячейки в памяти: для целой и для дробной части.
Целая часть числа
Для того, чтобы вычислить целую часть положительного числа в языке программирования С/С++, необходимо применить конвертацию переменной из типа double
в тип int
. Чтобы сконвертировать переменную типа double
в тип int
, необходимо просто поставить перед ней int
и взять её в круглые скобки:
int(a);
Для того, чтобы вычислить целую часть отрицательного числа в языке программирования С/С++, необходимо отнять единицу от числа, сконвертированного в тип int
.
int(a) - 1;
Дробная часть числа
Проще говоря, целая часть — то, что слева от точки, а дробная часть — то, что справа.
Для того, чтобы вычислить дробную часть числа в языке программирования С/С++, необходимо вычесть из этого числа его целую часть.
a - int(a);
Но бывают дробные числа, дробная часть которых бесконечна. Такие числа хранятся в компьютере с некоторой точностью в силу невозможности хранить бесконечное число чисел.
Создание переменной типа double
Чтобы создать переменную типа double
:
double x; // создаём переменную типа double
Как и в случае с целыми переменными, рекомендуется сразу же очищать переменную от мусора, присваиванием ей нулевое значение:
double x = 0.0; // создаём переменную типа double
Считывание дробных чисел с клавиатуры
Считывание дробных чисел с клавиатуры в языке программирования С/С++ происходит аналогично считыванию целых чисел с помощью функции scanf()
за исключением другого типа данных (6 строка):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
double x = 0.0; // создаём дробную переменную
scanf("%lf", &x); // считываем с клавиатуры дробное число в созданную переменную
return 0; // возвращаем 0 - успех
}
Для типа double
короткое имя при считывании это lf
.
Вывод дробных чисел на экран
Вывод дробных чисел на экран в языке программирования С/С++ происходит аналогично выводу целых чисел с помощью функции printf()
(7-8 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
double x = 0.0, y = 0.0; // создаём дробные переменные
scanf("%lf%lf", &x, &y); // считываем с клавиатуры дробные числа в созданные переменные
printf("x = %lf\n", x); // выписываем значение переменной х
printf("The value of y is %f\n", y); // выписываем значение переменной y
return 0; // возвращаем 0 - успех
}
Формат вывода дробных чисел на экран
В языке программирования С/С++ можно регулировать, сколько цифр после точки будет выписано на экран. По умолчанию выписываются 6 цифр после точки.
Чтобы указать, сколько цифр после точки необходимо отобразить, можно написать следующий код (7-8 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
double x = 0.0, y = 0.0; // создаём дробные переменные
scanf("%lf%lf", &x, &y); // считываем с клавиатуры дробные числа в созданные переменные
printf("x = %.8lf\n", x); // выписываем значение переменной х в формате 8 цифр после точки
printf("y = %.12lf\n", y); // выписываем значение переменной y в формате 12 цифр после точки
return 0; // возвращаем 0 - успех
}
Пример вывода данного кода:
23.2435345463423435467564534546574
23.4679475845847583958946849568
x = 23.24353455
y = 23.467947584585
Process returned 0 (0x0) execution time : 14.551 s
Press any key to continue.
IIОперация деления с остатком
В языке программирования С/С++ есть операция деления с остатком. Более того, данная операция является очень популярной и широко используемой.
Определение оператора %
Для того, чтобы узнать остаток при делении одного числа на другое, существует специальный оператор, обозначающийся символом процента %
:
c = a % b; // вычисляем остаток при делении переменной a на переменную b
printf("Remainder when dividing a number %d by a number %d is %d\n", a, b, c); // выводим получившейся остаток на экран
Остаток при делении отрицательных чисел
В математике принято, что остатки могут быть только положительными. Например, у числа -12 остаток 3 при делении на 5.
В языке программирования С/С++ остатки могут быть отрицательными. У числа -12 при делении на 5 остаток будет не 3, а -2. Необходимо иметь это в виду при решении зада
Процедура универсализации взятия остатка написана в данном уроке чуть ниже.
IIIЦикл if
Мы начинаем знакомство с таким объектом языка программирования С/С++, как цикл. В языке программирования С/С++ есть несколько основных базовых циклов.
Определение
Самым базовым циклом в языке программирования С/С++, как и во многих других высокоуровневых языках программирования, является цикл if
(от англ. if — если).
Цикл if
выполняет ровно то, что он означает: «Если условие в аргументе истинно, то команды из цикла будут выполнены, а если ложно — не будут».
Разновидности условий
В качестве условий могут выступать совершенно любые математические выражения, которые могут быть абсолютно точно истинными или же абсолютно точки ложными. Например, условие «Среди чисел от 1 до 1000 есть число, которое делится на все положительные однозначные числа» указать в цикле if
нельзя.
Условие должно быть односложным и легкопроверяемым компьютером с точки зрения вычисления. Условия могут быть как на созданные ранее переменные, так и на конкретные числа. Рассмотрим самые популярные разновидности условий:
Выражения со знаками:
В программировании существуют точно такие же знаки, что и в математике:
- Больше
>
- Меньше
<
- Больше или равно
>=
- Меньше или равно
<=
- Равно
==
- Не равно
!=
Условие пишется в круглых скобочках через пробел после названия цикла:
if (a > 3){} // условие, что переменная a больше числа 3
if (a >= b){} // условие, что переменная a больше или равна переменной b
if (a < b){} // условие, что переменная a меньше переменной b
if (b <= 10){} // условие, что переменная b меньше или равна числа 10
if (a == 5){} // условие, что переменная a равна числу 5
if (b != 12){} // условие, что переменная b не равна числу 12
Выражения, требующие вычисления:
Но порой требуется сравнить не просто переменные или числа, а результаты некоторых операций над ними. Например, будет ли число a
больше числа b
после прибавления к нему числа c
.
Для этого, конечно можно создать дополнительную переменную, положить в неё сумму, а потом уже сравнить эту сумму и число c
в цикле if
:
int sum_a_b = a + b; // создаём дополнительную переменную и кладём в неё сумму a и b
if (sum_a_b > c){} // проверяем, что сумма a и b больше c
Однако это не очень удобно с точки зрения лишнего кода, а также использования памяти, необходимо для создания новой переменной.
Данное сравнение можно осуществить гораздо удобней, сразу сравнив результат суммы и число:
if (a + b > c){} // проверяем, что сумма a и b больше c сразу внутри цикла if
Внутри цикла if
можно вычислять выражения любой сложности:
if ((3 * a + 2 * b) * (7 * c - 40) + 120 + (e + 10) * (e + 10) > a * b * c){} // проверяем сложные выражения
Проверка делимости одного числа на другое:
Операция взятия остатка может пригодиться для проверки делимости одного числа на другое. Если число a
делится на число b
, то остаток при делении числа a
на число b
равен нулю.
Поэтому проверить делимость числа a
на число b
в программе можно следующим образом:
if (a % b == 0){ // проверяем, что остаток от деления числа a на число b равен нулю
printf("%d is divided by %d\n", a, b); // выводим на экран, что число a делится на число b
}
Сложные условия в цикле if:
Иногда необходимо проверить сразу несколько условий. Например, что число чётное и положительное. В таком случае можно воспользоваться двумя циклами if
:
if (a % 2 == 0){ // проверяем, что число a чётное
if (a > 0){} // проверяем, что число a положительное
}
Но иногда условия могут быть сложней: проверить, что число чётное, положительное и не делится на 7. И создавать для этого три вложенных друг в друга цикла if
достаточно долго. Вместо этого можно воспользоваться одним циклом if
со сложным условием, состоящем из нескольких простых:
if (a % 2 == 0 && a > 0 && a % 7 != 0){} // проверяем, что число a чётное, положительное и не делится на 7 в одном цикле if
Для связки простых условий можно использовать связки «И» или «ИЛИ». Связка «И» обозначается двумя символами амперсанта &&
, а связка «ИЛИ» — двумя вертикальными палочками ||
. В примере выше использована связка «И».
Чтобы в одном цикле if
проверить, что число кратно 11 или 13, необходимо воспользоваться связкой «ИЛИ»:
if (a % 11 == 0 || a % 13 == 0){} // проверяем, что число a кратно 11 или 13
Иерархия простых условий в составе сложного:
Важно понимать, что связка «ИЛИ» относится к связке «И» точно также, как операция сложения к операции умножения.
Допустим, необходимо проверить условие, что число положительное, чётное и при этом кратно или 11 или 13.
Можно написать просто:
if (a > 0 && a % 2 == 0 && a % 11 == 0 || a % 13 == 0){} // проверяем, что число a положительное, чётное и при этом кратно или 11 или 13 первым способом
И это будет неправильно. Перейдём от условий к выражениям с операциями сложения и умножения:
(a>0) \times (a \% 2 == 0) \times (a \% 11 == 0) + (a \% 13 == 0)Совершенно логично, что сначала будет произведено умножение, а только потом сложение полученного произведения с последним слагаемым. Но ведь нам необходимо, чтобы число гарантированно было чётно и положительно, и только потом кратно 11 или 13.
В стандартной арифметике для этого используются скобки:
(a>0) \times (a \% 2 == 0) \times \Big( (a \% 11 == 0) + (a \% 13 == 0)\Big)В языке программирования происходит тоже самое. Чтобы условие работало корректно, необходимо добавить скобки:
if (a > 0 && a % 2 == 0 && (a % 11 == 0 || a % 13 == 0)){} // проверяем, что число a положительное, чётное и при этом кратно или 11 или 13 вторым способом
Конструкция else
Чаще всего необходимо сделать что-либо не только, когда выполнено условие, но и когда оно не выполнено. Использовать для этого второй точно такой же цикл if
, только с противоположным условием не рационально.
Для этого и была придумана конструкция else
, которая определяет область невыполнимости условия цикла if
. Данная конструкция образована от слова else (иначе — англ.).
Допустим, необходимо разделить число на 2 и выписать его на экран, если оно чётное, и просто выписать его на экран, если нечётное. Для этого и нужно использовать else
:
if (a % 2 == 0){ // проверяем, что число чётное
printf("%d\n", a / 2); // делим его на 2 и выписываем на экран, если оно чётное
} else {
printf("%d\n", a); // в противном случае просто выписываем его на экран
}
Всё просто: «Если число a
чётно, делим его на 2 и выписываем, иначе просто выписываем его».
Конструкция else if
Данная конструкция может быть использована и в ещё более сложном условии. Например, необходимо сделать что-то конкретное, в зависимости от остатка при делении на 3. Так как при делении на 3 может быть три остатка (0, 1 и 2), обыкновенно конструкцией «если…иначе…» ограничиться нельзя. В таком случае можно воспользоваться:
if (a % 3 == 0){ // проверяем, что число имеет остаток 0 при делении на 3
// делаем что-то
} else if (a % 3 == 1){ // проверяем, что число имеет остаток 1 при делении на 3
// делаем что-то
} else { // если остаток при делении на 3 не 0 и не 1, то он точно 2, поэтому просто пишем else
// делаем что-то
}
Взятие остатка от отрицательного числа
Как уже было замечено, в языке программирования С/С++ операция взятия остатка от отрицательных чисел работает не так, как принято у математиков. Если есть вероятность, что программному коду нужно будет работать с отрицательными числами, необходимо не просто брать остаток при делении одного числа на другое, а осуществлять проверку, с положительным или отрицательным числом идёт работа:
if (a > 0){
r = a % 5;
} else {
r = a % 5 + 5;
}
В представленном выше коде осуществляется проверка знака переменной a
и в случае, если число a
отрицательно, чтобы остаток был таким, как принято у математиков, к остатку прибавляется то, число, на которое делится переменная a
.
Однако можно поступить проще. Так как ясно, что в языке программирования С/С++ при делении с остатком отрицательных чисел получается остаток, равный разности принятого у математиков остатка и делителя.
Например, число -12 при делении на 5 в стандартной операции даст остаток -2, а в общепринятой — 3, а число 3 как раз получается прибавлением -2 и 5.
Таким образом, например, при нахождении чисел, имеющих остаток 4 при делении на 11, можно написать следующее условие в цикле if
:
if (a % 11 == 4 || a % 11 == -7){
// делаем что-то
}
Практика
1Задача №1.
Считать с клавиатуры два целых числа и вывести наибольшее из них.
Решение:
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0; // создаём целочисленные переменные
printf("Print 2 numbers:\n"); // приглашаем пользователя на ввод
scanf("%d%d", &x, &y); // считываем два числа с клавиатуры
if (x > y){ // сравниваем числа
printf("%d\n", x); // выписываем x
} else {
printf("%d\n", y); // выписываем y
}
return 0; // возвращаем 0 - успех
}
Пример работы программы:
Print 2 numbers:
12 9
12
Process returned 0 (0x0) execution time : 6.953 s
Press any key to continue.
2Задача №2.
Считать с клавиатуры целое число, проверить его на чётность.
Решение:
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0; // создаём целочисленные переменные
printf("Print 1 number:\n"); // приглашаем пользователя на ввод
scanf("%d", &x); // считываем число с клавиатуры
if (x % 2 == 0){ // проверяем число x на чётность
printf("%d is divided by 2\n", x); // выписываем, что x кратно двум
} else {
printf("%d is not divided by 2\n", x); // выписываем, что x не кратно двум
}
return 0; // возвращаем 0 - успех
}
Пример работы программы:
Print 1 number:
35
35 is not divided by 2
Process returned 0 (0x0) execution time : 2.372 s
Press any key to continue.
3Задача №3.
Считать с клавиатуры два числа и проверить делится ли большее на меньшее.
Решение:
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0; // создаём целочисленные переменные
printf("Print 2 numbers:\n"); // приглашаем пользователя на ввод
scanf("%d%d", &x, &y); // считываем числа с клавиатуры
if (x > y){ // сравниваем числа
if (x % y == 0){ // проверяем, что число x делится на число y
printf("%d is divided by %d\n", x, y); // выписываем, что x кратно числу y
} else {
printf("%d is not divided by %d\n", x, y); // выписываем, что x не кратно числу y
}
} else {
if (y % x == 0){ // проверяем, что число y делится на число x
printf("%d is divided by %d\n", y, x); // выписываем, что y кратно числу x
} else {
printf("%d is not divided by %d\n", y, x); // выписываем, что y не кратно числу x
}
}
return 0; // возвращаем 0 - успех
}
Пример работы программы:
Print 2 numbers:
120 24
120 is divided by 24
Process returned 0 (0x0) execution time : 4.549 s
Press any key to continue.
4Задача №4.
Считать с клавиатуры три целых числа и вывести наибольшее из них.
Решение:
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0, z = 0; // создаём целочисленные переменные
printf("Print 3 numbers:\n"); // приглашаем пользователя на ввод
scanf("%d%d%d", &x, &y, &z); // считываем числа с клавиатуры
if (x > y && x > z){ // проверяем, что число x самое большое
printf("%d\n", x); // выписываем наибольшее число
} else if (y > x && y > z){ // проверяем, что число y самое большое
printf("%d\n", y); // выписываем наибольшее число
} else { // если это не x и не y, то это z
printf("%d\n", z); // выписываем наибольшее число
}
return 0; // возвращаем 0 - успех
}
Пример работы программы:
Print 3 numbers:
12 34 -19
34
Process returned 0 (0x0) execution time : 5.748 s
Press any key to continue.
Домашнее задание:
1Задача №1.
Считать с клавиатуры 4 целых числа и вывести наименьшее из них.
2Задача №2.
Считать с клавиатуры 3 целых числа и вывести их в порядке возрастания.
3Задача №3.
Считать с клавиатуры целое число и вывести на экран его последнюю цифру.
4Задача №4.
Число подходящее, если оно нечётно и при этом имеет остаток 5 при делении на 8 или кратно 5. Считать с клавиатуры целое число и выписать, подходящее оно или нет.
Пример входных и выходных данных:
Пример числа, которое ввёл пользователь:
-13
Пример корректного вывода программы для вышенаписанных входных данных:
-13 is a suitable number
5Задача №5.
Пользователь вводит одно число. Необходимо вывести его целую и дробную часть.
Пример входных и выходных данных:
Пример числа, которое ввёл пользователь:
-6.32
Пример корректного вывода программы для вышенаписанных входных данных:
The integer part of -6.320000 is -7
The fractional part of -6.320000 is 0.680000
6Задача №6.
Необходимо написать программу, которая сообщает пользователю, можно ли извлечь целочисленный корень из введённого им числа. Если можно, то программа сразу же извлекает его.
Пример входных и выходных данных:
Пример числа, которое ввёл пользователь:
16
Пример корректного вывода программы для вышенаписанных входных данных:
The square root from 16.000000 is integer and is equal to 4.000000
7Задача №7.
Пользователь вводит три дробных числа. Они интерпретируются, как коэффициенты a, b, c уравнения aх + b = c. Необходимо вывести на экран решение данного уравнения.
Пример входных и выходных данных:
Пример чисел, которые ввёл пользователь:
2 4 7
Пример корректного вывода программы для вышенаписанных входных данных:
Your equation is: (2.000000)x + (4.000000) = (7.000000)
The solution is 1,5
8Задача №8*.
Пользователь вводит три дробных числа. Они интерпретируются, как коэффициенты a, b, c уравнения aх^2 + bx + c = 0. Необходимо вывести на экран решение данного уравнения.
Пример входных и выходных данных:
Пример чисел, которые ввёл пользователь:
1 2 -5
Пример корректного вывода программы для вышенаписанных входных данных:
Your equation is: (1.000000)x^2 + (2.000000)x + (-5.000000) = 0
The solution is (-2.000000 + sqrt(24.000000)) / 2.000000 and (-2.000000 - sqrt(24.000000)) / 2.000000