1.19. Дополнительные возможности языка: тип enum, использование командной строки, функции с переменным числом параметров, средства консольного ввода-вывода, системное время, случайные числа

Оператор enum в языке С предназначен для объявления переменных типа перечисление, а также для объявления именованных целочисленных констант (типа int). Оператор enum записывается в виде

enum [ имя перечисления ] { К-имя1 [ = значение! ] , К-имя2 [ = значение2 ] ,

... };

enum имя перечисления имя1 [ , имя2 , ... ] ;

Первый оператор определяет набор именованных констант, перечисленных в {} . Если какое-либо значение опущено, то оно больше предыдущей константы на

1, если опущено первое значение, то оно равно 0. Константы типа enum могут использоваться как обычные величины типа int. Второй оператор определяет переменные перечислимого типа, такие переменные могут принимать значения только из своего перечисления. Оба действия можно объединить в одном опера­торе. Тип enum очень похож на тип "перечисление" в языке PASCAL, но в С данные такого типа могут использоваться как обычные числа.

Функция main может иметь два параметра : количество аргументов (типа int) и массив строк-аргументов (типа char*[] ), которые позволяют ей считывать ин­формацию из командной строки. Эти параметры обеспечивают те же возможно­сти, что и функции ParamCount и ParamStr в языке PASCAL. Для того чтобы в программе получить аргументы, переданные через командную строку, достаточ­но записать список параметров функции main, например, так:

void main(int NumberOfArgs, char *Args[]) Выведем на экран аргументы, полученные программой :

for(i=0;i<n;i++) printf("\n аргумент #%d = %s",i,Args[i]);

или

for(i=1;Args[i]!=NULL;i++) printf("\n аргумент #%d = %s",i,Args[i]);

В языке С допускаются функции, число параметров которых заранее не оп­ределено. Список параметров таких функций имеет вид:

( список фиксированных параметров , ... ) При этом многоточие должно стоять только в конце списка и хотя бы один пара­метр должен быть явно указан. Многоточие означает, что далее может следовать любое количество параметров любого типа. Для работы с неименованными па­раметрами в такой функции используются макроопределения, описанные в stdarg.h :

va_start(va_list указатель,имя последнего фиксированного параметра) -инициализирует указатель на список неименованных параметров;

va_arg(va_list указатель , тип ) - возвращает очередной параметр указанного типа;

va_end(va_list указатель ); - закрывает список неименованных параметров, его использование в функции обязательно.

Функции для организации интерфейса с пользователем (аналогичные средст­вам модуля Crt в языке PASCAL) описаны в файле conio.h :

1) void window(int left, int top, int right, int bottom) - распределяет текстовое окно;

2) void textbackground(int color) - устанавливает цвет фона;

3) void textcolor(int color) - устанавливает цвет символов;

4) void textattr(int attr) - устанавливает цветовой атрибут;

5) void clrscr(void) - очищает окно;

6) void gotoxy(int x, int y) - перемещает курсор;

7) void _setcursortype(int cur_type) - устанавливает тип курсора, тип прини­мает значения: NOCURSOR, _SOLIDCURSOR и NORMALCURSOR

8) int kbhit(void) - проверяет, нажата ли какая-нибудь клавиша;

9) int putch(int ch) - выводит символ на экран;

10) int cprintf(char * формат [ , список вывода J ) - осуществляет форматный вывод на экран;

11) int cputs(char *str) - выводит строку на экран;

12) int getch(void)

int getche(void) - читают символ с клавиатуры;

13) char *cgets(char *str) - читает строку с клавиатуры, str[0] должен содер­жать максимально допустимую длину вводимой строки, через str[1] функция возвращает длину введенной строки, сама строка начинается с str[2] , функция возвращает &str[2] ;

14) int cscanf(char * формат [ , список ввода J ) - осуществляет форматный ввод с клавиатуры.

Функции, предназначенные для работы с временем, описаны в файле time.h :

1) clock_t clock(void) - возвращает процессорное время в тактах, прошедшее с начала выполнения программы; clock_t - псевдоним типа long;

2) CLK_TCK - вещественная символическая константа, равная количеству тактов процессора в секунду;

3) time_t time(time_t* timer) - возвращает время в секундах, прошедшее с 0 часов І января І970 года; time_t - псевдоним типа long;

4) struct tm* localtime(time_t* timer) - возвращает структуру, содержащую дату и время, соответствующие значению переменной timer; структурный шаб­лон tm описан в файле time.h ;

5) char* asctime(struct tm* dt) - преобразует дату и время в символьную строку и возвращает указатель на нее.

Функции для получения случайных чисел описаны в файле stdlib.h :

1) void randomize(void) - инициализирует генератор случайных чисел, ис­пользуя функцию time ;

2) void srand(unsigned seed) - инициализирует генератор случайных чисел, используя значение параметра seed ;

3) int rand(void) - возвращает случайное число в диапазоне от 0 до З27б7;

4) int random(int range) - возвращает случайное число в диапазоне от 0 до range-І.