20160202.CCPP体系详解(0012天)
内容概要:C语言控制语句题库.doc
第三章 控制语句
一、选择题
1. 以下语句中无限循环语句是【B】。
A)for(;2&5;); B)while(1,2,3); -> while(3)
C)while(‘\0’); D)for(;’\0’;);
解析过程:
A选项:
010
101
B选项:
While(3);
C,D选项:
‘0’ ‘\0’ 0
%d:48 0 0
%c:0 NUT NUT(不可见字符)
2. 若有程序段如下:
a=b=c=0;x=35;
if(!a)x--; if(!0) 35--;
else if(b); else if(0);
if(c)x=3; if(c!=0) x=3;
else x=4; else x=4;
执行后,变量x的值是【B】。
A.34 B.4 C.35 D.3
解析过程:else和最近的一个if进行配对
3. 下列if语句中,不正确的是【A】。
A.if (x<y)scanf (“%d”,&x); else scanf (“%d”, &y);
B.if (x<y);
C.if (x==y)x+=y;
D.if (x<y){x++;y++;}
解析过程:分支语句if-else和三元运算符之间的区别,分支语句当中每一块儿语句的结束
必须使用分号,三元表达式当中每个局部语句的结束不需要使用分号标识结束
4. 若有int x,y;,执行程序段:
for(x=1,y=1;y<50;y++)
{
if (x>=10)
break;
if(x%2==1) 奇数
{
x+=5;
continue;
}
x-=3;
}
变量x的值最终为【D】。
A.11 B.12 C.13 D.10
解析过程:
X:6 3 8 5 10
Y:1 2 3 4 5
5. 若有int x=3;,执行程序段:
do
{
printf("%3d",x-=2);
}while(!(--x));
输出的结果是【C】。
A.1 3 B.1 -1 C.1 -2 D.1 -3
x 3 0
x-=2 1 -2
--x 0 !(-3)=0
6. 有程序段:
int a;
for (scanf (“%d”,&a);!a;)
printf (“continue”);
则for语句中的!a等价于【C】。
(A)a!=0 (B)a= =0 (C)a>0 (D)a>=0
解析方式:
!a 1 0
a!=0 0 1
a==0 1 0
7. 有如下程序段:
int x=1,y=1;
int m,n;
m=n=1;
switch (m)
{
case 0:x=x*2;
case 1:
{
switch (n)
{
case 1:x=x*2; -> x=2
case 2:y=y*2;break; -> y=2
case 3:x++;
}
}
case 2:x++;y++;->x=3;y=3
case 3:x*=2;y*=2;break;->x=6;y=6
default:x++;y++;
}
执行完成后,x和y的值分别是【A】。
(A)x=6 y=6 (B)x=2 y=1 (C)x=2 y=2 (Dx=7 y=7
8. 以下描述不正确的是【C】。
A.使用while和do-while循环时,循环变量初始化的操作应在循环体语句之前完成
B.while循环是先判断表达式,后执行循环语句
C.do-while 和for循环均是先执行循环语句,后判断表达式
D.for、while 和do-while循环中的循环体均可以由空语句构成
9. 若x是int型变量,以下程序的输出结果是【D】。
for (x=3;x<6;x++)
printf ((x%2)?(“**%d”):( “##%d\n”),x);
printf (“\n”);
A.* * 3 B.# # 3 C.# # 3 D.* * 3 # # 4
# # 4 * * 4 * * 4# # 5 * * 5
* * 5 # # 5
10.与“for (i=0;i<10;i++)putchar ('a'+i);”功能不同的语句是【A】。
A)for (i=0;i<10;)putchar ('a'+(++i));
B)for (i=0;i<10;) putchar ('a'+(i++));
C)for (i=0;i<10;putchar ('a'+i),i++);
D)for (i=0;i<=9;i++)putchar ('a'+i);
11.循环控制语句“while (!scanf (“%d”,&i))getchar ( );”执行的情况是【C】。
A)循环输入字符,遇文件结束符EOF退出
B)循环条件有错,不能执行
C)若输入数据i有错,继续输入数据
D)键入i值后,回车退出循环
解析过程:
!scanf(“%d”,&i);判断数据输入是否正确
getchar();如果数据扫描错误,就吸收掉错误数据
12. 已知x=3、y=2,则表达式 x*=y+8的值为【C】。
A)3 B)2 C)30 D)10
13. 设x为int型变量,则执行以下语句后,x的值为【B】。
x=10;x+=x- =x-x;
A)10 B)20 C)40 D)30
解析过程:严格区分赋值运算符和复合运算符,只有最后一次才是真正的赋值操作,其余过程 都是在获取运算表达式的数据
14. 在下列描述中,正确的一条是【C】。
A)if (表达式)语句中,表达式的类型只限于逻辑表达式
B)语句“goto 12;”是合法的
C)for(;;)语句相当于while(1)语句
D)break语句可用于程序的任何地方,以终止程序的执行
解析过程:
A选项中,关系表达式
B选项中,标识符的命名法则
D选项中,break只能用于循环结构和switch分支结构当中
15. 下面程序的输出结果是【C】。
#include <stdio.h>
void main( )
{
int i,j,m=0,n=0;
for (i=0;i<2;i++)
for (j=0;j<2;j++)
if (j>=i)m=1;n++;
printf("%d\n",n);
}
A)4 B)2 C)1 D)0
16. 若输入字符串:abcde<回车>,则以下while循环体将执行【C】次。
While ((ch=getchar ( ))= = ' e ')printf(" * ");
A)4 B)5 C)0 D)任意
17. 设j为int型变量,则下面for 循环语句的执行结果是【B】。
for (j=10;j>3;j--)
{
if (j%3)j--;
--j;--j;
printf ("%d",j);
}
A)6 3 B)7 4 C)6 2 D)7 3
18. 以下循环体的执行次数是【C】。
#include <stdio.h>
void main()
{
int i,j;
for (i=0,j=1;i<=j+1;i+=2,j--)0<=2
printf ("%d\n",i); 2<=1
}
A)3 B)2 C)1 D)0
19. 以下程序的输出结果是【C】。
#include <stdio.h>
void main( )
{
int a=-1,b=1,k;
if((++a<0)&&!(b--<=0)) printf("%d %d\n",a,b);
else printf("%d %d\n", b, a);
}
A)-1 1 B)0 1 C)1 0 D)0 0
20. 下面程序的功能是输出以下形式的金字塔图案:
4 1
3 3
2 5
1 7
#include <stdio.h>
void main( )
{
int i,j;
for(i=1;i<=4;i++)-->1,2,3,4
{
for(j=1;j<=4-i;j++)printf(" ");-->3,2,1,0
for(j=1;j<= ;j++)printf("*");
printf("\n ");-->
}
}
在下划线处应填入的是【B】.
A)i B)2*i-1 C)2*i+1 D)i+2
21. 以下程序的输出结果是【A】。
#include <stdio.h>
void main( )
{
int i;
for(i=1;i<6;i++)
{
if(i%2)
{
printf("#");
continue;
}
printf("*");
}
printf("\n");
}
A)#*#*# B)##### C)***** D)*#*#*
22. 在下列选项中,没有构成死循环的程序段是【C】。
A)int i=100 B)for(;;); C)int k=1000; D)int s=36;
while(1) do while(s);空语句
{i=i%100+1; {++k;} --s;
if(i>100)break; while(k>=10000);
}
答案:C
23. 运行下面的程序:
#include <stdio.h>
void main( )
{
char c[6]; a b \n c \n d e f
int i=0;
for(;i<6;c[i]=getchar( ),i++);
for(i=0;i<6;i++)putchar(c[i]);
printf("\n");
}
如果从键盘上输入:
ab<回车>
c<回车>
def<回车>
则输出结果为【C】。
A)a B)a C)ab D)avcdef
b b c
c c d
d d
e
f
24. 下面程序的输出结果是【C】
#include <stdio.h>
void main( )
{
int x=5,a=0,b=0;
if(x!=(a+b)) printf("x=5\n");
else printf("a=b=0\n");
}
A)有语法错,不能通过编译 B)通过编译,但不能连接
C)x=5 D)a=b=0
25. 当输入为”right?”时,下面程序的执行结果是【C】。
#include <stdio.h>
void main( )
{
char c;
c=getchar( );
while((c=getchar())!='?')
putchar(++c);
}
A)Right B)jhiu
C)right D)sjhiu?
26. 下面程序的输出结果是【D】。
#include <stdio.h>
void main( )
{
int x=3;
do{
printf("%3d",x+=1);4 4
}while(--x);3 3
}
A)4 B)4 4
C)4 4 4 D)死循环
27. 若变量已正确定义,要求程序段写成5!的计算,不能完成此操作的程序段是【B】。
A)for(i=1,p=1;i<=5;i++) p*=i;
B)for(i=1;i<=5;i++){p=1;p*=i;}
C)i=1;p=1;while(i<=5){p*=i;i++;}
D)i=1;p=1;do{p*=i;i++;}while(i<=5);
28. 有以下程序:
#include <stdio.h>
void main( )
{
int i=1,j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf("%d %d %d\n",i,j,k);
}
程序运行后的输出结果是【D】(2005年4月)
(A)1 2 3 (B)2 3 4 (C)2 2 3 (D)2 3 3
29. 有如下程序:
#include <stdio.h>
void main( )
{
int i,sum;
for(i=1;i<=3;sum++)
printf("%d\n",sum);
}
该程序的执行结果是【C】。
(A)6 (B)3 (C)死循环 (D)0
30. 运行以下程序后,如果从键盘上输入china#<回车>,则输出结果为【C】。
A)2,0 (B)5,0 (C)5,5 (D)2,5
#include <stdio.h>
void main( )
{
int v1=0,v2=0;
char ch;
while ((ch=getchar( ))!= '#')
switch (ch)
{
case 'a':
case 'h':
default:v1++;->1 2 3 4 5
case '0':v2++;->1 2 3 4 5
}
printf("%d,%d\n",v1,v2);
}
31. 下面程序运行结果是【A】。
#include <stdio.h>
void main()
{
int a,b,c,d,x;
a=c=0;
b=1;d=20;
if(a) d=d-10;
else if(!b)
if(!c)x=15;
else x=25;
printf("%d\n",d);
}
(A)20 (B)25 (C)15 (D)10
32. 写出下列程序的运行结果【B】。
#include <stdio.h>
void main()
{
int k=0;char c='A';
do
{
switch(c++)
{
case 'A':k++;break;
case 'B':k--;
case 'C':k+=3;break;
case 'D':k=k%2;continue;
case 'E':k=k*6;break;
default:k=k/4;
}
k++;2 5 9 1 7
}while (c<'G');B C D E F G
printf("k=%d\n",k);
}
(A)2 (B)k=2 (C)k=3 (D)k=6
33. 定义:int x=7,y=8,z=9;后,则下面表达式为0的是【D】。
A)' x ' && ' y ' B)x<=y
C)x||(y+z&&y-z) D)!((x<y) &&!z||1)
34. 若w=1,x=2,y=3,z=4,则条件表达式w<x?w:y<z?y:z的值是【D】。
A)4 B)3 C)2 D)1
解析过程:三元运算符所组成的三元表达式嵌套情况,从右往左进行运算(类似于添加括号的
修改运算符优先级特点)
35. 以下程序:
#include <stdio.h>
void main()
{
int w=4,x=3,y=2,z=1;
printf("%d\n",(w<x?w:z<y?z:x));
}
其输出结果是【A】。
A)1 B)2 C)3 D)4
36. 若a和b均是正整数变量,正确的switch语句是【D】。
A) switch(pow(a,2)+pow(b,2)) (注:调用求幂的数学函数)
{->pow();函数的运算结果是实数类型
case 1:case 3:y=a+b;break;
case 0:case 5:y=a-b;
}
B) switch(a*a+b*b)
{
case 3:
case 1: y=a+b;break;
case 0: y= b - a;break;->两个正整数的平方和不可能等于0
}
C) switch a ->switch关键字后面的表达式必须采用小括号括上
{
default:x=a+b;
case 10: y=a-b;break;
case 11: x=a*d;break;
}
D) switch (a+b)
{
case 10: x=a+b;break;
case 11: y=a-b;break;
}
37. 对以下程序:
#include <stdio.h>
void main()
{
int c;
while((c=getchar())!='\n')->getchar();函数所获取的输入都是字符类型
{
switch(c-'2')->字符类型和整数类型之间的转换
{
case 0:
case 1:putchar(c+4);
case 2:putchar(c+4);break;
case 3:putchar(c+3);
default:putchar(c+2);break;
}
}
printf("\n");
}
从第一列开始输入数据:2473<CR>(<CR>代表回车符),程序的输出结果是【A】。
A)668977 B)668966 C)66778777 D)6688766
38. 以下程序:
#include <stdio.h>
void main()
{
int n[2]={0}, i,j,k=2;
for(i=0;i<k;i++)
for(j=0;j<k;j++) n[j]=n[i]+1;
printf("%d\n",n[k]);
}
其输出结果是【A】。
A)不确定的值 B)3 C)2 D)1
39. 有以下程序
#include <stdio.h>
void main()
{
int i=1,j=1,k=2;
if((j++||k++)&&i++) printf("%d,%d,%d\n",i,j,k);
}
执行后输出结果是【C】。
A)1,1,2 B)2,2,1 C)2,2,2 D)2,2,3
40. 以下程序的输出结果是【C】。
#include <stdio.h>
void main()
{
int a= -1,b=1,k;
if((++a<0)&&!(b--<=0))
printf("%d %d\n",a, b);
else
printf("%d %d\n",b, a);
}
A)-1 1 B)0 1 C)1 0 D)0 0
41. 阅读以下程序:
#include <stdio.h>
void main()
{
int x;
scanf ("%d",&x);
if (x--<5) printf("%d",x);
else printf("%d",x++);
}
程序执行后,如果从键盘上输入5,则输出结果是【B】(2001年9月)
A)3 B)4 C)5 D)6
42. 以下程序的输出结果是【A】。
#include <stdio.h>
void main()
{
int n=4;
while(n--) printf("%d",--n);->2,0
}
A)2 0 B)31 C)321 D)210
43. 设有以下定义
int a=0;double b=1.25;char c= 'A'
#define d 2->预编译指令在预处理阶段得到处理,因此程序实质为2++,错误,非变量
则下面语句中错误的是【B】。
A)a++; B)b++; C)c++; D)d++;
44. 有以下程序
#include <stdio.h>
void main()
{
int a=3,b=4,c=5,d=2;
if(a>b)
if(b>c)
printf("%d",d+++1);
else
printf("%d",++d+1);
printf("%d\n",d);
}
程序运行后的输出结果是【A】。(2004年9月)
A)2 B)3 C)43 D)44
45. 下列条件语句中,功能与其他语句不同的是【D】。
A)if(a) printf("%d\n",x);else printf("%d\n",y);
B)if(a==0) printf("%d\n",y);else printf("%d\n",x);
C)if(a!=0) printf("%d\n",x);else printf("%d\n",y);
D)if(a==0) printf("%d\n",x);else printf("%d\n",y);
解析过程:a<==>a!=0; !a<==>a==0;
46. 有以下程序
#include <stdio.h>
void main()
{
int i;
for(i=0;i<3;i++)
switch(i)
{
case 1:printf("%d",i);
case 2:printf("%d",i);
default:printf("%d",i);
}
}
执行后输出结果是【A】。
A)011122 B)012 C)012020 D)120
47. 有以下主程序
#include <stdio.h>
void main()
{
int a=15,b=21,m=0;
switch(a%3)
{
case 0:m++;break;
case 1:m++;
switch(b%2)
{
default:m++;
case 0:m++;break;
}
}
printf("%d\n",m);
}
程序运行后的输出结果是【A】。
A)1 B)2 C)3 D)4
48. 以下程序的功能是:按顺序读入10名学生4门功课的成绩,计算出每位学生的平均分并输出。程序如下:
#include <stdio.h>
void main()
{
int n,k;
float score,sum,ave;
sum=0.0;
for(n=1;n<=10;n++)
{
for(k=1;k<=4;k++)
{
scanf("%f",&score);sum+=score;
}
ave=sum/4.0;
printf("No%d:%f\n",n,ave);
}
}
上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正确。这条语句是【A】。
A)sum=0.0; B)sum+=score; C)ave=sum/4.0; D)printf(“NO%d:%f\n”,n,ave);
49. 有以下程序
#include <stdio.h>
void main()
{
int i,n=0;
for(i=2;i<5;i++)
{
do
{
if(i%3) continue;
n++;
}while(!i);
n++;
}
printf("n=%d\n",n);
}
程序执行后输出结果是【D】。
A)n=5 B)n=2 C)n=3 D)n=4
50. 执行下面的程序后,a值为【A】。
#include <stdio.h>
void main( )
{
int a,b;
for(a=1,b=1;a<=10;a++)
{
if(b>=5) break;
if(b%3==1)
{
b+=3;continue;
}
b-=5;
}
printf("%d",b);
}
A)7 B)8 C)9 D)10
51. 若有以下定义:
float x;int a,b;
则正确的switch语句是【C】。
A)switch(x) B)switch(x)
{ case 1.0:printf(“*\n”); { case 1,2:printf(“*\n”);
case 2.0:printf(“**\n”); case 3:printf(“**\n”);
} }
C)switch(a+b) D)switch(a+b)
{ case 1:printf(“\n”); { case 1:printf(.”*\n”);
case 1+2:printf(“**\n”); case 2:printf(“**\n”);
} }
52. 执行下面程序段的结果是【B】。
#include <stdio.h>
void main( )
{
int x=23;
do
{
printf("%2d",x--);
}while(!x);
}
A)打印出321 B)打印出23 C)不打印任何内容 D)陷入死循环
53. 下面程序的输出是【D】。
#include <stdio.h>
void main( )
{
int x=3,y=6,a=0;
while(x++!=(y-=1))4,5 5 4
{
a+=1;1 2
if(y<x)
break;
}
printf("x=%d,y=%d,a=%d\n",x,y,a);
}
A)x=4,y=4,a=1 B)x=5,y=5,a=1 C)x=5,y=4,a=3 D)x=5,y=4,a=1
54. 下面程序段的运行结果是【C】。
int n=0;
while (n++<=2);
printf ("%d",n);
A)2 B)3 C)4 D)有语法错误
55. 已知x、a、b、c、d均为int型变量,则执行如下程序段后x的值是【D】。
a = 1; b = 2; c= 3; d = 4;
x = (a<b) ? a : b;
x = (a<c) ? a : c;
x = (a<d) ? a : d;
A)4 B)3 C)2 D)1
56. 若有以下定义语句float x; int a,b;则以下正确是【C】。
A)switch(x) B)switch(x)
{ {
case 1.0: printf(“*”); case 1,2: printf(“*”);
case 2.0: printf(“* *”) ; case 2: printf(“**”) ;
} }
C)switch(a+b) D)switch(a)
{ {
case 1: printf(“*”); case 1,2: printf(“*”);->逗号表达式
case 2: printf(“* *”) ; case 2: printf(“**”) ;
} }
57. 运行下列程序段后x的值是【A】。
int a,b,c,x;
a = 0; b = 0; c= 0; x = 7;
if (!a) x--; else if (b);
if(c) x=3; else x=4;
A)4 B)6 C)7 D)3
58. 运行下列程序段后x的值是【B】。
int a,b,c,d;
a = 1; b = 7; c= 15; d = 10;
if (a<b) x--;
if(c<d) x=1;
else
if (a<c)
if(b<d) x=2
else x=3;4
else x=6;
else x=7;
A)1 B)2 C)6 D)7
59. 如下程序的输出结果是【C】。
#include <stdio.h>
void main()
{
int a,b,c,d;
a = 2; b = -6; c= 5;
if (a<b) if(b<0) c=0;
else c++;
printf (" %d \n", c);
}
A)0 B)1 C)5 D)6
60. 以下五条语句中有【D】是合法的。
if (a=b) x++; if (a=<b) x++; if (a-b) x++; if (a<=b<=c) x++; if(1) x++;
A)1 B)2 C)3 D)4
61. 以下结论中正确的是【B】。
A)break语句是switch语句中的一部分
B)switch语句中可以根据需要使用或不使用break语句
C)break语句只能用于循环结构中
D)以上三个结论中没有一个正确
62. 运行下列程序段后x的值是【C】。
int a=10;
switch (a)
{
case 9: a++;
case 10: a++;
case 11: a++;
default: a++;
}
A)11 B)12 C)13 D)10
答案:C
63. 关于以下三条语句的描述中,正确的是【A】。
if(a) a=1;else a=2; if(a= =0) a=2;else a=1; if(a!=0) a=1;else a=2;
A)三条语句相互等效 B)三条语句中与等效
C)三条语句中与等效 D)三条语句各不等效
64. 如下程序的输出结果是【A】。
#include <stdio.h>
void main()
{
int x=1,a=0,b=0;
switch (x)
{
case 0: b++;
case 1: a++;
case 2: a++; b++;
}
printf ("a=%d , b=%d \n", a,b);
}
A)a=2 , b=1 B)a=1 , b=1 C)a=1 , b=0 D)a=1 , b=2
65. 下面的4段程序都试图求解整数1一l0的和,不能满足要求是【C】。
A) #include <stdio.h> B) #include <stdio.h>
void main() void main()
{ {
int i,sum; int i,sum
for(i =1,sum=0;i<=10;++ i) i =1,sum=0;
sum+= i; for( ; i<=10;)
printf(" i=%d sum=%d\n ",i,sum); sum+=i++;
} printf("i=%d sum=%d\n ",i,sum);
}
C) #include <stdio.h> B)#include <stdio.h>
void main() void main()
{ {
int i,sum; int i,sum
i =1,sum=0; i =1,sum=0;
for(;i<=10;++i,sum=sum+i); for( ; i<=10; sum=sum+i;++i)
printf("i=%d sum=%d\n",i,sum); printf("i=%d sum=%d\n",i,sum);
} }
66. 下面程序的运行结果为【C】。
#include <stdio.h>
void main()
{
int i,sum;
i=1,sum=0;
for (;i<=10;)
++i;
sum=sum+i;
printf("i=%d sum=%d\n",i,sum);
}
A) i=11,sum=55 B) i=10,sum=55
C) i=11,sum=11 D) 形成死循环
67. 下面程序的运行结果为【D】。
#include <stdio.h>
void main()
{
double sum=0.0,x;
for(x=0.0;x!=3.0;x+=0.1)
sum+=x;
printf("\n x=%f", x);
}
A) x=3.0 B) x=2.0
C) 会提示出错 D)形成死循环
68. 下面程序的运行结果为【A】。
#include <stdio.h>
void main()
{
int sum=0,x;
for(x=0;x!=3;x+=1)
sum+=x;
printf("\n x=%d, x=%d ",x,sum);
}
A) x=3, sum=3 B) x=2, sum=3
C) 会提示出错 D)形成死循环
69. 定义如下变量int n=10;则下列循环的输出结果是【B】。
while(n>=7)
{
n--;
printf(“%d\n”,n);
}
A)10 B)9 C)10 D)9
9 8 9 8
8 7 8 7
7 6
70. 有以下程序段,w和k都是整型变量,则不能与它等价的循环语句是【C】。
w=k;
A:
if(w==0) goto B;
w--;
printf("*");
goto A;
B:
printf("f");
A)for(w=k;w!=0;w--) printf(“*”);
B)w=k; while(w--!=0) printf(“*”);
C)w=k; do{w--;printf(“*”);}while(w!=0);
D)for(w=k;w;--w) printf(“*”);
71. 若i、j已定义为int型,则以下程序段中内循环体的总的执行次数是【B】。
for(i=6;i;i--)
for(j=0;j<5;j++)
{……}
A)25 B)30 C)36 D)死循环
72. 设x和y为int型变量,则执行下面的循环后,y的值为【C】。
for(y=1,x=1;y<=50;y++)
{
if (x>=10) break;
if (x%2==1)->1 2 3 4 5 6
{
x+=5;
continue;
}
x-=3;
}
A)2 B)4 C)6 D)
73. 设a和b为int型变量,则执行下而的循环后,b的值为【C】。
a=1; b=10;
do
{
b-=a;
a++;
}while(b--<10)->2 8
A)-1 B)-2 C)8 D)9
74. 当执行以下程序段时【A】。
x=-1;
do
{
x=x*x;
}while(!x)
A)循环体将执行一次 B)循环体将执行两次
C)循环体将执行无限次 D)会提示有语法错误
75. 以下叙述正确的是【D】。
A)do-while语句构成的循环不能用其它语句构成的循环代替
B)do-while语句构成的循环只能用break语句退出
C)用do-while语句构成的循环,在while后的表达式为非0时结束循环
D)用do-while语句构成的循环,在while后的表达式为0时结束循环
76. 在以下程序段中,while循环体执行的次数是【C】。
int k=0;
while(k=1) k++;
A)循环体将执行一次 B)循环体将一次也不执行
C)循环体将执行无限次 D)会提示有语法错误
77. 以下程序执行后,sum的值是【A】。
#include <stdio.h>
void main()
{
int n,sum;
for(n=1;n<6;n++)
sum+=n;
printf("%d\n",sum);
}
A)15 B)14 C)0 D)不确定
78. 以下程序执行后,输出结果是【A】。
#include <stdio.h>
void main()
{
int n=0;
while(n<=2)
{
n++;
printf("%d\n",n);
}
}
A)1 B)1 C)2 D)2
2 2 3
3
79.当把以下四个表达式用作if语句的控制表达式时,有一个选项与其它三个选项含义不同,这个选项是【D】。
A)k%2 B)k%2==1 C)(k%2)!=0 D)!k%2==1
80.有以下程序
#include <stdio.h>
void main()
{
int k=5,n=0;
while(k>0)
{
switch(k)
{
default : break;
case 1 : n+=k;
case 2 :
case 3 : n+=k;->3,5,7
}
k--;
}
printf("%d\n",n);
}
程序运行后的输出结果是【D】。
A)0 B)4 C)6 D)7
81.有以下程序
#include <stdio.h>
void main()
{
int i=1,j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf("%d %d %d\n",i,j,k);
}
程序运行后的输出结果是【D】。
A)1 2 3 B)2 3 4 C)2 2 3 D)2 3 3
82.若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a<b?a:c<d?c:d的值是【A】。
A)1 B)2 C)3 D)4
83.有以下程序
#include<stdio.h>
void main()
{
int i, s=0;
for(i=1; i<10; i+=2)
s+=i+1;
printf("%d\n", s);
}
程序执行后的输出结果是【D】。
A)自然数1~9的累加和 B)自然数1~10的累加和
C)自然数1~9中奇数之和 D)自然数1~10中偶数之和
86.有如下程序:
#include<stdio.h>
void main()
{
int s=0,a=1,n;
scanf("%d",&n);
do
{
s+=1;
a=a-2;
}while(a!=n);
printf("%d\n",s);
}
若要使程序输出值为2,则应该从键盘输入的值是【B】。
A)-1 B)-3 C)-5 D)0
87.有以下程序段
int n,t=1,s=0;
scanf("%d",&n);
do{ s=s+t; t=t-2; }while (t!=n);
为使此程序段不陷入死循环,从键盘输入的数据应该是【D】。
A)任意正奇数 B)任意负偶数
C)任意正偶数 D)任意负奇数
88.有以下程序
#include<stdio.h>
void main()
{
int a=1,b;
for(b=1;b<=10;b++)
{
if(a>=8) break;
if(a%2==1) {a+=5;continue;}
a-=3;
}1->2->3->4->
printf("%d\n",b);
}
程序运行后的输出结果是【B】。
A)3 B)4 C)5 D)6
二、填空题
1. 下面程序的功能是在屏幕上显示图形:
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
填空:
#include <stdio.h>
void main( )
{
int i,j;
for(i=1;i<=5;i++)
{
printf("\n");
for(j=i; j>=1 ;j--)
printf("%2d ", j);
}
}
2. 执行下面程序:
#include<stdio.h>
void main( )
{
int x;
scanf("%d",&x);
if(x++>5)
printf("%d\n", x);
else
printf("%d\n", x--);
}
若输入5,其输出结果是 6 。
3. switch语句中的表达式允许是 任何 表达式,其值必须是 整型 ,或 字符型 ,或 枚举
行 。switch语句中的常量表达式,其限制是: 常量表达式中的操作数必须是常量,严
谨变量出现;它的值类型必须是整型,或字符型,或枚举型,且要与switch后的表达式匹
配;各常量表达式值不能相同 。
4. while、do while和for语句正常退出循环的条件是 在循环体内必须有修改控制循环结
束的表达式指语句,使其值从非0变为0 ,否则会造成 死循环 。
5.三种重复结构能相互嵌套吗? 能 。使用循环嵌套结构的要点是: 内层和外层的循环控
制变量不能相同;嵌套循环的执行,总是从内循环到外循环,即内循环完整地执行一次,
外循环只执行一次 。
6. 程序填空:
程序功能:求e=1+1/1!+1/2!+1/3!+ …的近似值,误差小于1×10-8。请将正确答案写在横线处。
#include <stdio.h>
#include <math.ch>
# define EPS le-8
void main ( )
{
double e= 1 , fact=1; long n=0;
do
{
n++;
fact=fact*n ;
e=e+1/fact;
}while ( fabs(1/fact)>=EPS );
printf (“计算e值:%0.8f\n”,e);
printf (“调库函数:%0.8f\n”,exp (1,0));
}
7. break语句只能用于 switch多分支结构 语句和 循环结构 语句。
8. 在循环控制中,break语句用于结束 本层循环 ,continue语句用于结束 本次循环 。
9. 有如下程序段
int n=0;
int sum=0;
while (n++,n<50)
{
if (n= =(n/2)*2)
continue;
sum+=n;
}
printf (“%d\n”,sum);
此段程序执行的输出结果为 ,while循环共执行了 次。
答案:625,49
10. 下列程序运行后的输出结果是 。
# include <stdio.h>
void main ( )
{
int i,j,k;
for (i=1;i<=6;i++)
{
for (j=1;j<=20-2*i;j++)
printf (" ");
for (k=1;k<=i;k++)
printf ("%4d",i);
printf ("\n");
}
}
程序外循环执行6次,打印6行。对于第i次外循环:内循环输出数字i共i个。程序执行结果如下:
11. 有以下程序:
#include <stdio.h>
void main ( )
{
int i=1,j=1,k=2;
if ((j++||k++)&&i++) printf ("%d,%d,%d\n",i,j,k);
}
执行后输出的结果是 。
A)1,1,2 B)2,2,1 C)2,2,2 D)2,2,3
答案:C
12. 以下程序运行后的输出结果是 。
#include <stdio.h>
void main ( )
{
int a=1,b=3,c=5;
if (c=a+b) printf ("yes\n");
else printf ("no\n");
}
答案:yes
13. 以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。
#include <stdio.h>
void main ( )
{
float x[1000],sum=0.0,ave,a;
int n=0,i;
printf ("Enter mark:\n ");scanf ("%f ",&a);
while (a>=0.0&& n<1000)
{
sum+ 【1】 ;x[n]= 【2】 ;
n++;scanf ("%f ",&a);
}
ave= 【3】 ;
printf ("Output:\n ");
printf ("ave=%f\n ",ave);
for (i=0;i<n;i++)
if ( 【4】 ) printf ("%f\n ",x[i]);
}
答案:【1】=a 【2】a 【3】sum/n 【4】x[i]<sve
14. 以下程序将两个数从小到大输出。
#include <stdio.h>
void main ( )
{
float a,b, 【1】 ;
scanf ( 【2】 ,&a,&b);
if (a>b)
{
t=a;
【3】 ;
b=t;
}
printf ("%5.2f,%5.2f\n",a,b);
}
答案:【1】t 【2】" %f %f " 【3】a=b
15. 若有以下程序:
#include <stdio.h>
void main( )
{
int a=4,b=3,c=5,t=0;
if(a<b)t=a;a=b;b=t;
if(a<c)t=a;a=c;c=t;
printf("%d%d%d\n",a,b,c);
}
执行后输出结果是 。
答案:503
16.下面的if语句与y=(x>=10)?3*x-11:(x<1)?x:2*x-1;的功能相同,请补充完整。
if ( 【1】 )
if ( 【2】 )y=2*x-1;
else y=x;
else y=3*x-11;
答案:【1】x<10 【2】x>=1
17. 有以下程序:
#include <stdio.h>
void main( )
{
int i=0,s=0;
do
{
if(i%2){i++;continue;}
i++;
s+=i;
}while(i<7);
printf(" %d\n ",s):
}
执行后的输出结果是 。
A)16 B)12 C)28 D)21
答案:A
18. 以下主程序运行后的输出结果是 (2003年9月)
#include <stdio.h>
void main( )
{
int i,m=0,n=0,k=0;
for(i=9;i<=11;i++)
switch(i%10)
{
case 0:m++;n++;break;
case 10: n++;break;
default:k++;n++;
}
printf("%d %d %d \n",m,n,k);
}
答案:1 3 2
19. 以下程序是利用公式π=4*(1/1-1/3+1/5-1/7+…)来计算π的值。其中,变量k表示当前符号项,t表示当前项,n表示当前项的序号,要求精度控制在0.00001内。试分析程序,完成空标号处应填的内容。
# include <math.h>
# include <stdio.h>
void main( )
{
float pi,t,n,k;
pi=0.0;n=k=t=1.0;
while( (1) )
{
pi+=t;k=-k;t= (2) ;n++;
}
pi= (3) :
printf("pi=%f\n",pi);
}
答案:(1)fabs(t)>0.00001 (2)s/(2*n+1) (3)4*pi
20. 写出程序段的输出结果 。
int a=100;
if (a>100) printf ("%d\n ",a>100);
else printf ("%d\n ",a<=100);
答:1。a>100不成立,输出表达式a<=100的逻辑值真。
21. 若变量已正确定义,以下语句段的输出结果是 。
x=0; y=2; z=3;
switch(x)
{
case 0:
switch(y==2)
{
case 1: printf("*");break;
case 2: printf("%");break;
}
case 1:
switch(z)
{
case 1: printf("$");
case 2: printf("*");break;
default: printf("#");
}
}
答案:*#
22. 以下程序运行后的输出结果是 。
#include <stdio.h>
void main()
{
int p=30;
printf("%d\n",(p/3>0?p/10:p%3));
}
答案:3
23. 有以下程序
#include <stdio.h>
void main()
{
int a=5,b=4,c=3,d=2;
if(a>b>c)
printf("%d \n",d);
else if ((c-1>=d)==1)
printf("%d\n",d+1);
else
printf("%d\n",d+2);
}
执行后输出结果是 。(2003年4月)
A)2 B)3 C)4 D)编译时有错,无结果
答案:B
24. 下面程序段是找出整数的所有因子,请填空。
scanf ("%d",&x);
i=1;
for (; ;)
{
if (x%i==0)
printf ("%3d",i);
i++;
}
答:i<=x。所有因子包括1和整数本身。
25. 执行了以下程序片断后,若原来x = 9,则输出结果为_【_1_】_;若原来x = 6,则输出结果为_【_2_】_。
if(x++>8) printf("%d",x);
else printf("%d",x--);
答:【1】10; 【2】7
26. C语言提供了6种关系运算符_【_1_】__、_【_2_】__、_【_3_】__、_【_4_】__、_【_5_】__、_【_6_】__。
答:【1】>;【2】<;【3】>=;【4】<=;【5】= =;【6】!=
27. C语言中,关系表达式的值是一个_【_1_】__即真或假,一般以_【_2_】__代表真,以_【_3_】__代表假。
答:【1】逻辑值;【2】非0;【3】0
28. C语言提供三种逻辑运算符,包括_【_1_】__、_【_2_】__、_【_3_】__,这三种逻辑运算符中_【_4_】__的优先级最高。
答:【1】&& 【2】|| 【3】! 【4】!
29. 在if-else结构中,else子句不能作为语句单独使用,必须与_【_1_】__配对使用,且若if和else后面有多条语句,则需用_【_2_】__将其成为一个复合语句。
答:【1】if 【2】大括号
30. C语言中唯一的一个三目运算符是_【_1_】__,其一般形式为_【_2_】__。
答:【1】条件运算符;【2】表达式1?表达式2:表达式3
31. 以下两条if语句可以合并成一条if语句是_【_1_】__。
答:if(a<b)
{
x=5;
printf("#%d#",x);
}
else
{
x=7;
printf("*%d*",x);
}
32. 执行程序片断,当输入n为1时,flag的值为_【_1_】__,当输入n为7时,flag的值为_【_2_】__。
switch(n)
{
case 1:
case 2:
case 3: flag=1; break;
case 4: flag=2; break;
default: flag=3;
}
答:【1】1 【2】3
33. while循环结构中,当表达式为_【_1_】__时执行其中的内嵌语句;循环体如果包含一个以上的语句,应该用_【_2_】__括起来。
答:【1】非0;【2】花括弧
34. for循环语句的一般表达形式为“for(表达式1;表达式2;表达式3) {语句;}”若要省略表达式1,则必须_【_1_】__;若省略表达式2则认为表达式2始终为_【_2_】__;若省略表达式3则循环不能_【_3_】__。
答:【1】在for语句之间给循环变量赋初值;【2】真;【3】正常结束
35. for( ; ; )语句的等价while语句是_【_1_】__。
答:【1】while (1)
36. while循环结构中,可以用_【_1_】__退出循环;用_【_2_】__退出本次循环。
答:【1】break;【2】continue
37. break语句,只能用于_【_1_】__和_【_2_】__语句中。
答:【1】循环语句;【2】switch
38. 程序功能:下面程序求数组a[3][3]主对角线上的元素之和,并按矩阵的形式输出数组及求得的结果。请填空,将程序补充完整。
#include <stdio.h>
void main()
{
int a[3][3],i,j,s=0;
printf("输入矩阵元素:\n");
for (i=0;i<3;i++)
for (j=0;j<3;j++)
scanf("%d,", 【1】 );
printf("\n");
for (i=0;i<3;i++)
【2】 ;
for (i=0;i<=2;i++)
{
for (j=0;j<=2;j++)
printf("%5d",a[i][j]);
【3】
}
printf("主对角线和为:%d.\n",s);
}
答案:
【1】&a[i][j] 【2】s+=a[i][i] 【3】printf("\n");
39. 程序功能:以下程序是求如下所示分数序列的前20项之和。请填空,将程序补充完整。
2/1,3/2,5/3,8/5,13/8 ……
#include <stdio.h>
void main()
{
int n,t;
float x=2,y=1,s=0;
for (n=1;n<=20;n++)
{
【1】
【2】
【3】
【4】
}
printf("the sum is:%f\n",s);
}
答案:
【1】s+=x/y; 【2】t=x; 【3】x=x+y; 【4】y=t;
40. 程序功能:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请填空,将程序补充完整。
#include <stdio.h>
void main()
{
float x,xmax,xmin;
printf("输入成绩:\n");
scanf("%f",&x);
xmax=x;
【1】
while( 【2】 )
{
if(x>xmax) xmax=x;
if( 【3】 ) xmin=x;
scanf( 【4】 );
}
printf("max=%f,min=%f",xmax,xmin);
}
答案:【1】xmin=x; 【2】x>0 【3】x<xmin 【4】“%f”,&x
41. 程序功能:输出100以内能被3整除且个位数为6的所有正整数。请填空,将程序补充完整。
#include <stdio.h>
void main()
{
int i,j;
for(i=0; 【1】 ;i++)
{
j= 【2】 ;
if( 【3】 ) continue;
printf("%d",j);
}
}
答案:【1】i<=9 【2】i*10+6 【3】i%3!=0
42. C语言编译系统在给出逻辑运算结果时,以数值_【_1_】_代表“真”,以_【_2_】_代表“假”。
答案:【1】1;【2】0
43. C语言编译系统在判断一个量是否为“真”时,以_【_1_】_代表“真”,以_【_2_】_代表“假”。
答案:【1】非0;【2】0
44. 逻辑运算副两侧的运算对象可以是任何类型的数据,系统最终以0和非0来判断它们属于“真”或“假”。此说法正确吗?_【_1_】_。
答案:【1】正确
45. 如果表达式x>y为真或a<b为真,则表达式(x>y&&a<b)为真。对吗?_【_1_】_。
答案:【1】不正确
46. 如果至少有一个操作数为真,则包含||运算符的表达式为真。对吗?_【_1_】_。
答案:【1】正确
47. 【_1_】_语句用于进行判断。
答案:【1】if
48. _【_1_】_选择结构用于在条件为真时执行一个操作,条件为假时执行另一个操作。
答案:【1】if…else
49. else总是与_【_1_】_配对,必要时,可以通过加花括号来确定配对关系。
答案:【1】它前面的最近的if
50. switch后面括号内的表达式可以是整型表达式、_【_1_】_、_【_2_】_。
答案:【1】字符表达式;【2】枚举型数据
51. switch选择结构中必须有default语句。此说法正确吗?_【_1_】_。
答案:【1】不正确
52. switch选择结构的default中必须有break语句才能正确退出这个结构。此说法正确吗?_【_1_】_。
答案:【1】不正确
53. case后面只能是_【_1_】_常量表达式。
答案:【1】整型
54. 多个case可以共用一组执行语句。此说法正确吗?_【_1_】_。
答案:【1】正确
55.while语句的特点是_【_1_】_。
答案:【1】先判断表达式,后执行语句
56.do…while语句的特点是_【_1_】_。
答案:【1】先执行语句,后判断表达式
57.do…while循环是当表达式为_ 【_1_】 _时反复执行循环体,表达式为_ 【_2_】 _时结束循环。
答案:【1】真;【2】假
58.用while和do…while循环时,循环变量初始化的操作应在_ 【_1_】 _完成。
答案:【1】while和do…while语句之前
59.在C中,凡用while循环能完成的,用_ 【_1_】 _循环都能实现。
答案:【1】for
60.for语句中的表达式1可以省略,此时应在_ 【_1_】 _给循环变量赋初值。
答案:【1】for语句之前
61.如果省略for语句中的表达式1,则其后的分号_ 【_1_】 _省略。
答案:【1】不能
62.for语句中的三个表达式都可以省略,相当于_ 【_1_】 _语句。
答案:【1】while( 1 )
63.for语句中的表达式1和表达式3可以是一个简单的表达式,也可以是_ 【_1_】 _表达式。
答案:【1】逗号
64.如果for语句后面直接是_ 【_1_】 _,其循环体为空语句。
答案:【1】分号
65.对while、do…while、for循环,可以用_ 【_1_】 _语句跳出循环,用_ 【_2_】 _语句结束本次循环。
答案:【1】break;【2】continue
66.break语句只能用于_ 【_1_】 _语句和_ 【_2_】 _语句。
答案:【1】循环;【2】switch
67.continue语句和break语句的区别是:contine语句结束_ 【_1_】 _,而break语句结束 _【_2_】 _。
答案:【1】本次循环;【2】整个循环
68.滥用_ 【_1_】 _语句将使程序流程无规律、可读性差。
答案:【1】goto
69.程序功能:求e=l+l/1! +l/2!+1/3! +…的近似值,误差小于1×l0-8。请将正确答案写在横线处。
#include<stdio.h>
【1】
#define EPS 1e-8
void main( )
{
double e= 【2】 , fact=1; long n=0;
do
{
n++;
【3】 ;
e=e+1/fact;
}while ( 【4】 );
printf("计算e值:%0.8f\n", e);
printf("调库函数:%0.8f\n", exp(1.0));
}
答案:
【1】#include<math.h>
【2】1
【3】fact*=n;
【4】1/fact>EPS
70. 以下程序的功能是计算:s=1+12+123+1234+12345。请填空。
#include <stdio.h>
void main()
{
int t=0,s=0,i;
for( i=1; i<=5; i++)
{
t=i+ 【1】 ;
s=s+t;
}
printf("s=%d\n",s);
}
【1】t*10
71. 以下程序的功能是输出如下形式的方阵:
13 14 15 16
9 10 11 12
5 6 7 8
1 2 3 4
请填空。
#include <stdio.h>
void main()
{
int i,j,x;
for(j=4; j 【1】 ; j--)
{
for(i=1; i<=4; i++)
{
x=(j-1)*4 + 【2】 ;
printf("%4d",x);
}
printf("\n");
}
}
【1】>0
【2】i
72.设x和y均为int型变量, 则执行下面的循环后, x、y的值分别为 , 。
for(y=1, x=1; y<=50; y++)
{
if(x>=10) break;
if(x%2 == 1)
{
x+=5; continue;
}
x-=3;
}
答案:10 6
73.运行下面的程序,如果从键盘上输入5,则输出结果是 。
#include <stdio.h>
void main()
{
int x;
scanf("%d",&x);
if(x -- <5) printf("%d", x);
else printf("%d\n", x ++);
}
答案;4
74. 以下程序运行后的输出结果是______________
#include <stdio.h>
void main()
{
int x;
for(x=0;x<3;x++)
switch (x)
{
case 0:printf("%d", x);
case 2:printf("%d", x);
default:printf("%d", x);
}
}
答案:000122
75.
三、问答题
1. 程序改错
# include”stdio.h”
void main( )
{ char c;
c=getchar( )
switch c
case 0,1,2,3,4,5,6,7,8,9:printf(“%d”,c-’0’);break;
default:putchar(c);
}
解:
# include”stdio.h”
void main( )
{ char c;
c=getchar( ); /*修改*/
switch(c) /*修改*/
{ case ‘0’:case’1’:case’2’:case’3’:case’4’:
case ‘5’:case’6’:case’7’:case’8’:case’9’:printf(“%d”,c-’0’):break; /*修改*/
default:putchar(c);
}
}
2. 写出以下程序的运行结果
#include <stdio.h>
void main( )
{
int i,j;
for(i=j=1;j<=50;j++)
{
if(i>=10)break;
if(i%2)
{
i+=5;
continue;
}
i-=3;
}
printf("j=%d\n",j);
}
解:程序运行结果如下
j=6
3. 有程序如下:
#include <stdio.h>
void main( )
{
char ch;
ch=getchar( );
if(ch>='a'&&ch<='m'||ch>='A'&&ch<='M')
ch=ch+3;
else
if(ch>= 'n'&&ch<='z'||ch>='N'&&ch<='Z')
ch=ch-3;
printf("%c\n",ch);
}
假设从键盘上输入Exit或输入next后回车。试问printf语句打印出什么信息?
答:如果是输入Exit后回车,则打印出大写字母‘H’;如果是输入next后回车,则打印出小写字母‘k’。这是因为函数getchar( )在遇到回车符后,总是只接收输入字符串的第1个字符。因此,如果输入的是Exit后回车,那么它接收的是大写字母‘E’。这样ch就落在ch>=‘A’ &&ch<=‘M’区间里,使条件ch>=‘a’ &&ch<=‘m’‖ch>=‘A’ &&ch<=‘M’取真值,故对ch做ch=ch+3的操作,所以printf语句打印出大写字母‘H’。如果是输入next后回车,那么getchar( )函数接收的小写字母‘n’。这样,ch就落在ch>=‘n’ &&ch<=‘z’区间里,使条件ch>=‘n’&&ch<=‘z’‖ch>=‘N’&&ch<=‘Z’取真值,故对ch做ch=ch-3的操作,所以printf语句打印出小写字母‘k’。
4. 阅读下面的程序,它输出什么结果?
#include <stdio.h>
void main( )
{
int x,y;
for(x=1;x<=10;x++)
{
if(x==5)
{
y=x;
continue;
}
printf("%d\t",x);
}
printf("\nUsed continue to skip printing the value£º%d\n",y);
}
【解】这是一个在for循环结构中使用continue语句的例子。题目的中心意思是由x从1~10控制printf的执行,把当时x的取值打印出来。但如果x等于5,那么就强行结束这一次循环,即不去执行printf,而进入下一次循环。所以程序的执行结果是打印出如下结果:
1 2 3 4 5 6 7 8 9 10
Used continue to skip printing the value:5
5. 阅读下面的程序:
#include<stdio.h>
main( )
{
int j,k,x,y;
printf(“Enter integers in the range 1~20:\n”);
scanf(“%d%d”,&x,&y);
for(j=1;j<=y;j++)
{
for(k=1;j<=x;k++)
printf(“@”);
printf(“\n”);
}
}
运行后,最终输出什么?
答:输出结果如下图所示。
可以看出,输入的第1个数(x)决定了输出时每行打印的字符个数,输入的第2个数(y)决定了打印的行数。上图是打印8行,每行打印20个字符‘@’。
6. 阅读下面的程序:
#include<stdio.h>
void main( )
{
int x;
scanf("%d",&x);
if(x>=4)
while(x--);
printf("%d\n", ++x);
}
如果输入为5,则其输出为什么?
答:最后输出为0。这是因为在while循环里,最后判别到x为0时,循环停止。但在x上还要做“--”操作,从而退出循环后x的真正取值是-1。然而在打印时,又先对x进行“++”操作。所以最后输出为0。
7. 程序改错
程序功能:模拟加法和减法运算程序。请修改程序中的错误并调试。
# include<stdio.h>
# include<stdilb.h>
void main( )
{
int a,b;char op;
printf (“输入两个整数:”);
scanf (“%d %d”,&a,&b);
printf (“输入运算符(+ -):”);
scanf (“%c”,&op);
switch (op)
{
case +:printf (“%d+%d=%d\n”,a,b,a+b);break;
case-; printf (“%d- %d=%d\n”,a,b,a-b); break;
default:printf (“输入运算符错!\n”);exit(1);
}
}
【提示】第一次编译有错误,光标停在case +:printf (“%d+%d=%d\n”,a,b,a+b);break;行的“p”处,出现第一个错误信息:Expression syntax in function main
【解析】case的+和-应改为字符常量’+’和’-’。
排除错误,再编译无错误。
输入两个整数:10 20<回车>
输入运算符(+ -):输入运算符错!
运行错误。
【解析】因scanf (“%c”,&op)语句读入了一个换行符,不是读入操作符’+’或’-’,所以产生运行错误。在语句scanf (“%d %d”,&a,&b)后加语句scanf (“% * c”),跳过换行符不读,就可保护正常读入操作符’+’或’-’。
程序运行示例:
输入两个整数:10 20
输入运算符(+ -):+
10+20=30
8. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后。
#include <stdio.h>
void main ( )
{
int sum=0,n=0;
while (1)
{
n=n+1;
if (n>5)break;
if (n%2)continue;
sum+=n;
}
printf ("sum=%d n=%d\n",sum,n);
}
运行结果:
sum=6 n=6
9. 程序改错
程序功能:求正整数n以内的奇数。请修改程序中的错误,并调试。
# include <stdio.h>
void main ( )
{
int n,i=1; long sum=0;
printf ("输入一个正整数:");
scanf ("%d",&n);
while (i<n)
i+=2;
sum+=i;
if (n%2==0) n--;
printf ("输出1+3+5+…+%d=%1d\n",n,sum);
}
【提示】编译无错误,运行有错误。
程序运行示例:
输入一个正整数:10<回车>
输出1+3+5+…9=11
程序运行结果错误。
【解析】由于多个语句含义写错,造成逻辑错误:
long sum=0; 应改为 long sum=1;
while 循环语句,应改为:
while (i<n)
{
i+=2;
sum+=i;
}
n--; 应改为n++;
程序运行示例:
输入一个正整数:10<回车>
输出1+3+5+…+11=36
10. 以下程序在输入5,2之后的输出是 。
#include <stdio.h>
void main( )
{
int s,t,a,b;
scanf ("%d,%d",&a,&b);
s=1;
t=1;
if (a>0) s=s+1; /* ① */
if (a>b) t=s+t; /* ② */
else if (a==b) t=5;
else t=2*s;
printf ("s=%d,t=%d\n",s,t);
}
解:在输入5,2后,a=5,b=2。执行语句①,s=2,执行语句②,a>b为真,t=s+t=2+1=3。所以程序输出为:s=2,t=3
11. 阅读下面程序,回答指定的问题。
#include <stdio.h>
void main ( )
{
int a,b,m,n;
scanf ("%d%d,\n",&a,&b);
m=1;n=1;
if (a>0) m=m+n;
if (a<b) n=2*m;
else if (a==b) n=5;
else n=m+1;
printf ("m=%d n=%d\n",m,n);
}问:
(1)当输入为:-1 –2<回车>时,程序的运行结果是什么?
(2)当输入为:1 0<回车>时,程序的运行结果是什么?
(3)为了输出n=4,变量a和b应具备什么条件?
解:(1)m=1,n=1,输入后,a=-1,b=-2,a>0为假,a<b和a= =b 都为假,执行语句n=m+1=2; 所以输出为:m=1 n=2。
(2)m=1,n=1,输入后,a=1,b=0,a>0为真,执行语句m=m+n=2;a<b和a= =b都为假,执行语句n=m+1=3;所以输出为:m=2 n=3。
(3)要使n=4,就应执行语句m=m+n和n=2*m,为此要求满足条件a>0和a<b,即0<a<b。
12. 说明以下两个程序段的不同点。
程序段1:
int i,n=0;
for (i=0;i<10;i++)
{
n++;
if (i>5)continue;
}
printf ("i=%d,n=%d\n",i,n);
程序段2:
int i,n=0;
while (i<10)
{
n++;
if (i>5) continue;
i++;
}
printf ("i=%d,n=%d\n",i,n);
解:表面上看这两个程序段的功能是相同的,程序段2只是将程序段1中的for语句用相应的while语句替换。实际上,如果其中没有continue语句或将continue改为break语句,这两段程序的功能是相同的。但continue语句的功能是退出本次执行的循环体,重新开始下一次循环,对于for循环,<表达式3>不包含在循环体中,所以在下次循环之前执行<表达式3>,而while循环不包含<表达式3>。
对于程序段1,执行for语句,当i=6时,满足if条件,执行continue语句,执行i++,i值为7,执行下一次循环,如此直到<表达式2>即i<10不再满足,此时i=10,n=10。对于程序段2,执行while语句,当i=6时,满足if条件,执行continue语句,i值仍为6,执行下一次循环,满足if 条件,执行continue语句,i值仍为6,执行下一次循环……如此形成了死循环。
为了使程序段2与程序段1的功能等价,只需将与for语句<表达式3>对应的语句放在continue语句之前执行。即改为:
int n=0,i=0;
while (i<10)
{
n++;
i++;
if (i>5) continue;
}
printf ("i=%d,n=%d\n",i,n);
13. 试说明以下两个if语句的区别:
(1)if (x>0) (2)if (x>0)
if (y>0)n=1; {if (y>0)n=1;}
else n=2; else n=2;
答:前者属于第一种if单分支嵌套,如果x>0才执行内嵌的if语句,n赋值非1即2,如果x≤0,n不被赋值。后者属于第二种if-else双分支,如果x>0又执行一个嵌套的if单分支语句,y>0时n被赋值1,否则n不被赋值;如果x≤0,n被赋值2。
14. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main ( )
{
int a=2,b=2,x,y;
x=a++;
y=++b;
printf("%d,%d\n ",x,y);
printf("%d,%d\n",a++,++b);
}
运行结果是:
答案:运行结果是: 2, 3
3, 4
15. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main ( )
{
int a=3,b=7;
printf("%d, ",(a++)+(++b));
printf("%d, ",b%a);
printf("%d, ",!(a>b));
printf("%d ",a+b);
}
运行结果是:
答案:运行结果是:11, 0, 1, 12
16.阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main ( )
{
short n=65535;
n++;
printf("n=%d\n",n);
}
运行结果是:
答案:运行结果是:0
简析:65535的内存形式为11111111 11111111,其加1后就变为00000000 00000000,即是0。
17. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
int n;
printf ("输入序号");
scanf("%d", &n);
switch(n)
{
case 0: printf ("SUN\n");
case 1: printf ("MON\n");
case 2: printf ("TUE\n");
case 3: printf ("WED\n");
case 4: printf ("THU\n");
case 5: printf ("FRI\n");
case 6: printf ("SAT\n");
}
}
当输入4时,程序的运行结果是:
答案: THU
FRI
SAT
18. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
int n;
printf ("输入成绩");
scanf("%d", &n);
n/=10;
switch(n)
{
case 9: printf ("优\n");
case 8: printf ("良\n");
case 7: printf ("中\n");
case 6: printf ("合格\n");
default: printf ("差\n");
}
}
当输入53时,程序的运行结果是:
当输入79时,程序的运行结果是:
答:当输入53时,程序的运行结果是:
差
当输入79时,程序的运行结果是:
中
合格
差
19. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
int a,b,c;
a=2; b=3; c=1;
if(a>b)
if(a>c)
printf("%d\n",a);
else
printf("%d\n",b);
printf("end");
}
运行结果是:
答: end
20. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
int i,j;
for (i=1;i<=4;i++)
{
for (j=28-i*2;j>=1;j--)
printf(" ");
for (j=1;j<=2*i-1;j++)
printf("* ");
printf("\n");
}
for (i=3;i>=1;i--)
{
for (j=28-i*2;j>=1;j--)
printf(" ");
for (j=1;j<=2*i-1;j++)
printf("* ");
printf("\n");
}
}
运行结果是:
答案:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
21. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
int m,n,t,a,b;
printf("请输入2个数:");
scanf("%d,%d",&m,&n);
if(m<n)
{
t=m;m=n;n=t;
}
a=m;b=n;
while(n!=0)
{
t=m%n; m=n; n=t;
}
printf("%d\n%d\n",m,a*b/m);
}
该程序完成的功能是:
若输入6,32则运行结果是:
答案:功能是:求两个数的最大公约数和最小公倍数。
运行结果是:
2
96
22. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
char c;
int l,s,n,o;
l=0;s=0;n=0;o=0;
printf("请输入一行字符:");
while((c=getchar())!='\n')
{
if(c<='Z' && c>='A' || c<='z' && c>='a') l++;
else if(c<='9' && c>='0') n++;
else if(c==' ') s++;
else o++;
}
printf("\n%d,%d,%d,%d\n",l,s,n,o);
}
该程序完成的功能是:
若输入ab2. 3c7 **则运行结果是:
答案:
功能是:统计一行字符中字母、空格、数字、其它字符的个数。
运行结果是:
3,2,3,3
23. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
int n;
for(n=1;n<6;n++)
{
if(n%2)
{
printf("#");
continue;
}
printf("*");
}
printf("\n");
}
运行结果是:
答案:
运行结果是:
# * # * #
24. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
char i,j;
for(i='a',j='z';i<j;i++,j--)
printf("%c %c ",i,j);
printf("\n ");
}
运行结果是:
a z b y c x d w e v f u g t h s i r j q k p l o m n
25. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main( )
{
char c[7];
int i=0;
for (;i<7;c[i]=getchar(),i++);
for (i=0;i<7;i++) putchar(c[i]);
}
若输入 AB <回车>
CD<回车>
EFG<回车>
则运行结果是:
答案:运行结果是:
AB
CD
E
26. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main( )
{
char c1,c2,c3,c4;
c1='A'; c2='b';
c3=c1+('a'-'A');
c4=c2-('a'-'A');
printf("%c->%c\n",c1,c3);
printf("%c->%c\n",c2,c4);
}
答案:运行结果是:
A->a
b->B
27. 阅读程序,并按给定的输出格式将程序运行结果写在“运行结果:”之后
#include <stdio.h>
void main()
{
int a=1,b=2,c=3;
if(c=a) printf("%d\n",c);
else printf("%d\n",b);
}
运行结果:
答案:1
28.判断并纠正下列程序中的错误。
#include <stdio.h>
void main()
{
int n;
printf("n=");
scanf("%d",n);
if(n<7);
printf("n is less than 7\n");
if(n=>7)
printf("n is equal to or greater than 7\n");
}
答案:原语句1:scanf("%d",n); 应改为:scanf("%d",&n);
原语句2:if(n<7); 应改为:if(n<7)
原语句3:if(n=>7) 应改为:if(n>=7)
29.寻找下列程序代码中的错误并说明如何纠正。
#include<stdio.h>
void main()
{
int gender;
printf("gender=");
scanf("%d",&gender);
if(gender=1)
printf("Woman\n");
else;
printf("Man\n");
}
答案:原语句1:if(gender=1) 应改为:if(gender==1)
原语句2:else; 应改为:else
30. 寻找下列程序代码中的错误并说明如何纠正。
#include<stdio.h>
void main()
{
int n;
printf("n=");
scanf("%d",&n);
switch(n){
case 1: printf("The number is 1\n");
case 2: printf("The number is 2\n");
break;
default:
printf("The number is not 1 or 2\n");
}
}
答案:原语句 case 1: printf("The number is 1\n");
应改为: case 1: printf("The number is 1\n"); break;
31. 程序功能:求正整数n以内的奇数。请修改程序中的错误,并调试。
#include<stdio.h>
void main()
{
int n, i=1;
double sum=0;
printf("输入一个正整数:");
scanf("%d", &n);
while(i<n)
i+=2;
sum+=i;
if(n%2==0) n--;
printf("输出1+3+5+…+%d=%f\n", n, sum);
}
【提示】编译无错误,运行有错误。
程序运行示例:
输入一个正整数:10<回车>
输出1+3+5+…+9=11
程序运行结果错误。
答案:
原语句1:double sum=0; 应改为:double sum=1;
原语句2:i+=2; 应改为:{ i+=2;
原语句3:if(n%2==0) n - -; 应改为:if(n%2==0) n - -; }
32. 下列程序代码打印1到10的值,判断并纠正其中的错误。
#include<stdio.h>
void main()
{
int n=1;
while(n<10);
printf("%d\n",n);
}
答案:
原语句1:while(n<10); 应改为:while(n<=10) 或while(n<11)
原语句2:printf("%d\n",n); 应改为:printf("%d\n",n++);
33. 寻找下列程序代码中的错误并说明如何纠正。
#include<stdio.h>
void main()
{
for( y=.1;y!=1.0;y+=.1)
printf("%f\n",y);
}
答案:
原语句1:for( y=.1;y!=1.0;y+=.1) 应改为:for( int y=1;y!=10;y++)
原语句2:printf("%f\n",y); 应改为:printf("%f\n",(float)y/10);
四、编程题
1. 从键盘输入一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入a,则输出b。如果输入的字符不在26个英语字母中,则显示输入数据有误,如果输入的字符是z或Z,则输出a或A。
解:
#include <stdio.h>
void main( )
{
char c;
printf("Please enter a char:");
c=getchar( ); /*输入一个字符*/
if (c>='a'&&c<='y'||c>='A'&&c<='Y')
/*字符是除了z以外的是26个字母中的一个*/
putchar(c+1);
else if(c=='z'||c=='Z') /*字符是小写或大写的z*/
putchar(c-25);
else
printf("Data error!");
}
2. 编写程序,求a+aa+aaa+…+aa…a,其中a是一个数字。例如:3+33+333+3333+33333(此时n为5)。要求a和n从键盘输入,输出格式为3+33+333+3333+33333=37035。
解:方法一:
# include <stdio.h>
void main( )
{
int sum,s,j;
int i,a,n;
printf("\nEnter a and n:");
scanf("%d%d",&a,&n);
sum=0;
j=1;
for(i=n;i>0;i--)
{
s=i*j*a;
sum=sum+s;
j=j*10;
}
for(i=1;i<=n;i++)/*开始输出*/
{
for(j=1;j<=i;j++)
printf("%d",a);
if(i==n)
printf("=%1d\n",sum);
else
printf("+");
}
}
方法二:
#include <stdio.h>
void main( )
{
long sum,s,a;
int i,n,j,b;
printf("\nEnter a and n:");
scanf("%1d%d",&a,&n);
sum=0;
s=0;
b=a; /* 暂存a */
for(i=1;i<=n;i++)
{
s=s+a;
sum=sum+s;
a=a*10;
}
for(i=1;i<=n;i++)/*开始输出*/
{
for(j=1;j<=i;j++)
printf("%d",b);
if(i==n)
printf("=%1d\n",sum);
else
printf("+");
}
}
程序运行时,首先显示Enter a and n :
如果用户输入:2 5
则运行结果为:
2+22+222+2222+22222=24690
3. 编写程序,输入一个正整数,计算并显示该整数的各位数字之和,例如,整型数1987的各位数字之和是1+9+8+7,等于25。
解:
#include <stdio.h>
void main( )
{
int i,sum;
int k;
printf("\nEnter a integer:");
scanf("%d",&i);
sum=0;
while(i!=0)
{
k=i%10; /*取数字的最后一位*/
sum=sum+k; /*累加到计数器中*/
i=i/10; /*去掉数字的最后一位*/
}
printf("sum is %d\n",sum);
}
4. 在歌手大奖赛中有若干裁判为歌手打分,计算歌手最后得分的方法是:去掉一个最高分,去掉一个最低分,取剩余成绩的平均分。编写程序,输入一个歌手的若干成绩,以-1作为输入结束标记,计算歌手的最后得分。
解:
#include <stdio.h>
void main( )
{
float score,min,max,sum=0;
int i=0;
printf("\nEnter some score end with -1:");
scanf("%f",&score); /*输入第一个分数*/
min=max=score; /*设读入第一个分数为最高分和最低分*/
while(score!=-1)
{
i++; /*计数器增1*/
sum=sum+score; /*分数累加*/
scanf("%f",&score); /*输入下一个分数*/
if(score>max) /*刚输入的分数大于最高分*/
max=score;
if(score<min&&score!=-1) /*刚输入的分数小于最低分*/
min=score;
}
sum=sum-max-min; /*去掉一个最高分和一个最低分*/
printf("Final score is %6.2f\n",sum/(i-2)); /*输出最后的分数*/
}
运行情况:
Enter some score end with-1:9.8 9.75 9.65 9.88 9.76 –1
Final score is 9.77
5. 编写程序计算:
答:
程序如下:
#include <stdio.h>
void main ( )
{
int i, j, result=0;
printf ("Please input a integer:");
scanf("%d",&i);
if (i<=5)
for (j=1;j<=i;j++)
result=result+j;
else if (i>10)
result=i*i;
else
{
result=100;
for (j=i;j>=1;j--)
result=result-j;
}
printf ( "result=%d\n",result );
}
6. 编写一个程序能读入并计算一个只包含加减运算的表达式,每个输入的数据都是浮点数,除第一个数以外,其余每个数前面都有一个运算符,如“23+43-233+234;”表达式以分号“;”结束。
答:
程序如下:
#include<stdio.h>
void main ( )
{
float temp,sum;
char ch,operat;
printf ("\nplease input a digital expression:");
scanf ("%f",&sum);
ch=getchar( );
while(ch!=';')
{
scanf ("%f",&temp);
switch (ch)
{
case '+':
sum=sum+temp;
break;
case '-':
sum=sum-temp;
break;
default:
printf ("Error input\n");
return;
}
ch=getchar( );
}
printf ("%f\n",sum);
}
7. 编写一个程序求满足以下公式的变量k的最大值。
2k≤m
其中,m是程序输入的一个正整数。
答:
程序如下:
#include <stdio.h>
void main ( )
{
int i,k=0,m,temp=1;
printf ("Please input a integer(m):");
scanf ("%d",&m);
do
{
k++;
temp=temp*2;
}while(!(temp>=m));
printf ("m=%d\tk=%d\t2^%d>=%d\n",m,k,k,m);
}
8. 编写一个程序,找出被2,3,5整除时余数均为1的最小的10个自然数。
答:
程序如下:
#include <stdio.h>
void main ( )
{
int i=1;
int count=0;
printf ("\n能被2,3,5整除时余数为1的最小10个自然数是:\n");
while (count<=10)
{
if ((i%2==1)&&(i%3==1)&&(i%5==1))
{
count++;
printf ("%d\n",i);
}
i++;
}
}
9. 编写一个程序,用以记录在键盘上输入的字符个数,直到输入回车换行符时止。
【解】程序编写如下:
#include<stdio.h>
void main( )
{
int n= -1;
char ch;
do
{
n++;
}while((ch=getchar( ))!='\n');
printf("The character's number of input is %d.\n",n);
}
假如在键盘上输入abcdefg后回车,那么会显示信息:
The character’s number of input is 7.
程序里,之所以把变量n的初始值设置为-1,是为了确保计数的准确性。如果一开始就按回车键,那么n就应该是0。在程序设计中,这些细微之处是必须考虑到的。
10. 编写一个程序,它打印出个位数是6、且能被3整除的所有三位正整数及其个数。要求一行打印8个数据。
【解】题目中要求打印的是三位数,且个位数必须是6。因此可以for循环,它的循环控制变量从106开始,直到996为止,增量为10(因此要保证个位数是6)。由于还要打印这种数据的总个数,因此需要设置一个用于计数的变量,比如是count。发现一个这样的数,它就加1。为了满足一行打印8个数据要求,可以利用计数器count,让这样的数一个个地打印下去。如果count %8= =0,就打印一个回车换行。具体程序如下:
#include <stdio.h>
void main( )
{
int count=0,j;
for(j=106;j<=996;j+=10)
{
if(j%3!=0)
continue;
else
{
count++;
printf("%d\t",j);
if(count%8==0)
printf("\n");
}
}
printf("\nThe count is %d\n",count);
}
运行此程序,输出结果如下图所示。
11. 编写一个C语言程序,打印出如下的图形(a)(b)和(c)。
答:(a)的程序如下:
#include <stdio.h>
void main()
{
int x,y;
for(x=10;x>=1;x--)
{
for(y=1;y<=x;y++)
printf("* "); //打印一个*号和一个空格
printf("\n");
}
}
(b)的程序如下:
#include<stdio.h>
void main( )
{
int x,y;
for (x=1;x<=10;x++)
{
for(y=1;y<=10;y++)
if(y<=10-x)
printf(" "); //打印两个空格
else
printf("* "); //打印一个*号和一个空格
printf("\n");
}
}
(c)的程序如下:
#include <stdio.h>
void main( )
{
int x, y;
for(x=1;x<=10;x++)
{
for(y=1;y<=10;y++)
if(y<=x-1)
printf(" "); //打印两个空格
else
printf("* "); //打印一个*号和一个空格
printf("\n");
}
}
12. 利用下面的公式,求π的近似值:
π/4=1-1/3+1/5-1/7+…±1/n…
循环直到1/n的绝对值小于0.0001时止。
答:程序编写如下:
#include<stdio.h>
void main( )
{
double pi=0.0,n=1.0,y=1.0,x,z;
do
{
x=y/n;
pi+=x;
y*=-1.0;
n+=2;
z=x<0?-x:x;
}while(z>1e-7);
printf("¦Ð=%lf\n",4*pi);
}
程序中,不断在x里形成1/1、-1/3、1/5、-1/7等,并将其累加到pi上去。由y*=-1.0;构成每项的正负号。用变量z来控制循环的次数(不能直接用x来控制,因为它可能是负的。z里实际上是x的绝对值)。运行结束,输出结果:π=3.141598。
13. 应用switch语句,判断两个整数a和b的大小,或相等。例如,输入a=10,b=5,输出10>5;输入a=5,b=15,输出5<15;输入a=25,b=25,输出25=25。
【解析】
(1)分析题意,建立数据模型,设计算法。
switch语句的常量表达式不能用关系表达式。将关系表达式转换为序号:
pvalue=1 *(a>b)+2* (a= =b)+3*(a<b)
pvalue的值只能为1,或2,或3。pvalue作为switch语句的表达式,其常量表达式为1、2、3。
需要定义三个变量:
输入量 int a,b;
中间量 pvalue;
再确定执行步骤。用自然语言描述算法:
第一步 读入a,b。
第二步 应用switch多选一判定,并输出相应信息。
(2)编程。
#include <stdio.h>
void main ( )
{
int a,b,pvalue;
printf ("输入两个整数:");
scanf ("%d %d",&a,&b);
pvalue=1 * (a>b)+2*(a==b)+3*(a<b);
switch (pvalue)
{
case 1:printf ("输出:%d>%d\n",a,b);break;
case 2:printf ("输出:%d==%d\n",a,b);break;
case 3:printf ("输出:%d<%d\n",a,b);break;
}
}
(3)程序运行示例
输入两个整数:10 5
输出:10>5
输入两个整数:10 10
输出:10= =10
输入两个整数:5 10
输出:5<10
14. 输入起始年号,输出50年内的闰年。
【解析】
(1)分析题意,建立数据模型,设计算法。
这个问题比较简单,其算法描述如下:
输入起始年号year scanf (“%d”,&year);
生成50年年号,可用for循环实现:
for (y=year;y<year+50;y++)
if (y%4= =0&&y%100!=0‖y%400= =0) /* 判闰年*/
{
printf (“%5d”,y); /*输出闰年*/
count+ +; /*控制换行*/
if (count%10= =0)printf (“\n”)
}
(2)编程。
#include <stdio.h>
void main( )
{
int year ,count=0,y;
printf ("输入起始年号:");
scanf ("%d",&year);
for (y=year;y<year+50;y++)
if (y%4==0&&y%100!=0||y%400==0) /* 判闰年 */
{
printf("%5d",y);count++;
if(count%10==0) printf ("\n"); /* 控制换行*/
}
printf ("\n");
}
(3)程序运行示例:
输入起始年号:2000
2000 2004 2008 2012 2016 2020 2024 2028 2032 2036
2040 2044 2048
15. 求N内的勾股数(A2+B2=C2)A、B、C。
【解析】
(1)分析题意,建立数据模型,设计算法。
该问题可用枚举法实现,直接用C语言描述:
scanf (“%d”,&n); /* 输入n */
for (A=1;A<n-1;A++) /* 生成A值*/
for (B=A+1;B<n;B++) /*生成C值*/
{
C=(int)sqrt (A*A+B*B); /*计算C值*/
if (C<=n&&A*A+B*B==C*C) /* 输出勾股数*/
{
printf (“[%5d”“%5d”%5d] “,A,B,C);
count + +;
if (count%3= =0) printf (“\n”);
}
}
(2) 编程。
#include <stdio.h>
#include <math.h>
void main( )
{
int n,A,B,C,count=0;
printf("输入一个正整数:");
scanf ("%d",&n);
for (A=1;A<n-1;A++)
for (B=A+1;B<n;B++)
{
C=(int)sqrt(A*A+B*B);
if (C<=n&&A*A+B*B==C*C)
{
printf ("[%5d %5d %5d]",A,B,C);count++;
if (count%3==0)printf ("\n");
}
}
printf ("\n");
}
(3)程序运行示例
输入一个正整数:40
[ 3 4 5 ] [ 5 12 13 ] [ 6 8 10 ]
[ 7 24 25 ] [ 8 15 17 ] [ 9 12 15 ]
[ 10 24 26 ] [ 12 16 20 ] [ 12 35 37 ]
[ 15 20 25 ] [ 15 36 39 ] [ 16 30 34 ]
[ 18 24 30 ] [ 20 21 29 ] [ 21 28 35 ]
[ 24 32 40 ]
16. 找出1~999之内的能被3整除、且至少有一位数字为5的整数,以每行15个整数形式输出。
【解析】
(1)分析题意,建立数据模型,设计算法。
(2)编程。
#include <stdio.h>
void main ( )
{
int n,found1,found2,count=0,t;
for (n=1;n<=999;n++)
{
found1=0;found2=0;
if (n%3==0)found1=1; /*判别n能否被3整除*/
t=n; /*判别n是否含有数字5*/
while (found1 && t!=0 && !found2)
{
if (t%10==5)found2=1;
t/=10;
}
if (found1 &&found2) /* 输出满足条件的n和计数*/
{
printf ("%4d",n);
count++;
if(count%15==0) printf ("\n"); /*控制换行*/
}
}
printf ("\n");
}
(3)程序运行示例:
15 45 51 54 57 75 105 135 150 153 156 159 165 195 225
252 255 258 285 315 345 351 354 357 375 405 435 450 453 456
459 465 495 501 504 507 510 513 516 519 522 525 528 531 534
537 540 543 546 549 552 555 558 561 564 567 570 573 576 579
582 585 588 591 594 597 615 645 651 654 657 675 705 735 750
753 756 759 765 795 825 852 855 858 885 915 945 951 954 957
975
17. 有100g的药品,用天平称量,砝码只有1g、2g、5g共3种,问:若要求加的砝码总数为50个,有几种不同的加法?若要求总数为30个呢?请编程求解上述问题。
答案:本题的实质也是求不定方程的正整数解,由题意列出的不定方程为:x+2y+5(50-x-y)=100,化简为4x+3y=150,使用二重循环穷举所有可能的x、y的正整数值的组合,对每种组合分别判断是否满足方程。
#include <stdio.h>
void main ( )
{
int i,j,k,sum=0;
for (i=0;i<50;i++)
{
for (j=0;j<=50-i;j++)
{
k=50-i-j;
if (i+j*2+k*5==100)
{
++sum;
printf ("one result:%2d,%2d,%2d\n",i,j,k);
}
}
}
printf ("sum=%d",sum);
}
18. 编写一个程序,求满足以下条件的最大的n:
12+22+32+…n2≤1000
解:n从1开始,然后递增,并且每次计算累加平方和s,当s刚大于1000时,这时的n-1便是满足该条件的最大的值。程序如下:
#include <stdio.h>
void main ( )
{
int n,s;
s=n=0;
while (s<=1000)
{
++n;
s+=n*n;
}
printf ("n=%d\n",n-1);
}
本程序的执行结果为:
19. 编写一个程序,对于用户输入的正偶数n,将其分解成两个素数之和。
解:设用户输入的正偶数为a,a=b+d,b和d是两个素数。假定b是较小的素数,则b<=a/2,且至少是奇数。判定b是素数的方法是其不能被2到sqrt (b)之间的任何数除尽。程序如下:
#include <stdio.h>
#include <math.h>
void main( )
{
int a,b,c,d;
scanf ("%d",&a);
for (b=3;b<=a/2;b+=2)
{
for (c=2;c<=sqrt(b);c++) /*找素数b*/
if (b%c==0) break;
if (c>sqrt(b)) /*找到了素数b,求出d*/
{
d=a-b;
for (c=2;c<=sqrt (d);c++)/*判定d是否是素数*/
if (d%c==0)break;
if (c>sqrt(d)) /*d是素数,则找到了一个解,退出*/
{
printf ("%d=%d+%d\n",a,b,d);
break;
}
}
}
}
20. 两个乒乓球队进行比赛,各队出3人。甲队为A、B、C3人,乙队为X、Y、Z 3人。以抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比。请编写程序找出3对赛手的名单。
解:设X、Y、Z三位队员的编号分别为1、2、3。设a、b、c分别表示A、B、C三位队员的对手编号。显然有a、b、c互不相同(因为每人都有不同的对手),即a!=b &&b!=c && c!=a成立,另外依题意有a!=1 && c!=1 && c!=3成立。所以应满足条件:
a!=b && b!=c && c!=a && a!=1 && c!=1 && c!=3
采用三重for循环求解的程序如下:
#include <stdio.h>
void main( )
{
int a,b,c;
for (a=1;a<=3;a++)
for (b=1;b<=3;b++)
for (c=1;c<=3;c++)
if (a!=b && b!=c &&c!=a && a!=1 && c!=1 && c!=3)
// 已经找到各自的对手,则输出结果
{
printf ("A<-> %c\n",char(a+'W'));
printf ("B<-> %c\n",char(b+'W'));
printf ("C<-> %c\n",char(c+'W'));
}
}
本题求解结果如下:
21. 验证:任何四个相邻的自然数(0除外)的乘积不是完全平方数,但乘积加1后则是完全平方数,如:15 * 16 * 17 * 18=73440不是,但73441=271*271是。用指针实现。
答:验证一个自然数是否完全平方数,可将这个数先开方再平方,看能否得到原数。
#include <stdio.h>
# include <math.h>
void main()
{
int n,s;
double r;
printf ("input n:");
scanf ("%1d",&n);
s=n*(n+1)*(n+2)*(n+3);
r=sqrt(s);
if (s!=r*r)
printf ("n=%d\ts=%d\tsqrt(%d)=%f\n",n,s,s,r);
else
{
printf ("结论错误!\n");
return;
}
s++;
r=sqrt(s);
if(s==r*r)
{
printf ("%d+1=%d=%d*%d\n",s-1,s,(int)r,(int)r);
printf ("结论正确\n");
}
else printf ("结论错误!\n\n");
}
运行示例:input n:
n=5 s=1680 sqrt (1680)=40.987803
1680+1=1681=41*41
结论正确
22. 编写程序,求e的值。e≈1+1/1!+1/2!+1/3!+1/4!+…+1/n!
(1)用for循环,计算前50项。
(2)用while循环,要求直至最后一项的值小于10-4。
【分析与解答】
(1)本题的基本算法是求累加值。累加项的分子部分都是1;分母的值有规律的递增,依次为1!、2!、…、n!,即,若第i-1项的累加项为t i-1,则第i项的累加项是t i-1/i,在程序中可用表达式:t=t/i(i从1变化到n)来表示。
(2)根据以上分析,若用变量t来存放累加项,当i的值从1变化到n时,可用以下语句来实现累加:
t=t/i; e+=t;
(3)为了实现累加过程,以上语句应当放在循环内,循环控制变量从1变化到n。
(4)若用for循环,按题目要求已指定n的值是50。若用while循环,并没有指定n的值,但已指定了循环结束的条件,当t的值小于10-4结束循环。
(5)现例示用while循环来求e值的部分程序:
i=1;e=1.0;t=1.0;
while(t>=le-4)
{
t=t/i;
e+=t;
i++;
}
(6)请读者自己对变量做出正确的定义,设计输出语句,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。
(7)e的值应当是:2.71828。
(8)根据以上分析,读者已不难用for循环来实现求e值的计算。
(9)注意:在完成此程序时,不要对分母中的阶乘值进行单独计算,因为17!的值已超过int类型的最大值,更无法求到50!。
23. 编写程序,对输入的一行数字字符(用回车结束,每个数字字符的前后都有空格),把这一行中的所有数字转换成一个整数。例如,若输入(<CR>代表Enter键):
2 4 8 3 <CR>
则输出整数:2483。
【分析与解答】
(1)一行字符的读入,程序段如下。循环体内的“……”符号表示需要在循环体内完成的其他操作。
ch=getchar( );
while(ch!='\n')
{ ……
ch=getchar( );
}
(2)在本题中循环体内需要把读入的所有数字字符转换成一个整数。若用变量n来存放这个整数,为了保证有效的存放,应当把它定义成long类型。
(3)要把输入的一串数字字符转换成一个整数,首先需要判断当前读入的字符是否是数字字符,若不是则什么也不做;若是,则进行以下操作:
①把当前读入的一个字符转换成一个一位整数,这可由语句“d=ch-'0';”来实现,在这里d是一个整型变量;
②把d中的一位数归并到n的低位中,这可用语句“n=n *10+d;”来实现。这里所述的操作可由以下语句来完成:
if(ch>='0'&&ch<='9'){d=ch-'0';n=n * 10+d;}
if语句后一对括号中的判断表达式可以调用字符函数isdigit来实现:
if(isdigit(ch)){d=ch-'0'; n=n * 10+d;}
if子句的两个语句可以合并成:n=n * 10+ch-'0';。
(4)把(3)中的语句放入循环中:
ch=getchar( );
while(ch!='\n')
if(ch>='0'&&ch<='9') n=n*10+ch-'0';
ch=getchar( );
(5)请自己写出定义语句并赋初值。注意,最后输出n时,应当使用格式说明%1d,而不能使用%d。
24. 编写输出以下图案的程序,图案的行数由输入的值确定。
【分析与解答】
(1)若图案的行数输入到变量L中。
(2)按要求L决定了图形的行数,因此可通过循环来实现L行的输出;
for(i=1;i<=L;i++)
{ …… }
循环体中的“……”号,代表输出L行的操作。
(3)假定ch中存放了一个字符,我们知道,通过以下循环可以在一行上输出n个字符:
for(j=1;j<=n;j++)putchar(ch);
putchar('\n' );
注意,在循环后putchar('\n' );语句不可少,它用以换行。
(4)现在应当解决如何按要求给出每行输出的字符。由图分析,行数(或行号)为1时输出字符A,行数为2时输出字母B……若输出的字母放在变量ch中,行号取决于外循环的控制变量i,则输出的字母和行号的关系可用表达式:ch='A'+i-1来表示。当i为1时ch中被赋予字母A,当i为2时ch中被赋予了字母B,其他依次类推。因此,在此表达式后,利用(3)中的循环就解决了各行上输出的字母。
(5)按要求每行输出的字母的个数不同,第二行输出3个字母,第三行输出5个字母,第四行输出7个字母……(3)中for循环体的执行次数取决于n的值,也就是说n的值决定了每行输出字母的个数。其实,n的值与行号有着密切的关系:n=2*i-1, 当i为1时n的值是1、当i为2时n的值是3、当i为3时n的值是5、当i为4时n的值是7。因此在(3)中for循环之前可用此表达式求出n的值。
(6)总结以上分析,我们可得到以下的程序段:
for(i=1;i<=L;i++)
{
ch='A'+i-1;
n=2*i-1;
for(j=1;j<=n;j++)putchar(ch);
putchar('\n');
}
若所用的变量都已正确定义,通过输入L的值为5,则程序段在第一列起有以下的输出结果:
和题目的要求比较已趋接近,不同的是在每行没有适当的缩进。
(7)现在来解决每行的缩进问题。由题中给出的图形可知,若指定输出5行,第一行缩进5个空格,第二行则缩进4个空格,第三行则缩进3个空格,第四行则缩进2个空格,第五行则缩进1个空格。这同样可以由以下的for循环来实现:
for(k=L;k>=i;k--)putchar('');
把此循环放在i控制的循环体内、输出每行字符的循环之前即可。
(8)请读者自己补充有关的include行、语句和变量的定义,以完成整个程序。注意,如果有能力可在某些地方作些简化。
25. 用for循环分别编程计算下式,变量用float类型,试分析结果不同的原因。
S=1-1/2+1/3-1/4+…+1/9999-1/100000
(1)从左到右计算。
(2)从右到左计算
答:只写出程序的主要语句:
(1)float i,s=0,t= -1;
for (i=1;i<=10000;i++){t=-t;s+=t/i;}
printf (“s=%f\n”,s);
(2)float i,s=0,t=1;
for (i=10000;i>=1;i--){t=-t;s+=t/i;}
printf (“s=%f\n”,s);
运算结果对比:(1)0.693091 (2)0.693097
运算按从左到右,结果精度较低。因为当s达到一定值时,后面的1.0/i的值相对s来说太小,一些小数位将不能加到s上而丢失,即俗称“丢失零头”。如取相反顺序,从右向左计算,可使较多的低位有效数字参加运算,实现“聚零为整”,结果精度较高。如果改用double类型计算,便可发现0.693097是比较准确的。
26. 由ex=1+x+x2/2!+x3/3!+x4/4!+…+xn/n!+…,计算ex的近似值,并与标准函数exp(x)结果相比较,N、X的值由键盘输入,N、X的值宜小不宜大,如N=10,X=0.1。
答:除n以外,变量类型皆定义为double,使计算精度高一些。
#include <stdio.h>
#include <math.h>
void main( )
{
int n;
double e=1,x,i,j=1,m=1;
printf ("n,x=");scanf ("%d %lf",&n,&x);
for (i=1;i<=n;i++)
{
j*=i;m*=x;e+=m/j;
}
printf ("e=%12.9f exp(x)=%12.9f\n",e,exp(x));
}
运行结果:n,x=5 0.1
e=1.105170917 exp(x)=1.105170918
27. 求无符号整型数范围内最大的一个素数。
答 要点:从最大长整型数向递减方向查找,找到的第一个素数则是最大的素数。
#include <stdio.h>
#include <math.h>
void main( )
{
unsigned int n=-1,i,k; /* 赋值用n=-1,n即为最大无符号整型数*/
while (n-=2) /*从大向小查找*/
{
k=sqrt (n);
for (i=2;i<=k;i++)
if (n%i==0)break; /* 已判断n不是素数,结束for循环*/
if (i>=k+1)
{
printf ("max=%lu\n",n);
break;
} /*找到了结束while循环*/
}
}
运行结果:max=4294967291
28. 甲乙丙三个步枪射手,命中率分别为0.7、0.6、0.5,按“甲→乙→丙→甲→乙→丙→…”的顺序,相继射击同一目标,直至有人命中为止。试模拟击中100个目标,所需要的子弹数。
答 要点:循环100次,模拟击中100个目标。设子弹数s,开始为0。执行一次s++,产生一个0~1之间的随机数,相当于一次射击。每轮第1个随机数如小于等于0.7,则认为甲命中,开始下一目标的射击;否则,产生第2个随机数,如小于等于0.6,则认为乙命中,开始下一目标的射击;否则,产生第3个随机数,如小于等于0.5,则认为丙命中,开始下一目标的射击;否则按上述规则,从甲开始再射击这一目标,直到有人命中。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main( )
{
int i,s=0;
srand(time(NULL)); //初始化随机数种子
for (i=1;i<=100;i++)
{
while(1)
{
s++;
if ((rand()%100/100.0)<=0.7) break;
s++;
if ((rand()%100/100.0)<=0.6) break;
s++;
if ((rand()%100/100.0)<=0.5) break;
}
}
printf ("s=%d\n",s);
}
29.编写一个程序,输入三条线段的长度,判断这三条线段能否构成一个直角三角形。
答案:
#include <stdio.h>
void main()
{
float a,b,c;
printf("请输入三条线段的长度:");
scanf("%f,%f,%f",&a,&b,&c);
if(a*a+b*b == c*c || a*a+c*c == b*b || b*b+c*c == a*a)
printf("这三条线段能构成直角三角形。\n");
else
printf("这三条线段不能构成直角三角形。\n");
}
30. 编写一个程序,求输入实数的绝对值。
答案:
#include <stdio.h>
void main()
{
float x,y;
printf("请输入一个实数:");
scanf("%f",&x);
if(x>0) y=x;
else y=-x;
printf("%f的绝对值是%f\n",x,y);
}
31. 编写一个程序,输出给定月份的天数。
答案:
#include <stdio.h>
void main()
{
int year,mon,days,leap;
printf ("请输入年份月份");
scanf("%d.%d", &year,&mon);
switch(mon)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: days=31;break;
case 4:
case 6:
case 9:
case 11: days=30;break;
case 2:
if(year % 400 == 0 || (year%4 == 0 && year%100 != 0)) days=29;
else days=28;
}
printf ("%d年%d月的天数为%d天\n",year,mon,days);
}
32. 编写一个程序,输入一个不多于5位的正整数,求出它是几位数。
提示:注意整型变量的范围。
答案:
#include <stdio.h>
void main()
{
int len,t=0;
int n;
printf("请输入一个整数:");
scanf("%ld",&n);
if(n<0||n>=100000) t=1;
else if(n<10) len=1;
else if(n<100) len=2;
else if(n<1000) len=3;
else if(n<10000) len=4;
else len=5;
if(t==0) printf("该整数是个%d位数。\n", len);
else printf("输入负数或大于5位,无法求解。\n");
}
33. 编写一个程序,根据输入的a,b,c的值,求出x的值。
c/b 若a=0时
x = a*c 若a!=0且b=0时
a+b+c 其它情况
答案:
#include <stdio.h>
void main()
{
float a,b,c,x;
printf("请输入a,b,c的值:");
scanf("%f,%f,%f",&a,&b,&c);
if(a==0) x=c/b;
else if(b==0) x=a*c;
else x=a+b+c;
printf("x=%f\n", x);
}
34. 某市企业管理测评中,若企业得分低于70的为较差企业,以“#”表示,若得分在70到80之间的为中等企业,以“*”表示,若得分在80到90之间的为良好企业,以“**”表示,若得分在90以上的为优秀企业,以“***”表示,利用if-else结构编写一个程序,对于输入的企业成绩,输出相应的级别标志。
如:输入89,输出 **。
答案:
#include <stdio.h>
void main()
{
float x;
printf("请输入企业的得分情况");
scanf("%f",&x);
if (x<0||x>100)
printf("输入错误,请校对后重新输入。\n");
else if (x<70)
printf("#\n");
else if (x<80)
printf("*\n");
else if(x<90)
printf("**\n");
else
printf("***\n");
}
35. 编写一个程序,输入某年某月某日,判断该日是这一年的第几天。
提示:以3月5日为例,先把前两个月的天数加起来,然后再加上5天即本年的第几天;特殊情况,闰年且输入月份大于3时需考虑多加一天。
答案:
#include <stdio.h>
void main()
{
int day,month,year,sum,leap;
printf("\n请输入年.月.日:\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month) /*先计算某月以前月份的总天数*/
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("data error");break;
}
sum=sum+day; /*再加上某天的天数*/
if(year%400==0||(year%4==0&&year%100!=0)) /*判断是不是闰年*/
leap=1;
else
leap=0;
if(leap==1&&month>2) /*若是闰年且月份大于2,总天数加一*/
sum++;
printf("这是%d的第%d天。\n",year,sum);
}
36. 编写一个程序,求一个四位数,它的十位上的数字是1,个位上的数字为2,且这个数能被7、8、9整除。
答案:
#include <stdio.h>
void main()
{
int n,a,b;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
{
n=1000*a+100*b+10+2;
if(n%7==0&&n%8==0&&n%9==0)
printf("n=%d\n", n);
}
}
37. 某些三位数,各位数字立方和等于该数本身,被称为水仙花数,编写程序输出这些数。
答案:
#include <stdio.h>
void main()
{
int n,a,b,c;
printf("the numbers are:");
for (n=100;n<=999;n++)
{
a=n/100;
b=(n-a*100)/10;
c=n%10;
if(n==a*a*a+b*b*b+c*c*c) printf("%d ",n);
}
printf("\n");
}
38. 编写程序求出1!+2!+3!+……+20!。
答案:
#include <stdio.h>
void main()
{
float s=0,t;
int n,i;
for(n=1;n<=20;n++)
{
for(i=1,t=1;i<=n;i++)
t=t*i;
s=s+t;
}
printf("the sum is:%e.\n",s);
}
39. 1、2、3、4这四个数字,能组成多少个互不相同且无重复数字的三位数?编写程序输出这些数。
答案:
#include <stdio.h>
void main()
{
int i,j,k;
printf("\n");
for(i=1;i<5;i++)
for(j=1;j<5;j++)
for (k=1;k<5;k++)
if (i!=k&&i!=j&&j!=k)
printf("%d,%d,%d\n",i,j,k);
}
40. 编写程序输出九九乘法口诀表。
答案:
#include <stdio.h>
void main()
{
int i,j,result;
printf("\n");
for (i=1;i<10;i++)
{
for(j=1;j<10;j++)
{
result=i*j;
printf("%d*%d=%-3d",i,j,result);
}
printf("\n");
}
}
41. 编写程序将输入的十进制正整数转换成十六进制整数后输出。
答案:
#include <stdio.h>
void main()
{
int n,b[20],i=0,j;
printf("\n请输入一个正整数:");
scanf("%d",&n);
while (n>0)
{
b[i++]=n%16; n=n/16;
}
printf("对应的十六进制整数:");
for(j=i-1;j>=0;j--)
{
if(b[j]<=9)
printf("%d",b[j]);
else
{
switch(b[j])
{
case 10: printf("A");break;
case 11: printf("B");break;
case 12: printf("C");break;
case 13: printf("D");break;
case 14: printf("E");break;
case 15: printf("F");break;
}
}
}
printf("\n");
}
42.编写程序,由输入的第一个字母来判断是星期几,若第一个字母一样,则继续判断第二个字母。直到输入*0,就不再判断了。
如:输入s,输出error;
输入S,则要求再输入第二个字符,若再输入u,则判断为周日,输出为Sunday,并可继续判断,若输入*,则退出判断,结束结束执行。
答案:
#include <stdio.h>
void main( )
{
char c;
printf("请输入第一个字符:\n");
while ((c=getchar())!='*')
{
switch (c)
{
case 'S':
printf("请输入第二个字符\n");
c=getchar();
if(c=='a')
printf("%c->Saturday\n",c);
else if (c=='u')
printf("%c->Sunday\n",c);
else
printf("error\n");
break;
case 'F':
printf("%c->Friday\n",c); break;
case 'M':
printf("%c->Monday\n",c); break;
case 'T':
printf("请输入第二个字符\n");
c=getchar();
if(c=='u')
printf("%c->Tuesday\n",c);
else if (c=='h')
printf("%c->Thursday\n",c);
else
printf("error\n");
break;
case 'W':
printf("%c->Wednesday\n",c); break;
default: printf("error\n");
}
}
}
43. 编写程序,使输入的字符按字母表后移一位。
如:输入s,输出t;
输入S,输出为T。
答案:
#include <stdio.h>
void main( )
{
char c;
printf("请输入字符:\n");
while ((c=getchar())!='\n')
{
if((c>='a'&&c<='y')||( c>='A'&&c<='Y'))
c++;
else if(c=='z'||c=='Z')
c-=25;
printf("%c",c);
}
}
44. 判断用户输入的字符是数字字符、字母字符还是其它字符。
【解】数字字符是'0'~'9',字母字符是'a'~'z'或'A'~'Z',其余为其它字符。程序如下:
#include<stdio.h>
void main()
{
char c;
printf("输入一个字符:"); scanf("%c",&c);
if(c>='0'&&c<='9')
printf("\n%c是数字字符\n\n",c);
else if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
printf("\n%c是字母字符\n\n",c);
else
printf("\n%c是其它字符\n\n",c);
}
45.求s=1!+ 2!+ … + n!的值。
【解】当前阶乘值由前一个阶乘值乘以循环变量值来求得。程序如下:
#include <stdio.h>
void main()
{
int i,s=0,t=1,n;
printf("输入n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
t=t*i; s=s+t;
}
printf("s=%d\n",s);
}
46. 将用户输入的一个正整数颠倒输出。
【解】对于正整数n,从个位起,依次取出并输出。程序如下:
#include <stdio.h>
void main()
{
int n,d;
printf("输入一个正整数:");
scanf("%d",&n);
printf("颠倒结果:");
do
{
d=n%10;
printf("%d",d);
n=n/10;
}while(n!=0);
printf("\n\n");
}
47.求满足如下条件的最大的n:12 + 22 + 32 + … + n2 ≤1000
【解】采用穷举法求解,n从1开始,然后依次递增,对每个n值计算累加平方和s,当s大于1000时,此时的n-1即为所求。程序如下:
#include<stdio.h>
void main()
{
int n=0,s=0;
while(s<=1000)
{
++n;
s=s+n*n;
}
printf("n=%d\n\n",n-1);
}
48.某人买了一堆糖,每天吃掉一半后,再多吃一颗,天天如此,过了三天就只剩下一颗,问该人共买了多少颗糖。
【解】采用迭代法,设迭代变量为n,其初值为1,迭代表达式为n=(n+1)*2,迭代条件为1 ≤ i ≤ 3。程序如下:
#include<stdio.h>
void main()
{
int i,n=1;
for(i=3;i>=1;i--)
n=(n+1)*2;
printf("n=%d\n\n",n);
}
49.编写程序。功能是找出1000之内的所有完数。一个数如果恰好等于它的因子之和,这个数就称为“完数”。( 例如,6的因子为1、2、3,而6=1+2+3,因此6是完数。)
答案:
#include <stdio.h>
void main()
{
int m,sum,i;
for(m=2;m<1000;m++)
{
sum = 0 ;
for(i=1;i<m;i++)
if(m % i == 0 ) sum=sum+i;
if( sum == m ) printf("%d 是一个完数\n",m);
}
}
50. 编写程序。功能是找出1至99之间的全部同构数。所谓同构数是这样的一组数:它出现在平方数的右边。(例如:5是25右边的数,25是625右边的数,5和25都是同构数。)
答案:
#include <stdio.h>
void main()
{
int i;
for(i=1;i<=9;i++)
if(i * i % 10 == i) printf("%3d是同构数\n", i );
for(i=10;i<100;i++)
if( i * i % 100 == i) printf("%3d是同构数\n", i );
}
51.程序的功能是打印100以内个位数为6且能被3整除的所有数。
答案:
#include <stdio.h>
void main()
{
int i,j;
for(i=0; i<=9; i++)
{
j=i * 10 +6;
if (j %3 != 0) continue;
printf("%d\n",j);
}
}
52.编写程序。计算100——1000数值范围内各位数字之和为5的数,并输出该数,每行输出五个数。
答案:
#include <stdio.h>
void main()
{
int i,sum,n,count=0;
for (i=100;i<1000;i++)
{
sum=0;
n=i;
while(n!=0)
{
sum=sum+n%10;
n=n/10;
}
if (sum!=5) continue;
else
{
count++;
printf("%5d",i);
if(count%5==0) printf("\n");
}
}
printf ("%d\n", count) ;
}
53.编写程序。打印出100以内个位数为6,并且能被3整除的所有数。
答案;
#include <stdio.h>
void main()
{
int m,n;
for (m=0;m<=9;m++)
{
n=m*10+6;
if(n%3!=0) continue;
printf("%d\n",n);
}
}