朱昌杰 C语言程序设计课本习题解答 - 图文

更新时间:2023-12-07 04:28:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习题1

一.选择题

(1) 以下叙述正确的是( )

A. 计算机不仅能执行机器语言程序,也可以直接执行其它高级语言编写的程序

B. 汇编语言是一种面向机器的低级语言,所以计算机可以直接执行用汇编语言编写的源程序

C. 高级语言是与自然语言或数学语言相近的计算机语言,用高级语言编写的源程序计算机都不能直接执行 D. 用高级语言编写的源程序只能经过解释程序边解释边执行 (2) 以下不正确的概念是( ) A. 一个C程序必须包含一个main函数 B. 一个C程序可以只有一个语句 C. 一个C程序可以由一个或多个函数组成 D. 一个C语言函数可以没有任何可执行语句 (3) 在C语言程序中( )。 A. main函数必须放在程序最前头 B. main函数必须放在程序最后 C. main函数必须放在所有函数之前

D. main函数可以放在程序任何允许放置函数的位置 (4) 以下C语言源程序的书写格式不正确的是( ) A. 正确的函数首部,其后必须加上分号 B. 分号是语句的一部分 C. 一行上可以书写多条语句 D. 一个语句可以写在多行之上 (5) 以下不正确的叙述是( )

A. 一个#include命令只能指定一个被包含文件 B. 一个#include命令可以指定多个被包含文件

C. 在#include命令中,文件名可以用尖括号或双引号括起来 D. 一个C程序中,可以使用多个#include文件包含命令 二.填空题

(1) 计算机程序设计语言分为 语言、 语言和 语言。

(2) 正确的算法应具有五个重要的特征是:① ,② ,③ ,④ ,⑤ 。 (3) 算法的表示方法主要有 、 、 、自然语言和 语言等。(4) 程序设计方法主要分为 程序设计方法和 程序设计方法。 (5) C语言的函数一般由 和 两部分组成。 (6) 注释部分从 开始,以 结束。 (7) 任何C程序的执行都是从 函数开始。 (8) 函数体一般包括 部分和 部分。

(9) 一个C语言程序由若干个函数组成,其中必须有一个 函数。 三.编程题

(1) 上机运行本章例题,熟悉所用C语言系统(如:Turbo C/C++和Visual C++ 6.0等)的上机方法与步骤。(2) 参照本章例题编写一个C语言程序,并上机运行,要求输出一下信息: **************************** Hello,World!

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

1

【参考答案】

一.选择题 (1) C (2) B (3) D (4) A (5) B

二.填空题 (1) 机器语言、汇编语言、高级语言 (2) ①有穷性、②确定性、③有效性、④输入、⑤输出。 (3) 传统流程图、N-S图、伪代码、计算机程序 (4) 面向过程、面向对象

(5) 函数首部、函数体 (6) /* 、*/ (7) main (8) 声明、执行 (9) main 三.编程题

(1) 例1.3 输出一行信息,内容为:This is my first C program. /* exa1-3.c */ #include void main() { printf(\

}

例1.4 键盘输入两个整数,求两个整数中的较大者。 /* exa1-4.c */

#include \头文件 */ void main() /* 主函数 */ { int max(int x,int y); /* 对被调用函数max的声明 */ int a,b,c; /* 定义三个整型变量a,b,c */ printf(\提示输入 */ scanf(\键盘输入变量a和b的值 */

c=max(a,b); /* 调用max函数,将函数返回值赋值给变量c */ printf(\输出c的值 */ }

int max(int x,int y) /* 定义整型函数max,其两个形式参数x,y也为整型 */ { int z; /* 函数max的声明部分 */ if(x>y) z=x; /* 如果x>y,将x赋值给z */ else z=y; /* 否则,将y赋值给z */

return(z); /* 将z的值返回给调用函数的位置 */ } (2)解答:

/* exe1-3-2.c */ #include void main() { printf(\ printf(\

printf(\

}

2

习题2

一.选择题

(1)以下哪一个可以作为正确的变量名( )。 A.for

B.$abc

C.3*x

D._file

(2)以下哪一个不是正确的C语言常量( )。 A.0x2ac

B.3.25e-8 C.800

D.0486

(3)以下哪一个是合法的C语言实型常量( )。 A.3E2.5

B.E6 C.2A8

D.218

(4)以下哪一个整型常数值最大( )。 A.35 B.035

C.0x35

D.50

(5)以下不是字符型常量的是( )。 A.′m′

B.\

C.′\\115′ D.′\\x8c′

(6)以下哪一个字符与其他3个字符不相等( )。 A.′a′

B.′A′

C.′\\X41′ D.′\\101′

(7)以下哪一个是C语言合法的字符串常量( )。 A.I am a student.

B.\中国\C.′\\hello′

D.$abc$

(8)C语言中short型整数占2个字节,则unsigned short型数据的其值范围是:( )。 A.0~65535

B.0~65536

D.-65535~65535

C.-32768~32767

(9)在C语言中,数字018是一个( )。 A.十进制数 B.八进制数 C.十六进制数

D.非法数

