5.1先查阅标准库函数,然后再回答下列代码完成什么功能? int c: while((c= getchar o)!=EOF putchar(isupper(c)?tolower(c): c) 答:将大写字母转换为小写输出,其它字符原样输出 5.2下面的代码段意欲实现:如果x==0,则什么也不做,除 非y==0时调用exit(1);否则置ⅹ=x+y。你认为这段代码能否 完成上述功能?请给出你的一个实现方案 if(x==0) exit(1) else 答:不能完成这一功能。一个解决方案是 f( f( exit(1) else x Xty 5.3下面的代码段是否存在问题?为什么?
1 5.1 先查阅标准库函数,然后再回答下列代码完成什么功能? int c; while((c = getchar()) != EOF putchar(isupper(c)?tolower(c):c); 答:将大写字母转换为小写输出,其它字符原样输出。 5.2 下面的代码段意欲实现:如果 x = =0,则什么也不做,除 非 y = =0 时调用 exit(1);否则置 x == x+y。你认为这段代码能否 完成上述功能?请给出你的一个实现方案。 if(x == 0) if(y == 0) exit(1) else x = x+y; 答:不能完成这一功能。一个解决方案是: if(x == 0) { if(y == 0) exit(1); } else x = x+y; 5.3 下面的代码段是否存在问题?为什么?
int m= 10 oat X float *p=&x m/>p printf( x=%f\n", x) 答:语句行“x=m/*p;/**==x*/”存在问题。 ANSI C 规定:“如果输入字符流到一个给定的字符串为止已经被识别为记 号,则应该包含下一个字符以组成能够构成记号的最长的字符串”。 因此,如果/是一个记号的第一个字符,并且/后面紧随了一个*,则 这两个字符构成了注释的开始,直到*/的出现。换句话说,这条语 句变成了 但ⅹ=m又缺少分号,所以导致编译错。解决问题的一个方案是: D/*水 x*/ 或者 x=m/(*p)/米*p==x*/ 5.4编程:任给一个三位十进制整数,若该数中有且仅有两个 数码相同,则输出该数。 解:下面给出它的两种解决方案 方案
2 int m = 10; float x = 2.3; float *p = &x; x = m/*p; /* *p = = x */ printf("x = %f\n",x); 答:语句行“x = m/*p; /* *p = = x */”存在问题。ANSI C 规定:“如果输入字符流到一个给定的字符串为止已经被识别为记 号,则应该包含下一个字符以组成能够构成记号的最长的字符串”。 因此,如果/是一个记号的第一个字符,并且/后面紧随了一个*,则 这两个字符构成了注释的开始,直到*/的出现。换句话说,这条语 句变成了 x = m/*p……*/ 但 x = m 又缺少分号,所以导致编译错。解决问题的一个方案是: x = m/ *p /* *p == x */ 或者 x = m/(*p) /* *p == x */ 5.4 编程:任给一个三位十进制整数,若该数中有且仅有两个 数码相同,则输出该数。 解:下面给出它的两种解决方案。 方案一:
#include <stdio. h> int mal nt a.b. c d=100 W」 d%10 b=d/10%10 a=d/10 if(a==b&& b!=c la=c&&b!=c b==c & a!=b printf(%d\n", d) return o 方案二:该方案巧妙地利用了条件判断表达式的特性。 #include <stdio. h> int maino
3 #include <stdio.h> int main() { int a,b,c,d = 100; while(d <= 999) { c = d % 10; b = d / 10 % 10; a = d/100; if(a==b && b!=c||a==c && b!=c||b==c && a!=b) printf("%d\n",d); d++; } return 0; } 方案二:该方案巧妙地利用了条件判断表达式的特性。 #include <stdio.h> int main() {
nt num. hundreds. tens, units printf( " Input an integer( form 100 to 999): scanf(%d", &num) hundreds= num/100 tens num %100/10: units num %610: if((hundreds=tens)+(tens=units)+(hundreds==uni printf(“%d\n”,num); return 0: 5.5用case语句编程计算y值: cos(x+3.0) ≤x<10 cos2(x+7.5)10≤x<20 cos4(x+4.0)20≤x<30 解:用case语句编程的关键是如何巧妙地设计“选择开关”。 根据本题所提供的条件,我们将选择开关设计为表达式(int)x/10。 下面给出本题的一种解决方案 #include <stdio. h>
4 int num,hundreds,tens,units; printf("Input an integer ( form 100 to 999 ): "); scanf("%d",&num); hundreds = num/100; tens = num % 100/10; units = num % 10; if((hundreds==tens)+(tens==units)+(hundreds==uni ts)==1) printf(“%d\n ”,num); return 0; } 5.5 用 case 语句编程计算 y 值: cos(x+3.0) 0≤x<10 y = cos2(x+7.5) 10≤x<20 cos4(x+4.0) 20≤x<30 解:用 case 语句编程的关键是如何巧妙地设计“选择开关”。 根据本题所提供的条件,我们将选择开关设计为表达式(int)x/10。 下面给出本题的一种解决方案。 #include <stdio.h>
#include < math. h> int maino float x f("inputx=" f("%f",&x) switch((int)(x/10)) case 0: x= cos(x+3.0); break; case 1:x= cos(x+7.5): x=X*x break case 2:x=cos(x+4.0): X=x*x*x*x, break default: printf ("Unknown \n"): goto 1 printf(y=%f\n", x) loop: return O 5.6任给一整数,判断该数是奇数还是偶数。若是大于1的奇 数,判其是否是素数 解:本题很简单,主要是判素数的问题。下面它的一种解决方
5 #include <math.h> int main() { float x; printf("Input x = "); scanf("%f",&x); switch((int)(x/10)) { case 0: x = cos(x+3.0); break; case 1: x = cos(x+7.5); x=x*x; break; case 2:x=cos(x+4.0); x=x*x*x*x; break; default:printf("Unknown !\n");goto loop; } printf("y=%f\n",x); loop: return 0; } 5.6 任给一整数,判断该数是奇数还是偶数。若是大于 1 的奇 数,判其是否是素数。 解:本题很简单,主要是判素数的问题。下面它的一种解决方