Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

Функция

п/п

11log

12loglO

Прототип функции, назначение и пример использования

double log(double х) - натуральный логарифм х.

а

=

l o g (2.718282);

/ / а

=

1

double loglOfdouble х) -

десятичный логарифм х.

а

=

lo g lO (100);

/ / а

=

2

Обратите внимание, что функция fmod в отличие от операции % может работать с числами типовfloat и double.

Язык Си позволяет работать с тригонометрическими функ­ циями (табл. 2.2).

Т а б л и ц а 2.2

Тригонометрические и обратные тригонометрические функции

Функция

п/п

1 sin

2cos

3tan

4asin

5acos

6atan

Прототип функции, назначение и пример использования

double sin(double х) - синус л\

а

= s in (3 0 );

/ / а

=

-0.988032

double cos(double х) - косинус х.

а

= c o s (60);

/ / а

=

-0.952413

double tan(double х) - тангенс х.

а

= t a n (45);

/ / а

=

1.619775

double asin(double х) - арксинус л: (должен быть в пределах [-1; 1]).

а = a s i n (1); / / а = 1.570796

double acos(double х) - арккосинус х (должен быть в

пределах [—1; 1]).

 

 

 

а = a c o s (1);

/ / а

=

0

double atan(double х) - арктангенс х.

а = t a n (45);

/ / а

=

1.619775

Функций котангенса и арккотангенса нет, поэтому использу­ ют 1/tan, 1/atan. Также обращаем внимание, что аргументы триго-

нометрических функций задаются в радианах. Перевод из радиан в градусы нужно делать самим.

Для обозначения числа к в файле math.h уже определена кон­ станта М PI.

Пример. Перевод «градусы -радианы», «радианы - градусы».

float а;

//а

=

0.5

а = cos(60*М_Р1/180);

а = sin(30*М_Р1/180);

//а

=

0.5

а = tan(45*М_Р1/180);

//а

=

1

а = acos(0.5)*180/М_Р1;

//а

=

60

а = asin(0.5)*180/М_Р1;

//а

=

30

а = atan(l)*180/М_Р1;

//а

=

45

Также в языке Си есть гиперболические функции (табл. 2.3).

Т а б л и ц а 2. 3

Гиперболические функции

Функция

п/п

1 sink

2 cosh

3 tank

Прототип функции, назначение и пример использования

double sinh(double х) - гиперболический синус

еX е- X

а = sinh(0); // а = 0

double cosh(double х) - гиперболический косинус

ех+ е~х ch(x) =-— .

а = cosh(0); // а = 1

double tcmh(double х) - гиперболический тангенс

о* р

 

th(x) = —----— •

 

ех +е х

// а = 0

а = tanh(0);

Закрепите пройденный материал на следующих примерах.

Чемуравны а и с после выполнения каждой строки?

float a=7,c;

 

 

a++;

//a=8

 

 

c=a++;

//c=8, a=9

 

c*=++a;

//a=10, c=80

float a=7/c;

 

 

c=a++;

//c=7,a=8

 

c*=— a;

//a=7,c=4 9

 

a++;

//a=8

 

 

int a=9,c;

 

//a=4

 

a%=5;

 

c=l

c=fmod(a,3);

//a=4,

a-=pow(++c,3);

//c=2,

a=-4

2.4. Генерация случайных чисел

Для работы с функциями генерации случайных чисел необхо­ димо подключить файл stdlib.h. Для генерации случайных чисел в языке Си есть следующие функции:

rand() - возвращает псевдослучайное целое число в интерва­ ле от 0 до 32767.

int a,b,c;

- случайное число,

например

41

а

=rand();//a

b

=rand();//b

- случайное число,

например

18467

с=rand();//c - случайное число, например 6334

При каждом запуске программы с данным кодом функция rand будет генерировать одну и ту же последовательность случай­ ных чисел, например, 41, 18467, 6334, поэтому числа называются псевдослучайными. Для обновления последовательности псевдо­ случайных чисел нужно использовать следующую функцию:

srand(unsigned int seed) - генерирует новую последователь­ ность псевдослучайных чисел в зависимости от заданного целого числа seed.

int a,b,c;

srand(89);

a = rand();//a - случайное число, например 329

b = rand();//b - случайное число, например 14055

с= rand();//c - случайное число, например 5517

Пример. Генерация псевдослучайных чисел.

#include<conio.h>

#include<stdio.h>

main()

