experiment3

一、实验目的

  1. 能正确使用c语法规则定义、声明、调用函数
  2. 能正确编写递归函数
  3. 针对具体问题场景,能合理抽象出独立的功能模块,正确定义函数并使用,使得代码更具可读性、可维护性

二、实验准备

实验前,请复习第4章以下内容:

  1. 函数定义、声明、调用的语法规则
  2. 什么是形参、什么是实参,以及,参数传递和返回过程
  3. 什么是递归函数,以及,递归函数的编写规范

三、实验内容

实验任务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;
}

实验结论
//预览结果如图所示
image

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

问题二: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;
}

实验结论
//预览结果如图所示 image

问题一: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;
}
}

实验结论
//预览结果如图所示 image
问题一:power的功能:如果输入n为0,输出1;如果输入n是奇数,则为xpower(x,n-1)的递归;若n为偶数,则输出power(x, n/2)power(x, n/2)
问题二238d52fa4e541bce0d87717fe6056245

实验任务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;
 }
 

//预览结果如图所示
image

问题一
问题二

实验任务5

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

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);}
 } 

 

//预览结果如图所示image

  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;  
}


//预览结果如图所示
image

实验任务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"); 
        
    }
}

//预览结果如图所示
image

实验总结

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

posted @ 2025-10-28 22:39  Luckynar  阅读(12)  评论(1)    收藏  举报