实验十二 用函数实现模块化程序设计
一、实验目的和要求:
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)运行结果与分析
四、实验总结与心得
总结:
前面的构建好思路,整个程序框架能更快解题。
学习的时候一定要自己理解,巧妙记忆。
审题是关键,对题意理解了,借助自己所学的知识,进行合理设计,然后整理程序。
心得:
不断利用基础的结构设计
利用自己知道的题型逐步设计程序
自己一定要记住一些模型,才能更快的编辑程序。