C语言练习题1-5及参考答案 下载本文

i=i0+1;

练习题5及参考答案

if (i==20) break; }

B. for (i=1;;i++) sum=sum+1; 1. 单项选择题

C. k=0; do (1)语句while (!e);中的条件!e等价于 。

{ A. e==0

B. e!=1

C. e!=0

++k;

D. ~e

} while (k<=0); 【答】!e等价于!(e!=0),即e==0。本题答案为A。

D. s=3379;

(2)下面有关for循环的正确描述是 。

while (s++%2+3%2) A. for循环只能用于循环次数已经确定的情况 s++; B. for循环是先执行循环体语句,后判定表达式 【答】A C. 在for循环中,不能用break语句跳出循环体

D. for循环体语句中,可以包含多条语句,但要用花括号(7)与以下程序段等价的是____。 括起来

while (a) 【答】D

{

(3)C语言中 。

if (b) continue; A. 不能使用do-while语句构成的循环

c; B. do-while语句构成的循环必须用break语句才能退出 }

C. do-while语句构成的循环,当while语句中的表达式值A. while (a)

为非零时结束循环

{ if (!b) c; }

D. do-while语句构成的循环,当while语句中的表达式值C. while (c)

为零时结束循环

{ if (b) c; }

【答】D

c; } (4)C语言中while和do-while循环的主要区别【答】A

是 。

(8)以下程序的输出结果是____。 A. do-while的循环体至少无条件执行一次

#include B. while的循环控制条件比do-while的循环控制条件严格

