Неделя 3 · Foundation

Основы языка C

Идеи, которые мы изучили в Scratch с помощью блоков, теперь переносим в настоящий текстовый код. C — быстрый и точный язык, лежащий в основе почти всех современных языков. На этом уроке мы шаг за шагом пройдём путь от первой программы до переменных, условий, циклов и функций, рассматривая каждое в живом отладчике кода в стиле IDE.

Что вы узнаете на этом уроке

Напишете свою первую программу на C и поймёте каждую её часть
Увидите, как код превращается в программу через компиляцию
Узнаете типы int, char, float, double и их размер в памяти
Выведете форматированный результат с помощью printf
Построите логику с помощью if/else и циклов
Напишете функцию и повторно используете код

3.1 Что такое язык C?

C — язык программирования, созданный в 1972 году, и до сих пор один из самых используемых и влиятельных языков. Операционные системы (Windows, ядро Linux), браузеры и даже другие языки программирования часто построены на основе C.

В Scratch мы соединяли блоки. А в языке C мы пишем код, то есть текст, написанный по особым правилам. Поначалу это кажется сложнее, но взамен язык работает очень быстро и очень близко к компьютеру.

Почему мы начинаем именно с C?

  • Он простой и точный: вы сами пишете только то, что нужно, ничего не скрыто
  • Он учит глубоко понимать, как работают память и компьютер
  • Его идеи (типы, циклы, функции) есть и в Python, JavaScript, Java и других

Самое главное: если вы поймёте C, другие языки станут для вас намного легче. Поэтому он настоящий фундамент.

В Scratch ошибиться было трудно, потому что блоки соединялись только подходящие. А в C даже если вы забудете маленькую точку с запятой, появится ошибка. Это не плохо, а приучает к порядку и дисциплине, и именно этот навык делает вас сильным программистом.

3.2 Первая программа

Первая программа каждого программиста обычно выводит на экран «Привет». Вот полная программа на языке C, всего шесть строк:

Анатомия программы нажмите на часть
salom.c
Нажмите на одну из кнопок выше, и вы увидите, что делает каждая часть.

Итак, любая программа на C начинается с функции main: когда компьютер запускает программу, он начинает читать именно отсюда. А printf выводит текст на экран.

В конце каждой команды обязательно ставится точка с запятой (;). Это сообщает C «эта команда завершена», подобно точке в конце предложения.

3.3 Компиляция

Компьютер не понимает написанный нами код на C напрямую. Он знает только машинный код, состоящий из 0 и 1. Поэтому наш код мы переводим в машинный код с помощью компилятора (для C обычно gcc). Запустите этот процесс пошагово ниже:

Конвейер компиляции запустите
terminal
$
Нажмите кнопку «Запустить»: вы увидите, как код превращается в программу.

Итак, путь всегда один и тот же: напиши кодскомпилируй (gcc) → запусти программу. Если в коде есть ошибка, компилятор не создаст программу, а скажет, в какой строке ошибка.

3.4 Переменные и типы

Программа должна где-то хранить данные. Для этого мы используем переменную (variable), то есть именованную ячейку в памяти. Это точно то же самое, что «переменная» в Scratch, только здесь у каждой переменной есть ещё и тип (type).

Под типом понимается, какие данные хранит переменная: целое число, дробное число или один символ. Мы заранее сообщаем C тип, и тогда он знает, сколько памяти выделить.

turlar.c
1int yosh = 19; // целое число
2float bo'y = 1.78; // дробное число
3char daraja = 'A'; // один символ
4double pi = 3.14159; // точное дробное число

Каждый тип занимает в памяти разное место. Нажмите на карточку, чтобы рассмотреть подробнее:

Типы данных нажмите на карточку
Нажмите на один из четырёх типов выше.

3.5 printf и ввод

printf выводит текст на экран. Но не только обычный текст, он может выводить и значения переменных. Для этого используются специальные символы, спецификаторы формата:

  • %d для целого числа (int)
  • %f для дробного числа (float, double)
  • %c для одного символа (char)
  • \n для перехода на новую строку

Ниже выберите тип и введите значение, посмотрите, как выводит printf:

Поле printf измените значение
main.c
1printf("Результат: %d\n", 42);
terminal
Для получения данных от пользователя используется scanf, например scanf("%d", &yosh);. Он записывает введённое с клавиатуры число в переменную yosh.

