实验结论
1.实验任务1
task1.c源代码
#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]()
问题回答
- Q1:函数
score_to_grade的功能是什么?形参类型、返回值类型是什么?
- Q2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。
switch(score/10) {
case 10:
case 9: ans = "A";
case 8: ans = "B";
case 7: ans = "C";
case 6: ans = "D";
default: ans = 'E';
}
- A2:运行后由于没有
break跳出,导致default一行默认执行,从而使ans总是为E,即最后等级总为E。
2.实验任务2
task2.c源代码
#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]()
问题回答
- Q1:函数
sum_digits的功能是什么?
- A1:将取得的
n的各位数字相加并存于ans,返回ans。
- Q2:如果保持main代码和函数sum_digits声明不变,把函数sum_digits定义成如下实现方式,能实现同等的效果吗?如果不能实现同等效果,分析原因。如果能实现同等效果,说明两种实现方式背后的算法思维区别。
int sum_digits(int n) {
if(n < 10)
return n;
return sum_digits(n/10) + n%10;
}
- A2:能实现相同效果,源代码里使用的是迭代,更改后的函数为递归
3.实验任务3
task3.c源代码
#include <stdio.h>
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]()
问题回答
- Q1:函数
power的功能是什么?
- Q2:函数
power是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
- A1:是递归函数,其数学公式模型为
![image]()
4.实验任务4
task4.c源代码
#include<stdio.h>
int is_prime (int);
int main(){
int n,num=0;
printf("100以内的孪生素数:\n");
for(n=1;n<=100;++n)
{
if(is_prime(n)==1&&is_prime(n+2)==1)
{
printf("%d %d\n",n,n+2);
num+=1;
}
}
printf("100以内的孪生素数共有%d个\n",num);
return 0;
}
int is_prime (int x){
int i;
if(x==1)
return 0;
for(i=2;i<=x/2;++i)
{
if(x%i==0)
break;
}
if(i <= x/2)
return 0;
else
return 1;
}
运行结果
![image]()
5.实验任务5
task5.c源代码
#include <stdio.h>
extern int sum=0;
void move(int n,char x,char y)
{
printf("%d:%c-->%c\n",n,x,y);
sum+=1;
}
void hanoi(int n,char a,char c,char b)
{
if(n==1)
move(n,a,c);
else
{
hanoi(n-1,a,b,c);
move (n,a,c);
hanoi(n-1,b,c,a);
}
}
int main(){
int n;
do
{
scanf_s("%d",&n);
hanoi(n,'A','C','B');
printf("一共移动了%d次\n",sum);
sum=0;
}while(n!=EOF);
return 0;
}
运行结果
![image]()
6.实验任务6
task6_1.c源代码
#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;
}
// 函数定义
// 待补足。。。(分别用迭代和递归实现)
int func(int n,int m)
{
int up=1,down=1,i;
for(i=n;i>n-m;--i)
up*=i;
for(i=1;i<=m;++i)
down*=i;
return up/down;
}
task6_2.c源代码
#include <stdio.h>
int func(int n, int m); // 函数声明
int main() {
int n, m;
int ans;
while (scanf_s("%d%d", &n, &m) != EOF) {
ans = func(n, m); // 函数调用
printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
}
return 0;
}
// 函数定义
// 待补足。。。(分别用迭代和递归实现)
int func(int n, int m)
{
if (n < m)
return 0;
if (m == n || m == 0)
return 1;
if (m == 1)
return n;
else
return func(n - 1, m) + func(n - 1, m - 1);
}
运行测试
![image]()
7.实验任务7
task7.c源代码
#include <stdio.h>
// 函数声明
// 待补足....
int gcd(int,int,int);
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 i,j;
i= (a < b) ? a : b;
i= (i < c) ? i : c;
for (j = i; j >= 1; j--)
{
if (a % j == 0 && b % j == 0 && c % j == 0)
break;
}
return j;
}
运行结果
![image]()