實驗十二 用函數實現模塊化程序設計
一、實驗目的和要求:
1. 掌握函數定義、函數聲明、函數調用的方法。
2. 領會函數調用時實參與形參的對應關系,以及主、被調函數之間的數據傳遞方式。
3. 掌握函數的嵌套調用和遞歸調用的方法。
4. 掌握使用數組作為函數參數的程序設計方法。
5. 掌握全局變量和局部變量的使用方法。
二、實驗內容:
- 寫一個判斷素數的函數,在主函數輸入一個整數,輸出該數是否素數的信息。
- 自定義函數實現判斷素數功能,求[100,600]之間雙胞胎數對數。
- 使用用戶自定義函數,求出三個數中的最大者和最小者並輸出。
- 用遞歸法將一個整數轉換成字符串。例如,輸入483,應輸出字符串“483”。N的位數不確定,可以是任意的整數。
- 用選擇法或冒泡法實現對數組中10個整數的由小到大排序(使用一維數組名作為函數參數)。
- 編寫一函數,使給定的一個二維數組(3×3)轉置,即行列互換。(使用二維數組名作為函數參數)
- 一維數組中存放10個數,用函數實現將10 個數中最大值與第一個數交換,最小值與最后一個數交換。
- 編寫一個函數。從實參傳來一個字符串,統計該字符串中字母、數字、空格和其它字符的個數,在主函數中輸入字符串並輸出結果。(考慮使用全局變量)
三、實驗步驟與結果
1.寫一個判斷素數的函數,在主函數輸入一個整數,輸出該數是否素數的信息。
(1)設計思路
利用循環對輸入的整數傳到函數體判斷,判斷完成后返回函數
(2)程序源碼(加注釋)
#include<stdio.h> int main() { int prime(int n); //聲明素數判斷函數 int x; printf("輸入需要判斷的整數:"); scanf("%d", &x); //輸入一個整數 prime(x); //調用素數判斷函數 printf("\n"); return 0; } int prime(int n) //定義素數判斷函數 { int i; int a = 0; if(n<2) printf("%d不是素數\n", n); else { for (i = 2; i < n; i++) { if (n % i == 0) a++; } if (a == 0) printf("%d是素數\n", n); else printf("%d不是素數\n", n); }
return 0; } |
(3)運行結果與分析
2.自定義函數實現判斷素數功能,求[100,600]之間雙胞胎數對數。
(1)設計思路
知道雙胞胎數:兩素數差為2稱為雙胞胎數,利用循環篩選出素數,然后就是判斷是不是雙胞胎數
(2)程序源碼(加注釋)
#include<stdio.h>
void main() { int s,a,b,n=0,i=2,j=2; for(s=101;s<=598;s++) //循環被除數篩選素數 { for(i=2;i<s;i++) //篩選素數 { if(s%i==0) //非素數 break; } if(i==s) //x是素數 { a=i; b=a+2; i=2; for(j=2;j<=b;j++) //篩選素數 { if(b%j==0) //非素數 break; } if(j==b) { printf("%d\t%d\n",a,b); n++; j=2; } } } printf("\n共%d對雙胞胎數。\n",n); } |
(3)運行結果與分析
3.使用用戶自定義函數,求出三個數中的最大者和最小者並輸出。
(1)設計思路
對定義好的三個數,進行函數的賦值、調用、定義,在賦值的時候就可以進行數據的比較
(2)程序源碼(加注釋)
#include <stdio.h> int max(int a,int b,int c) //定義數據類型,進行最大值的判斷 { int m=a; if(b>m)m=b; if(c>m)m=c; return m; } int min(int a,int b,int c) //定義數據類型,進行最小值的判斷 { int n=a; if(b>n&&n>c)n=c; if(c>n); return n; } int main() //直接在main函數里面調用 { printf("max=%d\n",max(1,2,3)); printf("min=%d\n",min(1,2,3)); return 0; } |
(3)運行結果與分析
4.用遞歸法將一個整數轉換成字符串。例如,輸入483,應輸出字符串“483”。N的位數不確定,可以是任意的整數。
(1)設計思路
對輸入的數字進行不斷的每一位的都進行判斷,然后進行轉換
(2)程序源碼(加注釋)
#include<stdio.h> int main() { void int_to_str(int n); //聲明函數 int n; printf("請輸入一個整數n:"); scanf("%d", &n); if (n < 0) { // 如果n小於0,則在前面添加上- printf("-"); n = -n; } int_to_str(n); printf("\n"); return 0; }
void int_to_str(int n) //定義函數,並進行函數值的判斷,轉換為字符類型 { if (n/10 != 0){ // 遞歸的思想 int_to_str(n/10); } printf("%c", n%10+'0'); } |
(3)運行結果與分析
5.用選擇法或冒泡法實現對數組中10個整數的由小到大排序(使用一維數組名作為函數參數)。
(1)設計思路
用“冒泡排序法”對10個整數按由小到大排序
(2)程序源碼(加注釋)
#include <stdio.h> int main( ) { void sort(int a[],int n); //聲明數組函數 int i,arr[]={12,66,22,45,13,35,18,28,77,88}; //數組存入元素 sort(arr,10); //函數調用 for(i=0;i<10;i++) printf("%4d",arr[i]); //輸出排好序的數字 printf("\n"); return 0; } void sort(int a[],int n ) //函數定義 { int i,j,temp; for(i=0;i<n-1;i++) //用循環對函數里已經存入的數進行排序 { for(j=0;j<n-i-1;j++ ) if(a[j]>a[j+1]) temp=a[j],a[j]=a[j+1],a[j+1]=temp; } } |
(3)運行結果與分析
6.編寫一函數,使給定的一個二維數組(3×3)轉置,即行列互換。(使用二維數組名作為函數參數)
(1)設計思路
利用數組的寄存方式對數組的行和列進行交換,並用函數模塊化轉換
(2)程序源碼(加注釋)
#include<stdio.h> int main() { int huan(int a[3][3]); //聲明函數 int num[3][3],i,j; //定義數組 printf("請輸入一個3*3的數組:\n"); for(i=0;i<3;i++) //循環輸出已經轉換了的數組 { for(j=0;j<3;j++) scanf("%d",&num[i][j]); } huan(num); return 0; } int huan(int a[3][3]) //定義huan函數,含有一個數組 { printf("行列互換后:\n"); int i,j,b[3][3]; for(i=0;i<3;i++) { for(j=0;j<3;j++) { b[j][i]=a[i][j]; } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { printf("%d ",b[i][j]); } printf("\n"); } return 0; } |
(3)運行結果與分析
7.一維數組中存放10個數,用函數實現將10 個數中最大值與第一個數交換,最小值與最后一個數交換。
(1)設計思路
利用數組的寄存方式進行數的交換,並用函數來傳值
(2)程序源碼(加注釋)
#include<stdio.h> #include<string.h> #define M 10
int sort(int *,int *,size_t); //實現排序功能並且暫存到另一數組用來尋找最大最小值 int swap_min(int *,int *); //實現最小值放末尾 int swap_max(int *,int *); //實現最大值放開頭
int main() { int a[M],c[M]; //c用於存放排序后的數組 c首位為最小值 末位為最大值 int *p=a; int i,j; printf("請輸入十個數:\n"); for(i=0;i<M;i++) scanf("%d",p+i); sort(a,c,M); swap_min(a,c); swap_max(a,c); printf("經過交換后十個數的順序為:\n"); for(i=0;i<M;i++) printf("%-8d",a[i]); puts("");
}
int sort(int *a,int *c,size_t b) { int i,j,max; for(i=0;i<M;i++) { *(c+i)=*a++; } for(i=0;i<b-1;i++) { for(j=0;j<b-i-1;j++) { if(*(c+j)>*(c+j+1)) { max=*(c+j); *(c+j)=*(c+j+1); *(c+j+1)=max; } } } }
int swap_min(int *a,int *b) { int tmp; int i; for(i=0;i<M;i++) { if(*(a+i)==*b) { tmp=*(a+M-1); *(a+M-1)=*(a+i); *(a+i)=tmp; } } }
int swap_max(int *a,int *b) { int tmp; int i; for(i=0;i<M;i++) { if(*(a+i)==*(b+M-1)) { tmp=*a; *a=*(a+i); *(a+i)=tmp; } } } |
(3)運行結果與分析
8.編寫一個函數。從實參傳來一個字符串,統計該字符串中字母、數字、空格和其它字符的個數,在主函數中輸入字符串並輸出結果。(考慮使用全局變量)
(1)設計思路
利用函數里面的
(2)程序源碼(加注釋)
#include <stdio.h> #include <string.h> int lett=0,dig=0,spac=0,oth=0; void main() { void count(char a[]); //定義函數 char a[100]; puts("請輸入字符串:"); gets(a); count(a); printf("字母個數 = %d\n",lett); //輸出判斷后的 printf("數字個數 = %d\n",dig); printf("空格個數 = %d\n",spac); printf("其他字符個數 = %d\n",oth); } void count(char a[]) //定義函數 { int j,i; for( i=0;a[i] !='\0';i++) { if((a[i]>='a'&&a[i]<='z')||(a[j]>='A'&&a[j]<='Z')) { lett++; } else if(a[i]<='9'&&a[i]>='0') { dig++; } else if(a[i] == ' ') { spac++; } else oth++; ; }
} |
(3)運行結果與分析
四、實驗總結與心得
總結:
前面的構建好思路,整個程序框架能更快解題。
學習的時候一定要自己理解,巧妙記憶。
審題是關鍵,對題意理解了,借助自己所學的知識,進行合理設計,然后整理程序。
心得:
不斷利用基礎的結構設計
利用自己知道的題型逐步設計程序
自己一定要記住一些模型,才能更快的編輯程序。