Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных Лекция 2.doc
Скачиваний:
13
Добавлен:
03.11.2018
Размер:
280.58 Кб
Скачать

Ключевые слова и идентификаторы

Все слова, не считая знаков препинания, операций и чисел, в языке Си можно разделить на две группы: ключевые слова и идентификаторы. Ключевые слова – это зарезервированные компилятором слова для работы; к ним относятся названия типов, условные операторы, циклы и ряд других конструкций языка, которые подробно рассматриваются далее в этой следующих темах. Как правило, современные среды разработки подсвечивают ключевые слова специальным цветом. В языке Си существует 32 ключевых слова:

auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

Int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

Идентификаторы – это названия переменных, функций и других объектов, создаваемых программистом или уже созданных в заголовочных файлах. Следует заметить, что активно используемые функции printf(), scanf(), а также название функции main() являются идентификаторами, а не ключевыми словами.

При выборе идентификаторов необходимо придерживаться трех правил:

  • в идентификаторах можно использовать буквы нижнего или верхнего регистра, цифры и знак подчеркивания _;

  • первым символом в идентификаторе может быть буква или знак подчеркивания;

  • язык Си чувствителен к регистру букв, например, int и Int – это два разных слова.

Вот примеры корректных и некорректных идентификаторов:

Корректные

Некорректные

_123

1number

my_variable

int

BIG_LETTERS

t^

float1

*x

a1b2

_$var

Вывод на экран и функция printf()

Итак, мы уже видели, что для вывода на экран применяется функция printf(), которая объявлена в библиотеке stdio.h, поэтому перед выводом чего-либо с ее помощью нужно подключить эту библиотеку командой

#include <stdio.h>

Функция printf() является функцией форматного вывода. Слово форматный означает, что при использовании этой функции задается формат (или шаблон) вывода и список аргументов:

printf("шаблон", список аргументов);

Подобным образом мы заполняем пустые поля в анкетах и заявлениях, когда некоторые слова уже напечатаны. Другими словами, задана форма, а наша задача – внести в нее свои данные (аргументы). Рассмотрим следующий вывод:

Здесь шаблон имеет вид: «Имя: , рост: , вес: ;». В первом случае он заполнен так: «Имя: Иван, рост: 181, вес: 75.1.», а во втором – «Имя: Мария, рост: 169, вес: 60.5.». Использование функции printf() для этого примера выглядит так:

char name1[] = "Иван";

int height1 = 181;

float weight1 = 75.1;

char name2[] = "Мария";

int height2 = 169;

float weight2 = 60.5;

printf("Имя: %s, рост: %d, вес: %g.\n",

name1, height1, weight1);

printf("Имя: %s, рост: %d, вес: %g.\n",

name2, height2, weight2);

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

char frmt[] = "Имя: %s, рост: %d, вес: %g.\n";

printf(frmt, name1, height1, weight1);

printf(frmt, name2, height2, weight2);

Спецификаторы, модификаторы и спецсимволы

Разберем подробно структуру форматной строки. Эта строка включает в себя:

  • обычные символы, которые выводятся на экран в том же виде, в каком они указаны в форматной строке;

  • спецификаторы типа выводимого значения: %s, %d и %g;

  • спецсимвол перевода курсора на новую строку – \n.

Спецификаторы представляют собой «пустое место», куда должно быть вставлено значение аргумента соответствующего типа. Если спецификаторов несколько, то их порядок соответствует порядку, в котором перечисляются аргументы. Рассмотрим, какие спецификаторы вывода существуют в языке Си.

Тип данных

Спецификатор

Целое число со знаком

%d

Целое число без знака

%u

Символ

%c

Строка

%s

Вещественное число

%f

Вещественное число в экспоненциальной форме

%e или %E

Веществ. число без лишних нулей после запятой

%g или %G

Целое число в восьмеричной записи

%o

Целое число в шестнадцатеричной записи

%x или %X

Для лучшего понимания действий различных спецификаторов поэкспериментируйте с ними и со значениями разных типов.

