#Cprove7-9 函式應用
阿新 • • 發佈:2018-12-13
NO.1歌手大獎賽計分
(1)在歌手大獎賽中,有n位評委為參賽的選手打分,分數為0~10分(執行時由人輸入)。選手最後得分為:去掉一個最高分和一個最低分後其餘分數的平均值。請編寫一個程式,完成相關的功能。 要求利用一個函式void calScore(int n),對一位選手成績的輸入成績、計算和顯示實現,其中n為評委人數。這樣,在main函式呼叫時,需要將輸入的評委人數n作為實參。 (2)進一步完善(1)的程式。輸入時,難免有錄入錯誤發生,如果輸入的成績不在0-10之間,要求使用者立即重新輸入(在函式calScore中修改);一次執行程式只計算一位選手成績太麻煩,要求輸出當前選手的最後得分後,提示“按任意鍵計算下一位選手的成績,退出請選擇N:”如果輸入的不是N或n,可以為下一位選手計算成績(在main函式中進行控制即可)。
合計程式碼
#include<stdio.h>
void calScore(int n);
int main( )
{
int n;
char ch;
printf("請輸入評委人數:");
scanf("%d",&n);
while(1)
{
calScore(n);
printf("**********success**********\n");
printf("按 N 退出,其他鍵繼續...");
fflush(stdin); //讀入字元前,清除輸入快取區
ch=getchar ();
if(ch=='n'||ch=='N')
break;
printf("\n");
}
return 0;
}
/** \計分函式
*功能:對評委輸入的評分進行去首尾求平均分計算並顯示計分
* input: 評委人數n
* output:
* return:NULL
*演算法:**
*/
void calScore(int n)
{
int i;
float j,max=0.0,min=10.0,ave,sum=0;
printf("請輸入選手成績(0~10)\n");
for(i=1;i<=n;i++)
{
printf("第%d位評委打分:",i);
scanf("%f",&j);
if(j<0||j>10)
{
--i;
continue;
}
sum+=j;
max=(j>=max)?j:max;
min=(j<=min)?j:min;
}
ave=(sum-max-min)/(n-2);
printf("\n減去一個最高分 %.2f,減去一個最低分 %.2f\n",max,min);
printf("當前選手最後得分:%.2f\n",ave);
}
執行結果
小結
注意在對輸入字元進行判斷操作前,需要先清除輸入快取區
NO.2 編制三角函式表
要求在main()函式中呼叫show_sin_table(min_angle, max_angle),顯示角度值為min_angle到max_angle之間的所有角度(間隔為1度)的正弦值。要求不能用數學庫函式,可以將專案“太樂了”中的mysin函式拷貝到這個程式中,用於計算sin值。例如show_sin_table(0, 90)可以顯示出所有0到90度的正弦值。可以考慮以速查表格的形式(例,單位轉換對照表)給出結果。
程式碼
#include <stdio.h>
//下面加入常變數和自定義函式的宣告
#define pi 3.1415926
void show_sin_table(int,int);
double mysin(double);
double myabs(double);
int main( )
{
show_sin_table(0, 90);
show_sin_table(135, 180);
return 0;
}
/** show_sin_table()函式
*功能:顯示某段角度範圍內三角函式表(間隔1°),分兩列顯示
* input:最小角度min_angle,最大角度max_angle
* output:
* return:NULL
*演算法:
*/
void show_sin_table(int min_angle,int max_angle)
{
int i;
printf("angle2sin三角函式表(分2列顯示):\n");
printf("角度angle\tsin(angle)\n");
for(i=min_angle;i<=max_angle;i++)
{
printf("%d\t\t",i);
printf("%.3f\n",mysin(pi*i/180.0));
}
return;
}
/**mysin函式
*求弧度的sin值
* input:弧度x
* output:
* return: 累加項之和sum
*演算法:sin泰勒展開式
*/
double mysin(double x)
{
double sum=x,x_pow=x,item,fact=1;
int n=1,sign=1; //定義變數時賦初值,已經將第一項考慮到累加和sum中
do
{
fact=fact*(n+1)*(n+2); //fact用於表示階乘(n+2)!(可聯想n!for迴圈寫法,每次多乘了(n+1)*(n+2)),在公式中作分母
x_pow*=x*x; //x_pow是分子中用於表示階乘(聯想x^nfor迴圈,把x換成x^2),在公式中作分母
sign=-sign; //確定即將要累加的這一項的符號
item =x_pow/fact*sign; //計算出要累加的項
sum+=item; //將該項累加上去
n+=2;
}while(myabs(item)>1e-5);
return sum;
}
//下面定義myabs函式求絕對值
double myabs(double x)
{
return ((x>=0)?x:-x);
}
執行
心得
自定義函式說明中,輸入輸出引數均源於函式定義時括號內的變數。
C語言是通過不同的傳遞引數型別決定其輸入輸出引數的:
- 如果是傳值引數,只能用於輸入引數
- 如果是引用或指標型別,則即可用於輸入也可用於輸出
如 int fun( int a, int& b, int* c ) a 作為輸入引數 b和c 可輸入也可輸出