{int a,b,c; a=rand(); b=rand(); c=rand();

printf(M%d %d %d\n",a,b, c); srand(126);

a=rand();

b=rand();

c=rand();

printf(f,%d %d %d\n",a,b, c) ; getch();

return 0;

}

Результат:

41 18467 6334

450 18530 11131

Чтобы при новых запусках программы число seed генериро­ валось автоматически и при этом не повторялось, используют сис­ темное время (поскольку время всегда идет вперед и не повторяет­ ся), которое получают функцией time (объявлена в файле time.Г).

Пример. Автоматическая генерация числа seed.

#include<conio.h>

#include<stdio.h>

#include<time.h>

main()

{int a,b,c;

srand(time(NULL));

a=rand();

b=rand() ;

c=rand();

printf("%d %d %d\n",a,b,c);

getch();

return 0;

}

Теперь при каждом запуске программы случайные числа бу­ дут новыми.

Пример. Генерация случайного числа в заданном диапазоне.

Пусть нужно сгенерировать случайное число в диапазоне от 100 до 230. Допустим, функция rand сгенерировала случайное

число

21546. Нужный нам интервал изменения чисел равен

230 -

100 = 130. В него укладывается 131 число (от 0 до 130).

Для перевода сгенерированного числа 21546 с интервала 0...32767 в интервал 0...130 нужно выполнить вычисление остатка от целочисленного деления 21546%131 = 62. Для смещения полу­ ченного числа в интервал 100...230 нужно прибавить к крайнему левому пределу полученное число, т.е. 100 + 62 = 162.

#include<conio.h>

#include<stdio.h>

#include<time.h>

main()

{int a,min=100,max=230;

srand(time(NULL));

a = min + rand ()% (max-min+1);

printf("%d",a);

getch();

return 0;

Таким же образом можно генерировать случайные числа и за пределами диапазона 0...32767. Например, от 50000 до 100000 (min = 50000, max = 100000).

Задача 1. Вычислить выражение

1

1+

2 +

1

2 + -3

5 В данной задаче нужно всего лишь правильно расставить

круглые скобки в арифметическом выражении и помнить, что при делении констант типа int друг на друга дробная часть не сохраня­ ется.

#include<stdio.h>

#include<conio.h>

main ()

{float y;

у = 1/(1 +1/(2 +1/(2+3./5)));

printf("%f",у);

//печать на экран

getch();

return 0;

}

Ответ: 0.704545.

Попробуйте вместо 3./5 написать 3/5 и посмотрите, как изме­ нится ответ.

Задача 2. Дан прямоугольник со сторонами 1000*500 мм. Сколько от него можно отрезать квадратов со стороной 26 мм?

Подсчитаем, сколько квадратов уместится на длине 1000 мм и сколько на длине 500 мм. Затем перемножим полученные числа. Помним, что при делении друг на друга переменных типа int дробная часть не сохраняется. Теперь это свойство наоборот нам будет полезным.

#include<stdio.h>

#include<conio.h>

main()

{int a=1000,b=500; int dl=26;

int na,nb,N;

na = a/dl;//целое число квадратов на стороне а nb = b/dl;//целое число квадратов на стороне b N = na*nb;

printf (,,%d,,/N) ;

getch();

 

 

 

return

0;

 

 

 

}

 

 

 

 

Задача 3. Вычислить выражение

 

- „ 5

,

Зч

у1х +1

х =2 .

y =-2 ,lx

+ ctg(x

) - .

-----— ---- при

 

 

V*

+3 -sin3(jc5- l)

 

Когда встречаются такие длинные выражения, лучше разби­ вать их на части, чтобы не ошибиться при наборе. Например:

а = -2, lx 5 +ctg(jc3); b = tjx4+3;

3 , 5

у - а

yjx + l

.

c = sm (х

-1);

----------

#include<conio.h>

#include<stdio.h>

#include<math.h>

main()

{double a/b,c/x=2,y;

a = -2.7*pow(x,5) + 1/tan(pow(x, 3) ); b = pow(pow(x,4)+3,1./5);

c = pow(sin(pow(x,5)-1),3); у = a - sqrt(x+1)/ (b*c);

//печать преобразованного числа printf("%f\n"/у);

}

Ответ: у = -71.974218.

Обращаем ваше внимание на часто встречающуюся ошиб-

т?

2 - д

ку. Если нужно вычислить выражение, например

у = ------ , то в

 

2 + х

коде пишут у = 2-д/2 + х, что является ошибкой. Такая запись со-

- а

ответствует выражению у =2 - — + *, поэтому при написании по­

добных выражений не забывайте заключать в круглые скобки чис­ литель и знаменатель: у = (2 - д)/(2 + х).

Задача 4. С начала суток прошло N секунд. Определить, сколько полных часов прошло с начала суток, сколько полных ми­ нут прошло с начала очередного часа, сколько полных секунд проьило с начала очередной минуты.

Нам вновь поможет свойство, что при делении переменных и констант типа int друг на друга дробная часть не сохраняется.

#include<conio.h>

#include<stdio.h>

#include<math.h> main ()

{int N=7310; //секунд с начала часа int chas,min,sec;

chas = N/3600; //часов с начала суток sec = N - chas*3600; //секунд с начала //очередного часа

min = sec/60; //минут с начала очередного часа sec -= min*60; //секунд с начала очередной

//минуты

p r i n t f ("chas=%d\n", c h a s ); p r i n t f (ffmin=%d\nn ,min) ; p r i n t f ("sec=%dff, sec) ;

}

Задача 5. Сгенерировать положительное четырехзначное случайное число и преобразовать его по следующему правилу: пер­ вые две цифры числа меняются местами с третьей и четвертой цифрами.

#include<conio.h>

#include<stdio.h>

#include<time.h> main()

{int min=1000,max=9999; //пределы генерации //4-значного числа

int a,pl,p2;

// Генерируем 4-значное случайное число sгand(time(NULL));

а = min + rand()%(max-min+1); printf("%d\n",a); //печать исходного числа

pi = a/100; //извлекаем первые две цифры

р2 = а%100; //извлекаем последние две цифры

а = р2*100+р1; //формируем новое число //по заданному правилу

//Печать преобразованного числа printf (,,%d,,/а) ;

getch() ; return 0;

}

1. Придумать и вычислить разные выражения с использова­ нием операций: + - / * % - + + + = * = - = / = %=.

2.Набрать все рассмотренные примеры программ. Скомпили­ ровать исполняемые файлы.

3.Проверить в программе генерации случайных чисел разные варианты. Например, сгенерировать три случайных числа в преде­ лах от -350 до 350.