main() C. do-while允许从外部转到循环体内 {

D. do-while的循环体不能是复合语句

int i;

【答】A

for (i=4;i<=10;i++) (5)以下程序段 。 {

int x=-1; if (i%3==0) continue; do printf(\{

} x=x*x; } }

A. 45

B. 457810 while (!x);

D. 678910

A. 是死循环

B. 循环执行二次

【答】B

C. 循环执行一次

D. 有语法错误

(9)以下程序的输出结果是____。 【答】C

#include (6)下列语句段中不是死循环的是____。

main() A. i=100;

{

while (1) int num=0; { while (num<=2) {

25

B. while (c)

D. while (a)

{ if (b) break;

C. 69

{ if (!b) break; c; }

num++;

printf(\ } } A. 1

B. 1

C. 1

D. 1

2

2 2

3

3

4

【答】C

2. 填空题

(1)以下程序的运行结果是____。 #include main() {

int s=0,k; for (k=7;k>=0;k--) {

switch(k) {

case 1: case 4:

case 7: s++; break; case 2: case 3: case 6: break; case 0:

case 5: s+=2; break; } }

printf(\}

【答】s=7

(2)以下程序的运行结果是 。

#include main() { int i=1,s=3; do { s+=i++;

if (s%7==0)

continue; else

++i;

} while (s<15); printf(\

}

【答】执行第1次循环时,i++返回1,i=2,s=3+1=4,执行else部分,i=3;执行第2次循环时,i++返回3,i=4,s=4+3=7,执行if部分;执行第3次循环时,i++返回4,i=5,s=7+4=11,执行else部分,i=6;执行第4次循环时,i++返回6,i=7,s=11+6=17,执行else部分,i=8,此时while条件不满足,退出循环。所以输出结果为:8。

(3)以下程序的运行结果是____。 #include main() {

int i,j;

for (i=4;i>=1;i--) {

printf(\

for (j=1;j<=4-i;j++) printf(\ printf(\ } }

【答】使用两重循环。本题答案为:

* ** *** ****

(4)以下程序的运行结果是____。 #include 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(\ printf(\ } }

【答】使用两重循环。本题答案为: 1 2 2 3 3 3

26

4 4 4 4 5 5 5 5 5 6 6 6 6 6 6

(5)以下程序的运行结果是____。 #include main() {

int i,j,k; for (i=1;i<=6;i++) {

for (j=1;j<=20-3*i;j++) printf(\ for (k=1;k<=i;k++) printf(\ for (k=i-1;k>0;k--) printf(\ printf(\ } }

【答】使用两重循环。本题答案为: 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 5 6 5 4 3 2 1 (6)以下程序的运行结果是____。 #include main() {

int i,j,k; for (i=1;i<=4;i++) {

for (j=1;j<=20-3*i;j++) printf(\ for (k=1;k<=2*i-1;k++) printf(\ printf(\ }

for (i=3;i>0;i--) {

for (j=1;j<=20-3*i;j++) printf(\ for (k=1;k<=2*i-1;k++) printf(\ printf(\ } }

【答】使用两重循环。本题答案为:

* * * * * * * * * * * * * * * * * * * * * * * * *

3. 编程题

(1)编写一个程序,求

之值。【解】使用一个for循环即可。程序如下: /*文件名:exci5_1.cpp*/ VC++6.0 #include main() {

int i; float s; s=0;

for (i=1;i<=100;i++) {

if (i%2==0)

/*i为偶数*/

s=s-1.0/i; else

/*i为奇数*/

s=s+1.0/i; }

printf(\}

程序运行结果: s=0.688172

(2)编写一个程序,求s=1+(1+2)+(1+2+3)+?+(1+2+3+?+n)的值。

【解】采用两层循环求解,外层i从1到n,里层从1到i。程序如下:

/*文件名:exci5_2.cpp*/ VC++6.0 #include main() { int i,j,s1,s=0,n; printf(\输入n:\ scanf(\ for (i=1;i<=n;i++) { s1=0;

/* 求1+ ? +i */

for (j=1;j<=i;j++)

27

}

}

s1=s1+j; }

do {

d=n; printf(\n=n/10;

s=s+s1;

printf(\

(3)编写一个程序,对用户输入的字符流(以Ctrl+Z结束)中的行、单词和字符个数进行统计。

【解】用nc、nl和nw分别统计字符个数、行数和单词数。使用lnword作为单词开始与否的标记,开始时为0。lnword=0表示一个单词可以开始计数,为了使一个单词只计一次,在遇到单词的第一个字符后让lnword为1。程序如下: /*文件名:exci5_3.cpp*/ #include #define EOF -1 #define YES 1 #define NO 0 main() { }

(4)编写一个程序,用户输入一个正整数,把它的各位数字前后颠倒一下,并输出颠倒后的结果。

【解】对于正整数n,从高位到低位依次计算出它的各位上的数字d,在计算出d后立即输出该数字,输出序列构成的数正好是n的各位数字前后颠倒的结果。程序如下: /*文件名:exci5_4.cpp*/ #include main() {

int n,d;

printf(\输入一个正整数:\scanf(\printf(\颠倒结果:\

28

VC++6.0 int c,nl,nw,lnword,nc; lnword=NO; nl=1;nw=nc=0;

while ((c=getchar())!=EOF) /*按Ctrl+Z输入结束*/ { }

printf(\字符个数:%d,行数:%d,单词个

nc++;

if (c=='\\n') nl++; /*增加一行*/

if (c==' ' || c=='\\n' || c=='\\t') lnword=NO; /*else if (lnword==NO) { }

lnword=YES;++nw;

VC++6.0 } while (n!=0); printf(\

(5)编写一个程序,求输入的三个正整数的最小公倍数。 【解】采用穷举法求解。输入三个整数分别为x,y和z,该最小公倍数一定是x的倍数。程序使用while循环,倍增x查找满足s % y == 0 && s % z == 0条件的s。程序如下: /*文件名:exci5_5.cpp*/ #include main() { }

(6)编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12。

【解】采用穷举法求解。使用两重for循环嵌套语句,i、j、k分别表示该数的百位数、十位数、个位数,i只能是2,j和k进行循环。程序如下: /*文件名:exci5_6.cpp*/ #include main() { }

(7)编写一个程序,求出满足下列条件的四位数:该数是个完全平方数,且第一、三位数字之和为10,第二、四位数字之积为12。 【解】采用穷举法求解。该数是一个四位数,其平方数只能在32到99之间,使用一个for循环即可。程序如下:

int i,j,k; i=2;

for (j=0;j<=9;j++)

for (k=0;k<=9;k++)

if (i*j*k==42 && i+j+k==12)

printf(\

VC++6.0 int x,y,z,s;

printf(\输入三个整数=>x,y,z:\scanf(\s=x; while (1) { }

printf(\最小公倍数:%d\\n\

if (s%y==0 && s%z==0)

break; s+=x;

VC++6.0 不计空白符*/

数:%d\\n\