怎麼設計一個函數?

怎麼設計一個函數?

很多同學在實際的編程過程中,總是很困惑函數應該怎麼設計,形參有哪些,返回什麼值。

通常我們經常說函數設計的兩個原則是:高內聚、低耦合。高內聚是說函數的功能盡量精巧、靈活,功能單一;低耦合是說函數盡量通過形參和返回值這兩個介面實現交互,不要和函數所在的文件有太多的聯繫,也就是說盡量少使用全局變數,否則程序的可移植性太差。

今天以下面例子為例給大家簡單介紹下。

例:本題在給定的n個數中找出大於平均值的數並輸出。

輸入:輸入數據有多組,每組數據中第一行為n(0<=n<=50),第二行為n個int類型整數

輸出:每組數據首先輸出這n個數的平均數(保留兩位小數),接下來若能找到比平均數大的數則全部輸出。輸出的各個數用空格分隔,最後一個數後也有空格。如果沒有比平均數大的數則輸出「no」。樣例:

輸入:

5

1 2 3 4 5

5

5 5 5 5 5

輸出:

3.00

4 5

5.00

no

程序分析:本題目的要求是接收n個整數,然後計算n個整數的平均值,並輸出超過平均值的數。可以將這n個整數存入一個整型數組a,由於n的範圍是(0<=n<=50),因此數組定義的長度可以為50. 然後接收n個整數,並計算數組a中n個數的平均值,存入double類型變數avg中,最後遍曆數組a中各元素,如果值大於avg則列印輸出,並記錄大於avg的元素的個數num,如果個數為0,最後列印no。

#include <stdio.h>#include <stdlib.h>int main(){ int a[50],i,n,num; double avg; while(scanf("%d",&n)!=EOF) { //s1接受n個數,並計算各個元素之和 avg=0; for(i=0; i<n; i++) { scanf("%d",a+i); avg +=a[i]; } //s2求平均值avg,並列印輸出 avg=avg/n; printf("%.2lf
",avg); //s3從數組a中把大於平均值avg的數輸出,並記錄個數 num=0; for(i=0; i<n; i++) { if(a[i]>avg) { printf("%d ",a[i]); num++; } } if(num==0) printf("no
"); else printf("
"); } return 0;}

以上代碼雖然能夠完成題目要求的輸出n個數中大於平均值數據輸出的功能,但是如果能夠使用函數完成數據的輸入、平均值的計算、數組的過濾、數組元素的輸出,將使代碼能夠更加簡潔,代碼的可重用性也將更好。

(1)數據的輸入

可以設計一個函數input完成將n個整數存入一個整型數組的功能。也就是說,在調用函數時,需要提供兩個必要的參數,存入哪個數組,有幾個元素,不考慮輸入異常的情況下,函數可以沒有返回值。因此,函數的原型可以定義為:

void input(int a[],int n)

函數的定義如下:

void input(int a[],int n){ int i; for(i=0; i<n; i++) scanf("%d",a+i);}

這樣,函數的使用過程中有一個問題,如果函數輸入異常,比如n個數輸入的過程中不小心輸入了字母,其實輸入並沒有完成相應的功能。這樣可以通過函數返回一個int類型值,表示輸入是否正常完成,如果出現異常則返回-1,正常輸入則返回0。修改後的函數定義如下:

int input(int a[],int n){ int i; for(i=0; i<n; i++) { if(scanf("%d",a+i)!=1) return -1; } return 0;}

(2)數組中元素平均值的計算

這個函數需要接受兩個參數,分別表示數組和數組中元素的個數,可以有一個返回值,表示n個元素的平均值,因此平均值的類型應該為實數,可以選擇double類型作為返回值類型。

函數定義如下:

double average(int a[],int n){ double avg=0; int i; for(i=0;i<n;i++) { avg+=a[i]; } return avg/n;}

(3)數組中元素的過濾

這個函數完成的功能是將一個數組a中的n個元素中大於平均值avg的元素過濾到另外一個數組b中,並返回b中元素個數的功能。在這個函數中可以通過調用上面的函數完成平均值的計算,因此,函數只需要接收三個參數,數組a,a中元素的個數n和過濾後數據的存儲數組b,函數返回一個整數值,表示b中元素的個數。

int filter(int a[],int n,int b[]){ int i,j; double avg=average(a,n); for(i=0,j=0;i<n;i++) { if(a[i]>avg) { b[j]=a[i]; j++; } } return j;}

(4)數組元素的輸出

這個函數完成的功能是輸出數組中各元素的值,因此,只需要接收兩個參數,數組和個數,不需要有返回值。因此函數定義如下:

void output(int a[],int n){ int i; for(i=0;i<n;i++) printf("%d ",a[i]); printf("
");}

(5)main函數調用上面函數完成相應功能:

int main(){ int a[50],b[50],i,num,n; double avg; while(scanf("%d",&n)!=EOF) { //s1接受n個數 input(a,n); //s2求平均值avg //s3從數組a中把大於平均值avg的數拷貝到數組b中,並記錄b中有效元素的個數 avg=average(a,n); num=filter(a,n,b); printf("%.2lf
",avg); //s4把數組b中的數據列印輸出 if(num==0) printf("no
"); else { output(b,num); } } return 0;}

執行界面如下:


推薦閱讀:

數據結構與演算法題整理
如何用nodejs開發爬蟲程序?
Leetcodes Solution 39 Combination Sum
簡化深度學習實踐流程:新鮮出爐的TensorFlow項目模板來了
如何為列表裡的字典(元組)進行排序

TAG:編程語言 | 編程 | 設計 |