В нашем примере также был использован спецсимвол \n. Рассмотрим на примере его работу. Предположим, что нам нужно поприветствовать двух людей, тогда разумно использовать следующий код:

printf("Hello, John!");

printf("Hello, Maria!");

Однако после запуска программы обнаружится, что оба приветствия появятся на одной строке:

Решение проблемы заключается в использовании специального символа \n, предназначенного для перевода курсора на новую строку. Добавление его в программу

printf("Hello, John!\n");

printf("Hello, Maria!");

приведет к желаемому выводу:

Специальные символы, такие как \n, не отображаемые при выводе, называются управляющими последовательностями; они управляют выводом, но сами на экран не выводятся, либо выводятся специальным образом. В следующей таблице перечислены спецсимволы языка Си.

Спецсимвол

Действие

\a

Звуковой сигнал (предупреждение)

\b

Возврат курсора на одну позицию

\n

Перевод курсора на новую строку

\r

Возврат курсора в начало строки

\t

Табуляция

\\

Вывод символа «\»

\'

Вывод символа «'»

\"

Вывод символа «"»

%%

Вывод символа «%»

Рассмотренный нами вид спецификаторов наподобие %d или %f является сокращенным. К спецификатору можно добавлять модификаторы вывода, которые изменяют способ вывода значений. Полный вид спецификатора следующий:

%[1][2].[4][5]

Здесь [1] – это модификатор, определяющий отображение выводимого значения; [2] – модификатор количества знаков, которое отводится под выводимое значение, [3] – количество знаков после запятой для вещественного числа, [4] – тип выводимого значения. Некоторые комбинации модификаторов невозможны.

Рассмотрим использование модификаторов на примерах. Начнем с модификатора количества знаков после запятой. Пока модификаторы [1] и [2] будут отсутствовать:

float x = 13.57;

printf("%.0f;\n", x);

printf("%.1f;\n", x);

printf("%.2f;\n", x);

printf("%.3f;\n", x);

printf("%.4f;\n", x);

Обратите внимание на то, что число округляется, если количество знаком после запятой у него больше, чем отводится модификатором. Добавим теперь модификатор количества знаков, которое отводится под выводимое значение:

float x = 13.57;

printf("%10.0f;\n", x);

printf("%10.1f;\n", x);

printf("%10.2f;\n", x);

printf("%10.3f;\n", x);

printf("%10.4f;\n", x);

Здесь под все число отводится 10 знаков, и выводимое значение выравнивается по правому краю этой десятиместной ячейки. Модификатор «-» выравнивает значение по левому краю:

float x = 13.57;

printf("%-10.0f;\n", x);

printf("%-10.1f;\n", x);

printf("%-10.2f;\n", x);

printf("%-10.3f;\n", x);

printf("%-10.4f;\n", x);

Модификатор «0» заполняет нулями пустые места:

float x = 13.57;

printf("%010.0f;\n", x);

printf("%010.1f;\n", x);

printf("%010.2f;\n", x);

printf("%010.3f;\n", x);

printf("%010.4f;\n", x);

При использовании модификатора «+» положительные значения выводятся с плюсом, а отрицательные – с минусом:

float x = 13.57;

float y = -13.57;

printf("%+010.0f;\n", x);

printf("%+010.1f;\n", y);

printf("%+010.2f;\n", x);

printf("%+010.3f;\n", y);

printf("%+010.4f;\n", x);

При использовании модификатора «пробел» знаки ставятся только у отрицательных чисел:

float x = 13.57;

float y = -13.57;

printf("% 010.0f;\n", x);

printf("% 010.1f;\n", y);

printf("% 010.2f;\n", x);

printf("% 010.3f;\n", y);

printf("% 010.4f;\n", x);

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

Рассмотрим пример использования спецификаторов и модификаторов в комбинации с функцией sizeof() для вывода на экран размеров в байтах типов данных:

char frmt[] = "%-15s%5d\n";

printf("%-15s%5s\n", "Тип", "Размер");

printf("---------------------\n");

printf(frmt, "char", sizeof(char));

