Unix/Linux環境C程式設計入門教程(31) 數學函式帶你戰勝企業面試
1.函式介紹:
abs()acos()asin()atan()atan2()ceil()cos()cosh()exp()frexp()ldexp()log()log10()pow()sin()sinh()sqrt()tan()tanh()
| |
相關函式 | labs, fabs |
表標頭檔案 | #include<stdlib.h> |
定義函式 | int abs (int j) |
函式說明 | abs()用來計算引數j的絕對值,然後將結果返回。 |
返回值 | 返回引數j的絕對值結果。 |
範例 | #ingclude <stdlib.h> |
執行 | |-12| = 12 |
| |
相關函式 | asin , atan , atan2 , cos , sin , tan |
表標頭檔案 | #include <math.h> |
定義函式 | double acos (double x); |
函式說明 | acos()用來計算引數x的反餘弦值,然後將結果返回。引數x範圍為-1至1之間,超過此範圍則會失敗。 |
返回值 | 返回0至PI之間的計算結果,單位為弧度,在函式庫中角度均以弧度來表示。 |
錯誤程式碼 | EDOM引數x超出範圍。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include <math.h> |
執行 | angle = 1.047198 |
| |
相關函式 | acos , atan , atan2 , cos , sin , tan |
表標頭檔案 | #include <math.h> |
定義函式 | double asin (double x) |
函式說明 | asin()用來計算引數x的反正弦值,然後將結果返回。引數x範圍為-1至1之間,超過此範圍則會失敗。 |
返回值 | 返回-PI/2之PI/2之間的計算結果。 |
錯誤程式碼 | EDOM引數x超出範圍 |
附加說明 | 使用GCC編譯時請加入-lm |
範例 | #include<math.h> |
執行 | angle = 0.523599 |
| |
相關函式 | acos,asin,atan2,cos,sin,tan |
表標頭檔案 | #include<math.h> |
定義函式 | double atan(double x); |
函式說明 | atan()用來計算引數x的反正切值,然後將結果返回。 |
返回值 | 返回-PI/2至PI/2之間的計算結果。 |
附加說明 | 使用GCC編譯時請加入-lm |
範例 | #include<math.h> |
執行 | angle = 1.570796 |
| |
相關函式 | acos,asin,atan,cos,sin,tan |
表標頭檔案 | #include<math.h> |
定義函式 | double atan2(double y,double x); |
函式說明 | atan2()用來計算引數y/x的反正切值,然後將結果返回。 |
返回值 | 返回-PI/2 至PI/2 之間的計算結果。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | angle = 0.463648 |
| |
相關函式 | fabs |
表標頭檔案 | #include <math.h> |
定義函式 | double ceil (double x); |
函式說明 | ceil()會返回不小於引數x的最小整數值,結果以double形態返回。 |
返回值 | 返回不小於引數x的最小整數值。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | 4.800000=>5.000000 |
| |
相關函式 | acos,asin,atan,atan2,sin,tan |
表標頭檔案 | #include<math.h> |
定義函式 | double cos(double x); |
函式說明 | cos()用來計算引數x 的餘玄值,然後將結果返回。 |
返回值 | 返回-1至1之間的計算結果。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | cos(0.5) = 0.877583 |
| |
相關函式 | sinh,tanh |
表標頭檔案 | #include<math.h> |
定義函式 | double cosh(double x); |
函式說明 | cosh()用來計算引數x的雙曲線餘玄值,然後將結果返回。數學定義式為:(exp(x)+exp(-x))/2。 |
返回值 | 返回引數x的雙曲線餘玄值。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | cosh(0.5) = 1.127626 |
| |
相關函式 | log,log10,pow |
表標頭檔案 | #include<math.h> |
定義函式 | double exp(double x); |
函式說明 | exp()用來計算以e為底的x次方值,即ex值,然後將結果返回。 |
返回值 | 返回e的x次方計算結果。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | e^10 = 22026.465795 |
| |
相關函式 | ldexp,modf |
表標頭檔案 | #include<math.h> |
定義函式 | double frexp( double x, int *exp); |
函式說明 | frexp()用來將引數x 的浮點型數切割成底數和指數。底數部分直接返回,指數部分則借引數exp 指標返回,將返回值乘以2 的exp次方即為x的值。 |
返回值 | 返回引數x的底數部分,指數部分則存於exp指標所指的地址。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include <math.h> |
執行 | exp = 11 |
| |
相關函式 | frexp |
表標頭檔案 | #include<math.h> |
定義函式 | double ldexp(double x,int exp); |
函式說明 | ldexp()用來將引數x乘上2的exp次方值,即x*2exp。 |
返回值 | 返回計算結果。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例: | /* 計算3*(2^2)=12 */ |
執行 | 3*2^(2) = 12.000000 |
| |
相關函式 | exp,log10,pow |
表標頭檔案 | #include <math.h> |
定義函式 | double log (double x); |
函式說明 | log()用來計算以e為底的x 對數值,然後將結果返回。 |
返回值 | 返回引數x的自然對數值。 |
錯誤程式碼 | EDOM 引數x為負數,ERANGE 引數x為零值,零的對數值無定義。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | log(100) = 4.605170 |
| |
相關函式 | exp,log,pow |
表標頭檔案 | #include<math.h> |
定義函式 | double log10(double x); |
函式說明 | log10()用來計算以10為底的x對數值,然後將結果返回。 |
返回值 | 返回引數x以10為底的對數值。 |
錯誤程式碼 | EDOM引數x為負數。RANGE引數x為零值,零的對數值無定義。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | log10(100) = 2.000000 |
| |
相關函式 | exp,log,log10 |
表標頭檔案 | #include<math.h> |
定義函式 | double pow(double x,double y); |
函式說明 | pow()用來計算以x為底的y次方值,即xy值,然後將結果返回。 |
返回值 | 返回x的y次方計算結果。 |
錯誤程式碼 | EDOM 引數x為負數且引數y不是整數。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include <math.h> |
執行 | 2^10 = 1024.000000 |
| |
相關函式 | acos,asin,atan,atan2,cos,tan |
表標頭檔案 | #include<math.h> |
定義函式 | double sin(double x); |
函式說明 | sin()用來計算引數x的正玄值,然後將結果返回。 |
返回值 | 返回-1 至1之間的計算結果。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | sin(0.5) = 0.479426 |
| |
相關函式 | cosh,tanh |
表標頭檔案 | #include<math.h> |
定義函式 | double sinh( double x); |
函式說明 | sinh()用來計算引數x的雙曲線正玄值,然後將結果返回。數學定義式為:(exp(x)-exp(-x))/2。 |
返回值 | 返回引數x的雙曲線正玄值。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | sinh(0.5) = 0.521095 |
| |
相關函式 | hypotq |
表標頭檔案 | #include<math.h> |
定義函式 | double sqrt(double x); |
函式說明 | sqrt()用來計算引數x的平方根,然後將結果返回。引數x必須為正數。 |
返回值 | 返回引數x的平方根值。 |
錯誤程式碼 | EDOM 引數x為負數。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | /* 計算200的平方根值*/ |
執行 | answer is 14.142136 |
| |
相關函式 | atan,atan2,cos,sin |
表標頭檔案 | #include <math.h> |
定義函式 | double tan(double x); |
函式說明 | tan()用來計算引數x的正切值,然後將結果返回。 |
返回值 | 返回引數x的正切值。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | tan(0.5) = 0.546302 |
| |
相關函式 | cosh,sinh |
表標頭檔案 | #include<math.h> |
定義函式 | double tanh(double x); |
函式說明 | tanh()用來計算引數x的雙曲線正切值,然後將結果返回。數學定義式為:sinh(x)/cosh(x)。 |
返回值 | 返回引數x的雙曲線正切值。 |
附加說明 | 使用GCC編譯時請加入-lm。 |
範例 | #include<math.h> |
執行 | tanh(0.5) = 0.462117 |
|
2.企業面試實戰演練
題目如下:
現有1個點和10000個位置半徑各不同的圓,為了判斷改點被包含在哪些圓內,需要一個函式判斷點(px,py)是否於圓心(x,y)半徑r的圓內,請儘快優化執行速度。
函式原型:
bool IsPointInCircle(int px,int py,int x,int y,int r);
流程設計如下:
採用模組化的設計思想,我們建立1個函式
int CreateCircle(int n);
CreateCircle函式功能就是接受引數n並建立n個圓圈,圓心座標隨機產生,半徑也隨機產生
將建立好的圓圈與點(px,py)進行遊戲中的 "碰撞檢測"
我們加上本專題的第一篇部落格測試程式執行時間。經過本人測試發現10000個圓圈根本就測試不出時間,所以我們在專案中改成了1000,000個圓圈。
另外C語言中沒有內建型別bool 所以我們需要換成int
專案實現
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
int CreateCircle(int n,int px,int py);
int IsPointInCircle(int px,int py,int x,int y,int r);
clock_t t;
printf ("Begin clock...\n");
t = clock();//第一個clock() t表示從程式啟動到現在這個時刻的時間
CreateCircle(1000000,50,25);
t = clock() - t;//第二次呼叫clock()減去第一次獲得的t的差值為兩次掐表的間隔
printf ("\nIt took %d clicks (%f seconds) to test.\n",t,((float)t)/CLOCKS_PER_SEC);
return 0;
}
int IsPointInCircle(int px,int py,int x,int y,int r)
{
double distance = sqrt(pow(py-y,2)+pow(px-x,2));
if(distance -r >0.00001) //減去double型別的誤差 再比較大小
return 0; //返回0 便是不在圓內
else
return 1; //返回1 在圓內
}
int CreateCircle(int n,int px,int py)
{
int r ; //r用來緩衝臨時產生圓圈的半徑
int x; //x用來緩衝臨時產生圓圈的圓心橫座標
int y; //y用來緩衝臨時產生圓圈的圓心縱座標
int iCount = 0; //計數產生圓圈的個數
srand(time(NULL)); //初始化隨即種子
while(iCount < n)
{
x = rand()%1000; // rand()函式就是返回一個隨機數
y = rand()%1000;
r = rand()%100;
if(IsPointInCircle(px,py,x,y,r)) //如果在圓內
printf("%din",iCount); //列印出他在圓內
++iCount;
}
}
3.在各個平臺的執行的情況
在RHEL7上
在REHL6上
在Solaris11上
在MAC上
相關文章
- Unix/Linux環境C程式設計入門教程(30) 字串操作那些事兒LinuxC程式程式設計字串
- Unix/Linux環境C程式設計入門教程(27) 記憶體那些事兒LinuxC程式程式設計記憶體
- Unix/Linux環境C程式設計入門教程(28) 日期時間那些事兒LinuxC程式程式設計
- Unix/Linux環境C程式設計入門教程(29) 記憶體操作那些事兒LinuxC程式程式設計記憶體
- Unix/Linux環境C程式設計入門教程(33) 命令和滑鼠管理使用者和組LinuxC程式程式設計
- 函數語言程式設計入門教程函數程式設計
- Linux/Unix C程式設計之的perror函式,strerror函式,errnoLinuxC程式程式設計Error函式
- linux c 環境變數相關函式Linux變數函式
- Python函數語言程式設計入門教程Python函數程式設計
- Lambda表示式入門--函數語言程式設計與函式式介面函數程式設計函式
- linux c 環境變數函式 getenv putenv 簡介Linux變數函式
- 函數語言程式設計入門函數程式設計
- unix環境高階程式設計(中)-程式篇程式設計
- 《MySQL 入門教程》第 14 篇 MySQL 常用函式之數學函式MySql函式
- Shell入門:掌握Linux,OS X,Unix的Shell環境Linux
- C++入門教程(11):呼叫函式C++函式
- Spark MLlib 入門學習筆記 - 程式設計環境配置Spark筆記程式設計
- linux環境下的c++程式設計LinuxC++程式設計
- UNIX再學習 -- 環境變數變數
- Python函數語言程式設計自帶函式Python函數程式設計函式
- [譯]函式式響應程式設計入門指南函式程式設計
- 程式設計入門18:Python生產環境程式設計Python
- C++入門教程(14):過載函式C++函式
- C++入門教程(12):定義函式C++函式
- UNIX系統程式設計的瑞士軍刀 --《UNIX環境高階程式設計》書評程式設計
- 一篇帶你入門面向介面程式設計程式設計
- 程式設計正規化 —— 函數語言程式設計入門程式設計函數
- C#程式設計基礎入門教程pdfC#程式設計
- 手摸手帶你入門ionic3(二):環境配置
- 設定linux/unix的shell環境Linux
- 清華尹成帶你實戰GO案例(31)Go 函式定義Go函式
- mybatis實戰教程(一)環境配置及簡單入門MyBatis
- unix環境高階程式設計(上)-檔案篇程式設計
- 一文帶你響應式網頁設計入門網頁
- 【面試官問】你懂函數語言程式設計嗎?面試函數程式設計
- 函數語言程式設計實戰教程(Python版)函數程式設計Python
- gitbook 入門教程之環境要求Git
- unix下環境變數 .變數