experiment3
一、实验目的
- 能正确使用c语法规则定义、声明、调用函数
- 能正确编写递归函数
- 针对具体问题场景,能合理抽象出独立的功能模块,正确定义函数并使用,使得代码更具可读性、可维护性
二、实验准备
实验前,请复习第4章以下内容:
- 函数定义、声明、调用的语法规则
- 什么是形参、什么是实参,以及,参数传递和返回过程
- 什么是递归函数,以及,递归函数的编写规范
三、实验内容
实验任务1
验证性实验。
在C开发环境下,输入如下程序。结合程序运行结果,理解代码、回答问题。
task1.c
SHOW CODE
#include <stdio.h>
char score_to_grade(int score); // 函数声明
int main() {
int score;
char grade;
while(scanf("%d", &score) != EOF) {
grade = score_to_grade(score); // 函数调用
printf("分数: %d, 等级: %c\n\n", score, grade);
}
return 0;
}
// 函数定义
char score_to_grade(int score) {
char ans;
switch(score/10) {
case 10:
case 9: ans = 'A'; break;
case 8: ans = 'B'; break;
case 7: ans = 'C'; break;
case 6: ans = 'D'; break;
default: ans = 'E';
}
return ans;
}
实验结论
//预览结果如图所示

问题一:score_to_grade(int score)负责根据分数转换成等级;形参类型是int,返回值类型是char
//预览结果如图所示

问题二:1、char是字符型,而使用""来表示字符,导致不匹配
2、case语句缺少break分支,导致一直执行到case6
2. 实验任务2
验证性实验。
在C开发环境下,输入如下程序。结合程序运行结果,理解代码、回答问题。
task2.c
SHOW CODE
#include <stdio.h>
int sum_digits(int n); // 函数声明
int main() {
int n;
int ans;
while(printf("Enter n: "), scanf("%d", &n) != EOF) {
ans = sum_digits(n); // 函数调用
printf("n = %d, ans = %d\n\n", n, ans);
}
return 0;
}
// 函数定义
int sum_digits(int n) {
int ans = 0;
while(n != 0) {
ans += n % 10;
n /= 10;
}
return ans;
}
实验结论
//预览结果如图所示 
问题一:sum_digits功能用于将输入的n中各位数字相加
问题二:能,第一种是迭代,使用while循环通过取余得到数字的个位,再除10去掉个位;第二种是递归,使用if语句,当n<10,直接输出,n>=10,返回值就是n%10+sum_digits(n/10)(直至n<10,执行第一个if)
3. 实验任务3
验证性实验。
在C开发环境下,输入如下程序。结合程序运行结果,理解代码、回答问题。
task3.c
SHOW CODE
int power(int x, int n); // 函数声明
int main() {
int x, n;
int ans;
while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) {
ans = power(x, n); // 函数调用
printf("n = %d, ans = %d\n\n", n, ans);
}
return 0;
}
// 函数定义
int power(int x, int n) {
int t;
if(n == 0)
return 1;
else if(n % 2)
return x * power(x, n-1);
else {
t = power(x, n/2);
return t*t;
}
}
实验结论
//预览结果如图所示 
问题一:power的功能:如果输入n为0,输出1;如果输入n是奇数,则为xpower(x,n-1)的递归;若n为偶数,则输出power(x, n/2)power(x, n/2)
问题二:
实验任务4
编写程序,打印输出100以内的孪生素数,及,总数。
如果n和n+2都是素数,则n和n+2是孪生素数。
task4.c
SHOW CODE
#include<stdio.h>
int is_prime (int n);
int main()
{
int i,count=0;
printf("100以内的孪生素数\n");
for(i=2;i<=100;i++){
if(is_prime(i)+is_prime(i+2)==2){
printf("%d %d\n",i ,i+2);
count+=1;
}
}
printf("100以内有%d个孪生素数",count);
return 0;
}
int is_prime (int n)
{
int i;
for(i=2;i<=n/2;i++) //若写成i<n/2,则会打出2 4;也可以写成i*i<n
{
if(n%i==0)
{return 0;}
}
return 1;
}
//预览结果如图所示

