книги / Язык Си
..pdf№
Функция
п/п
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.