实验内容: 1.运行程序 #include <stdio.h> void ex(int x,int y); void main( ) { int a=1,b=2; ex(a,b); printf("a=%d,b=%d\n",a,b); } void ex(int x,int y) { x++; ++y; printf("\nx=%d,y=%d\n",x,y); } 要求: (1)输入源程序并进行编译、连接。 | ||||||||||||||||||||||||
(2)将初始化(a=1,b=2)改为键盘输入(调用系统函数scanf())。 (3)将程序运行结果填入表5-1,分析参数传递与结果的关系。 表5-1 程序测试及结果分析
2.运行程序 #include <stdio.h> int b=0; int f(int a); void main( ) { int a=2,i; for(i=0;i<3;i++) printf("%d\n",f(a)); printf("\n"); } int f(int a) { int c=3; a=a+1; b+=a; c++; return (a+b+c); } 要求: (1)输入源程序并进行编译、连接、运行和调试。 (2)运行并将结果填入表5-3。 (3)分析函数中a、b、c的存储类型及其在每次调用中的变化。 (4)将函数f()中的语句“int c=3;”改为“static int c=3;”后进行编译、连接、运行和调试。将结果填入表5-3。 (5)比较(4)修改前后函数f使用的变量a、b、c的差别。 | ||||||||||||||||||||||||
表5-2 程序测试及结果分析
表5-3 程序测试及结果分析
3. 运行程序 #include <stdio.h> int func2(int a,int b); int func1(int a,int b); void main( ) { int x=7,y=17; printf("%d\n",func1(x,y)); } int func1(int a,int b) { int c; a+=a; b+=b; c=func2(a,b); return c*c; } int func2(int a,int b) { int c; c=a*b%3; return c; } 要求: (1)输入源程序并进行编译、连接、运行并调试。 (2)运行并将结果填入表5-4。 |
(3)分析函数之间的调用关系。 表5-4 程序测试及结果分析
4.编写程序 编写一个函数,计算并返回三角形的面积。其中三角形的3条边长a、b、c作为函数的参数。输入a、b、c,判断是否能够构成三角形。
|
} 5.编写程序 编写一个程序,用两个函数分别求最大公约数和最小公倍数,其值不由函数带回,将最大公约数和最小公倍数都设为全局变量,在主函数中输出它们的值。
6.编写程序 写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。 要求: |
(1)判别素数的函数名为:prime。 (2)程序中测试数据为:17、34、2、1、0 (3)算法分析中表示出判断素数的算法。 (4)结果分析中讨论判断素数的几种算法,并分析优劣。
7.编写程序 编写具有如下原型的函数: void chgStr(char is[],char os[]); 由它负责将is 中的输入字符串按照如下的规则变换成结果字符串放入os数组中。 从头到尾逐字符地对输入字符串is进行处理: (1)若is的当前字符不是数学字符,则将该字符复制到输出字符串os中。 (2)若is的当前字符是一个数学字符,且假定其大小值为n,则将该数字字符替换为n+1个相关字母存放到结果字符串os中:字符0替换为1个a,字符1替换为2个b,字符2替换为3个c,……,字符9替换为10个j。 |
例如:当输入字符串is为“s1k02”时,输出字符串os应为“sbbkaccc”; 当输入字符串is为“abc5uf20t”时,输出字符串os应为“abcffffffufcccat”; 编写函数,对chgStr()进行调用,以验证其正确性.
8. |
9.编写程序 编写具有如下原型的函数: bool f(long x); 其功能为:若整数x仅由偶数字(0、2、4、6、8) 组成时(如x=2468),函数返回true; 否则返回false(如x=2214)。 编写主函数,对f()进行调用,以验证其正确性。 要求:输入输出界面设计为下面的形式 Input a long integer:x=2214 NO!—(Include:1,3,5,7) 再一次执行: Input a long integer:x=80246 YES!—(Only: 0,2,4,6,8)
|
10.编写程序 编写一个将x进制正整数转化为十进制数并输出结果的函数,具有如下原型: void ChgxTo10(char a[],int x); 其中:参数a中存放的是x进制正整数的各位数字字符(如x可为2或8或16等,为大于等于2而小于等于16的正整数),要将其转化为十进制数并输出。 要求及提示: (1)编写主函数,输入具体数据a(一个数字字符串)及其进制x,而后作为实参对ChgxTo10()进行调用以验证其正确性。 (2)要注意检查a数组中x进制数的合法性,即只允许出现数字字符1~x-1。例如可以再编写并使用如下的函数checkx()来完成该检查功能: void checkx(char a[],int x); (3)程序执行后的输入输出界面可设计为: a,x=? 7b 16 7B(16)=123(10) 再一次执行: a,x=? 236 7 236(7)=125(10) |
程序:#include <stdio.h> #include <math.h> bool checkx(char a[], int x); void chgxto10(char a[], int x); void main() { int x; char a[20]; printf("input 1~9 or A~F data.\n"); scanf("%s", &a); printf("input radix x:"); scanf("%d", &x); if (checkx(a, x)) chgxto10(a, x); else printf("data is not right\n"); } bool checkx(char a[], int x) { int i = 0; char b[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' }; bool flag; while (a[i] != '\0') { flag = 0; for (int j = 0; j < x; j++) { if (a[i] == b[j]) { flag = 1; break; } } if (flag == 0) return false; i++; } return true; void chgxto10(char a[], int x) { long sum = 0; int num = 0, i = 0, j; int p; while (a[i++] != '\0') num++; for (j = num - 1, i = 0; j >= 0; j--, i++) { if (a[j] >= '0' && a[j] <= '9') p = a[j] - '0'; else if (a[j] >= 'A' && a[j] <= 'F') p = a[j] - 'A' + 10; } |
程序测试及运行结果: 4. 5. 程序测试及运行结果: 6. 7. 8. 程序测试及运行结果: 9. 10. |
四、分析与讨论
1.函数实参和形参的“传递”方式有哪些?
答:(1)常量传递,实参是常量,形参是变量
- 变量传递,实参是变量,形参是变量
- 地址传递 ,实参是地址,形参也是地址
- 指针指针传递,实参是指针,形参是指针
- 指针地址传递,实参是指针,形参是地址
- 地址指针传递,实参是地址,形参是指针
- 数组元素变量传递,实参是数组元素,形参是变量
- 变量数组元素传递,实参是变量,形参是数组元素
2.函数的形参与实参类型总结?
答:形参:在定义函数时指定的参数,在未出现函数调用时,他们并不占用内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在函数调用结束后,形参所占用的内存单元也被释放。
实参:即你调用函数时传递的参数。实参可以是常量、变量、表达式。
实参与形参的类型应相同或兼容赋值;
如果实参为int型而形参为float型,则按不同类型的赋值规则进行转换。
形参和实参实际上占用的是两份不同的存储单元。