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 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 int maino
3 #include int main() { int a,b,c,d = 100; while(d 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
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
#include 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 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 的奇 数,判其是否是素数。 解:本题很简单,主要是判素数的问题。下面它的一种解决方
案 #include #include nt maino Int n,1 printf( Input an integer: scanf( %d", &n) if(n %2==0) printf( %d is an even number. \n", n) else printf( %d is an odd number. \n", n) if(n>1) for(i=2: i<=sgrt(n); i++) f(n%i==0) printf(%d is not a prime \ n", n) goto loop 6
6 案。 #include #include int main() { int n,i; printf("Input an integer: "); scanf("%d",&n); if(n % 2==0) printf("%d is an even number.\n",n); else{ printf("%d is an odd number.\n",n); if(n>1) { for(i = 2; i <= sqrt(n); i++) { if(n%i==0) { printf("%d is not a prime\n",n); goto loop;
printf( %d is a prime \n",n e⊥se loop: return 0 5.7三个成等差数列的数,首尾两项之积为中项的5倍,后两 项之和为第一项的8倍,求此三数。 解:从数学上不难分析它们之间的关系,可编程序如下: #include #include int maino float b =4.0. d. b++:d qr Iwhile(2 * b! =3 d) printf (%.2f \t %. 2f \t %.2f \n", b-d, b, b+d)
7 } } printf("%d is a prime\n",n); } }/* else */ loop: return 0; } 5.7 三个成等差数列的数,首尾两项之积为中项的 5 倍,后两 项之和为第一项的 8 倍,求此三数。 解:从数学上不难分析它们之间的关系,可编程序如下: #include #include int main() { float b = 4.0,d; do{ b++; d = sqrt(b * b – 5 * b); }while(2 * b != 3 * d); printf("%.2f \t %.2f \t %.2f \n",b-d,b,b+d);
return o 5.8给定一字母,要求打印出一个菱形,该菱形中间一行由此 字母组成,其相邻的上下两行由它的直接前趋字母组成。按此规律, 直到字母A出现在第一行和最后一行为止。例如,给定字母C,输出 如下: BBB CCCCC BBB A 解:将其分解为两部分:先打印上三角,再打印下三角。一种实 现方案如下。注意,程序中的 print语句 printf("%来c",1 etter-i+10,’) 该语句通过格式修饰符“*”来动态确定一行中的前导空格数, 即第i行前面应该预留 letter-i+10个空格位置,其中“+10”相当 于将图整个右移10个空格位置 #include #includectype. h>
8 return 0; } 5.8 给定一字母,要求打印出一个菱形,该菱形中间一行由此 字母组成,其相邻的上下两行由它的直接前趋字母组成。按此规律, 直到字母 A 出现在第一行和最后一行为止。例如,给定字母 C,输出 如下: A BBB CCCCC BBB A 解:将其分解为两部分:先打印上三角,再打印下三角。一种实 现方案如下。注意,程序中的 prinft 语句: printf("%*c",letter-i+10, ' '); 该语句通过格式修饰符“*”来动态确定一行中的前导空格数, 即第 i 行前面应该预留 letter-i+10 个空格位置,其中“+10”相当 于将图整个右移 10 个空格位置。 #include #include
int mal unsigned char letter int 1, J printf("input a letter (b to Z): letter= getchar o letter= islower(letter)?toupper (letter):letter; /=* 小写换大写*/ lette 64 for(i=1;i<= letter;i++)/*打印上三角*/ printf("脒c", letter-i+10,’);/*确定每行的 开始打印位置* for(j=1;j<=2*i-1;j+) putchar(64+i) /*打印第i行 putchar(\n’); /*一行打印 完,换一行 }/*上三角打印完*/
9 int main() { unsigned char letter; int i,j; printf("Input a letter (B to Z): "); letter = getchar(); letter = islower(letter)?toupper(letter):letter; /* 小写换大写 */ letter -= 64; for(i = 1; i <= letter; i++) /* 打印上三角 */ { printf("%*c",letter-i+10, ' '); /* 确定每行的 开始打印位置 */ for(j=1;j<=2*i-1;j++) putchar(64+i); /* 打印第 i 行 */ putchar('\n'); /* 一行打印 完,换一行 */ } /* 上三角打印完 */
for(i=letter-1; i>=1; i-) /*开始打印下 三角米 printf("%c", letter-i+10,’’); for(j=1; j<=2*i-1; j++)putchar(64+i) putchar(Ⅶn’); return o 5.9打印以下由数字组成的金字塔 1221 123321 1234 4321 12345 54321 解:本题比5.8题稍复杂。仍然当作一个矩形来考虑:前部用空 格组成一个直角三角形,它控制了前面各行数字的开始打印位置 内部用空格组成一个等腰三角形,它控制了后面各行数字的开始打 印位置。设欲打印的行数为n,根据分析不难发现: 对直角三角形,第i行应打印2*n-2*个空格
10 for(i=letter-1;i>=1;i--) /* 开始打印下 三角 */ { printf("%*c",letter-i+10, ' '); for(j=1;j<=2*i-1;j++) putchar(64+i); putchar('\n'); } return 0; } 5.9 打印以下由数字组成的金字塔。 1 12 21 123 321 1234 4321 12345 54321 解:本题比 5.8 题稍复杂。仍然当作一个矩形来考虑:前部用空 格组成一个直角三角形,它控制了前面各行数字的开始打印位置; 内部用空格组成一个等腰三角形,它控制了后面各行数字的开始打 印位置。设欲打印的行数为 n,根据分析不难发现: 对直角三角形,第 i 行应打印 2*n-2*i 个空格;