Теория:
IСтруктура программы на языке С/С++
Как мы уже выяснили, программа на высокоуровневом языке программирования (а язык С/С++ высокоуровневый) — это набор команд, которые написаны с соблюдением синтаксиса языка С/С++. Проще говоря, программа — это некий алгоритм, реализованный в виде последовательности команд.
Давайте разберёмся, из чего состоит стандартная программа, написанная на языке С/С++.
Библиотеки
Все функции с описанием синтаксиса, необходимым для компилятора, хранятся в библиотеках.
Чтобы компилятор мог понимать синтаксис, в самое начала файла с программным кодом нужно подключить соответствующие библиотеки. Чтобы это сделать существует специальная команда #include
Для начала работы, нам нужно подключить две самые необходимые библиотеки:
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
Главная функция программы
У каждой компании должен быть генеральный директор, руководящий всеми процессами, происходящими с компаниям. Точно также и у каждой программы должна быть главная функция, которая всем управляет.
В языке программирования С/С++ главная функция называется main()
, и поэтому мы должны создать ей сразу после библиотек. Чтобы создать главную функцию, необходимо добавить следующие команды (4-6 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
return 0; // возвращаем 0 - успех
}
Давайте разберём синтаксис подробнее.
Перед названием главной функции указан тип возвращаемого значения, то есть тип данных, возвращаемых функцией. Тип int
соответствует целым числам.
Сразу после названия идут пустые круглые скобки. В них должны находится аргументы, которые принимает функция main()
. Мы пока оставим их пустыми, потому что только начинаем изучать язык программирования С/С++.
После круглых скобок с аргументами фигурной скобкой открывается тело функции. В теле функции содержится все команды программы. По сути вся программа — это библиотеки и главная функция. Все дополнительные функции будут запускаться непосредственно из главной функции либо из других функций, которые в свою очередь запускались из главной.
Внутри тела мы можем видеть лишь одну команду: return 0;
. Данная команда как раз возвращает число 0 в конце работы главной функции. По умолчанию считается, что 0 — код успешной работы программы, если не введён другой код.
После команды стоит точка с запятой. Это не случайно. Точку с запятой необходимо ставить в конце каждой команды. Это часть синтаксиса языка С/С++.
Также важно писать все команды внутри тела после табуляции. Это элемент хорошего тона программиста. Компилятор, конечно, на это внимание не обратит, а вот читаемость кода станет равна нулю. Поэтому важно запомнить, что все команды внутри тела должны быть на одну табуляцию правее самого тела.
IIОсновной синтаксис языка С/С++
Комментарии
Для комфортной работы с программным кодом нам просто необходимо уметь комментировать то или иное действие, причём так, чтобы компилятор не воспринимал это, как команды и не выдавал ошибки.
Вы могли заметить, что в примерах предыдущего раздела после каждой строчки есть описание того, что в ней произошло. А перед этим описанием стоят два слеша (//). Именно эта комбинация символов является для компилятора сигналом, что дальше будет идти комментарий, а не другие команды.
Программисты активно пользуются комментариями, потому что они позволяют объяснять, что было сделано в той или иной части кода. Иногда даже сам автор кода может по прошествии длительного времени забыть что-то, и его собственные комментарии в этом случае будут очень полезны.
Можно комментировать не только записи после команд, но и сами команды. Для этого точно также достаточно поставить перед ними два слэша.
Если необходимо закомментировать несколько строк сразу, нужно напечатать в начале фрагмента, который требуется закомментировать символы /* а в конце этого фрагмента — */ (5-11 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
/*
А вот эту область
компилятор не видит.
Поэтому тут можно
писать всё, что
угодно!
*/
return 0; // возвращаем 0 - успех
}
Итог
Давайте подытожим синтаксис, который был разобран:
- В шапку должны быть добавлены библиотеки при помощи функции
#include <..>
- В программе должна быть главная функция
int main(){..}
- В конце главной функции должна быть команда, возврата
return 0;
. По умолчанию считается, что нуль — код успеха. - В конце каждой команды должна стоять точка с запятой
- Все команды следующего уровня (внутри тела) рекомендуется писать через табуляцию
- Программистами приветствуется использование комментариев для объяснения команд или функций. Комментарии пишутся либо после двух слешей (//) — одна строка, либо между /* и */ — несколько строк.
IIIХранение целых чисел
Основной тип данных в языке С/С++ это числа, которые, как мы знаем из математики, бывают целыми (2, 34, 45…) и нецелыми (2.123, 43.234, 3.123454…).
Для хранения чисел в языке С/С++ используются переменные, точно такие же, как в и математике ( х — «икс» или у — «игрек»).
Целые числа хранятся в типе int
(от англ. inteher — целое число).
Чтобы создать переменную с именем «х» типа int
нужно написать следующую команду (5 строка):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x; // создаём целочисленную переменную с именем х
return 0; // возвращаем 0 - успех
}
В одной строке можно создавать сразу несколько переменных одного типа. Для этого нужно просто перечислить их через запятую (5 строка):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x, y, z; // создаём целочисленные переменные с именами х, y, z
return 0; // возвращаем 0 - успех
}
Также никто не будет против, если Вы создадите при помощи нескольких отдельных строк (5-7 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x; // создаём целочисленную переменную с именем х
int y; // создаём целочисленную переменную с именем y
int z; // создаём целочисленную переменную с именем z
return 0; // возвращаем 0 - успех
}
При создании переменной в оперативной памяти Вашего компьютера выделяется ячейка, которая будет хранить значение созданной переменной. Иногда это ячейка может содержать в себе мусор из оперативной памяти, поэтому правилом хорошего тона программистов считается очищение значения переменной непосредственно при её создании. Для этого достаточно просто положить в созданную переменную нуль.
Чтобы присвоить переменной то или иное значение можно просто написать:
x = 0; // присваиваем переменной х значение 0
Поэтому для очищения переменных непосредственно при их создании нужно (5 строка):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0, z = 0; // создаём и очищаем целочисленные переменные с именами х, y, z
return 0; // возвращаем 0 - успех
}
Значение переменной можно перезаписать в любом месте программы (6-8 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0, z = 0; // создаём и очищаем целочисленные переменные с именами х, y, z
х = 5; // присваиваем переменной х значение 5
y = 10; // присваиваем переменной y значение 10
x = 7000; // присваиваем переменной х значение 7000
return 0; // возвращаем 0 - успех
}
IVСчитывание целых чисел с клавиатуры
Программа не программа, если она не взаимодействует с пользователем. Поэтому давайте разберёмся, как устроен процесс считывания значения в переменную.
Чтобы считать значения с клавиатуры в переменную можно воспользоваться функций scanf()
(6 строка):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0; // создаём целочисленную переменную
scanf("%d", &x); // считываем с клавиатуры целое число в созданную переменную
return 0; // возвращаем 0 - успех
}
Функция scanf()
имеет два аргумента: маску и переменные, куда необходимо положить значение, принятое процессором с клавиатуры.
Маска функции scanf()
Маска функции scanf()
— это строка, которая написана в двойных кавычках. Маска содержит тип переменных, в которые будет произведена запись считанных данных. Для типа int
аргументом является %d
, в котором символ процента %
служит обозначением того, что после него будет короткое имя типа считываемых данных. Для типа int
короткое имя это английская буква d
.
Функция scanf()
может считывать данные сразу в несколько переменных типа int
. Для каждой из них в таком случае необходим свой %d
в маске.
Переменные в функции scanf()
В качестве второго аргумента для функции scanf()
выступают переменные, в которые и необходимо произвести считывание. Переменные пишутся через запятую после маски.
Перед каждой переменной пишется указатель — символ амперсант &
, который указывает компилятору, куда осуществлять считывание.
Примеры считывания целочисленных переменных с клавиатуры
Чтобы считать данные в больше, чем одну переменных, необходимо (6 строка):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0; // создаём целочисленные переменные
scanf("%d%d", &x, &y); // считываем с клавиатуры целые числа в созданные переменные
return 0; // возвращаем 0 - успех
}
VВывод целых чисел на экран
Мы научились объявлять переменные, присваивать им необходимые значения непосредственно в программном коде, а также считывать значения переменных с клавиатуры. Теперь необходимо научиться выводить значения переменных на экран.
Чтобы вывести значения переменной на экран можно воспользоваться функций printf()
(7 строка):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0; // создаём целочисленную переменную
scanf("%d", &x); // считываем с клавиатуры целое число в созданную переменную
printf("x = %d\n", x); // вывод на экран значения переменной
return 0; // возвращаем 0 - успех
}
Функция printf()
точно также, как и её аналог для чтения, имеет два аргумента: маску и переменные, значения которых необходимо отобразить на экране.
Маска функции printf()
Маска функции printf()
— это строка, которая написана в двойных кавычках. Маска данной функции представляет из себя шаблон того, что будет написано на экране, и точно также содержит типы переменных, значения которых будут выписаны на экран.
Для типа int
в маске точно также указывается уже знакомый нам %d
.
Функция printf()
также может выписывать на экран сразу несколько переменных int
. Для каждой из них также необходим свой %d
в маске.
Переменные в функции printf()
В качестве второго аргумента для функции printf()
также выступают переменные, значения которых необходимо вывести на экран. Переменные пишутся через запятую после маски.
Однако указатель — символ амперсант &
перед каждой переменной в функции printf()
не пишется.
Примеры вывода целочисленных переменных на экран
Значения переменных можно вывести различными способами (7-8 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0; // создаём целочисленные переменные
scanf("%d%d", &x, &y); // считываем с клавиатуры целые числа в созданные переменные
printf("x = %d\n", x); // выписываем значение переменной х
printf("The value of y is %d\n", y); // выписываем значение переменной y
return 0; // возвращаем 0 - успех
}
VIОсновные операции над целыми числами
Над целыми числами в языке программирования С/С++ разрешены практически любые математические операции.
Самые интересные из их них требует подключение дополнительной библиотеки math.h
:
#include <math.h> // подключаем библиотеку math.h
Линейные операции
Линейными называются операции сложения, вычитания и умножения на константы (фиксированные числа). Они не требуют подкопчены библиотеки math.h
, допустимы и очень легко осуществимы:
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
int main(){ // создаём главную функцию
int x = 0, y = 0; // создаём целочисленные переменные
int z = 2 * x + 3 * y; // линейные операции
z = z - x; // линейные операции
return 0; // возвращаем 0 - успех
}
Короткие операторы перезаписи
Для операций перезаписи существуют короткие операторы. Например, следующие операции выполняют одни и те же действия:
x = x + 5; // увеличиваем значение переменной x на 5 привычным образом
x += 5; // увеличиваем значение переменной x на 5 сокращённым образом
y = y - 3; // уменьшаем значение переменной y на 5 привычным образом
y -= 3; // уменьшаем значение переменной y сокращённым образом
z = z * 7; // увеличиваем значение переменной z в 7 раз привычным образом
z *= 7; // увеличиваем значение переменной z в 7 раз сокращённым образом
q = q / 2; // уменьшаем значение переменной z в 2 раза привычным образом
q /= 2; // уменьшаем значение переменной z в 2 раза сокращённым образом
i = i + 1; // увеличиваем значение переменной i на 1 привычным образом
i++; // увеличиваем значение переменной i на 1 сокращённым образом
k = k - 1; // уменьшаем значение переменной k на 1 привычным образом
k--; // уменьшаем значение переменной k на 1 сокращённым образом
Операции умножения и деления переменных друг на друга
Данные операции также можно использовать без подключения библиотеки math.h
:
int x = 3, y = 4, z = 4; // создаём целочисленные переменные
int k = x * y; // умножение переменных друг на друга
int w = z / k; // деление переменных друг на друга
Скобки и длинные выражения
В программировании, как и в математике, очень часто необходимо вычислять длинные сложные выражения, поэтому язык С/С++ поддерживает скобки и длинные выражения.
Например, можно вычислить значение выражения: \frac{(4x^3 + 3y^2)(12z + 7x - y^3)}{(2a+3b)(7a^2 - b)}
int x = 3, y = 4, z = 8, a = 12, b = 22, c = 90; // создаём целочисленные переменные
int answer = (4 * x * x * x + 3 * y * y) * (12 * z + 7 * x - y * y * y) / ((2 * a + 3 * b) * (7 * a * a - b)); // вычисляем длинного выражения, содержащего скобки
Взятие квадратного корня и возведение в степень
А вот эти операции уже требуют подключения библиотеки math.h
, так как они выполняются специальными функциями.
Функция sqrt()
берёт квадратный корень, а функция pow()
возводит любое число в любую степень.
Пример использования данных функций (7-8 строки):
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
#include <math.h> // подключаем библиотеку math.h
int main(){ // создаём главную функцию
int x = 16, y = 3; // создаём целочисленные переменные
x = sqrt(x); // берём квадратный корень
y = pow(y, 5); // возводим переменную y в пятую степень
return 0; // возвращаем 0 - успех
}
Практика
1Задача №1.
Считать с клавиатуры три целых числа и вывести их сумму.
Решение:
#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); // считываем три числа с клавиатуры
printf("%d + %d + %d = %d\n", x, y, z, x + y + z); // выводим на экран их сумму
return 0; // возвращаем 0 - успех
}
Пример работы программы:
Print 3 numbers:
10 20 35
10 + 20 + 35 = 65
Process returned 0 (0x0) execution time : 6.779 s
Press any key to continue.
2Задача №2.
Считать с клавиатуры два целых числа, возвести их в куб, сложить получившиеся кубы, а затем поделить получившуюся сумму на сумму исходных чисел.
Решение:
#include <stdio.h> // подключаем библиотеку stdio.h
#include <stdlib.h> // подключаем библиотеку stdlib.h
#include <math.h> // подключаем библиотеку math.h
int main(){ // создаём главную функцию
int x = 0, y = 0, z = 0; // создаём целочисленные переменные
printf("Print 2 numbers:\n"); // приглашаем пользователя на ввод
scanf("%d%d", &x, &y); // считываем три числа с клавиатуры
z = pow(x, 3) + pow(y, 3); // складываем кубы считанных чисел
z /= (x + y); // делим сумму кубов на сумму исходных чисел
printf("%d\n", z); // выводим ответ на экран
return 0; // возвращаем 0 - успех
}
Пример работы программы:
Print 2 numbers:
3 7
37
Process returned 0 (0x0) execution time : 7.058 s
Press any key to continue.
Домашнее задание:
1Задача №1.
Считать с клавиатуры два целых числа и вывести на экран их сумму и разность.
2Задача №2.
Считать с клавиатуры три цифры и вывести на экран трёхзначное число, состоящее из данных трёх цифр. Факт того, что пользователь введёт три положительные однозначные цифры, первая из которых не нуль, гарантируется.
3Задача №3.
Считать с клавиатуры три целых числа. Первое число — количество 10-ти рублёвых монет, второе число — количество 5-ти рублёвых монет, а третье — количество 2-х рублёвых монет в кошельке Васи. Больше в его кошельке ничего нет. Необходимо посчитать общую сумму денег в кошельке Васи. Факт того, что пользователь введёт три положительных числа гарантируется.
4Задача №4.
Считать с клавиатуры три целых числа. Длина, ширина и высота параллелепипеда соответственно. Необходимо вывести на экран объём и площадь поверхности данного параллелепипеда. Факт того, что пользователь введёт три положительных числа гарантируется.
5Задача №5.
Считать с клавиатуры три целых числа и вывести их среднее арифметическое на экран.
6Задача №6.
Считать с клавиатуры четыре целых числа a, b, c, x_0. Первые три интерпретировать, как коэффициенты квадратного трехчлена f(x) = ax^2 + bx + c, а четвёртое — как точка, значение f(x_0) в которой необходимо вывести на экран.
7Задача №7.
Пунктуальный мальчик Боря планирует пополнить запас молока. Он пошел в магазин и взял с собой s рублей. Один ящик молока стоит p рублей, и в нём находится 8 пакетиков молока. Боря покупает молоко по оптовой цене, поэтому может купить только целое число ящиков молока. Боря планирует выпивать строго по одному пакетику молока каждое утро. Необходимо определить, на сколько недель и дней Боре хватит купленного запаса. Боря вводит на клавиатуре два числа: s и p. Факт того, что Боря введёт два положительных числа гарантируется.
8Задача №8*.
Пунктуальный мальчик Боря планирует поехать в деревню к бабушке на велосипеде. Боря вводит на клавиатуре два числа: s — расстояние в километрах и v — скорость в метрах в секунду, с которой он всегда едет по шоссе к бабушке. Необходимо вывести на экран за сколько часов, минут и секунд Боря сможет доехать до бабушки. Факт того, что Боря введёт два положительных числа гарантируется.