Основные типы данных и ввод-вывод

Язык Си имеет сравнительно небольшое количество базовых типов данных. Для хранения символьных данных используется тип char, для целых чисел - int, для чисел с плавающей точкой - float и double.

Объявление любой переменной должно соответствовать следующему формату:

[модификаторы] тип имя_переменной;

Замечание 1. После объявления переменной происходит выделение памяти, необходимой для её хранения, однако начальное значение не определено до тех пор пока переменная не будет инициализирована! Для инициализации переменной достаточно присвоить ей некоторое значение:

имя_переменной = значение;

Операции объявления переменной и её инициализации можно совмещать:

[модификаторы] тип имя_переменной = значение;

Замечание 2. Необязательный элемент объявления [модификаторы] может применяться для уточнения типа переменной. Подробности рассмотриваются в курсе лекций. Также дополнительную информацию можно получить из книги K&R C.

Пример 1 - Основные типы и форматный вывод данных

Внимательно изучите текст предлагаемой программы и наберите её в текстовом редакторе:

$ vim types.c

types.c.png

Данная программа является фактически "шпаргалкой" по функции форматного вывода данных на экран printf(). Первым аргументом этой функции всегда должна следовать форматная строка - набор символов, заключённых в двойные кавычки "". В форматной строке могут встречаться спецификаторы вывода - сочетания символов вида %X, где X - буква, обозначающая представление, в котором в данном месте строки должен выводиться соответствующий аргумент функции printf(). Более подробно этот материал также рассмотрен в лекциях, дополнительно можно ознакомиться с соответствующими материалами по книге K&R C. Кроме того, исчерпывающую информацию можно получить в справочной системе:

$ man 3 printf

После того как текст программы написан, её следует транслировать и запустить на исполнение:

$ gcc types.c -o types
$ ./types

Пример 2 - Нуль в языке Си

В зависимости от контекста нуль в программах на Си может встречаться в различных формах. В арифметических операциях используется обычная форма: 0 (причём 0.0 - это не то же самое. Самостоятельно подумайте почему это так?). Нулевой адрес обозначается константой NULL, а каждая строка в Си неявно заканчивается нулём, обычно записываемом в виде '\0'.

Замечание. Обратите внимание на то, что символ нуля '0' и сам нуль - это не одно и то же!

Все сказанное иллюстрирует следующая программа:

$ vim null.c

null.c.png

Как и всегда до этого, после набора программы её следует транслировать, при необходимости исправить ошибки и запустить, внимательно разобравшись с результатами её работы:

$ gcc null.c -o null
$ ./null

Пример 3 - Основные системы счисления в языке Си

Наберите, скомпилируйте и запустите предлагаемую программу:

$ vim digit_systems.c
$ gcc digit_systems.c -o digit_systems
$ ./digit_systems

digit_systems.c.png

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

Пример 4 - Строки в Си

Строка в Си - это массив символов. Признаком массива являются квадратные скобки []. В языке Си предпологается, что каждая строка неявно завершается нулём - признаком окончания строки. Имя массива - это адрес её первого элемента.

$ vim strings.c
$ gcc strings.c -o strings
$ ./strings

strings.c.png

Что такое sizeof()? Объясните, почему вторая строка отобразилась именно так? Почему размеры строк именно такие? Попробуйте изменить второй вызов функции printf() на следующий:

printf("%s %d\n", string2+3, sizeof(string2));

после чего оттранслируйте программу ещё раз, запустите и объясните, что произошло.

Пример 5 - Форматный ввод данных

"Шпаргалка" по функции форматного ввода данных с клавиатуры scanf(). Как и всегда, подробная теория рассмотрена в лекциях, либо доступна в книге K&R C и в справочной документации:

$ man scanf

Набираем текст программы, компилируем её и запускаем:

$ vim scanf.c
$ gcc scanf.c -o scanf
$ ./scanf

scanf.c.png

Пример 6 - Обработка ошибок при вводе

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

$ vim scanf_error.c

scanf_error.c.png

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

Скомпилируйте программу и запустите её несколько раз вводя данные корретно и некорректно:

$ gcc scanf_error.c -o scanf_error
$ ./scanf_error
Введите через пробел 3 целых числа x, y, z: 1 2 3
Количество правильно обработанных аргументов - 3
Переменные x, y, z приняли значения: 1, 2, 3
$ ./scanf_error
Введите через пробел 3 целых числа x, y, z: 1 2 a
...
$ ./scanf_error
Введите через пробел 3 целых числа x, y, z: 1 3.4 7
...

Объясните поведение программы в приведённых примерах.