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(\lank, digit, other); return 0; }
第55/106页
2. 输入一行字符,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。 解答: #include
char c;
int count, word; c = getchar(); count = word = 0; while(c != '\\n'){ if(c == ' ') word=0;
else if(word == 0){
count++; word = 1; }
c = getchar(); }
printf(\return 0; }
3. 程序模拟简单运算器的工作:输入一个算式(没有空格),遇等号\说明输入结束,输出结果。假设计算器只能进行加、减、乘、除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。例如,输入“1+2*10-10/2=”后,输出10。 解答: #include
char op;
int operand1, operand2, res; scanf(\op = getchar();
while(op != '='){
scanf(\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;
第56/106页
op = getchar(); }
printf(\return 0; }
4. 验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。例如6=3+3,8=3+5,?,18=5+13。将6~100之间的偶数都表示成两个素数之和,打印时一行打印5组。 解答:
#include \#include \int main(void) {
int count, i, number; int prime(int m); 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(\count++;
if(count % 5 == 0) printf(\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.4实验指导教材参考答案
一、调试示例
改正下列程序中的错误。根据下式求?的值,直到某一项小于10-6。(源程序error06_1.cpp)
第57/106页
7.3练习与习题参考答案 7.3.1练习参考答案
练习7-1 编写程序,输入一个正整数n (1<n≤10),再输入n个整数,输出平均值(保留2位小数)。 解答:
#include
int i, n, sum; float aver; int a[10];
printf(\
scanf(\
printf(\for(i=0; i for(i=0; i printf(\return 0; } 练习7-2 编写程序,输入一个正整数n (1<n≤10) ,再输入n个整数,按逆序输出这些数。 解答: #include 第58/106页 int i, n, temp; int a[10]; printf(\scanf(\ printf(\for(i=0; i a[i]=a[n-1-i]; a[n-1-i]=temp; } printf(\for(i=0; i 练习7-3 将例7-3程序中的break语句去掉,输出结果有变化吗?假设输入数据不变,输出什么? 解答: 当去掉break语句后,一旦找到数据将不跳出循环,而是继续往下找值为x的元素,因此程序输出会有变化。当输入数据仍为2 9 8 1 9时,输出将是index is 4。 练习7-4 编写程序,输入一个正整数n (1<n≤10),再输入n个整数,先输出最大值及其下标(设最大值唯一,下标从0开始),再将最大值与最后一个数交换,并输出交换后的n个数。 解答: #include int i, index, n, t; int a[10]; scanf(\for(i=0; i for(i=1; i printf(“Max is %d , index is %d \\n”,a[index],index); t=a[n-1]; a[n-1]=a[index]; a[index]=t; printf(\printf(\ 练习7-5 给二维数组赋值时,如果把列下标作为外循环的循环变量,行下标作为内循环的循环变量,输入的数据在二维数组中如何存放?用下列for语句替换例7-7中的对应语句,将输入的6个数存入二维数组中,假设输入数据不变,输出什么?与例7-7中的输出结果一样吗?为什么? for( j=0;j<2;j++) for( i=0;i<3;i++) scanf(“%d”,&a[i][j]); 解答: 当把列下标作为外循环的循环变量,行下标作为内循环的循环变量时,输入的数据将以列优先的方式存放。当用上述for循环方式时,输出结果为:max=a[2][0]=10,与原例7-7不一样,因为当用上述方式输入是,二维数组中存放值如下: 3 -9 2 6 10 -1 练习7-6 在例7-9的程序中,如果将遍历上三角矩阵改为遍历下三角矩阵,需要怎样修改程序?运行结果有变化吗?如果改为遍历整个矩阵,需要怎样修改程序?输出是什么?为什么? 解答: