Дисклеймер: практически все необходимые алгоритмы уже кем-то придуманы и описаны, с помощью google и stackoverflow можно найти решение задач практически любой сложности и фактически это самый важный в разработке инструмент. Главное запомнить основный систаксис и функции языка.
int main() {
return 0;
}
Запуск программы всегда начинается с функции main()
. return
это функция возрата, в данном случае после завершения функции main()
возращается нуль, туда без проблем можно поставить любое число, но в программировании принято возвращать что-то отличное от нуля только в случае возникнования ошибок, например код ошибки.
int a = 4;
float b = 5.0;
char c = 'g';
Объявление переменный (ее создание) начинается с типа данных, вроде int (целые числа), float (числа с плавающей запятой) или char (символы по таблице ANCII), далее ее название, и при необходимости значение.
Основная задача переменных хранить значения, которые можно использовать при вычислениях, выводе на экран или в функции return
:
int main() {
int a = 10;
return a;
}
Комментарии крайне полезная вещь при разработки программ, например с их помощью можно описать как работает сложный алгоритм. Компилятор их полностью игноирует, они нужны только для тех кто пишет код:
//Строчный комментарий, игноируется все что после двойного слэша
/* Многострочный комментарий, игноируется все что между слэшем со звездой, его необходимо всегда закрывавть */
Си поддерживает множество привычных арифметических операций от обычного сложения до деления с остатком. Основные операции:
int main() {
int a = 19;
int b = 11;
int c = 7;
int result;
result = a + b; // сложение
printf("Result sum: %d\n", result); //%d это обозначение формата целых чисел, необходимую букву можно найти в таблице по ссылке типы данных. \n переход на следующую строку.
result = a - b; // вычитание
printf("Result sub: %d\n", result);
result = a * b; // умножениее
printf("Result mul: %d\n", result);
result = a / b; // деление, важно чтобы получить дродь, необходимо использовать тип данных float или double, при int всегда результат округляется в меньшуу сторону т.е. при 9.99 получим 9
printf("Result div: %d\n", result);
float result2 = (float)a / (float)b; //(float) это преобразование типа, т.е. целочисленный тип преобразуется в тип с плавающей запятой далее происходит деление
printf("Result div 2%f\n", result2); // не забываем поменять %d на %f
result = a % b; // остаток от деления
printf("Result mod: %d\n", result);
//си так же не игноирует порядок действий, т.е. сначала будут вычисляться умножение и деление, тольео потом сложение и вычитаение.
result = a + b * c;
printf("Result: %d", result);
return 0;
}
Результат кода:
Result sum: 30
Result sub: 8
Result mul: 209
Result div: 1
Result div 21.727273
Result mod: 8
Result: 96
Массивы нужны для хранения однотипных данных, пожалуй самая частоиспользуемая структура данных. Главное удобство структурирование, намного быстрее создать массив, чем последовательность переменных:
// создание массива
int m[50];
// создание переменных
int m0;
int m1;
int m2;
int m3;
int m4;
int m5;
int m6;
...
int m47;
int m48;
int m49;
Кажный элемент массива имеет свой индекс, исчисление всегда начинается с нуля.
Далее с массивом можно работать как с обычными переменными, например:
int main() {
int m[50];
m[4] = 19;
m[10] = 11;
m[40] = 7;
int result;
result = m[4] + m[10];
printf("Result sum: %d\n", result);
result = m[10] - m[40];
printf("Result sub: %d\n", result);
return 0;
}
Результат:
Result sum: 30
Result sub: 4
Так же с массивы в отличии от переменных можно использовать в перечислениях с помощью цикла (пт 7).
Условия принимают на вход выражения результат которых должен быть true (правда) или false (ложь). Например: 50 > 10? Больше (т.е. правда), следовательно условие верно:
int main() {
if(50 > 10){
printf("Правда");
}
return 0;
}
Результат:
Правда
Так же оператор if
позволяет выполнять код в случаях, когда выражение ложно, с помощью конструкции else
(иначе), заменим больше на меньше:
int main() {
if(50 < 10){
printf("Правда");
} else {
printf("Ложь");
}
return 0;
}
Результат:
Ложь
В си всего 6 операторов сравнения:
Оператор | Описание |
---|---|
< | Первый операнд меньше второго |
> | Первый операнд больше второго |
<= | Первый операнд меньше или равен второму |
>= | Первый операнд больше или равен второму |
== | Первый операнд равен второму |
!= | Первый операнд не равен второму |
Пример:
int main() {
int a = 40;
int b = 50;
printf("Условие 1 - ");
if(a > b){
printf("Правда");
} else {
printf("Ложь");
}
printf("\nУсловие 2 - ");
if(a < b){
printf("Правда");
} else {
printf("Ложь");
}
printf("\nУсловие 3 - ");
if(a >= b){
printf("Правда");
} else {
printf("Ложь");
}
printf("\nУсловие 4 - ");
if(a <= b){
printf("Правда");
} else {
printf("Ложь");
}
printf("\nУсловие 5 - ");
if(a == b){
printf("Правда");
} else {
printf("Ложь");
}
printf("\nУсловие 6 - ");
if(a != b){
printf("Правда");
} else {
printf("Ложь");
}
return 0;
}
Результат:
Условие 1 - Ложь
Условие 2 - Правда
Условие 3 - Ложь
Условие 4 - Правда
Условие 5 - Ложь
Условие 6 - Правда
Помимо оператов сравнения, if
поддерживает операторы И(&&
) и ИЛИ(||
), важно не забывать ставить скобки, так же как с арифметическими операторами тут есть ранги, компилятор сначала вычисляет И потом ИЛИ. Пример:
int main() {
int a = 40;
int b = 50;
int c = 40;
int d = 20;
// a больше b и при этом a равен c или половина c равна d
if ((a > b && a == c) || c/2 == d) {
/*
a > b - ложь
a == c - правда
между словиями стоит И, оператор И требует правды от всех условий, следовательно в первой скобке ложь
половина c == d - правда
между скобкой и c/2 == d оператор ИЛИ, он требует правды хотя бы от одного условия, следовательно общий результат правда
*/
printf("Правда\n");
} else {
printf("Ложь\n");
}
if ((a < b || a == c) && c/2 != d) {
printf("Правда\n");
} else {
/*
a < b - правда
a == c - правда, следовательно результат первой скобки правда
с/2 != d - ложь, между скобкой и вторым условием И, следовательно общий результат ложь
*/
printf("Ложь\n");
}
return 0;
}
Результат:
Правда
Ложь
Тут все просто, ввод с клавиатуры получается с помощью функции scanf
, так же как с printf
, необходимо указать тип данных (по ссылке в пт 2) и !!!адрес переменной (про адреса углубляться не буду, простыми словами у каждой переменной есть свой адрес в оперативной памяти (аналогия, наш адрес места жительства), функции scanf
указывается этот адрес после ввода чего-то в консоль, то что ввели кладется в переменную по указанному адресу) главное запомнить что для передачи адреса необходимо добавить &
перед переменной.
int main() {
int a;
scanf("%d", &a);
printf("%d", a);
return 0;
}
Результат:
4 // ввел 4, функция положила это значение в переменную a, далее print вывел это значениче
4
Дословно увеличивать, уменьшать, достаточно запомнить простой синтаксис, он будет встречаться часто:
int main() {
int a = 40;
printf("%d\n", a);
a++; // увеличить на единицу
printf("%d\n", a);
a+=5; // увеличить на 5
printf("%d\n", a);
a--; // уменьшить на единицу
printf("%d\n", a);
a-=3; // та же логика
printf("%d\n", a);
return 0;
}
Результат:
40
41
46
45
42
Основная задача циклов это повторение однотивных действий, если программа сложнее Hello world
, там 100% будут циклы.
В си есть циклы типа while
, do-while
, for
.
Это самый простой цикл, будет выполнять код пока условие верно.
int main() {
int a = 0;
while(a < 5) { // будет выполнять строки внутри себя пока a меньше 5, как только a будет равна 5 цикл завершится, если изначально присвоить a=5 цикл даже не начнется.
a++;
printf("%d\n", a);
}
return 0;
}
Результат:
1
2
3
4
5
Тоже самое, только сначала выполняется код, а потом проверка:
int main() {
int a = 0;
do {
a++;
printf("%d\n", a);
} while(a<5); // Не забываем точку зяпятой после while, в данном случае она нужна. Если сначала зададим a=5, цикл выполнит код, потом сделает проверку и завершится, результатом будет 6.
return 0;
}
Результат:
1
2
3
4
5
Самый сложный с точки зрения структуры, ее необходимо запомнить:
for('объявление переменной': 'условие выхода': 'инкрементатор')
int main() {
for(int a; a<5; a++){ //создаем переменную a, пока a<5 цикл будет выполняться, a увеличивается на 1 каждую итерацию (интерация это один проход цикла)
printf("%d", a);
}
return 0;
}
Результат:
01234
for
самый удобный цикл для итерации массивов:
int main() {
int array_lenght = 5;
int m[array_lenght];
m[0] = 5;
m[1] = 3;
m[2] = 6;
m[3] = 99;
m[4] = 12;
for(int a=0; a<array_lenght; a++){
printf("%d\n", m[a]);
}
return 0;
}
Результат:
5
3
6
99
12