• 沒有找到結果。

三、程序设计题

1.分类统计字符个数:输入一行字符,统计出其中的英文字母、空格、数字和其他字符的个数。

试编写相应程序。

解答:

#include<stdio.h>

int main(void)

{

char c;

int blank, digit, letter, other;

printf("请输入一行字符,以回车符结束:");

c = getchar();

blank = digit = letter = other = 0;

while(c != '\n'){

if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') letter++;

else if(c >= '0' && c <= '9') digit++;

else if(c == ' ') blank++;

else other++;

c = getchar();

}

printf("letter = %d, blank = %d, digit = %d, other = %d\n", letter, blank, digit, other);

return 0;

}

2.使用函数累加由 n 个 a 构成的整数之和:输入两个正整数 a 和 n, 求 a+aa+aaa+aa„

a(n 个 a)之和。要求定义并调用函数 fn(a,n),它的功能是返回 aa„a(n 个 a)。例如,fn(3,2) 的返回值是 33。试编写相应程序。

解答:

#include<stdio.h>

longfn(long a, int n);

int main(void) { inti, n;

long a, sn;

scanf("%ld%d", &a, &n);

sn=0;

for(i=1; i<=n; i++) sn=sn+fn(a, i);

printf("sum=%ld\n", sn);

return 0;

}

longfn(long a, int n) { inti;

longtn=0;

for(i=1; i<=n; i++){

tn=tn+a;

a=a*10;

} returntn;

}

3.使用函数输出指定范围内的完数:输入两个正整数 m 和 n(1<=m,n<=1000),输出 m ~ n 之 间 的 所 有 完 数 , 完 数 就 是 因 子 和 与 它 本 身 相 等 的 数 。 要 求 定 义 并 调 用 函 数 factorsum(number),它的功能是返回 number 的因子和。例如,factorsum(12)的返回值是 16

(1+2+3+4+6)。试编写相应程序。

解答:

#include<stdio.h>

intfactorsum(int number);

int main(void) {

inti, m, n;

scanf("%d%d", &m, &n);

for (i=m; i<=n; i++)

if(factorsum(i)==i) printf("%d\n", i);

return 0;

}

intfactorsum(int number) { inti, sum;

sum = 1;

for(i=2; i<=number/2; i++)

if(number%i==0) sum = sum + i;

return sum;

}

4.使用函数输出指定范围内的 Fibonacci 数:输入两个正整数 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<stdio.h>

long fib(int n);

int main(void) { inti, m, n;

scanf("%d%d", &m, &n);

i=1;

while(fib(i)<=n){

if(fib(i)>=m) printf("%ld ", fib(i));

i++;

}

return 0;

}

long fib(int n) { inti;

long x1,x2,x;

if(n==1 || n==2) return 1;

else{

x1=1;x2=1;

for(i=3;i<=n;i++){

x=x1+x2;

x1=x2;

x2=x;

} return x;

} }

5.使用函数验证哥德巴赫猜想:任何一个不小于 6 的偶数均可表示为两个奇素数之和。

例如 6=3+3,8=3+5,„,18=5+13。将 6~100 之间的偶数都表示成两个素数之和,打印时 一行打印 5 组。试编写相应程序。

解答:

#include "stdio.h"

#include "math.h"

int prime(int m);

int main(void) {

int count, i, number;

count = 0;

for(number = 6; number <= 100; number =number + 2){

for(i = 3; i<= number/2; i = i + 2) if(prime(i) && prime(number - i)){

printf("%d=%d+%d ", number, i, number - i);

count++;

if(count % 5 == 0) printf("\n");

break;

} }

return 0;

}

int prime(int m) {

int k, i;

if(m == 1) return 0;

k = sqrt(m);

for(i = 2; i<= k; i++) if(m % i == 0) return 0;

return 1;

}

6.使用函数输出一个整数的逆序数:输入一个整数,将它逆序输出。要求定义并调用 函数 reverse(number),它的功能是返回 number 的逆序数。例如,reverse(12345)的返回值是 54321。试编写相应程序。

解答:

#include<stdio.h>

int reverse(int n);

int main(void) {

int x;

scanf("%d", &x);

printf("%d 的逆向是%d\n", x, reverse(x));

return 0;

}

int reverse (int n) {

int m, res;

if(n >= 0) m = n;

else

m = -n;

res = 0;

while(m != 0){

res= res* 10 + m % 10;

m = m / 10;

} if(n >= 0) return res;

else

return -res;

}

