Основы языка C. Курс по программированию

Курс "Основы языка C" включает 23 урока и итоговую проверочную работу.

Предполагается, что вы знакомы с азами программирования. Как минимум у вас должно быть представление о том, что такое переменная, ветвление, цикл и функция.

В курсе среди прочего затрагиваются отличительные особенности программирования на языке C. Рассматриваются массивы, строки, указатели, структуры, в том числе динамические, работа с файлами, передача аргументов командной строки в программу, препроцессор языка, создание многофайловых программ и библиотек, работа со временем. В уроки добавлены задания в форме задач. В конце пособия приведены примеры их решения.

Первая версия учебного пособия "Особенности языка C" была опубликована на сайте https://younglinux.info в период с января по апрель 2012 года. Текущая версия (пятая) ‒ сентябрь 2025 г.

Содержание курса

  1. Введение в язык программирования C
    Обзор языка С: особенности, область применения, история, связь с Unix. Первая программа на Си, функция main(), компиляция с помощью gcc.

  2. Типы данных и их вывод
    В Си есть несколько целочисленных и вещественных типов. Символьный тип относится к целым числам. Строки представлены как массивы символов. Функция printf() выводит данные согласно спецификациям: %s, %d, %f и др.

  3. Символьный тип данных. Управляющие символы
    В Си тип char принимает значения от -128 до 127, но только положительные кодируют символы. Вместо числа можно вывести соответствующий ему символ по таблице ASCII. Как и наоборот - вывести код символа. Управляющие символы в программном коде обозначаются двумя знаками, т.к. одним их обычно обозначить невозможно.

  4. Операторы ветвления: if-else, тернарный, switch
    В Си кроме оператора ветвления if-else, есть условное выражение и переключатель switch. Логическое выражение при if записывается в скобках, тело заключается в фигурные скобки. Логические И (&&) и ИЛИ (||) имеют меньший приоритет, чем операции сравнения.

  5. Циклы: while, do-while, for. Инкремент и декремент
    В языке Си есть три цикла: while, do-while (цикл с постусловием, выполняется хотя бы один раз), for (цикл со счетчиком, заголовок состоит из трех частей), а также операторы break (прерывания цикла) и continue (прерывания итерации цикла).

  6. Битовые операции. Восьмеричное и шестнадцатеричное представление числа
    В языке программирования Си существуют следующие поразрядные, или битовые, операции: & (И), | (ИЛИ), ^ (исключающее ИЛИ), << (сдвиг влево), >> (сдвиг вправо), ~ (поразрядное дополнение до единицы). Перед восьмеричным числом пишется 0, перед шестнадцатеричным 0x. Форматы вывода %o и %x.

  7. Посимвольный ввод и вывод - функции getchar и putchar
    Посимвольный ввод и вывод выполняется функциями getchar() и putchar(). При этом putchar() выводит символы не на экран, а в буфер операционной системы, которая отображает данные на экране только после нажатия Enter.

  8. Переменные, адреса и указатели
    В языке C есть такой тип данных как указатели. Переменные этого типа хранят адреса других переменных. Получение адреса переменной - &. Получение значения по адресу (разыменовывание указателя) - *.

  9. Объявление и определение функций. Передача аргументов по значению и по ссылке
    Программы могут состоять из множества функций, однако язык Си не допускает вложенных. Обычно объявление и определение функций разносятся по разным частям исходного кода. В функцию кроме значений можно передавать указатели и адреса переменных.

  10. Форматированный ввод данных - функция scanf
    Функция scanf осуществляет форматированный ввод данных. В scanf() передается строка формата и адреса переменных. Существует ряд особенностей scanf(), которые делают ее использование не всегда удобным.

  11. Случайные числа. Функции rand и srand. Диапазоны значений
    Случайные целые числа генерируются функцией rand. С помощью srand задается "зерно". Для получения вещественных результат rand() делится на RAND_MAX. Формулы диапазонов значений.

  12. Массивы и указатели. Адресная арифметика
    Имя массива является указателем на его первый элемент, т.е. содержит его адрес. Хотя к имени массива можно применять адресную арифметику также как к указателям, значение адреса начала массива изменять нельзя.

  13. Массивы и функции. Передача указателя на массив
    В языке Си в функции передаются указатели на массивы, а не сами массивы. Таким образом, функции способны менять массивы, определенные в других функциях. Защитить массив от изменений можно, объявив аргумент-указатель как константу.

  14. Ввод и вывод строк. Строки и указатели. Передача строк в функцию
    Неформатированный ввод и вывод строк осуществляется с помощью функций fgets() и puts(). Если строка задана как литерал и присвоена указателю, то ее нельзя изменить. В функции строки передаются по указателю как массив символов.

  15. Строковые функции
    В Си функции для работы со строками объявляются в заголовочном файле string.h, который подключается к исходному коду. Существует около двадцати функций для работы со строками. Среди них поиск символа в строке, функции сравнения, копирования строк и др.

  16. Структурный тип данных. Указатели и структуры. Массив структур
    Структура - это объединение данных разных типов (в отличие от массивов) в одном объекте. В языке C сначала определяется структура как новый тип данных, потом объявляются переменные этого типа. Структуры передаются в функцию по значению, однако можно передавать указатель. Это важно при работе с массивами структур.

  17. Динамические структуры данных. Стек
    Динамические структуры данных позволяют выделять память в процессе выполнения программы. Для их создания в структурном типе данных объявляется поле указателя на эту же структуру. В уроке рассматривается организация стека на языке C.

  18. Работа с файлами. Ввод данных из файла и вывод в файл
    Особенности чтения данных из файла и записи в файл. Функции fopen, fclose, fscanf, fgets, fgetc, fprintf, fputs, fputc. Работа с двоичными файлами - fread и fwrite.

  19. Передача аргументов в программу. Параметры функции main
    Для того чтобы получить аргументы командной строки, надо в функцию main() добавить два параметра - argc и argv. Первый имеет целый тип и описывает количество аргументов командной строки. Второй - указатель на массив строк - содержимое командной строки.

  20. Препроцессор. Директивы и макросы
    В компилятор языка программирования C входит препроцессор, который осуществляет подготовку программы к компиляции. Он включает содержимое одних файлов в другие, заменяет в тексте исходного кода имена констант на их значения, удаляет символы конца строки, выполняет условную компиляцию.

  21. Многофайловые программы. Объектный код и заголовочные файлы
    При компиляции программы, состоящей из нескольких файлов исходного кода, сначала получают объектные файлы, после этого исполняемый. Объявления функций принято выносить в заголовочные файлы.

  22. Создание библиотеки. Сборка программы со статической и динамической библиотеками
    Пример создания статической и динамической библиотек на языке C, их отличия. Компиляция программы с включением в нее своей библиотеки.

  23. Время и даты. Библиотека time.h
    Функции и типы данных для работы со временем и датами объявлены в файле time.h. Функция time() возвращает системное время в секундах, localtime() и gmtime() преобразуют его в структурированное время. Есть ряд функций для получения строкового представления времени и даты.

  24. Проверочная работа к курсу "Основы языка C"
    Задачи на разные темы, цель которых проверить, актуализировать и закрепить изученные на протяжения курса знания, в том числе по массивам, строкам и указателям.