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(1m,n1000),输出 m ~ n 之间的所有完数,完数就是因子和与它本身相等的数(如 6=1+2+3)。要求定义并调用函数 factorsum(number),它的功能是返回 number 的因子和。例如,factorsum(12)的返回值是 16
(1+2+3+4+6)。
解答:参见《C 语言程序设计》习题 6 中的三、程序设计题,第 3 题。
(4)使用函数输出指定范围内的 Fibonacci 数:输入两个正整数 m 和 n(1m,n10000),
输出 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 题。