实验十二 用函数实现模块化程序设计


实验十二 用函数实现模块化程序设计

 

一、实验目的和要求:

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