Резюме: Классы памяти

Резюме: Классы памяти

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(" Введите, пожалуйста, значение зерна. ");

scanf(" %d, &seed);

srand(seed);

printf(" Введите число сторон кости, 0 для завершения. ");

scanf(" %d", &sides);

while(sides > 0)

{ printf(" Сколько костей? ");

scanf(" %d", &dice);

for( roll = 0, count = 1; count <= dice; count++)

roll + = rollem(sides); /* бросание всех костей набора */

printf(" У вас выпало %d, для %d  %.0f-сторонних костей. ", roll, dice, sides);

printf(" Сколько сторон? Введите 0 для завершения. ");

scanf(" %f", &sides);

} printf(" Удачи вам! ");

}

Теперь давайте используем эту программу:

Введите значение зерна

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( )] изменило бы вашу программу угадывания чисел: компьютер стал бы выбирать, а вы угадывать, вместо того чтобы сделать наоборот.

     Разработаем еще некоторые функции. Сначала мы хотим создать функцию, которая читает целые числа.