(10)在C语言中,不同数据类型占用内存的字节长度是( )。 A.相同的 C.任意的

B.与编译环境有关的 D.由用户自己定义的

(11)以下哪一个不是C语言中的数据类型( )。 A.实型

B.浮点型 C.空类型 D.关系型

(12)以下哪一个是C语言中的数据类型( )。 A.集合型 B.双精度型 C.复数型 D.逻辑型 二、填空题

(1)C语言的常量分为:________常量、________常量、________常量、________常量和________常量。 (2) C语言中的整型数据有三种表示方法,分别是:________进制、________进制和________进制。 (3)C语言规定,变量必须________定义,________使用。

(4)C语言中,sizeof( )是分别是测定某种类型数据所占存储空间长度的________。

(5)C语言中,运算符的结合性有两种:左结合和右结合,左结合是________计算,右结合是________计算。 (6)C语言中,++i是先________,后________;i--是先________,后________。 (7)赋值运算符比逗号运算符的优先级别________。 (8)________运算符的优先级别最低,级别为15。

(9)C语言的类型转换有三种方式:________类型转换、________类型转换和________类型转换。 三、计算与编程题

(1)给出下列公式的C语言表达式。 ① y=ax2+bx+c

② y=ax+b/cx+d ③ 3.25×10+√(b2-4ac)-x2-y3 ④ y=1/2+2/3+(x2+y2)/(a2+b2)

8

⑤ 求表达式3*2+4.0/5?15%?4+(5*8/9+4)%5?1/2+1.0/2的值。 (2)上机运行本章例题,熟悉所用C语言编译系统的使用。

(3)用运算符sizeof( )测试以下数据类型在内存中所占空间的大小:char、unsigned char、int、short、long、unsigned、

3

unsigned short、unsigned long、float、double、long double,输出时一行输出一种数据类型的内存字节大小,并给出清晰的提示信息。

【参考答案】 一.选择题

(1) D (2) D (3) D (4) C (5) B (6) A (7) B (8) B (9) D (10) B (11) D (12) B 二.填空题

(1) 字符、整型、实型、字符串、符号 (2) 十、八、十六 (3) 先、后 (4) 运算符

(5) 从左到右、从右到左 (6) 加1、引用、引用、减1 (7) 高 (8) 逗号

(9) 自动、赋值、强制 三、计算与编程题 (1) ① y=a*x*x+b*x+c ② y=(a*x+b)/(c*x+d)

③ 3.25e8+sqrt(b*b-4*a*c)-x*x-y*y*y ④ y=1.0/2+2/3.0+x*x/(a*a)+y*y/(b*b) ⑤ 7.3 (2) 略 (3)

/* exe2-3-3.c */ #include int main() {