问题一:
问题二:
实验任务5
编写函数计算组合数,要求算法分别用迭代方式和递归方式实现。
设函数原型如下: int func(int n, int m); 其功能是计算从n个不同元素中取出m个元素的组合数。
main函数代码已经在task5.c中给出。补足函数 func 定义部分,分别用两种方式实现函数

task5.c
SHOW CODE
#include <stdio.h>
int func(int n, int m); // 函数声明
int main()
{
int n, m;
int ans;
while(scanf("%d%d", &n, &m) != EOF)
{
ans = func(n, m); // 函数调用
printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
}
return 0;
}
//函数
<font color=Red size=5>**迭代**</font>
int func(int n,int m )
{
if (m>n) return 0;
if(m==0||m==n) return 1;
double fenzi=1,fenmu=1;
int i;
for(i=1;i<=m;i++)
fenmu=fenmu*i;
for(i=n;i>n-m;i--)
fenzi=fenzi*i;
return fenzi/fenmu;
}
<font color=Red size=5>**递归**</font>
int func(int n,int m )
{
if (m>n) return 0;
if(m==0||m==n) return 1;
else
{return func(n-1,m)+func(n-1,m-1);}
}
//预览结果如图所示
- 实验任务6
设计函数 gcd ,计算三个整数的最大公约数并返回计算结果。要求 gcd 函数用穷举法实现:
从 3 个数中的最小数开始,测试是否公约数。 对于正整数 a、b、c ,将它们中最小的数记为 i ,则最大公约数
一定在 1 到 i 之间。从大到小依次考虑 i、i−1、i−2、…、1 ,如果其中某个数能够同时被 a、b、c 整除,则
这个数就是它们的最大公约数。
在main()函数中输入三个整数,调用 gcd ,计算三个数最大公约数并输出。
task6.c
SHOW CODE
#include <stdio.h>
// 函数声明
int gcd(int a, int b, int c);
int main() {
int a, b, c;
int ans;
while(scanf("%d%d%d", &a, &b, &c) != EOF) {
ans = gcd(a, b, c); // 函数调用
printf("最大公约数:%d\n\n", ans);
}
return 0;
}
//函数定义
int gcd(int a, int b, int c) {
// 找出三个数中的最小值
int min = a;
if (b < min) min = b;
if (c < min) min = c;
for (int i = min; i >= 1; i--) {
if (a % i == 0 && b % i == 0 && c % i == 0) {
return i;
}
}
return 1;
}
//预览结果如图所示

实验任务7
设计并编写函数 print_charman ,打印n行按图示方式递减的字符小人阵列。n通过参数传入。
基于程序主体代码和预期效果,设计函数 print_charman 原型,补足代码中的函数声明和函数定义。
task7.c
SHOW CODE
#include <stdio.h>
#include <stdlib.h>
void print_charman(int n);
int main()
{
int n;
printf("Enter n: ");
scanf("%d", &n);
print_charman(n);
return 0;
}
// 函数定义
void print_charman(int n) {
for (int i = 2*n-1; i >= 1; i=i-2)
{ for(int j=0;j<n-i/2;j++)
{printf(" ");}
for (int j = 0; j < i; j++) {
printf(" O ");
}
printf("\n");
for(int j=0;j<n-i/2;j++)
{printf(" ");}
for (int j = 0; j < i; j++) {
printf("<H> ");
}
printf("\n");
for(int j=0;j<n-i/2;j++)
{printf(" ");}
for (int j = 0; j < i; j++) {
printf("I I ");
}
printf("\n\n");
}
}
//预览结果如图所示

实验总结
定义函数时 如 int func()后面不需要加;
找到合适的参数进行便利

浙公网安备 33010602011771号