number = number / 10; }while(number != 0); return count; }
第48/106页
7.输入两个正整数m和n(1<=m,n<=10000),输出m ~ n之间所有的Fibonacci数。Fibonacci 序列(第1项起):1 1 2 3 5 8 13 21??要求定义并调用函数fib(n),它的功能是返回第n项Fibonacci数。例如,fib(7)的返回值是13。 解答:
#include \#include \int main(void) {
int i, m, n; long f;
long fib(int n);
scanf(\i = f = 1;
while(f <= n){
if(f >= m) printf(\i++;
f = fib(i); }
printf(\return 0; }
long fib(int n) {
int i;
long x1, x2, x;
if(n == 1 || n == 2) return 1; else{
x1 = x2 = 1;
for(i = 3; i <= n; i++){ x = x1 + x2; x1 = x2;
x2 = x;
} }
return x; }
8.输入两个正整数m和n(1<=m,n<=1000),输出m ~ n之间的所有完数,完数就是因子和与它本身相等的数。要求定义并调用函数factorsum(number),它的功能是返回number的因子和。例如,factorsum(12)的返回值是16(1+2+3+4+6)。 解答:
#include \int main(void)
{
int i, m, n;
int factorsum(int number); scanf(\i++) if(factorsum(i) == i) printf(\ }
int factorsum(int number) { int i, sum;
if(number == 1) return 1; sum = 0;
for(i = 1; i <= number/2; i++) if(number % i==0) sum = sum + i; return sum; }
9.输入两个正整数m和n(1<=m,n<=1000),输出m ~ n之间的所有满足各位数字的立方和等于它本身的数。要求定义并调用函数is(number)判断number的各位数字之立方和是否等于它本身,若相等则返回1,否则返回0。 解答: #include \int i, m, n;
int is(int number);
scanf(\f(is(i) != 0)
printf(\
int is(int number) {
int digit, sum, temp; temp = number; sum = 0; while(temp != 0){ digit = temp % 10;
第50/106页
temp = temp / 10;
sum = sum + digit * digit * digit; } return sum == number; }
10.输入一个整数,将它逆序输出。要求定义并调用函数reverse(number),它的功能是返回number的逆序数。例如,reverse(12345)的返回值是54321。 解答:
#include
int reverse(int number); scanf(\(\int reverse(int number) { int flag, res;
if(number >= 0) flag = 1; else{ flag = -1;
number = -number; } res = 0; do{
res = res * 10 + number % 10; number /= 10; }while(number != 0); return flag * res; }
11.按照图5.1学生成绩统计程序的层次结构图,开发一个学生成绩统计程序,输入一批学生的5门课程的成绩,要求输出每个学生的平均分和每门课程的平均分,找出平均分最高的学生。要求设计7个函数,每个函数完成一项功能。其中:主函数main()、数据输入input_stu()、数据计算calc_data()、计算学生平均分avr_stu()、计算课程平均分avr_cor()、数据查找(查找最高分)highest()和输出成绩output_stu()。 解答:略
第51/106页
6.3练习与习题参考答案
6.3.1练习参考答案
6-1输入一个十进制数,输出相应的八进制数和十六进制数。例如:输入31,输出37和1F。 解答:
#include
scanf(\
printf(\
6-2在程序段:
printf(\scanf(\
printf(\指定变量b的输出宽度为5 */
第52/106页
中,如果将scanf(\改为 scanf(\,仍然输入17 17,输出是什么?
解答: 23 17(中间有三个空格)
6-3如果字符型变量ch的值是大写字母,怎样的运算可以把它转换为小写字母? 解答:
ch=ch-‘A’+’a’; 6-4证明下列等价关系。 (1) a&&(b||c) 等价于 a&&b||a&&c。 解答:
(2) a||(b&&c) 等价于 (a||b)&&(a||c)。 解答:
第53/106页
(3)!(a&&b) 等价于 !a||!b。 解答:
(4)!(a||b) 等价于 !a&&!b。 解答:
6.3.2习题参考答案 一.选择题
1.设 float x=2.5, y=4.7; int a=7;,printf(“%.1f”, x+a%3*(int)(x+y)%2/4)的结果为。 A.2.5 B.2.8 C.3.5 D.3.8 2.执行下列程序段的输出结果
是。 int a = 2; a += a *= a -= a *= 3; printf(\.-6 B.12 C.0 D.2
3.设字符型变量x的值是064,表达式“~ x ^ x << 2 & x”的值是 A.0333 B.333 C.0x333 D.020
4.设a 为整型变量,不能正确表达数学关系:1010 && a<15 D.!(a<=10) && !(a>=15) 5.设以下变量均为int类型,表达式的值不为9的是。 A. (x=y=8,x+y,x+1) B. (x=y=8,x+y,y+1) C. (x=8,x+1,y=8,x+y) D. (y=8,y+1,x=y,x+1) 二.填空题
1.-127的原码为、反码为、补码为
2. 逻辑表达式x && 1等价于关系表达式
3.设int a=5, b=6; 则表达式(++a==b--)? ++a : --b的值是
4.设 c = 'w', a = 1, b = 2, d = -5, 则表达式 'x'+1>c, 'y'!=c+2, -a-5*b<=d+1, b==(a=2)的值分别为 1 、 0 、 1 、 1 。
5.运行以下程序后,如果从键盘上输入china#<回车>,则输出结果为。 #include
int c1 = 0, c2 = 0; char ch; while((ch = getchar()) !=’#’) switch(ch) { case ‘a’: case ‘h’: c1++; default: c2++; }
printf(“c1=%d,c2=%d\\n”, c1, c2); return 0; }
三.程序设计题
1. 输入一行字符,统计出其中的英文字母、空格、数字和其他字符的个数。 解答:
#include
char c;
int blank, digit, letter, other; c = getchar();