printf(frmt, "unsigned char",

sizeof(unsigned char));

printf(frmt, "short", sizeof(short));

printf(frmt, "unsigned short",

sizeof(unsigned short));

printf(frmt, "int", sizeof(int));

printf(frmt, "unsigned int",

sizeof(unsigned int));

printf(frmt, "float", sizeof(float));

printf(frmt, "double", sizeof(double));

printf(frmt, "bool", sizeof(bool));

printf(frmt, "void", sizeof(void));

printf("---------------------\n");

Ввод с клавиатуры и функция scanf()

Пришло время добавить в наши программы интерактивности: мы будем вводить информацию и заставлять компьютер выполнять действия, зависящие от введенной информации. Сущность ввода заключается в том, что отдельные символы или группы символов трактуются программой как целые числа, вещественные числа, символы или строки и сохраняются в указанные переменные. Причем, один и тот же набор символов в разных ситуациях может иметь разный тип. Скажем, набор символов 2014 может быть целым числом, может быть частью строки Сочи-2014 или четырьмя отдельными символами 2, 0, 1 и 4. Таким образом, наша задача определить то, как трактовать вводимые символы и указать переменные соответствующих типов, куда сохранить эти символы.

Наиболее общая функция, позволяющая вводить данные – это функция scanf(), она осуществляет форматный ввод. По аналогии с printf() она принимает форматную строку (шаблон) и список аргументов:

scanf("шаблон", список аргументов);

Важное отличие scanf() от printf() заключается в том, что в качестве аргументов функция scanf() принимает не имена переменных, а их адреса. Более подробно работа с адресами изучается в теме «Указатели», однако для работы с функцией scanf() не нужно глубоких знаний, связанных с указателями, а достаточно запомнить два простых правила:

  • если с помощью scanf() вводятся значения переменных, имеющих один из базовых типов, то перед именем переменной нужно поставить знак & (амперсанд);

  • если вводится строка и сохраняется в символьный массив, то амперсанд не требуется.

Самый простой способ использования функции scanf() – это ввод значения одной переменной. Следующий фрагмент кода демонстрирует, как ввести значения целочисленной переменной, вещественной, символьной и строковой:

//Ввод целого числа

int x;

scanf("%d", &x);

//Ввод вещественного числа

float y;

scanf("%f", &y);

//Ввод символа

int symbol;

scanf("%c", &symbol);

//Ввод строки

char str[100];

scanf("%s", str);

Рассмотрим теперь функцию scanf() более детально и исследуем ее возможности. Функция scanf() – это довольно мощный инструмент, который позволяет вводить одним нажатием клавиши «Enter» несколько переменных, причем, не обязательно одного типа. Данная функция использует служебные символы (пробелы, символы перевода строки и знаки табуляции) для разделения полей ввода. Например, если указан спецификатор вещественного числа %f, то функция берет из входного потока символы один за другим, пропуская все служебные символы. Поскольку указан спецификатор вещественного числа, то функция ожидает «плюс», «минус», цифры или знак «точка». Если она встречает другой символ, то возникает ошибка. Если ошибок нет, то символы читаются до первого служебного символа. Прочитанные символы преобразуются в вещественное число и сохраняются в указанную переменную. Если используется модификатор ширины поля, то чтение продолжается заданное количество символов. Аналогично вводятся и значения других типов. При вводе числа спецификатором %x допускаются буквы, используемые в шестнадцатеричной системе исчисления.

Разделять поля ввода можно и неслужебными символами. Например, шаблон "%f,%f,%f" говорит о том, что вводить числа нужно через запятую. Служебные символы игнорируются, поэтому данный шаблон, что и "%f, %f, %f". Вот примеры:

int n1, n2, n3;

printf("Введите три числа через пробел:\n");

scanf("%d %d %d", &n1, &n2, &n3);

Можно ввести значения через запятую:

float n1, n2, n3;

printf("Введите три числа через запятую:\n");

scanf("%f,%f,%f", &n1, &n2, &n3);

Обратите внимание, что сообщения для пользователя пишутся в функции printf(), а не в scanf().