實驗十二 用函數實現模塊化程序設計


實驗十二 用函數實現模塊化程序設計

 

一、實驗目的和要求:

1. 掌握函數定義、函數聲明、函數調用的方法。

2. 領會函數調用時實參與形參的對應關系,以及主、被調函數之間的數據傳遞方式。

3. 掌握函數的嵌套調用和遞歸調用的方法。

4. 掌握使用數組作為函數參數的程序設計方法。

5. 掌握全局變量和局部變量的使用方法。

 

二、實驗內容:

  1. 寫一個判斷素數的函數,在主函數輸入一個整數,輸出該數是否素數的信息。
  2. 自定義函數實現判斷素數功能,求[100,600]之間雙胞胎數對數。
  3. 使用用戶自定義函數,求出三個數中的最大者和最小者並輸出。
  4. 遞歸法將一個整數轉換成字符串。例如,輸入483,應輸出字符串483”。N的位數不確定,可以是任意的整數。
  5. 用選擇法或冒泡法實現對數組中10個整數的由小到大排序(使用一維數組名作為函數參數)。
  6. 編寫一函數,使給定的一個二維數組(3×3)轉置,即行列互換。(使用二維數組名作為函數參數)
  7. 一維數組中存放10個數,用函數實現將10 個數中最大值與第一個數交換,最小值與最后一個數交換。
  8. 編寫一個函數。從實參傳來一個字符串,統計該字符串中字母、數字、空格和其它字符的個數,在主函數中輸入字符串並輸出結果。(考慮使用全局變量

 

三、實驗步驟與結果

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)運行結果與分析

 

 

四、實驗總結與心得

 

總結:

 

前面的構建好思路,整個程序框架能更快解題。

學習的時候一定要自己理解,巧妙記憶。

審題是關鍵,對題意理解了,借助自己所學的知識,進行合理設計,然后整理程序。

心得:

不斷利用基礎的結構設計

利用自己知道的題型逐步設計程序

自己一定要記住一些模型,才能更快的編輯程序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM