
- •050201 «Системная инженерия»
- •1. Цель работы
- •2. Постановка задачи
- •3. Краткие теоретические сведения
- •3.1. Системные вызовы
- •3.1.1. 6Открытие файла: Системный вызов open
- •3.1.2. Чтение данных из файла: системный вызов read
- •3.1.3. Запись в файл: системный вызов write
- •3.1.4. Закрытие файла: системный вызов close
- •3.1.5. Создание файла: системный вызов creat
- •3.2. Ошибки при выполнении системных вызовов
- •3.3. Генерация случайных чисел
- •4. Пример программы
- •5. Контрольные вопросы
- •Приложение а (справочное) Текст программы
3.3. Генерация случайных чисел
Функция rand() генерирует псевдослучайное целое число в диапазоне от нуля до значения RAND_MAX. RAND_MAX –это константа, которая определена в <stdlib.h>.
Диапазон значений, непосредственно генерируемых rand, часто отличается от того, который необходим в конкретном приложении. Если вы хотите получить целое число из интервала [A..B], используйте соотношение
int x = A + rand() % (B+1-A);
Например, чтобы получить целое число в диапазоне от -100 до 100, нужно вычислить
x = -100+ rand() % 201;
В результате вычисления выражения rand() % 201, то есть взятия остатка от деления на 201, получим целое число в диапазоне от 0 до 200. Это называется масштабированием []. После этого мы сдвигаем диапазон генерируемых случайных чисел, отнимая 100 от предыдущего результата. Получается целое число в диапазоне от -100 до 100.
Приведем в качестве примера фрагмент программы, моделирующий 10 бросков шестигранной игральной кости:
for (i = 1; i <= 20; i++)
printf(“%4d”, 1+ rand()%6 );
При каждом вызове такой программы последовательность чисел будет повторяться. Чтобы получать разные последовательности следует задавать некий начальный параметр последовательности (это называется «рандомизация») при помощи функции
srand( число );
Для рандомизации часто используется такой прием []
srand(time(NULL));
Функция time() определяет текущее календарное время в секундах. То есть компьютер считывает показания внутренних часов, чтобы автоматически получить не определенное заранее значение.
4. Пример программы
Ниже приводится текст программы, осуществляющей формирование и запись в файл нескольких наборов неупакованных чисел, содержащих информацию о состоянии устройства для примера из лабораторной работы №2:
Устройство сообщает о своем состоянии с помощью нескольких чисел.
Например, пусть состояние устройства представляется в виде:
C – код состояния (число в диапазоне от 0 до 31);
F – признак ошибки (1/0) ;
B – признак занятости (0/1);
N – количество байт, переданных в последней операции (число в диапазоне от 0 до 255).
Эти числа объединяются в одно слово состояния устройства, формируемое таким образом:
№ разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
C |
C |
C |
C |
C |
0 |
F |
B |
N |
N |
N |
N |
N |
N |
N |
N |
Пример вызова программы:
Вызов для формирования файла с пятью наборами чисел:
$ ./lr33 -w lr33.dat 5
Вызов для чтения готового файла:
$ ./lr33 -r lr33.dat
Код состояния = 23
Признак ошибки = 0
Признак занятости = 0
Количество переданных байт = 6
…...............................
5. Контрольные вопросы
1. Что такое системный вызов?
2. Какие системные вызовы служат для открытия файла? Что такое дескриптор файла?
3. Как формируются права доступа к создаваемому файлу?
4. С помощью каких системных вызовов можно организовать запись в файл, чтение из файла? Какие возможны ошибочные ситуации при использовании этих системных вызовов?
5. Какая функция служит для обработки ошибок системных вызовов?
6. Для чего предназначены параметры функции main(int argc, char *argv[])?
7. Для чего предназначена функция atoi()?
8. Как сгенерировать случайное число в диапазоне от 0 до 255?