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 nf x n = − x x + x − x + + −
−× 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 题。