Книга: Язык Си - руководство для начинающих
Резюме: Классы памяти
Резюме: Классы памяти
I. Ключевые слова: auto, extern, static, register
II. Общие замечания:
Класс памяти определяет область действия переменной и продолжительность ее существования в памяти. Класс памяти устанавливается при описании переменной с соответствующим ключевым словом. Переменные, определенные вне функции, являются внешними и имеют глобальную область действия. Переменные, определенные внутри функции, являются автоматическими и локальными, если только не используются другие ключевые слова. Внешние переменные, определенные раньше функции, доступны ей, даже если не описаны внутри ее.
III. Свойства
КЛАСС ПАМЯТИ | КЛЮЧЕВОЕ СЛОВО | ПРОДОЛЖИТЕЛЬНОСТЬ СУЩЕСТВОВАНИЯ | ОБЛАСТЬ ДЕЙСТВИЯ | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Автоматический | auto | Временно | Локальная | ||||||||||||
Регистровый | register | Временно | Локальная | ||||||||||||
Статический | static | Постоянно | Локальная | ||||||||||||
Внешний | extern | Постоянно | Глобальная (все файлы) | ||||||||||||
Внешний статический | static | Постоянно | Глобальная (один файл) |
1. Разделим случайное число на 32768. В результате получим число х в диапазоне - 1 <= х < 1. (Мы должны превратить его в тип float, чтобы иметь десятичные дроби.)
2. Добавим 1. Наше новое число удовлетворяет отношению 0 < = х < 2.
3. Разделим на 2. Теперь имеем 0 <= х < 1.
4. Умножим на 6. Имеем 0 <= х < 6. (Близко к тому, что нужно, но 0 не является возможным значением.)
5. Прибавим 1: 1 <= х < 7. (Заметим, что эти числа все еще являются десятичными дробями.)
6. Преобразуем в целые числа. Теперь мы имеем целые в диапазоне от 1 до 6.
7. Для обобщения достаточно заменить значение 6 в п. 4 на число сторон.
Вот функция, которая выполняет эти действия:
/* электронное бросание костей */
#define SCALE 32768.0
rollem(sides) float sides;
{
float roll;
roll = ((float)rand( )/SCALE + 1.0) * sides/2.0 + 1.0;
return((int)roll);
}
Мы включили в программу два явных описания типа, чтобы показать, где выполняются преобразования типов. Обратимся к программе, которая использует эти средства:
/* многократное бросание кости */
main( )
{
int dice, count, roll, seed;
float sides;
printf(" Введите, пожалуйста, значение зерна. n");
scanf(" %d, &seed);
srand(seed);
printf(" Введите число сторон кости, 0 для завершения. n");
scanf(" %d", &sides);
while(sides > 0)
{ printf(" Сколько костей?n");
scanf(" %d", &dice);
for( roll = 0, count = 1; count <= dice; count++)
roll + = rollem(sides); /* бросание всех костей набора */
printf(" У вас выпало %d, для %d %.0f-сторонних костей.n", roll, dice, sides);
printf(" Сколько сторон? Введите 0 для завершения.n");
scanf(" %f", &sides);
} printf(" Удачи вам!n");
}
Теперь давайте используем эту программу:
Введите значение зерна
1
Введите число сторон кости, 0 для завершения.
6
Сколько костей?
2
У вас выпало 4 для 2 6-сторонних костей.
Сколько сторон ? Введите 0 для завершения.
6
Сколько костей ?
2
У вас выпало 7 для 2 6-сторонних костей.
Сколько сторон? Введите 0 для завершения.
0
Удачи Вам!
Спасибо.
Вы можете использовать функцию rollem( )по-разному. Пусть число сторон (sides) равно двум, тогда бросание) монеты даст следующий результат: "орел" выпал 2 раза, a "peшка" - один (или наоборот, смотря, что вы предпочитаете). Можно легко модифицировать программу, чтобы показать как отдельные результаты, так и итог. Или вы можете построить имитатор игры "крапс". Если вам нужно большое число бросаний, вы можете легко модифицировать свою программу и получить результат, подобный следующему:
Введите значение зерна.
10
Введите количество ходов; введите 0 для завершения.
18
Сколько сторон и сколько костей? 6 3
Здесь 18 ходов для 3 6-сторонних костей.
7 5 9 7 12 10 7 12 10 14
9 8 13 9 10 7 16 10
Сколько ходов? Введите 0 для завершения. 0
Использование функции rand( )[но не rоllem( )] изменило бы вашу программу угадывания чисел: компьютер стал бы выбирать, а вы угадывать, вместо того чтобы сделать наоборот.
Разработаем еще некоторые функции. Сначала мы хотим создать функцию, которая читает целые числа.