• 沒有找到結果。

实验指导教材参考答案

在文檔中 第 10 章 函数与程序结构 (頁 26-31)

double a, b, c, s;

printf("input a, b, c: ");

scanf("%lf%lf%lf", &a, &b, &c);

s = S(a,b,c);

printf("s = %lf, area = %lf\n", s, AREA(s,a,b,c));

return 0;

}

(2) 使用函数实现

#include <stdio.h>

#include <math.h>

double f1(double a, double b, double c) {

return (a+b+c)/2;

}

double f2(double s, double a, double b, double c) {

return sqrt(s*(s-a)*(s-b)*(s-c));

}

int main(void){

double a, b, c, s;

printf("input a, b, c: ");

scanf("%lf%lf%lf", &a, &b, &c);

s = f1(a,b,c);

printf("s = %lf, area = %lf\n", s, f2(s,a,b,c));

return 0;

}

10.4 实验指导教材参考答案

一 、 调 试 示 例 ( 略 ) 二 、 基 础 编 程 题

(1)判断满足条件的三位数:编写一个函数,利用参数传入一个 3 位数 number,找出 101~number 之间所有满足下列两个条件的数:它是完全平方数,又有两位数字相同,如 144、676 等,函数返回找出这样的数据的个数,并编写主函数。

输入输出示例(括号内为说明文字)

150 (number=150)

count=2

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 1 题。

(2)递归求阶乘和:输入一个整数 n(n>0 且 n≤10),求 1!+2!+3!+...+n!。定义并调用函 数fact(n)计算 n!,函数类型是 double。试编写相应程序。

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 2 题。

(3)递归实现计算 x^n:输入双精度浮点数 x 和整数 n (n≥1),调用函数求 x 的 n 次方,

并保留两位小数。

输入输出示例(括号内为说明文字)

2 (x=2)

3 (n=3)

Root = 8.00

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 3 题。

(4)递归求式子和:用递归的方法对下列计算式子编写一个函数,并写出相应主函数,

计算结果保留两位小数。

2 3 4 1

( , ) ... ( 1)

n n

f x n = − x x + xx + + −

× x

(n>0)

输入输出示例(括号内为说明文字)

2 (x=2)

4 (n=4)

f(2,4) = -10

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 4 题。

(5)递归计算函数 Ack(m,n):输入两个整数 m 和 n(m≥0 且 n≥0),输出函数 Ack(m,n) 的值。Ack(m,n)定义为(m≥0 且 n≥0):

n + 1 m=0

Ack(m, n)= Ack(m - 1, 1) n=0 && m>0 Ack(m - 1, Ack(m, n - 1) ) m>0 && n>0 输入输出示例(括号内为说明文字)

2 (m=2)

3 (n=3)

Ack(2, 3)=9

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 5 题。

(6)递归实现求 Fabonacci 数列:用递归方法编写求斐波那契数列的函数,返回值为整型,

并写出相应的主函数。斐波那契数列的定义为:

f(0) = 0,f(1) = 1

f(n) = f(n - 2) + f(n - 1) (n>1)

输入输出示例(括号内为说明文字)

6 (n=6)

fib(6)=8

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 6 题。

三 、 改 错 题

改正下列程序中的错误,输入一个整数n (n≥0)和一个双精度浮点数 x,输出函数 P(n,x) 的值(保留2 位小数)。(源程序 error10_2.cpp)