printf(\

printf(\ printf(\ printf(\ printf(\ printf(\

printf(\ printf(\ printf(\ printf(\

printf(\}

4

习 题 3

一.选择题

(1)若有定义:double a=22;int i=0,k=18;,则不符合C语言规定的赋值语句是( ) A. a=a++,i++; B. i=(a+k)<=(i+k); C. i=a; D. i=!a;

(2) 若有定义:int x,y; char a,b,c; 并有以下输入数据(此处,代表换行符) 1 2 A B C

则能给x赋整数1,给y赋整数2,给a赋字符A,给b赋字符B,给c赋字符C的正确程序段是() A. scanf(\B. scanf(\C. scanf(\D. scanf(\

(3)若有定义:int a,b;,通过语句scanf(“%d;%d”,&a,&b);,能把整数3赋给变量a,5付给变量b的输入数据是()A. 3 5 B. 3,5 C. 3;5 D. 35

(4)若有定义语句:int k1=10,k2=20;,执行表达式(k1=k1>k2)&&(k2=k2>k1)后,k1和k2的值分别为() A. 0和1 B. 0和20 C. 10和1 D. 10和20

(5)以下不能输出字符A的语句是()(注:字符A的ASCII码值为65,字符a的ASCII码值为97) A.printf(“%c\\n”,’A’-32) B.printf(“%d\\n”,’A’); C.printf(“%c\\n”,65); D.printf(“%c\\n”,’B’-1); 二.填空题

(1) 有以下程序(说明:字符0的ASCII码值为48) void main(void) #include { (1) main()

a=50.0;b=20.0;

{ char c1,c2; printf(\scanf(\printf(\c2=c1+9;

printf(\printf(\printf(\}

}

若程序运行时从键盘输入48<回车>,则输出结果为将缺少的部分填在空白处。

____________。

(4)下列程序的输出结果是____________。 (2) 以下程序的输出结果为:____________。 #include main( )

main() { float a=3.14, b=3.14159; {

char a;

printf(\a='A';

}

printf(\(3) 编制程序对实数a与b进行加,减,乘,除计算,要求}

显示如下结果。 (5)分析下面程序 jia=70.000000 main() jian=30.000000 {

int x=2,y,z;

cheng=1000.000000 x*=3+2;printf(\chu=2.5000000 x*=y=z=4;printf(\程序:

x=y=1;

#include

z=x++-1;printf(\

5

z+=-x++ +(++y);printf(\(1) 从键盘上输入一个大写字母,要求改用小写字母输出。 }

(2) 请编写一个程序,能显示出以下两行文字。 程序的输出结果是____________。 I am a student. 三.编程题 I love China.

【参考答案】 一.选择题

(1) C (2) C (3)A (4) B (5) B 二.填空题

(1)09 (2)3.140000, 3.142 double a,b a+b a-b a*b a/b (4)65A (5) 10 40 2.0 3.0 三、编程题 (1)

#include void main() { char c; scanf(\ if ((c>='A')&&(c<='Z')) printf(\

else

printf(\输入的不是大写字母\\n\ } (2)

#include void main() { printf(\

}

6

习 题4

一.选择题 (1) 以下程序段: int i,a=3,b=2; i=(--a==b++)?--a:++b;

printf(\输出结果是 。 A)i=1 a=1 b=3 B)i=3 a=2 b=3 C)i=4 a=1 b=4

D)i=4 a=2 b=4

(2)若a是数值类型,则逻辑表达式(a==1)||(a!=1)的值是 。

A)1 B)0 C)2 D)不知道a的值,不能确定

(3)能正确表示x的取值范围在[0,100]和[-10,-5]内的表达式是 。

A)(x<=-10)||(x>=-5)&&(x<=0)||(x>=100) B)(x>=-10)&&(x<=-5)||(x>=0)&&(x<=100) C)(x>=-10)&&(x<=-5)&&(x>=0)&&(x<=100) D)(x<=-10)||(x>=-5)&&(x<=0)||(x>=100) (4)以下程序的运行结果是 。 main( ) {

int c,x,y; x=1; y=1; c=0;

c=x++||y++;

printf(“\\n%d%d%d\\n”,x,y,c); }

A)110 B)211 C)011 D)001 (5)两次运行下面的程序,如果从键盘上分别输入6和4,则输出结果是 。 main( ) { int x;

scanf(“%d”,&x);

if(x++>5) printf(“%d”,x); else printf(“%d\\n”,x--);

}

A)7和5 B)6和3 C)7和4 D)6和4 (6)写出下面程序的执行结果 。 main( ) { int x,y=1; if(y!=0) x=5; printf(“%d\\t”,x);

if(y= =0) x=3; else x=5;

printf(“%d\\t\\n”,x); }

A)1 3 B)1 5 C)5 3 D)5 5

(7)写出下面程序的执行结果 。 main() {

int x=1,y=1,z=0;

if(z<0) if(y>0) x=3; else x=5; printf(\if(z=y<0) x=3; else if(y= =0 ) x=5; else x=7; printf(\printf(\}

A)1 7 0 B)3 7 0 C)5 5 0 D)1 5 1

(8)假定所有变量均已正确说明,下列程序段运行后x的值是 。 a=b=c=0;x=35; if(!a) x=-1; else if(b); if(c) x=3; else x=4;

A)34 B)4 C)35 D)3 (9)以下选项中与if(a==1)a=b;else a++;语句功能不同的switch语句是 。 A)switch(a) {

case1:a=b; break;

default:a++; }

B)switch(a==1) {

case 0:a=b; break;

case 1:a++; }

C)switch(a) {

default:a++;break;

case1:a=b; }

7

D)switch(a==1) {

case 1:a=b;break;

if(a++<9) printf(\ else printf(\}

程序运行时从键盘输入9<回车>,则输出的结果是 。 A)10 B)11 C)9 D)8

(15) 已知 int x=30,y=50,z=80;以下语句执行后变量x、y、case 0:a++; }

(10)有如下嵌套的if语句 if(a

以下选项中与上述if语句等价的语句是 。 A)k=(a

B)k=(a main() {

int a=1,b=0; if(--a) b++; else if(a==0) b+=2; else b+=3; printf(“%d\\n”,b); }

程序运行后的输出结果是 。 A)0 B)1 C)2 D)3

(12)下列条件语句中输出结果与其他语句不同的是 。

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); (13) 以下选项中与if(a==1)a=b; else a++;语句功能不同的switch语句是 。

A)switch(a) {case 1:a=b;break; default:a++; } B)switch(a==1) {case 0:a=b;break;case 1:a++; } C)switch(a) {default:a++;break;case 1:a=b;} D)switch(a==1) {case 1:a=b;break; case 0:a++;} (14) 有以下程序 #include main() { int a;

scanf(\

z的值分别为: 。 if (x>y||xz) z=x; x=y; y=z;

A)x=50, y=80, z=80 B)x=50, y=30, z=30 C)x=30, y=50, z=80 D)x=80, y=30, z=50 二.填空题

(1) 以下程序运行的输出结果是 。 main()

