Си: main() и арифметика; цикл «редактирование-компиляция-запуск»
Как получить компилятор Си:
Скачать образ загрузочного диска с актуальным практикумом
Установить VirtualBox и загрузиться с этого диска (подключить его как CD-ROM)
Установить VirtualBox и установить систему с этого диска (можно настроить под себя)
Записать этот образ на флешку и загрузиться с этой флешки (установленная ОС не модифицируется)
Записать этот образ на флешку и установиться с этой флешки (возможно установить параллельно с другой ОС, но требуется
Скачать любой десктопный дистрибутив Альт и проделать с ним что-нибудь из вышеописанного
Дополнительно потребуется поставить компилятор Си (пакет gcc) и, возможно, что-то ещё
Воспользоваться любым доступным вам дистрибутивом Linux (включая те, что предоставляет WSL2 — версия Linux, запускаемая в виртуальной машине под Windows)
- Дополнительно потребуется поставить компилятор Си (обязательно именно GCC) и, возможно, что-то ещё
- (только на самый крайний случай!) Найти какой-нибудь онлайн-компилятор (погуглить GCC online)
Командная строка
Основной принцип: текстовый диалог
- Человек вводит текстовую команду
Компьютер её интерпретирует, выводит текстовую диагностику и/или результат
- Человек интерпретирует результат, вводит следующую команду…
Эмулятор терминала и шелл
Эмулятор терминала (для краткости — терминал) — приложение, которое организует ввод и вывод текста. Кстати! В логотипе нашей группы Кен и Деннис сидят за аппаратным терминалом!
Шелл (командная оболочка) — программа, реализующая интерфейс командной строки для управления системой.
- Командная строкаD ::= команда { параметр }
- Командная строка ::= команда { параметр }
- параметр ::= строка | ключ
- ключ ::= -буква | --слово
- Клавиша Enter (aka «Ввод», ака «конец строки»)
Команды 1 echo qqЕсли кому интересно, отчего буквы цватные. При копировании текста цвет не сохраняется.
Скопипастить (вместе со строкой подсказкой) ввод и вывод команд date date -R date -d @0 date -d @987987987
что это за 987987987?
запуск произвольной программы (например, geany), создание файла и ls - История в шелле
- Клавиши «↑» и «↓»
- Клавиши «←» и «→» (нет необходимости подгонять к концу строки для ввода)
- Для продвинутых — Ctrl+R
TODO Нужно ли? (1) перенаправление вывода (2) перенаправление ввода (3) pwd / mkdir / cd / rm / rmdir ?
Редактирование-компиляция-запуск
- Программа (исходный текст) — это просто текстовый файл
- Программа (запускаемая) — это либо исполняемый файл (ака «бинарник», «экзешник» вот это всё), либо текстовый сценарий для какого-то другого исполняемого файла
исполнитель сценариев называется интерпретатором — например, Python, но и шелл тоже так может
Си — компилируемый язык, так что запускаемая программа на Си — «бинарник»
⇒ Требуется копмилятор
- Компиляция ::= Трансляция Компоновка
- Трансляция ::= перевод текста программы в машинные коды
- Компоновка ::= дополнение машинных кодов программы другими машинными кодами (исполняющей системой, компонентами библиотек и т. п.)
Цикл:
- Редактируем исходный текст; обновляем файл
- Компилируем, если были ошибки компиляции — п. 1
- Запускаем, если были ошибки выполнения или алгоритма — п. 1
Упражнение:
Редактирование, компиляция и запуск программы: geany prog.c
gcc prog.c
./a.out
Полезные ключи gcc
-o программа (чтобы программа называлась программа, а не a.out
-Wall — для вывода предупреждений
-Wextra — больше предупреждений богу предупреждений!
-ansi — для соответствия стандарту C90 (как в лекциях)
TODO Надо ли? (1) Настройка кнопки «собрать» в Geany
Программа «среднее арифметическое трёх чисел»
Библиотеки
Функций очень много, все одновременно не нужны. Лежат в отдельных файлах:
Описания этих функций (т. н. заголовочные фафлы aka .-h-файлы aka «хедеры»)
Машинный код этих функций ((т. н. библиотеки)
⇒
Директива #include вставляет в текст программы содержимое файла (обычно это хедер, но можно и не).
Ключ компилятора (actually, компоновщика) -lИМЯ_БИБЛИОТЕКИ подключает к программе машинный код из библиотеки и с именем libИМЯ_БИБЛИОТЕКИ
Например:
gcc prog.c -lm -o prog2
Площадь треугольника по формуле Герона
Логические операции
TODO (можем не успеть, но это не логические операторы, это просто && || !)
Д/З
Написать и отладить программу prog.c, которая TODO чён-ть такое математическое вычисляет Положить в форму текстовую копипасту следующих команд в командной строке Linux:
cat prog.c cc prog.c -o prog -lm ./prog …ввод gcc -v

Понадобятся (или не понадобятся) позже:
-Wshadow — если локальная переменная перекрывает глобальную
-fsanitize=address / -fsanitize=undefined (+ -fno-omit-frame-pointer для красоты)
-fanalyzer / -fhardened
-fcf-protection=full / -mzero-caller-saved-regs=used