7.简单计算器:模拟简单运算器的工作,输入一个算式(没有空格),遇等号"="说明 输入结束,输出结果。假设计算器只能进行加、减、乘、除运算,运算数和结果都是整数,

4 种运算符的优先级相同,按从左到右的顺序计算。例如,输入 1+2*10-10/2=后,输出 10。

试编写相应程序。

解答:

#include<stdio.h>

int main(void) {

charop;

int operand1, operand2, res;

printf("请输入一个算式,以=结束:");

scanf("%d", &operand1);

op = getchar();

while(op != '='){

scanf("%d", &operand2);

switch(op){

case '+': res = operand1 + operand2; break;

case '-': res = operand1 - operand2; break;

case '*': res = operand1 * operand2; break;

case '/': res = operand1 / operand2; break;

default: res = 0;

} operand1 = res;

op = getchar();

}

printf("%d\n", res);

return 0;

}

8.统计一行文本的单词个数:输入一行字符,统计其中单词的个数。各单词之间用空 格分隔,空格数可以是多个。试编写相应程序。

解答:

#include<stdio.h>

int main(void) {

char c;

int count, word;

printf("请输入一行字符,以回车符结束:");

c = getchar();

count = word = 0;

while(c != '\n'){

if(c == ' ') word=0;

else if(word == 0){

count++;

word = 1;

}

c = getchar();

}

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

return 0;

}

6.4 实验指导教材参考答案

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

(1)分类统计字符个数:编写程序,输入一行字符,统计出其中的英文字母、空格、

数字和其他字符的个数。

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

(2)使用函数累加由 n 个 a 构成的整数之和:输入两个正整数 a 和 n, 求 a+aa+aaa+aa„

a(n 个 a)之和。要求定义并调用函数 fn(a,n),它的功能是返回 aa„a(n 个 a)。例如,fn(3,2)的 返回值是 33。

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

(3)使用函数输出指定范围内的完数:输入两个正整数 m 和 n(1m,n1000),输出 m ~ n 之间的所有完数,完数就是因子和与它本身相等的数(如 6=1+2+3)。要求定义并调用函数 factorsum(number),它的功能是返回 number 的因子和。例如,factorsum(12)的返回值是 16

(1+2+3+4+6)。

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

(4)使用函数输出指定范围内的 Fibonacci 数:输入两个正整数 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。

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

(5)使用函数验证哥德巴赫猜想:任何一个不小于 6 的偶数均可表示为两个奇素数之和。

例如 6=3+3,8=3+5,„,18=5+13。将 6~100 之间的偶数都表示成两个素数之和,打印时一 行打印 5 组。素数就是只能被 1 和自身整除的正整数,最小的素数是 2。要求定义并调用函数 prime(m)判断 m 是否为素数,当 m 为素数时返回 1,否则返回 0。

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

三、改错题

使用函数输出整数的逆序数:改正下列程序中的错误。输入两个整数,分别将其逆向输出,

要求定义并调用函数 reverse(n),它的功能是返回 n 的逆向值。例如 reverse (123)的返回值是 321。

(1)编译后共有 2 个[Error],双击第一个错误,观察源程序中出错位置,并分析错误 原因。

错误信息:`reverse' undeclared ; 错误原因:reverse()函数未声明;

改正方法:在第 5 行添加函数声明 intreverse(int n); ;

(2)改正错误后,再次编译无错误出现,运行程序:

运行输入测试数据为 123 -910,

运行结果为: 123 的逆向是 0 -910 的逆向是 0 是否正确:否

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

方法:在程序的第 15 行添加断点,开始单步调试程序。当程序从 main()主函数的第 7 行跳入 reverse()函数执行后,发现从第 15 行到第 18 行出现错误,当 n 为负数时,程序 将 n 转为正数,应将第 15 行的条件改为 n>=0。接着进行单步调试,发现第 19 行到第 22 行 出现算术运算符使用错误,并且循环条件有误。

改错汇总:

错误行号:15 正确语句:if(n>=0) 错误行号:19 正确语句:while(m!=0) {

错误行号:20 正确语句:res = res * 10 + m % 10;

错误行号:21 正确语句:m = m / 10;

四、拓展编程题

(1)简单计算器:编写程序,模拟简单运算器的工作:输入一个算式(没有空格),遇等号

"="说明输入结束,输出结果。假设计算器只能进行加、减、乘、除运算,运算数和结果都 是整数,四种运算符的优先级相同,按从左到右的顺序计算。

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

(2)统计一行文本的单词个数:输入一行字符,以回车符结束,统计其中单词的个数。

各单词之间用空格分隔,空格数可以是多个。

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

相關文件