3.6 Операторы

Под оператором понимается знак, выполняющий действие над значениями. В C есть три основные группы:

  • Арифметические: + сложение, - вычитание, * умножение, / деление, % остаток
  • Сравнения: == равно, != не равно, > больше, < меньше
  • Логические: && и, || или, ! не

Важный тонкий момент: в C при делении целых чисел результат тоже целый. Например, 7 / 2 даёт 3 (дробная часть отбрасывается), а 7 % 2 даёт 1 (остаток). Попробуйте ниже:

Калькулятор операторов измените числа
terminal

3.7 Условия: if / else

Блок «если ...» из Scratch в C записывается как if. Программа проверяет условие: если условие верно (истинно), идёт одним путём, иначе через else идёт другим путём.

Отладчик if / else измените возраст
возраст =
tekshir.c
terminal
Если вариантов много, используется цепочка if ... else if ... else или switch. Внимание: при проверке равенства ставится не один, а два знака равно (==). Один = — это присваивание, два == — это сравнение.

3.8 Циклы: for / while

Чтобы повторить одно действие много раз, мы используем цикл, как блок «повторить» в Scratch. В C чаще всего используется цикл for. Он состоит из трёх частей: начальное значение, условие продолжения и изменение на каждом шаге.

Программа ниже складывает числа от 1 до 5. Пройдите её по шагам и понаблюдайте, как меняются переменные и результат, словно в отладчике:

Отладчик кода (debugger) пройдите по шагам
yigindi.c
terminal

Результат: 1, 3, 6, 10, 15. Цикл while работает точно так же, но условие задаётся заранее, и тело повторяется, пока условие истинно.

Сделайте прогноз

Что этот цикл выведет в терминал?

main.c
1for (int i = 0; i < 3; i++)
2 printf("*");
* * * (с пробелами)
***
0 1 2

3.9 Функции

В Scratch мы создавали «свой блок». В C это называется функцией: мы даём имя куску кода и вызываем его в любом месте. Функция может принимать данные (параметр) и возвращать результат (return).

kvadrat.c
1int kvadrat(int n) { // n параметр
2 return n * n; // возвращает результат
3}

Теперь, если вызвать kvadrat(4), он вернёт 16. Ниже выберите число и понаблюдайте за вызовом функции:

Вызов функции выберите число
kvadrat( )
Нажмите кнопку «Вызвать».

3.10 Глубже advanced

Вы освоили основы. Теперь кратко познакомимся ещё с тремя важными понятиями C. Их мы изучим глубоко в следующих неделях, а сейчас получим общее представление.

Массивы

Под массивом понимается хранение нескольких значений одного типа под одним именем. Каждый элемент берётся по своему номеру (индексу), и индекс начинается с 0.

massiv.c
1int ballar[3] = {90, 85, 70};
2printf("%d\n", ballar[0]); // 90

Строки (string)

Под строкой понимается последовательность символов. В C строка на самом деле массив из char. Слово, имя или предложение хранятся именно так.

satr.c
1char ism[] = "Ali";
2printf("Salom, %s!\n", ism); // Salom, Ali!

Указатели (pointer)

Под указателем понимается переменная, хранящая адрес другой переменной в памяти. То есть он хранит не само значение, а информацию «где оно находится». Это самое мощное и одновременно самое тонкое понятие C, и мы изучим его полностью на 6-й неделе.

Массив, строка и указатель — всё это о работе с памятью. Именно поэтому C называют «языком, наиболее близким к компьютеру»: он даёт вам возможность управлять памятью напрямую.

Словарь терминов

intтип, хранящий целое число (например 5, -20, 100).
printfфункция, выводящая текст и значение на экран.
mainфункция, выполняемая первой при запуске программы.
gccкомпилятор, переводящий код C в машинный код.
forцикл, повторяющий определённое число раз.
returnвозвращает результат из функции.

3.11 Тест знаний

16 вопросов. Чтобы завершить неделю, ответьте правильно как минимум на 11 из них.

Поздравляем! Неделя 3 завершена

Теперь вы умеете писать настоящий код на C: вы познакомились с переменными, типами, printf, операторами, условиями, циклами и функциями. Это основные кирпичики любой большой программы.

Следующая неделя: Массивы и строки (хранение множества значений, индекс, строки и нулевой терминатор).

Перейти к следующему модулю