1. 程式人生 > >#Cprove7-9 函式應用

#Cprove7-9 函式應用

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 可輸入也可輸出