Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию.doc
Скачиваний:
11
Добавлен:
13.11.2019
Размер:
1.2 Mб
Скачать

Void main()

{

int n,i=1,j=1;

scanf("%d".&n);

for(;i<=n;)j*=i++;

printf(“%d!=%d”,n,j);

}

Здесь, наоборот, невостребованными оказались Выраже­ния1, поскольку начальные присваивания сделаны при описании переменных. Отсутствуют и Выражения3, так как все необходимые действия перенесены в Выражение4.

Поскольку циклы являются важнейшими элементами программ, рассмотрим еще несколько примеров. Следу­ющая программа выводит на экран столбец случайных целых чисел:

#include<stdio.h>

#include<stdlib.h>

Void main()

{

int i;

for(i=10; i- -;) printf("%d\п",rand());

}

Здесь фигурирует новый заголовочный файл stdlib.h, имеющий отношение к функциям из так называемой стандартной библиотеки. В данном случае одной из таких функций является генератор случайных чисел rand(). Эта функция при каждом к ней обращении воз­вращает очередное целое случайное число в диапазоне от 0 до 32 766 включительно. Что это за магическое число? Это максимальное целое число типа int. С помощью генератора rand можно легко получать последователь­ности и вещественных чисел. Так, в результате опера­ции rand()/32766.0 будет сгенерировано случайное вещественное число в диапазоне от 0.0 до 1.0. Подчеркнем, что число в знаменателе должно быть записано именно с десятичной точкой, как вещественное число. В против­ном случае будет выполнено целочисленное деление, и бу­дет почти всегда генерироваться ... . Что? Только очень редко, примерно один раз из 30 000 будет попадаться ... Что?

Ну, а сам цикл for в последней программе будет вы­полнен 10 раз. На экране будет столбик из 10 случайных чисел. Обращаем внимание на то, что цикл записан весь­ма компактно и оптимален по быстродействию.

Теперь составим программу, решающую следующую задачу. Нужно найти среднее арифметическое всех слу­чайных чисел, генерируемых функцией rand. в последо­вательности до первого числа, превышающего значение 20 000.

#include<stdio. h>

#include<stdlib.h>

Void main()

{

int i=0,a.z;

long s=0;

double sred;

printf("3ATPABKA="); scanf("%d".&z);

srand(z);

while((a=rand())<=20000) {i++; s+=a;}

sred=(double)s/i;

printf("СРЕДНЕЕ %d ЧИСЕЛ = %lf",i,sred);

}

В программе вызывается еще одна функция из стандарт­ной библиотеки srand(z) от целого аргумента z. Число z вводится с консоли и является "затравкой" для последо­вательности случайных чисел, генерируемых функцией rand. Можно считать, что z является номером случай­ной последовательности. Каждому z будет соответство­вать своя последовательность. Чтобы получать каждый раз один и тот же ряд случайных чисел, нужно вводить одно и то же z, и, наоборот, вводя каждый раз новое z, вы получите новый ряд. В переменной s накапливается сумма случайных чисел для определения среднего значе­ния. Поскольку эта сумма может легко превысить максималь­но допустимую для типа int величину 32 767, мы зада­ли переменной s тип "длинного целого" long. Понятно, что начальное значение s должно быть нулевым. Целая переменная i является счетчиком числа выполнений ци­кла. Она также нужна для вычисления среднего ариф­метического. В цикле while, непосредственно при про­верке условия, переменная а получает очередное случай­ное значение. Цикл выполняется до тех пор, пока очеред­ное встретившееся случайное число не превысит 20 000. В составном выражении в цикле счетчик увеличивается каждый раз на единицу и к сумме добавляется очередное число. После выхода из цикла вещественная переменная sred получает значение среднего арифметического. Для этого надо сумму разделить на счетчик. Но и s и i име­ют целый тип, и операция s/i выполнится целочисленно, что было бы неверно, поскольку среднее арифметическое - вещественное число. В этой связи в программе при­менена новая операция, которую можно назвать приве­дением к нужному типу. Мы знаем, что для того, что­бы операция деления выполнилась в вещественной фор­ме или, как говорят, в виде операции с плавающей точ­кой, достаточно привести числитель или знаменатель к вещественному типу. В нашей программе в числителе написано (double)s. Это и означает, что значение пе­ременной s будет преобразовано в вещественное число (с двойной точностью). Теперь все стало на свои места, и нам осталось вывести на экран вычисленное среднее. За­метим, что переменная sred, вообще говоря, не нужна — можно было бы сразу в выражении печати использовать (double)s/i или s/(double)i.

Операция приведения к типу, конечно, универсальна. Так, если переменная Р была вещественного типа, то (int)P дает целое типа int, полученное из Р округле­нием, a (char)P дает символ, код которого равен округ­ленному значению Р, если, конечно, такой символ вообще существует.