{ int p=30;

printf(\

(2) 有以下程序 #include main()

{int a=1,b=2,c=3,d=0; if(a==1) if(b!=2) if(c==3) d=1; else d=2;

else if(c!=3) d=3; else d=4; else d=5;

printf(“%d\\n”,d); }

程序运行后的输出结果是 。 (3) 有以下程序 #include main() { int x; scanf(\

if(x>15) printf(\if(x>10) printf(\if(x>5) printf(\

若程序运行时从键盘输入12<回车>,则输出结果为(4)以下两条if语句可合并成一条if语句为 if(a<=b) x=1; else y=2;

if(a>b) printf(\

。 8

。、else printf(\

(5)输入一个字符,如果是大写字母,则把其变成小写字母;如果是小写字母,则变成大写字母;其它字符不变。请在( )内填入缺省的内容。 main( ) { char ch; 三.编程题

scanf(“%c”,&ch); if (_______) ch=ch+32;

else if(ch>=’a’&&ch<=‘z’) (_____); printf(”%c\\n”,ch); }

1.编写一个程序,要求有键盘输入三个数,计算以这三个数为边长的三角形的面积。

2.输入圆的的半径r和一个整型数k,当k=1时,计算圆的面积;但k=2时,计算圆的周长,当k=3时,既要求求圆的周长也要求出圆的面积。编程实现以上功能。 3. 编写程序,判断某一年是否是闰年。

4. 有一函数,其函数关系如下,试编程求对应于每一自变量的函数值。 x2 (x<0) y = -0.5x+10 (0≤x<10) x- (x≥10)

【参考答案】

一.选择题

(1) A (2) A (3) B (4) B (5) A (6) D (7) A (8) B (9) B (10) C (11)C (12) D (13) B (14) A (15) A 二.填空题 (1) 0 (2) 4 (3) 1217

(4) if(a<=b) {x=1; printf(\ else {y=2; printf(\ 'A'<=ch && ch<='Z' ch=ch-32 编程题

1 #include #include int main() { 函数

else {

printf(\您输入的三角形边长有误\float a,b,c,z,n,s;

printf(\请输入三角形边长:a,b,c:\scanf(\

if(a+b<=c||fabs(a-b)>=c)//fabs为求浮点数绝对值

z=a+b+c; n=z/2;

s=sqrt(n*(n-a)*(n-b)*(n-c));//sqart为平方

根函数 }

2 #include #define PI 3.14

int main() {

float r; int k;

printf(\请输入半径r: \\n\scanf(\

printf(\请输入处理要求\\n 1. 计算圆的面积 \\n }

printf(\三角形面积是 %f\\n:\

2. 计算圆的周长\\n 3. 计算圆的周长和圆的面积 \\n\

scanf(\switch(k) { case 1:

printf(\圆的面积为: %f\\n\

break;

case 2:

9

printf(\圆的周长为: %f\\n\break; case 3: printf(\圆的面积为: %f\\n\

printf(\圆的周长为: %f\\n\

break; default: printf(\错误要求!! \\n\

}

}

3 #include void main() {

int year,result=0; printf(\输入一个年份:\\n\ scanf(\ if(year0==0) { if(year@0==0) printf(\是闰年\\n\

else

printf(\不是闰年\\n\

}

else if(year%4==0)

printf(\是闰年\\n\

}

4 #include #include void main() { float x,y;

printf(\输入x: \ scanf(\

if(x<0) printf(\

else if(x>=0&&x<10)

printf(\ else if(x>=10)

printf(\

}

10

习题5

一、选择题

(1)当执行以下程序段时,程序的执行情况是( )。 x=-1;

do { x=x*x;} while( !x);

A.循环体将执行一次 B.循环体将执行两次 C.循环体将执行无限次

D.系统将提示有语法错误

(2)C语言中while 和do-while 循环的主要区别是( )。 A.do-while 的循环体不能是复合语句

B.while 的循环控制条件比do-while 的循环控制条件严格 C.do-while 允许从外部转到循环体内 D.do-while的循环体至少无条件执行一次

(3)若i,j已定义为int类型,则以下程序段中内循环体的总的执行次数是( )。 for (i=5;i;i--)

for (j=0;j<4;j++){...} A.25

B.20 C.24

D.30

(4)以下程序的输出结果是( )。 #include void main( ) { int a,b;

for(a=1,b=1;a<=100;a++) { if (b>=10) break;

if (b%5==1) { b+=5; continue; } } printf(\A.101 B.6

C.4 D.3

二、填空题

(1)以下程序段输出的结果是 【1】 。 #include void main() { int x=3; do

{printf(″=″,x-=2);} while(!(--x)); }

(2)以下程序输出结果是 【2】 。 #include void main() { int i, sum=0;

for(i=1; i<6; i++) sum+=i;

printf(″%d\\n″,sum); }

(3)以下程序输出的结果是 【3】 。

#include void main() { int x, i; for(i=1; i<=100; i++) { x=i; if(++x%2==0) if(++x%3==0) if(++x%7==0)

printf(\

}

printf(“\\n”);

}

(4)以下程序的运行结果是【4】 。#include void main() { int i=1,s=3; do { s+=i++; if (s%7==0) continue;

else

++i; } while (s<15); printf(\

}

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

int i,j;

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

11

{

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

三、编程题

1.求两个整数m和n的最大公约数和最小公倍数。 2.打印输出10以内加法口诀表。

3.输出所有的“水仙花数”,所谓的水仙花数是指一个3位数,其个位数字立方和等于该数本身。例如153是一个水仙花数,因为153=13+53+33。 4.求1+3+5+7+…+99的和。

5.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 6.输出以下图案: *

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

7.求Fibonacci数列前20个数,这个数列的特点:第1、2两个数为1、1,从第3个数开始,该数是其前面两个数之和。即:

【参考答案】

一.选择题

(1) A (2) D (3) B (4) C 二.填空题 (1) 1 -2 (2) 15 (3) 42 84 (4) 8 (5) * ** *** **** 三.编程题

1.求两个整数m和n的最大公约数和最小公倍数。 具体程序: #include\void main() {

int m,n,t,h,a,b,q; printf(\输入m,n的值:\scanf(\a=m; b=n; if (n>m) { t=m;m=n;n=t;} while (m%n!=0) { h=n;n=m%n;m=h;} a=a/n;b=b/n;q=a*b*n;

printf(\两数最大公约数为 %d,最小公倍数为 %d\\n\}

2.打印输出加法口诀表。 具体程序为: /* exa5-3-2.c */ #include void main() {

int i,j;

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

for(j=1;j<10;j++) {

printf(\ }

printf(\ } }

3.输出所有的“水仙花数”,所谓的水仙花数是指一个3位数,其个位数字立方和等于该数本身。例如153是一个水仙花数,因为153=13+53+33。 /* exa5-3-3.c */ #include void main() {

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

12

for(j=0;j<10;j++) for(k=0;k<10;k++)

if( (i*100+j*10+k)==((i*i*i)+(j*j*j)+(k*k*k))) printf(\getch(); }

4.求1+3+5+7+…+99的和。 具体程序为: /* exa5-3-4.c */ #include void main() {

int i, sum; sum = 0;

for (i=1; i<=99; i+=2) { sum = sum + i; } printf(\}

5.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 具体程序为: /* exa5-3-5.c */ #include void main() {

char ch; int

char_num=0,kongge_num=0,int_num=0,other_num=0; while((ch=getchar())!='\\n') {

if(ch>='a'&&ch<='z'||ch<='z'&&ch>='a') {

char_num++; }

else if(ch==' ') {

kongge_num++; }

else if(ch>='0'&&ch<='9') {

int_num++; } else {

other_num++;

} }

printf(\字母= %d,空格= %d,数字= %d,其它= %d\\n\char_num,kongge_num, int_num, other_num); }

6.输出以下图案:

* * * * * * * * * * * * * * * * * * * * * * * * * 具体程序为: /* exa5-3-6.c */ #include \ void main() {

int b,c,d,e; c=1;

for(b=1;b<=4;b++) { for(d=1;d<=4-b;d++) printf(\ for(d=1;d<=c;d++) printf(\ printf(\ c=c+2; } c=c-4; for(b=3;b>0;b--) { for(d=1;d<=4-b;d++) printf(\ for(d=1;d<=c;d++) printf(\ printf(\ c=c-2; } }

7.求Fibonacci数列前20个数,这个数列的特点:第1、2两个数为1、1,从第3个数开始,该数是其前面两个数之和。即: 具体程序为: /* exa5-3-7.c */

13

#include void main() {

int f1,f2,i; f1=1;f2=1; for(i=1;i<=10;i++) {

printf(\ if(i%2==0) printf(\ f1=f1+f2; f2=f2+f1; } }

习题6

一、选择题

(1) 在C语言中,引用数组元素时,其数组下标的数据类型允许是( )。 A.整型常量

B.整型表达式

C.整型常量、变量或表达式 D.任何类型的表达式 (2) 以下对一维整型数组a 的正确说明是( )。 A.int a(10);

B

int

n=10,a[n]; C.int n; D

int

a[3*5+2]; scanf(\

int a[n];

(3) 若有说明:int a[10];,则对a数组元素的正确引用是( )。

A.a[10] B.a[3.5]

C.a(5) D.a[10-10]

(4) 若有说明:int a[3][4];则对a 数组元素的非法引用是( )。

A.a[0][2*1] B.a[1][3] C

a[4-2][0]

D.a[0][4]

(5) 以下能对二维数组a 进行正确初始化的语句是( )。A.int a[2][]={{1,0,1},{5,2,3}}; B.int a[][3]={{1,2,3},{4,5,6}}; C.int a[2][4]={{1,2,3},{4,5},{6}}; D.int a[][3]={{1,0,1},{},{1,1}}; (6) 合法的数组说明语句是( )。 A.int a[ ]=\B.int a[5]={0,1,2,3,4,5}; C.char a =\D.int a[ ]={0,1,2,3,4,5};

(7) 以下不能对二维数组a 进行正确初始化的语句是( )。

A.int a[2][3]={0}; B.int a[][3]={{1,2},{0}};

C.int a[2][3]={{1,2},{3,4},{5,6}}; D.int a[][3]={1,2,3,4,5,6};

(8) 若有说明:int a[3][4]={0};则下面正确的叙述是

( )。

A.只有元素a[0][0]可得到初值0 B.此说明语句不正确

C.数组a 中各元素都可得到初值,但其值不一定为0 D.数组a 中每个元素均可得到初值0

(9) 若有说明:下面函数(程序代码前数字表示行号)

( )。 1 main()

2 { 3 float a[10]={0}; 4 int i;

5 for(i=0;i<3;i++) scanf(“%f”,&a[i]); 6 for(i=1;i<10;i++) a[0]=a[0]+a[i]; 7

printf(“%f\\n”,a[0]);

8 }

A.没有错误

B.第3 行有错误 C.第5行有错误

D.第7 行有错误

(10) 调用strlen(“abcd\\0ef\\0g”)的返回值为( )。 A.4 B.5

C.8

D.9

(11) 若有以下语句,则正确的描述是( )。 char x[ ]=\

char y[ ]={'1','2','3','4','5'}; A.x数组和y数组的长度相同 B.x数组长度大

于y数组长度

C.x数组长度小于y数组长度 D.x数组等价于y数组

(12) 有两个字符数组a,b,则以下正确的输入语句是( )。A.

gets(a,b);

B.scanf(\

C.scanf(\ D.gets(\二、填空题

(1) C 语言中,数组的各元素必须具有相同的 ,元素的下标下限为 ,下标必须是正整数、0或者 。但在程序执行过程中,不检查元素下标是否 。

(2) C 语言中,数组在内存中占一片 的存储区,由14

代表它的首地址。数组名是一个 常量,不能对它进行赋值运算。

(3) 设定义了char a[10]={'1','2','3','4','5'}; 则 printf(\}

(9) 下面程序的功能是输出数组 s 中最大元素的下标,请a[5]的正确初值是 。

填空。

(4) int a[10]={9,4,12,8,2,10,7,5,1,3}; a[a[9]]的值#include 为 ;a[a[4]+a[8]]的值为 。

void main( ) (5) 执行 int b[5], a[ ][3] ={1,2,3,4,5,6}; 后,b[4] {

= ,a[1][2] = 。

int k, p;

(6) 以下程序输入20个数,将其逆序输出。 int s[ ]={1,-9,7,2,-10,3}; #include for(p=k=0; p<6; p++) void main()

if(s[k]

{ int a[20],i;

printf(\ for(i=0;i<20;i++) }

scanf(\ );

(10) 下面程序以每行4个数据的形式输出a数组。 for(i=19;i>=0;i--) #define N 20 printf(\ ); #include }

void main() (7) 下面程序段的运行结果是 。 { int a[N],i;

char c[5]={'a','b','\\0','c','\\0'}; for(i=0; i

scanf(\ ); (8) 下面程序的运行时,输入Fortran Language↙,输出 for(i=0; i

是 。 { if( ) ; #include

printf(\

void main( ) } { char str[30]; }

scanf(\三、编程题

(1) 输入n个整数,用选择法将数据由大到小输出。 (2) 将一个数组中的值按逆序重新存放。

(3) 在有序的n个整数中,插入某整数x后,使原顺序不变。

(4) 找出1000以内的所有完数。一个数如果恰好等于它的所有因子之和,这个数就称为“完数”,例如6=1+2+3。 (5) 输入一个数,用折半查找法在n个有序数中查找此数。如果找到,指出其位置,如果找不到,则打印\无此数\。 (6) 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。 (7) 求方阵对角线上元素的和。

(8) 找出二维数组中的最大值,并指出它的位置。 (9) 计算两个矩阵的和。 (10)用数组输出下面图案。 * * * * * * * * * * * * *

(11) 打印出杨辉三角形(要求打印出10行,如下图) 1

15

#include void main()

{ int i, j, row, colum, max; int

a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; max=a[0][0]; row=0, colum=0; for (i=0;i<=2;i++) { for (j=0;j<=3;j++)

{ printf(\ if (a[i][j]>max) { max=a[i][j]; row=i; colum=j; } } printf(\ }

printf(\1); }

/* exe6-3-9.c */ #include void main() {

int a[3][4]={{1,1,1,1},{2,2,2,2},{3,3,3,3}}; int b[4][3]={{1,2,3},{1,2,3},{1,2,3},{1,2,3}}; int c[3][3]; int i,j,t;

printf(\矩阵:\\n\ for(i =0;i<3;i++ ) { for(j=0;j<4;j++ ) printf(\ printf(\ }

printf(\矩阵:\\n\ for(i =0;i<4;i++ ) { for(j=0;j<3;j++ ) printf(\ printf(\ }

printf(\矩阵:\\n\

for(i =0;i<3;i++ ) { for(j=0;j<3;j++ ) { c[i][j]=0;

for(t=0;t<4;t++ )

c[i][j]= c[i][j]+a[i][t]*b[t][j]; printf(\ }

printf(\ } }

/* exe6-3-10.c */ #include void main() {

char a[7][7]={'\\0'}; int i,j,t; for(i=0;i<4;i++ )

/* 上三角形图案 */

for(j=3-i,t=1;t<=2*i+1;j++,t++)

a[i][j]='*'; /* j控制每个*的输出列数,t控制每行*的个数 */ for(i=4;i<7;i++ ) /* 下三角形图案 */

for(j=i-3,t=1;t<=13-2*i;j++,t++)

a[i][j]='*'; /* j控制每个*的输出列数,t控制每行*的个数 */

for(i=0;i<7;i++ )

{ for(j=0;j<7;j++ ) printf(\ printf(\ } }

/* exe6-3-11.c */ #include void main()

{ int i , j , a[10][10]; for ( i=0 ;i<10 ;i++) { for ( j=0 ;j<=i; j++)

{ if ((j==0)||(i==j)) a[i][j]=1;

else a[i][j]= a[i-1][j] + a[i-1][j-1]; printf (\ }

21

printf(\ } }

/* exe6-3-12.c */ #include void main()

{ char s[50],s1[50],s2[50]; int i,j,k;

puts(\输入一个字符串:\ gets(s); i=j=k=0;

while(s[i]!='\\0')

{ if(s[i]>='a'&&s[i]<='z' || s[i]>='A'&&s[i]<='Z') s1[j++]=s[i];

if(s[i]>='0'&&s[i]<='9') s2[k++]=s[i]; i++; }

s1[j]=s2[k]='\\0'; puts(s1); puts(s2); }

/* exe6-3-13.c */ #include void main( ) { int i;

char str1[30], str2[30]; printf(\ gets(str2);

for ( i=0; str2[i]!='\\0';i++) str1[i]= str2[i]; str1[i]='\\0';

puts(\输出str1:\ puts(str1); }

/* exe6-3-14.c */ #include void main()

{ char dest[50],src[30]; int i=0,j=0;

puts(\输入字符串1:\ gets(dest);

puts(\输入字符串2:\ gets(src);

while(dest[i]!='\\0') i++;

for(j=0;src[j]!='\\0'; i++,j++) dest[i]=src[j]; dest[i]= '\\0';

puts(\字符串2连接到字符串1后:\ puts(dest); }

/* exe6-3-15.c */ #include void main() { char str[50]; int i=0;

puts(\输入字符串:\ gets(str);

while(str[i]!='\\0') i++; printf(\字符串长度是:%d\\n\}

22

习题7

一、单项选择题

(1) 一个完整的C源程序是( )。 A.要由一个主函数或一个以上的非主函数构成 B.由一个且仅由一个主函数和零个以上的非主函数构成 C.要由一个主函数和一个以上的非主函数构成 D.由一个且只有一个主函数或多个非主函数构成 (2) 以下关于函数的叙述中正确的是( )。 A.C语言程序将从源程序中第一个函数开始执行 B.可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行

C.C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束

D.main可作为用户标识符,用以定义任意一个函数 (3) 以下关于函数的叙述中不正确的是( )。

A.C程序是函数的集合,包括标准库函数和用户自定义函数 B.在C语言程序中,被调用的函数必须在main函数中定义 C.在C语言程序中,函数的定义不能嵌套 D.在C语言程序中,函数的调用可以嵌套 (4) 在一个C程序中,( )。 A.main函数必须出现在所有函数之前 B.main函数可以在任何地方出现 C.main函数必须出现在所有函数之后 D.main函数必须出现在固定位置

(5) 若在C语言中未说明函数的类型,则系统默认该函数的数据类型是( )。 A.float

B.long

C.int

D.double

(6) 以下关于函数叙述中,错误的是( )。 A.函数未被调用时,系统将不为形参分配内存单元 B.实参与形参的个数应相等,且实参与形参的类型必须对应一致

C.当形参是变量时,实参可以是常量、变量或表达式 D.形参可以是常量、变量或表达式

(7) 若函数调用时参数为基本数据类型的变量,以下叙述正确的是( )。

A.实参与其对应的形参共占存储单元

B.只有当实参与其对应的形参同名时才共占存储单元

C.实参与对应的形参分别占用不同的存储单元

D.实参将数据传递给形参后,立即释放原先占用的存储单元(8) 有如下程序 int func(int a,int b) { return(a+b); } main( )

{ int x=2,y=5,z=8,r; r=func(func(x,y),z); printf(\该程序的输出结果是( )。 A.12

B.13

C.14 D.15

(9) 若主调用函数类型为double,被调用函数定义中没有进行函数类型说明,而return语句中的表达式类型为float型,则被调函数返回值的类型是( )。 A.int 型 B.float 型 C.double 型

D.由系统当时的情况而定

(10) 定义一个void型函数意味着调用该函数时,函数( )。

A.通过return返回一个用户所希望的函数值 B.返回一个系统默认值 C.没有返回值 D.返回一个不确定的值

(11) 若用数组名作为函数调用的实参,则传递给形参的是( )。

A.数组的首地址 B.数组的第一个元素的值 C.数组中全部元素的值 D.数组元素的个数

(12) 若程序中定义函数

float myadd(float a, float b) { return a+b;}

并将其放在调用语句之后,则在调用之前应对该函数进行说明。以下说明中错误的是( )。 A.float myadd( float a,b); B.float myadd(float b, float a); C.float myadd(float, float); D.float myadd(float a, float b); (13) 以下叙述中,不正确的是( )。

23

A.在同一C程序文件中,不同函数中可以使用同名变量 B.在main函数体内定义的变量是全局变量 C.形参是局部变量,函数调用完成即失去意义

D.若同一文件中全局变量和局部变量同名,则全局变量在局部变量作用范围内不起作用

(14) 如果一个函数位于C程序中定义的第一个函数,在该函数体内说明语句后的复合语句中定义了一个变量,则该变量( )。

A.为全局变量,在本程序文件范围内有效 B.为局部变量,只在该函数内有效 C.为局部变量,只在该复合语句中有效 D.定义无效,为非法变量

(15) 若在一个C源程序文件中定义了一个允许其他源文件引用的实型外部变量a,则在另一文件中可使用的引用说明是( )。

A.extern static float a; B.float a; C.extern auto float a; 二、编程题

(1) 编写函数isNarcissi(n),n为三位自然数,判断n是否为水仙花数,是返回1,否返回0。编写main函数,输入一个数num,调用fun函数,并输出判断结果。

(2) 编写函数isPrime(n),判断n是否为素数,是返回1,

D.extern float a;

否返回0。编写main函数,输入一个数num,调用isPrime函数,并输出判断结果。

(3) 有哥德巴赫猜想:任一个不小于6的偶数可以表示为两个素数之和,例如:8=3+5,10=5+5,12=5+7,…。请编写函数goldbach(x),x是一个不小于6的偶数,输出x的哥德巴赫和式。

(4) 编写函数selectSort(array[],n),用选择法实现对array数组中n个整数按升序排序。

(5) 编写函数toString(n),n是一个四位整数,实现输出对应的四个数字字符,且每两个数字间用“_”间隔。如整数1990,应输出“1_9_9_0”。

(6) 计算s=(1!)+(1!+2!)+…+(1!+…+n!)。 n由用户输入,小于10。

要求:函数factorial(n)计算n的阶乘;函数sum(m)计算1!+2!+…+m!的累加运算。在主函数中调用sum函数,sum函数中调用factorial函数来实现累加。

(7) 编写函数reverse(s),s是一个字符串,实现将字符串s逆序存放。

(8) 写一个函数transpose(b),b是一个3阶方阵,实现对方阵的转置,即行列互换。

(9) 某数列为k(n)的定义为:用递归的方法求该数列的第6项k(6)。

【参考答案】

一.选择题

B C B B C D C D A C A A B C D 二.编程题

(1) 编写函数isNarcissi(n),n为三位自然数,判断n是否为水仙花数,是返回1,否返回0。编写main函数,输入一个数num,调用fun函数,并输出判断结果。 #include int isNarcissi(int n) { } main() {

int num; int a,b,c; a=n; b=n/10; c=n/100;

if(a*a*a+b*b*b+c*c*c==n) else

return(0); return(1);

scanf(\

while(num<100||num>=1000) {

printf(\enter the number again!

(number>=100&&number<1000)\\n\ }

(2) 编写函数isPrime(n),判断n是否为素数,是返回1,否返回0。编写main函数,输入一个数num,调用isPrime函数,并输出判断结果。 #include int isPrime(int n) {

int i;

for(i=2;i

if(n%i==0) }

if(isNarcissi(num)==1) else

printf(\printf(\scanf(\

24

break; if(i>=n) return(1);

else

return(0); }

main() { int num;

scanf(\ if(isPrime(num)==1)

printf(\

else

printf(\

}

(3) 有哥德巴赫猜想:任一个不小于6的偶数可以表示为两个素数之和,例如:8=3+5,10=5+5,12=5+7,…。请编写函数goldbach(x),x是一个不小于6的偶数,输出x的哥德巴赫和式。要求调用第2题中的isPrime函数。 void goldbach(int x) { int i;

if (x>=6 && x%2==0) { i=3;

while (i<=x/2) { if (isPrime(i) && isPrime(x-i)) { printf(\ break;

} else

i++;

}

} else

printf(\}

(4) 编写函数selectSort(array[],n),用选择法实现对array数组中n个整数按升序排序。 #include

void selectSort(int array[],int n)

{ int i,j,k,t; for(i=0;i

{ k=i;

for(j=i+1;j

k=j;

t=array[k]; array[k]=array[i]; array[i]=t;

}

}

void main() { int a[10],i;

printf(\ for(i=0;i<10;i++)

scanf(\

selectSort(a,10);

printf(\ for(i=0;i<10;i++)

printf(\

printf(\

}

(5) 编写函数toString(n),n是一个四位整数,实现输出对应的四个数字字符,且每两个数字间用“_”间隔。如整数1990,应输出“1_9_9_0”。 void toString(int a) { int u,v,w,t; u=a*0.001; v=0.01*(a-1000*u); w=(a-1000*u-100*v)*0.1; t=a-1000*u-100*v-10*w;

printf(\ printf(\}

(6) 计算s=(1!)+(1!+2!)+…+(1!+…+n!)。 n由用户输入,小于10。

要求:函数factorial(n)计算n的阶乘;函数sum(m)计算1!+2!+…+m!的累加运算。在主函数中调用sum函数,sum函数中调用factorial函数来实现累加。 #include

25

本文来源:https://www.bwwdw.com/article/n8gt.html

Top