E2 Программирование на языке C

Хотя OSOC (сокращение от «One Student One Chip») ставит целью научить вас проектировать процессорный чип, вам всё равно придётся часто иметь дело с программным обеспечением, поскольку процессорные чипы отличаются от прочих типов чипов. Поэтому, чтобы понять, как сделать так, чтобы программы работали лучше, вам сначала нужно понять, как они выполняются на процессоре.

Язык C — лучший выбор, чтобы помочь вам разобраться в этом вопросе, а поскольку многие студенты, участвующие в проекте «One Student One Chip», не имеют образования в области информатики, C относительно легко изучить. Вы должны быть знакомы со следующим: рекурсия, указатели, связные списки — и уметь самостоятельно написать корректную программу, а не полагаться на примеры кода, найденные в Google.

Изучите язык C с помощью онлайн-ресурсов

Вы наверняка уже использовали онлайн-сайт Compiler Explorerоткрыть в новом окне для запуска программ на C. Теперь вы систематически изучите программирование на языке C и выполните ряд заданий по программированию с помощью этого онлайн-сайта.

Вы можете самостоятельно выбрать учебные материалы, которые хотите изучать, но обязательно убедитесь, что понимаете следующее:

  • Базовые понятия о программах
    • Программы и языки программирования
    • Естественные и формальные языки
    • Отладка программ
    • Компиляторы
  • Константы, переменные и выражения
    • Константы
    • Переменные
    • Присваивание
    • Выражения
    • Символьные типы и кодировки символов
  • Простые функции
    • Математические функции
    • Пользовательские функции
    • Формальные и фактические параметры
    • Глобальные переменные, локальные переменные и область видимости
  • Операторы ветвления
    • Оператор if
    • Оператор if/else
    • Булева алгебра
    • Оператор switch
  • Углублённое изучение функций
    • Оператор return
    • Инкрементальная разработка
    • Рекурсия
  • Операторы цикла
    • Оператор while
    • Оператор do/while
    • Оператор for
    • Операторы break и continue
    • Вложенные циклы
    • Оператор goto и метки
  • Структуры
    • Составные типы и структуры
    • Абстракция данных
    • Теги типов
    • Вложенные структуры
  • Массивы
    • Базовые понятия о массивах
    • Строки
    • Многомерные массивы
  • Стиль кодирования
    • Отступы и пробельные символы
    • Комментарии
    • Именование идентификаторов
    • Функции
    • Инструмент indent
  • Сортировка и поиск
    • Понятие алгоритма
    • Сортировка вставками
    • Анализ временной сложности алгоритмов
    • Сортировка слиянием
    • Линейный поиск
    • Двоичный поиск
  • Стеки и очереди
    • Понятие структуры данных
    • Стек
    • Поиск в глубину
    • Очереди и поиск в ширину
    • Кольцевые очереди
  • Представление чисел в компьютере
    • Почему компьютеры используют двоичную систему счисления
    • Перевод между системами счисления
    • Сложение и вычитание целых чисел
      • Прямой код
      • Обратный код
      • Дополнительный код
      • Знаковые и беззнаковые числа
    • Числа с плавающей точкой
  • Типы данных подробно
    • Целочисленные типы
    • Типы с плавающей точкой
    • Преобразования типов
      • Целочисленное повышение
      • Обычные арифметические преобразования
      • Преобразования типов при присваивании
      • Явные преобразования типов
      • Как компилятор обрабатывает преобразования типов
  • Операции подробно
    • Побитовые операции
      • Побитовые операции AND, OR, XOR и NOT
      • Операции сдвига
      • Маски
      • Некоторые свойства операции XOR
    • Прочие операции
      • Составные операции присваивания
      • Условная операция
      • Операция «запятая»
      • Операция sizeof и объявления типов typedef
    • Побочные эффекты и точки следования
  • Препроцессорная обработка
    • Этапы препроцессорной обработки
    • Определение макросов
      • Макросы, подобные функциям
      • Встраиваемые функции
      • Операции # и ## и переменное число аргументов
      • Этапы раскрытия макросов
    • Условные директивы препроцессора
    • Другие возможности препроцессора
  • Указатели
    • Базовые понятия об указателях
    • Параметры и возвращаемые значения указательного типа
    • Указатели и массивы
    • Указатели и квалификатор const
    • Указатели и структуры
    • Указатели на указатели и массивы указателей
    • Указатели на массивы и многомерные массивы
    • Типы функций и типы указателей на функции
    • Неполные типы и сложные объявления
  • Интерфейсы функций
    • Что нужно знать перед этой главой
      • strcpy и strncpy
      • malloc и free
    • Входные и выходные параметры
    • Параметры типа «указатель на указатель»
    • Случаи, когда возвращаемое значение — указатель
    • Функции обратного вызова
    • Переменное число аргументов
  • Функции работы со строками
    • Инициализация строк
    • Получение длины строки
    • Копирование строк
    • Конкатенация строк
    • Сравнение строк
    • Поиск в строках
    • Разбиение строк
  • Функции стандартной библиотеки ввода-вывода
    • Базовые понятия о файлах
    • fopen/fclose
    • stdin/stdout/stderr
    • errno и функция perror
    • Байт-ориентированные функции ввода-вывода
    • Функции управления позицией чтения/записи
    • Строково-ориентированные функции ввода-вывода
    • Функции ввода-вывода, ориентированные на записи
    • Функции форматированного ввода-вывода
    • Буферы ввода-вывода в стандартной библиотеке C
  • Связные списки
    • Односвязные списки
    • Двусвязные списки
    • Статические связные списки

Если вы не против воспользоваться инструментом перевода, вы можете изучить One-stop Learning for Linux C Programmingоткрыть в новом окне, главы 1–9, главы 11–16, главу 21, главы 23–25 и главу 26, раздел 1 (то есть «Связные списки»). Вам нужно выполнить все упражнения и проверить свои программы в Compiler Explorer, чтобы убедиться в их корректности. Это полностью покрывает все требования данной части.

Кроме того, после того как программа успешно запустится, вам нужно сохранить соответствующий код программы локально. С одной стороны, вы можете хранить эти программы как свои задания. С другой стороны, после установки Linux мы попросим вас снова запустить часть этого кода.

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

Дополнительные рекомендуемые материалы для изучения C