1 (n=0) P(n, x) = x (n=1) ((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n (n>1) 输入输出示例

Enter n, x: 10 1.7 P(10,1.70) = 3.05

源程序(有错误的程序)

1 #include <stdio.h>

2 int main(void)

3 {

4 int n;

5 double x, result;

6

7 printf(“Enter n, x: ”);

8 scanf("%d%lf", &n, &x);

9 result = p(n,x);

10 printf("P(%d,%.2lf) = %.2lf\n", n, x, result);

11

12 return 0;

13 } 14

15 double p(int n, double x) 16 {

17 p(n,x) = ((2 * n - 1) * p(n - 1,x) - (n - 1) * p(n - 2,x)) / n;

18

19 return p(n,x);

20 }

(1)初次编译后共有 2 个[Error],请填写出错信息并分析原因。

① `p' undeclared (first use this function) ,函数p 未声明 ② non-lvalue in assignment 赋值语句中左边缺少变量

(2)请填写修改后的正确语句。

改错汇总:

错误行号: 6 正确语句: double p(int n, double x);

错误行号: 16 正确语句: double result;

错误行号: 17 正确语句: result = ((2 * n - 1) * p(n - 1,x) - (n - 1) * p(n - 2,x)) / n;

错误行号: 19 正确语句: return result;

(3)改正上述编译错误后,再次编译无错误出现,运行程序。

运行输入测试数据为 10 1.7,运行结果为: 程序错误,无输出 ,是否正确: 否

(4)请仔细分析错误产生的原因,模仿以前调试示例中的方法进行调试改错。并简要 说明你的方法并给出正确语句。

方 法 : 略

改 错 汇 总 :( 以 下 为 正 确 程 序 段 ) double p(int n, double x)

{

double result;

if(n==0) result=1;

else if(n==1) result=x;

else

result = ((2 * n - 1) * p(n - 1,x) - (n - 1) * p(n - 2,x)) / n;

return result;

}

四 、 拓 展 编 程 题

(1)十进制转二进制:输入一个正整数 n,将其转换为二进制后输出。要求定义并调 用函数 dectobin(n),它的功能是输出 n 的二进制。例如,调用 dectobin(10),输出 1010。

输入输出示例(括号内为说明文字)

100 (n=100)

1100100

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 7 题。

(2)递归实现顺序输出整数:输入一个正整数 n,编写递归函数实现对其进行按位顺序输 出。试编写相应程序。

输入输出示例(括号内为说明文字)

900 (n=900)

9 0 0

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 8 题。

(3)递归实现逆序输出整数:编写实现对一个整数进行逆序处理的递归函数,函数需 要有返回值,其值为逆序后的数据。

输入输出示例(括号内为说明文字)

第1 次运行:(总共运行 2 次)

567 (n=567)

reverse=765 第2 次运行:

800 (n=800)

reverse=8

解答:

#include <stdio.h>

int reverse(int n);

int main(void) {

int n;

scanf("%d", &n);

printf("reverse = %d\n", reverse(n));

return 0;

}

int reverse(int n) {

static int p;

int y;

if (n<10){

p = 1; y = n;

} else {

y = reverse(n / 10);

p *= 10;

y = y + (n % 10) * p;

}

return y;

}

(4)使用文件包含统计素数:输入 n(n<10)个整数,统计其中素数的个数。要求程序由

两个文件组成,一个文件中编写main 函数,另一个文件中编写素数判断的函数。使用文件

包含的方式实现。

输入输出示例(括号内为说明文字)

5 (n=5)

3 6 7 9 11 count=3

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 9 题。

(5)使用文件包含编制简单加减法计算器:编制一个简单加减运算的计算器,输入计

算式子的格式为:整数常量+运算符+整数常量。

输入输出示例 5+10

5+10=15

要求程序由两个文件组成,把加减运算写成函数:int Add(int a, int b),int Sub(int a, int b),

并单独写成一个源程序文件 cal.c,分别使用文件包含和工程文件与主函数的源程序进行连 接。

解答:

文件cal.c

#include <stdio.h>

#include "add.h"

#include "sub.h"

int main(void) {

char op;

int operand1, operand2, res;

scanf("%d%c%d", &operand1,&op,&operand2);

switch(op){

case'+':

printf("%d+%d=%d\n",operand1,operand2,Add(operand1,operand2));break;

case'-':

printf("%d-%d=%d\n",operand1,operand2,Sub(operand1,operand2));break;

default: printf("运算符错误\n");break;

} return 0;

}

文件add.h

int Add(int a, int b) {

return (a+b);

}

文件sub.h int Sub(int a, int b) {

return (a-b);

}

(6)三角形面积为:

area = s×(s−a)×(s−b)×(s−c) s = (a + b + c) / 2

其中a、b、c 分别是三角形的 3 条边。请分别定义计算 s 和 area 的宏。再使用函数实现,

比较两者在形式上和使用上的区别。

解答:参见《C 语言程序设计》习题 10 中的三、程序设计题,第 10 题。

在文檔中 第 10 章 函数与程序结构 (頁 26-31)

相關文件