Array M. УЭИТ - Язык Си - руководство для начинающих
- Название:Язык Си - руководство для начинающих
- Автор:
- Жанр:
- Издательство:Мир
- Год:1988
- Город:Москва
- ISBN:5-03-001309-1 /русск./
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Array M. УЭИТ - Язык Си - руководство для начинающих краткое содержание
Язык Си — руководство для начинающих
Язык Си - руководство для начинающих - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
static randx = 1;
rand( )
{
Немного позже мы приведем пример, в котором будет необходим этот тип переменной.
РИС. 10.1. Внешние и внешние статические переменные.
Регистровые переменные
Обычно переменные хранятся в памяти машины. К счастью, регистровые переменные запоминаются в регистрах центрального процессора, где доступ к ним и работа с ними выполняются гораздо быстрее, чем в памяти. В остальном регистровые переменные аналогичны автоматическим переменным. Они создаются следующим образом:
main( )
{
register int quick;
Мы сказали "к счастью", потому что описание переменной как регистровой, является скорее просьбой, чем обычным делом. Компилятор должен сравнить ваши требования с количеством доступных регистров, поэтому вы можете и не получить то, что хотите. В этом случае переменная становится простой автоматической переменной.
Какой класс памяти применять?
Ответ на вопрос почти всегда один - "автоматический". В конце концов почему этот класс памяти выбран по умолчанию? Мы знаем, что на первый взгляд использование внешних переменных очень соблазнительно. Опишите все ваши переменные как внешние, и у вас никогда не будет забот при использовании аргументов и указателей для связи между функциями в прямом и обратном направлениях. К сожалению, у вас возникнет проблема с функцией С, коварно изменяющей переменные в функции А, а это совсем не входит в паши интересы. Неоспоримый совокупный опыт использования машин, накопленный в течение многих лет, свидетельствует о том, что такая проблема значительно перевешивает кажущуюся привлекательность широкого использования внешних переменных.
Одно из золотых правил защитного программирования заключается в соблюдении принципа "необходимо знать только то, что нужно". Организуйте работу каждой функции автономно, насколько это возможно, и используйте глобальные переменные только тогда, когда это действительно необходимо.
Иногда полезны и другие классы памяти. Но прежде чем их использовать, спросите себя, необходимо ли это.
Резюме: Классы памяти
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( )] изменило бы вашу программу угадывания чисел: компьютер стал бы выбирать, а вы угадывать, вместо того чтобы сделать наоборот.
Разработаем еще некоторые функции. Сначала мы хотим создать функцию, которая читает целые числа.
ФУНКЦИЯ ПОЛУЧЕНИЯ ЦЕЛЫХ ЧИСЕЛ: getint( )
План
К счастью, мы уже выработали стратегию. Во-первых, заметим, что любую вводимую информацию можно читать как строку символов. Целое число 324, например, можно прочитать как строку из трех символов: символ '3', символ '2'и символ '4'. Это подсказывает нам следующий план:
Читать дальшеИнтервал:
Закладка: