admin 管理员组

文章数量: 1086019


2025年1月1日发(作者:c++编程步骤)

习题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("This is my first C program.n");

}

例1.4 键盘输入两个整数,求两个整数中的较大者。

/* exa1-4.c */

#include "stdio.h" /* 头文件 */

void main() /* 主函数 */

{

int max(int x,int y); /* 对被调用函数max的声明 */

int a,b,c; /* 定义三个整型变量a,b,c */

printf("Please input two integers a,b: "); /* 提示输入 */

scanf("%d,%d",&a,&b); /* 键盘输入变量a和b的值 */

c=max(a,b); /* 调用max函数,将函数返回值赋值给变量c */

printf("max=%dn",c); /* 输出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("****************************n");

printf(" Hello,World!n");

printf("****************************n");

}

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."n" 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=ax²+bx+c ② y=ax+b/cx+d ③ 3.25×10+√(b²-4ac)-x²-y³ ④ y=1/2+2/3+(x²+y²)/(a²+b²)

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("char: %d bytesn",sizeof(char));

printf("unsigned char: %d bytesn",sizeof(unsigned char));

printf("int: %d bytesn",sizeof(int));

printf("short: %d bytesn",sizeof(short));

printf("long: %d bytesn",sizeof(long));

printf("unsigned: %d bytesn",sizeof(unsigned));

printf("unsigned short: %d bytesn",sizeof(unsigned short));

printf("unsigned long: %d bytesn",sizeof(unsigned long));

printf("float: %d bytesn",sizeof(float));

printf("double: %d bytesn",sizeof(double));

printf("long double: %d bytesn",sizeof(long double));

}

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%11; 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("x=%dy=%d",&x,&y);a=getchar();b=getchar();c=getchar();

B. scanf("%dy%d",&x,&y);a=getchar();b=getchar();c=getchar();

C. scanf("%d%d%c%c%c%c%c%c",&x,&y,&a,&a,&b,&b,&c,&c);

D. scanf("%d%d%c%c%c",&x,&y,&a,&b,&c);

(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)

(“%cn”,’A’-32) (“%dn”,’A’);

(“%cn”,65); (“%cn”,’B’-1);

二.填空题

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

#include { (1)

main() a=50.0;b=20.0;

{ char c1,c2; printf("jia=%fn", (2) );

scanf("%d",&c1); printf("jian=%fn" ,(3) );

c2=c1+9; printf("cheng=%fn",(4) );

printf("%c%cn",c1,c2); printf("chu=%fn", (5) );

} }

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

____________。 (4)下列程序的输出结果是____________。

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

main( ) main()

{ float a=3.14, b=3.14159; { char a;

printf("%f, %5.3fn",a,b); a='A';

} printf("%d%c",a,a);

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

显示如下结果。 (5)分析下面程序

jia=70.000000 main()

jian=30.000000 { int x=2,y,z;

cheng=1000.000000 x*=3+2;printf("%dn",x);

chu=2.5000000 x*=y=z=4;printf("%dn",x);

程序: x=y=1;

#include z=x++-1;printf("%d,%dn",x,z);

5

z+=-x++ +(++y);printf("%d,%d",x,z); (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("%c", &c);

if ((c>='A')&&(c<='Z'))

printf("%cn", c+'a'-'A');

else

printf("输入的不是大写字母n");

}

(2)

#include

void main()

{

printf("I am a love China.n");

}

6

习 题4

一.选择题

(1) 以下程序段:

int i,a=3,b=2;

i=(--a==b++)?--a:++b;

printf("i=%d a=%d b=%d",i,a,b);

输出结果是 。

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%dn”,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(“%dn”,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(“%dt”,x);

if(y= =0) x=3;

else x=5;

printf(“%dtn”,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("%dt",x);

if(z=y<0) x=3;

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

else x=7;

printf("%dt",x);

printf("%dt",z);

}

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("%dn",a);

else printf("%dn",a);

}

程序运行时从键盘输入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

else k=c;

if(b

else k=c;

以下选项中与上述if语句等价的语句是 。

A)k=(a

B)k=(a

C)k=(a

D)k=(a

(11)有以下程序

#include

main()

{

int a=1,b=0;

if(--a) b++;

else if(a==0) b+=2;

else b+=3;

printf(“%dn”,b);

}

程序运行后的输出结果是 。

A)0 B)1 C)2 D)3

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

是 。

A)if(a) printf(“%dn”,x); else printf(“%dn”,y);

B)if(a==0) printf(“%dn”,y); else printf(“%dn”,x);

C)if(a!=0) printf(“%dn”,x); else printf(“%dn”,y);

D)if(a==0) printf(“%dn”,x); else printf(“%dn”,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("%d" ,&a);

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("%dn",(p/32>0?p/10:p%3)); }

(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(“%dn”,d); }

程序运行后的输出结果是 。

(3) 有以下程序

#include

main()

{ int x;

scanf("%d",&x);

if(x>15) printf("%d",x-5);

if(x>10) printf("%d",x);

if(x>5) printf("%dn",x+5); }

若程序运行时从键盘输入12<回车>,则输出结果为

(4)以下两条if语句可合并成一条if语句为

if(a<=b) x=1;

else y=2;

if(a>b) printf("* * * * y=%dn",y);

8

。、

else printf("# # # # x=%dn",x);

(5)输入一个字符,如果是大写字母,则把其变成小写字母;

如果是小写字母,则变成大写字母;其它字符不变。请在( )

内填入缺省的内容。

main( )

{ char ch;

三.编程题

scanf(“%c”,&ch);

if (_______) ch=ch+32;

else if(ch>=’a’&&ch<=‘z’) (_____);

printf(”%cn”,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("# # # # x=%dn",x);}

else {y=2; printf("* * * * y=%dn",y);}

'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("%f %f %f",&a,&b,&c);

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("%f",&r);

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

}

printf("三角形面积是 %fn:",s);

2. 计算圆的周长n 3. 计算圆的周长和圆的面积 n");

scanf("%d",&k);

switch(k)

{

case 1:

printf("圆的面积为: %fn",PI*r*r);

break;

case 2:

9

printf("圆的周长为: %fn",2*PI*r);

break;

case 3:

printf("圆的面积为: %fn",PI*r*r);

printf("圆的周长为: %fn",2*PI*r);

break;

default:

printf("错误要求!! n"); break;

}

}

3 #include

void main()

{

int year,result=0;

printf("输入一个年份:n");

scanf("%d",&year);

if(year%100==0)

{

if(year%400==0)

printf("n%d是闰年n",year);

else

printf("n%d不是闰年n",year);

}

else if(year%4==0)

printf("n%d是闰年n",year);

}

4 #include

#include

void main()

{

float x,y;

printf("输入x: ");

scanf("%f",&x);

if(x<0)

printf("y=%.2fn",x*x);

else

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

printf("y=%.2fn",-0.5*x+10);

else if(x>=10)

printf("y=%.2fn",x-sqrt(x));

}

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("%dn",a); }

A.101 B.6 C.4 D.3

二、填空题

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

#include

void main()

{

int x=3;

do

{printf(″%3d″,x-=2);}

while(!(--x));

}

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

#include

void main()

{ int i, sum=0;

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

sum+=i;

printf(″%dn″,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("%dn",x);

}

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("%dn",i);

}

(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("n");

}

}

三、编程题

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"stdio.h"

void main()

{

int m,n,t,h,a,b,q;

printf("输入m,n的值:");

scanf("%d %d",&m,&n);

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,最小公倍数为 %dn",n,q);

}

2.打印输出加法口诀表。

具体程序为:

/* exa5-3-2.c */

#include

void main()

{

int i,j;

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

{

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

{

printf("%d+%d=%dt",i,j,i+j);

}

printf("n");

}

}

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("%d%d%d ",i,j,k);

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("sum = %d", sum);

}

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,其它= %dn",

char_num,kongge_num, int_num, other_num);

}

6.输出以下图案:

*

* * *

* * * * *

* * * * * * *

* * * * *

* * *

*

具体程序为:

/* exa5-3-6.c */

#include "stdio.h"

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("n");

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("n");

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("%5d %5d",f1,f2);

if(i%2==0) printf("n");

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("%d",&n);

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[ ]="string";

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

C.char a ="string";

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(“%fn”,a[0]);

8 }

A.没有错误 B.第3 行有错误

C.第5行有错误 D.第7 行有错误

(10) 调用strlen(“abcd0ef0g”)的返回值为( )。

A.4 B.5 C.8 D.9

(11) 若有以下语句,则正确的描述是( )。

char x[ ]="12345";

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("%s%s",a,b);

C.scanf("%s%s",&a,&b);

D.gets("a"),gets("b");

二、填空题

(1) C 语言中,数组的各元素必须具有相同的 ,元

素的下标下限为 ,下标必须是正整数、0或者 。

但在程序执行过程中,不检查元素下标是否 。

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

14

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

赋值运算。

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

printf("%s",str);

}

(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("%dn" ,k);

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

scanf("%d", ); (10) 下面程序以每行4个数据的形式输出a数组。

for(i=19;i>=0;i--) #define N 20

printf("%d ", ); #include

} void main()

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

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

printf("%s",c); scanf("%d", );

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

是 。 { if( ) ;

#include printf(" %3d",a[i]);

void main( ) }

{ char str[30]; }

scanf("%s",str);

三、编程题

(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

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

(12) 输入一行字符,将其中的英文字母和数字字符分别存入两个一维数组中。

(13) 编写程序,不使用strcpy函数,将字符组str2的内容拷贝到str1中。

(14) 不用strcat函数,编程将两个字符串连接起来。

(15) 编写程序,计算字符串的长度。

【参考答案】

一.选择题

C D D D B D C D A A B B

二.填空题

(1) 数据类型,0,整型表达式。越界。

(2) 连续的存储空间,数组名,地址。

(3) ‘0’。

(4) 8,8。

(5) 不确定,6.

(6) &a[i] ,a[i] 。

(7) ab。

(8) Fortran。

(9) k=p。

(10) &a[i],i%4==0,printf("n")。

三.编程题

(1)

例6.1 求100以内自然数的和。

/* exa6-1.c */

#include

void main()

{int i,a[101],sum=0; /*定义a数组*/

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

{ a[i]=i;

sum=sum+a[i];

}

printf("1+2+...+100=%dn",sum);

}

例6.2 用打擂法从10个整数中找出最大值,并说明它的位

置。

/* exa6-2.c */

#include

void main()

{

int i,a[10],max,local; /* 定义数组 */

printf("输入10个整数:n");

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

scanf("%d", &a[i]);/* 输入10个整数 */

max=a[0]; /* 将第一个数赋值给max */

local=0;/* 记录第一个数的下标 */

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

if(max

{ max=a[i]; local=i;}/* 打擂法找最大值 */

printf("最大数是%d,是第%d个数n",max, local+1);

}

例6.3 输出Fibonacci数列的前20项。数列的前两项为1,1,

以后每一个数都是其前两个数之和。

/* exa6-3.c */

#include

void main()

{int i,f[20]={1,1};/* 初始化数组 */

for(i=2;i<20;i++)

f[i]=f[i-1]+f[i-2];/* 计算数列的项数 */

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

{ if(i%5==0) printf("n");/* 控制每行输出5个数 */

printf("%10d",f[i]);

}

}

例6.4 冒泡排序法。

/* exa6-4.c */

#include

void main()

{ int i,j,n,t,a[30];/* 对30个以内的数排序 */

printf("n=");

scanf("%d",&n);

printf("Input %d numbers:",n);

for(i=1;i<=n;i++)/* 输入n个整数 */

scanf("%d",&a[i]);

for(i=1;i

16

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

if(a[j]>a[j+1])

{ t=a[j];a[j]=a[j+1];a[j+1]=t;}

for(i=1;i<=n;i++)/* 输出n个整数 */

printf("%6d",a[i]);

}

例6.5 选择法排序。

/* exa6-5.c */

下面是用选择法对n个数按从小到大排序的程序段。

for(i=1;i

{ min=i;

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

if(a[min]>a[j]) min=j;

if(min!=i)

{ t=a[min];a[min]=a[i];a[i]=t;}

}

例6.6 用筛选法找出100之内的素数。

/* exa6-6.c */

#include

void main()

{ int i,j,n,a[101]={0};

for (i=2;i<=100;i++) a[i]=i;/* 2~100的自然数存放

到a数组中 */

for (i=2;i<100;i++)

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

f(a[i]!=0)

if (a[j]!=0 && a[j]%a[i]==0) /* 将所有大于a[i],并且

是a[i] */

a[j]=0; /* 倍数的a[j]置为0 */

printf("n");

for (i=2,n=0;i<=100;i++)

{

if(a[i]!=0)

{ printf("%5d",a[i]);/* 输出素数 */

n++; /* 记录已输出素数的个数 */

}

if(n==10) /* 控制每行输出10个素数 */

{ printf("n");

n=0;

}

}

printf("n");

}

例6.7 将一个二维数组的行和列元素互换,存到另一个二维

数组中。

/* exa6-7.c */

#include

void main()

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

printf("a数组n");

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

{ for(j=0;j<=2;j++)

{ printf("%3d",a[i][j]);

b[j][i]=a[i][j];

}

printf("n");

}

printf("nb数组n");

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

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

printf("%3d",b[i][j]);

printf("n");

}

}

例6.8 计算一个小组里每位学生的总分,并计算各门课程的平均分。学生成绩表如表6.1所示。

表6.1 学生成绩表

课程

语文

姓名

李海燕

刘杨

王国才

张石雨

/* exa6-8.c */

#include

void main()

{ int i,j,sum,score[4][6];

float aver[5];

printf("请输入4名学生5门课成绩:n");

70

82

93

68

81

94

95

80

72

91

89

74

73

80

87

52

85

88

96

63

数学 英语 物理 化学 总分

17

for(i=0;i<4;i++) /* 输入学生成绩 */

{ score[i][5]=0;

printf("第%d名学生5门课成绩:",i+1);

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

{ scanf("%d",&score[i][j]);

score[i][5]=score[i][5]+score[i][j]; /* 计

算每位学生总分 */

}

}

for(j=0;j<5;j++) /* 计算各门课程平均分 */

{ sum=0;

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

sum+=score[i][j];

aver[j]=sum/4.0;

}

printf("n学生成绩表n");

printf("语文t数学t英语t物理t化学t总分n");

for(i=0;i<4;i++) /* 输出学生成绩 */

{ for(j=0;j<6;j++)

printf("%dt",score[i][j]);

printf("n");

}

for(j=0;j<5;j++) /* 输出各门课程平均分 */

printf("%.2ft", aver[j]);

}

例6.9 字符串的输入输出。

/* exa6-9.c */

#include

void main()

{ int i;

char s1[10],s2[10];

puts("输入字符串:");

gets(s1);

scanf("%s",s2);

printf("输出字符串:n");

puts(s1);

puts(s2);

printf("%st%sn",s1,s2);

}

例6.10 编写计算字符串长度函数。

/* exa6-10.c */

int strlenth(char s[])

{ int i=0,lenth=0;

while(s[i++]) lenth++; /* while(s[i]!= '0')

{ lenth++; i++;} */

return lenth;

}

例6.11 编写字符串连接函数。

/* exa6-11.c */

#include

void strjoin(char dest[],char src[])

{ int i=0,j=0;

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

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

dest[i]= '0';

}

例6.12 输入五个字符串,按升序排列输出。

/* exa6-12.c */

#include

void main()

{ char st[20],str[5][20];

int i,j,min;

printf("input 5 strings:n");

for(i=0;i<5;i++) gets(str[i]);

printf("n");

for(i=0;i<4;i++) /* 选择法排序 */

{ min=i;

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

if(strcmp(str[min],str[j])>0) min=j; /*min行

字符串大于j行字符串*/

if(min!=i)

{ strcpy(st,str[i]);

strcpy(str[i],str[min]); /* min行、j行字符

串字符串换行*/

strcpy(str[min],st);

}

}

for(i=0;i<5;i++) printf("%st",str[i]);

}

例exa6-案例.

比赛评分系统设计。

评分系统基本要求:

评委给每位选手评分,去掉一个最高分,去掉一个最低分,

剩余评委的平均分作为每位选手的成绩。为防止重分现象,

平均分保留两位小数。

每位选手信息包括:编号、成绩和名次。

#include

#include

18

#define N 3 /*选手人数*/

#define M 3

#define P 4 /*评委人数*/

void main()

{

int n,i,j,max;

float rater[P],player[N][M],t,sum;

],player[i][2]);

}

(2)解答:

/* exe6-3-1.c */

#include

void main()

{ int i,j,n,t,min,a[30]; /* 对30个以内的数排序 */

for(n=0;n

{ printf("n输入第%d名选手的编号:",n+1);

scanf("%f",&player[n][0]);

for(i=0;i

{ printf("第%d位评委打分:",i+1);

scanf("%f",&rater[i]);

}

for(i=1;i

for(j=0;j

if (rater[j]>rater[j+1])

{ t=rater[j];

rater[j]=rater[j+1]; /*评委的打分排序

*/

rater[j+1]=t;

}

sum=0;

for(i=1;i

sum=sum+rater[i];

player[n][1]=sum/(P-2);/*计算选手得分*/

}

for(i=0;i

次*/

{ max=i;

for(j=i+1;j

if ( player[max][1]< player[j][1]) max=j;

if(max!=i)

{ t=player[max][1];

player[max][1]=player[i][1]; player[i][1]=t;

t=player[max][0];

player[max][0]=player[i][0]; player[i][0]=t;

}

player[i][2]=i+1;

}

player[N-1][2]=N;

printf("n编号t成绩t名次n");

for(i=0;i

printf("%.0ft%.2ft%",player[i][0],player[i][1

printf("n=");

scanf("%d",&n);

printf("Input %d numbers:",n);

for(i=1;i<=n;i++) /* 输入n个整数 */

scanf("%d",&a[i]);

for(i=1;i

{ min=i;

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

if(a[min]>a[j]) min=j;

if(min!=i)

{ t=a[min];a[min]=a[i];a[i]=t;}

}

for(i=1;i<=n;i++) /* 输出n个整数 */

printf("%6d",a[i]);

}

/* exe6-3-2.c */

#include

int main()

{

int a[20],n,i,j,tmp;

printf("请输入数组的大小(<=20):");

scanf("%d",&n);

printf("请输入%d个数:",n);

for (i=0;i

scanf("%d",&a[i]);

for (i=0,j=n-1;i

{ tmp = a[i];

a[i] = a[j];

a[j] = tmp;

}

for (i=0;i

printf("%4d",a[i]);

return 0;

}

/* exe6-3-3.c */

19

#include

int main()

{

int a[50],n,i,x,tmp;

printf("n=");

scanf("%d",&n);

printf("按从小到大输入%d个数:",n);

for(i=0;i

printf("x=");

printf("x=");

scanf("%d",&x);

while(top<=bot)

{ mid=(top+bot)/2;

if(a[mid]==x) break;

else if(a[mid]>x) bot=bot-1;

else top=top+1;

}

if(top<=bot) printf("%d是数组的第%d个元素

scanf("%d",&x);

for( i=n-1;i>=0;i-- )

if(x

else break;

a[i+1]=x;

for(i=0;i

}

/* exe6-3-4.c */

#include

void main()

{ int n,i,s;

for(n=2;n<1000;n++)

{ s=1;

for(i=2;i<=n/2;i++)

if(n%i==0) s=s+i;

if(s==n)

{ printf("%6d is 完数, 所有因子是 ",n);

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

if(n%i==0) printf("%d ",i);

printf("n");

}

}

}

/* exe6-3-5.c */

#include

void main()

{

int a[50],top,bot,i,n,x,mid;

printf("n=");

scanf("%d",&n);

printf("按从小到大输入%d个数:",n);

for(i=0;i

top=0,bot=n-1;

n",x,mid+1);

else printf("查无此数n");

}

/* exe6-3-6.c */

#include

void main()

{

int a[50],n,m,i,j;

printf("n,m=");

scanf("%d,%d",&n,&m);

printf("输入%d个数:",n);

for(i=0;i

for(i=0,j=n;i

for(i=0,j=n-m;i

for(i=0;i

}

/* exe6-3-7.c */

#include

void main()

{ int a[10][10],i,j,n,sum=0;

printf("方阵的行数:");

scanf("%d",&n);

printf("输入%d行%d列方阵:n",n,n);

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

for(i=0;i

for(j=0;j

if(i==j||i+j==n-1) sum=sum+a[i][j];

printf("sum=%dn",sum);

}

/* exe6-3-8.c */

20

#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("%6d",a[i][j]);

if (a[i][j]>max)

{ max=a[i][j];

row=i;

colum=j;

}

}

printf("n");

}

printf("nmax=%d,row=%d,colum=%dn",max,row+1,colum+

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("A矩阵:n");

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

{ for(j=0;j<4;j++ )

printf("%5d",a[i][j]);

printf("n");

}

printf("B矩阵:n");

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

{ for(j=0;j<3;j++ )

printf("%5d",b[i][j]);

printf("n");

}

printf("C矩阵: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("%5d",c[i][j]);

}

printf("n");

}

}

/* 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("%c",a[i][j]);

printf("n");

}

}

/* 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 ("%4d",a[i][j]);

}

21

printf("n");

}

}

/* 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("str2: ");

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("字符串长度是:%dn",i);

}

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("%dn",r); }

该程序的输出结果是( )。

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%10;

b=n/10%10;

c=n/100;

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

else

return(0);

return(1);

scanf("%d",&num);

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

{

printf("please 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(" %d is not a sxhs.n",num);

printf(" %d is a sxhs.n",num);

scanf("%d",&num);

24

break;

if(i>=n)

return(1);

else

return(0);

}

main()

{

int num;

scanf("%d",&num);

if(isPrime(num)==1)

printf("%d is a sushu.n",num);

else

printf("%d is not a sushu.n",num);

}

(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("%d=%d+%dn",x,i,x-i);

break;

}

else

i++;

}

}

else

printf("ERROR! %d undesirable!",x);

}

(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

if(array[j]

k=j;

t=array[k];

array[k]=array[i];

array[i]=t;

}

}

void main()

{

int a[10],i;

printf("input the array:n");

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

scanf("%d",&a[i]);

selectSort(a,10);

printf("output the array after ordered:n");

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

printf("%5d",a[i]);

printf("n");

}

(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("%c_%c_%c_%c",u+48,v+48,w+48,t+48);

printf("n");

}

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

小于10。

要求:函数factorial(n)计算n的阶乘;函数sum(m)计算

1!+2!+…+m!的累加运算。在主函数中调用sum函数,sum函

数中调用factorial函数来实现累加。

#include

25

long factorial(int n)

{

long t=1;int i;

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

t=t*i;

return t;

}

long sum(int m)

{

long s=0;int i;

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

s=s+factorial(i);

return s;

}

main()

{

int k,num;

long result=0;

scanf("%d",&num);

for(k=1;k<=num;k++)

result=result+sum(k);

printf("(1!)+(1!+2!)+...+(1!+2!+...+%d!)=%ldn",num,

result);

}

(7) 编写函数reverse(s),s是一个字符串,实现将字符串s

逆序存放。

#include

reverse(char s[])

{

int i,t,j;

char temp;

t=strlen(s);

for(i=0,j=t-1;i

{

temp=s[i];s[i]=s[j];s[j]=temp;

}

}

(8) 写一个函数transpose(b),b是一个3阶方阵,实现对

方阵的转置,即行列互换。

int transpose(int b[3][3])

{

int i,j,t;

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

for(j=i+1;j>=i&&j<3;j++)

{

t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;

}

}

main()

{

int a[3][3];int i,j;

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

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

scanf("%d",&a[i][j]);

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

{

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

printf(" %d",a[i][j]);

printf("n");

}

transpose(a);

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

{

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

printf(" %d",a[i][j]);

printf("n");

}

}

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

项k(6)。

#include

int k(int n)

{

int c;

if(n==1)

c=1;

else

if(n%2==0)

c=k(n-1)*2;

else

c=k(n-1)*3;

return c;

}

main()

{

int m;

26

scanf("%d",&m);

if(m>=1)

printf("k(%d)=%dn",m,k(m) /**/);

}

else

printf("input data error!n");

习题8

一、选择题

(1)下面有关宏替换的叙述不正确的是( )。

A.宏替换不占用运行时间

B.宏名无类型

C.宏替换只是字符替换

D.宏名必须用大写字母表示

(2)以下叙述中正确的是( )。

A.预处理命令行必须位于C源程序的起始位置

B.在C语言中,预处理命令行都以“#”开头

C.每个C程序必须在开头包括预处理命令行:#include

D.C语言的预处理不能实现宏定义和条件编译的功能

(3)下列关于#include命令的叙述中,错误的是( )。

A.#include命令中,文件名可以用双引号或尖括号括起来

B.一个被包含文件中又可以包含另一个被包含文件

C.一个#include命令中可以指定多个被包含文件

D.一个#include命令中只能指定一个被包含文件

二、填空题

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

#include

#define MULT(X) X*X

void main()

{ int a=10,c;

c=MULT(a);

printf("%d",c);

}

(2)以下程序运行的输出结果是 【2】 。

#include

#define S(x) 4*x*x

void main()

{ int a=10,b=11;

printf("%dn",S(a+b));

}

(3)以下程序中的for循环执行的次数是 【3】 。

#define N 2

#define M N+1

#define NUM 2*M+1

void main()

{ int i;

for(i=1;i<=NUM;i++)printf("%dn",i);

}

三、编程题

1、用带参数的宏来实现从3个数中找出最大数。

2、请设计输出整数的格式,整数用“%5d”格式输出。要求:

① 一行内输出2个整数;

② 一行内输出3个整数。

3、输入两个整数,求它们相除的余数,请用带参数的宏来实

现。

27

一.选择题

D B C

二.填空题

(1) 100

(2) 161

(3) 1

2

3

4

5

三.编程题

1、用带参数的宏来实现从3个数中找出最大数。

具体程序为:

#include

#define MAX2(x,y) (x)>(y)?(x):(y)

int max(int a,int b, int c)

{

int t1 = MAX2(a, b);

int t2 = MAX2(b, c);

int t3 = MAX2(t1, t2);

return t3;

}

void main()

{ int d,e,f,m;

scanf("%d %d %d",&d,&e,&f);

m = max(d, e, f);

printf("最大数为%d",m);

}

2、请设计输出整数的格式,整数用“%5d”格式输出。要求:

① 一行内输出2个整数;

② 一行内输出3个整数。

具体程序为:

3、输入两个整数,求它们相除的余数,请用带参数的宏来实

现。

具体程序为:

/* exa8-3-3.c */

#include

#define MOD(a, b) ((a) % (b))

void main()

{

int a, b;

printf("Enter two integersn");

scanf("%d %d", &a, &b);

printf("The value is %dn", MOD(a,b));

}

28

【参考答案】

习题9

29

30

【参考答案】

一.选择题

C B B A C B B C D C C C D C B B D B C C

二.填空题

(1) p

(2) *p

(3) 1 2 3 4

(4) 10,0

(5)strcmp(str2,str1);

(6) 定义指针数组p,它由4个指向整型数据的指针元素组成

(7) p为指向含4个元素的一维数组的指针变量

(8) p是返回一个指针的函数,该指针指向整型数据

(9) p为指向函数的指针,该函数返回一个整型值

(10) abCdabCdabCd

三.编程题

(1)定义3个整数及整数指针,仅用指针方法按由小到大的

顺序输出。

#include

void main()

{

int *p1,*p2,*p3,i,j,k,temp;

printf("input data:");

scanf("%d,%d,%d",&i,&j,&k);

p1=&i;

p2=&j;

p3=&k;

if(*p1>*p2)

{

}

输入10个整数,将其中最小的数与第一个数对换,把最大的

数与最后一个数对换。

#include

int main()

{

int m,i,j,a[10],*p1,*p2;

p1=p2=a;

}

if(*p1>*p3)

{

}

if(*p2>*p3)

{

}

printf("%d,%d,%d",i,j,k);

temp=*p3;

*p3=*p2;

*p2=temp;

temp=*p1;

*p1=*p3;

*p3=temp;

temp=*p1;

*p1=*p2;

*p2=temp;

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

scanf("%d",p2++); //输入

31

p2--;

for(m=1,i=0;m<10;m++)

if(a[m]

i=m; //找出最小值

j=a[i];

a[i]=*p1;

*p1=j; //交换最

小值与第一个数

for(m=1,i=0;m<10;m++)

if(a[m]>a[i])

i=m; //找出最大值

j=a[i];

a[i]=*p2;

*p2=j; //交换最大

值与第一个数

for(m=0;m<10;m++)

printf("%5d",a[m]);

printf("n");

return 0;

}

编写程序实现将一个整数字符串转换为一个整数。

#include "string.h"

#include "stdio.h"

int Fun(char *str)

{

int num,i,digital,len;

num = 0;

len=strlen(str);

while(*str!='0')

{

digital=*str-'0';

for(i=0; i

digital*=10;

len--;

str++;

num+=digital;

}

return num;

}

int main()

{

char n[80 ];

int number;

gets(n);

number=Fun(n);

printf("%dn",number);

return 0;

}

编写程序实现在主函数中输入字符串,并在lenth 函数中输

出其长度。

#include

#include

int lenth(const char *str)

{

int i = -1;

while (str[++i]); // while循环在 str[++i] 为

'0' 时结束

return i;

}

int main()

{

char str[1000];

printf("input a string:");

gets(str);

printf("string len: %dn", lenth(str));

return 0;

}

编写transposition函数(参数用指针)将一个4×4矩阵转

置。

#include "stdio.h"

void transposition(int *str)

{

int i,j,t;

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

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

{

t=*(str+4*i+j);

*(str+4*i+j)=*(str+4*j+i);

*(str+4*j+i)=t;

}

}

int main()

{

int a[4][4],*p,i;

printf("input matrix:n");

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

32

scanf("%d %d %d %d",&a[i][0],&a[i][1],&a[i][2],&a[i]

[3]);

printf("matrix:n");

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

printf("%5d %5d %5d %5dn",a[i][0],a[i][1],a[i][2],a

[i][3]);

p=&a[0][0];

transposition(p);

printf("new matrix:n");

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

printf("%5d %5d %5d %5dn",a[i][0],a[i][1],a[i][2],a

[i][3]);

return 0;

}

不用字符串处理函数strcmp,编写自定义函数实现两个字符

串的比较。

#include

int scmp(char *p1,char *p2)

{

int i=0;

while(*(p1+i)==*(p2+i))

if(*(p1+i++)=='0')

return 0;

return(*(p1+i)-*(p2+i));

}

void main()

{

char str1[80],str2[80],*p1,*p2;

int t;

printf("input str1:");

gets(str1);

printf("input str2:");

gets(str2);

p1=str1;

p2=str2;

t=scmp(p1,p2);

printf("%dn",t);

}

编程实现统计子串substr在母串str中出现的次数。

#include

int count(char *str,char *substr)

{

int i,j,k,num=0;

for(i=0;str[i];i++)

for(j=i,k=0;substr[k]==str[j];k++,j++)

if(substr[k+1]=='0')

{

num++;

break;

}

return(num);

}

void main()

{

char str[80],

substr[80];

int n;

printf("input str:");

gets(str);

printf("input substr:");

gets(substr);

printf("%dn",count(str,substr));

}

不用字符串处理函数strcat,编程实现两个字符串s1和s2

连接。

#include "stdio.h"

#include "string.h"

char *stringcat(char s1[],char s2[])

{

int i,j;

for(i=0;s1[i]!=0;i++);

for(j=0;s2[j]!=0;i++,j++)

s1[i]=s2[j];

s1[i]=0;

return s1;

}

int main()

{

char str1[1000],str2[80],*s;

printf("input str1:");

gets(str1);

printf("input str2:");

gets(str2);

s=stringcat(str1,str2);

printf("%s",s);

33

return 0;

一、选择题

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

#include

main()

{

struct date

{ int year,month,day;

}today;

union

{

long a;

int b;

char c;

}m;

printf("%d%dn",sizeof(struct date),sizeof(m));

}

A.6 4 B.8 5 C.10 6 D.12 7

2.若有以下定义和语句,不正确的引用是( )。

struct student

{ int age;

int num;

};

struct student

stu[3]={{1001,20},{1002,19},{1003,21}};

main()

{ struct student *p;

p=stu;

...

}

}

题10

A.(p++)->num B.p++ C.(*p).num

D.p=&

3.以下程序的输出结果为( )。

#include

main()

{ union

{ int a[2];

long b;

char c[4];

}s;

s.a[2]=0x39;

s.a[1]=0x38;

printf("%lx%cn",s.b,s.c[0]);

}

A.390039 39 B.380039 9 C.3938 38

D.3839 8

二、填空题

1、在以下嵌套结构中填空,给出李冬的姓名、年龄(20岁)、

性别(男)、生日(1993年5月16日)、语种(c)及系别

(计算机系)的信息,并输出这些信息。

#include

struct date

{ int month;

int day;

int year;

};

struct student

{

_________ name[20];

_________ age;

34

_________sex;

_________date_birthday;

_________Language;

_________department[30];

};

main()

{

struct student s1=_________;

printf ___________;

}

2.结构体数组中存有3个人的姓名和年龄,以下程序输出3

个人中最年长者的姓名和年龄,在横线上填上正确的内容。

static struct man

{ char name[20];

int age;

}person[]={{"zhang-hua",18},{"li-dong",20},{"wang-pi

ng",22}};

main()

{ struct man *p,*q;

int old=0;

for(_______;______;p++)

if (oldage)

{ q=p;

________;

}

printf("%s%d",_______);

}

三、编程题

1.定义一个结构体变量(包括年、月、日),计算该天在本

年中为第几天?(需考虑闰年问题)要求写一个days函数来

实现。由主函数将年月日传递给days函数,计算后将天数传

回主函数输出。

2.有若干个学生,每个学生的记录包括学号、姓名和三门课

的成绩,从键盘输入学生数据(学号为0000时,输入结束),

要求输出每个学生的三门课总平均成绩。

3.编写一个函数new,对n个字符开辟连续的存储空间,此函

数应返回一个指针(地址),指向字符串开始的空间。new(n)

表示分配n个字节的内存空间。

4.设计候选人得票统计的程序,要求随机设定候选人,每次

输入一个得票候选人的名字,最后输出各人得票情况。

5.有一个链表,每个结点包括:学号、姓名、性别和年龄。

编写函数,实现如下功能:每输入一个学生信息,比较新输

入学生学号与框表中已有结点的学号信息是否重复,如果重

复则提示“学号重复!”,并重新输入下一个学生信息;如

果不重复,则把该学生信息放到链表的最后,输出该链表中

的学生信息。

【参考答案】

一.选择题

1 D 2 D 3 B

二.填空题

、int、char、struct data、char、char、(“李冬,

20,1,1993-5-16,c,”计算机系“、

int days(date d)

{

int num = 0;

int m, da, i;

if (( %4 == 0 && %100!=0)||( % 400

== 0))

{

for (m = 1; m <= ; m++)

{

if (m == 2)

da = 29;

else if (m==4||m==6||m==8||m==11)

da = 30;

else

da = 31;

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

{

(“%s,%d,%d,%s,%sn”,,,_birthda

y,ge,met)

2. p=person、p<3、old=p->age、q->nam,q->old

三.编程题

1、

#include

typedef struct

{

int year;

int month;

int day;

}date;

35

num++;

if ( m == && i == )

return num;

}

}

}

else

{

for (m = 1; m <= ; m++)

{

if (m == 2)

da = 28;

else if (m==4||m==6||m==8||m==11)

da = 30;

else

da = 31;

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

{

num++;

if ( m == && i == )

return num;

}

}

}

}

int main()

{

date d;

scanf("%d%d%d",&,&,&);

printf("%d年%d月%d日 is the %d days of this

year",,,,days(d));

return 0;

}

2、

#include

#define N 50

struct student

{

long num;

char name[10];

int score[3];

float avr;

};

int main(void)

{

//这里定义了N个学生信息

struct student stu[N];

//下面的数据用来存储过程变量值

int i, s=0,j,h;

//

double aver;

//定义3个最大值和和值,用来分别统计3门课程的

最大值和总分

int max[3],sum[3];

//这里用来读入学生信息

printf("请输入学生的学号,姓名,三门课成绩:n");

if(=”0000”)

break;

else

{

for(i=0;i

{

scanf("%ld %s %d %d %d",&stu[i].num,stu[i].nam

e,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]

);

}

//下面是用来显示输入的用户信息

for(i=0;i

{

printf("%dt%st%dt%dt%dt%fn",stu[i].num,s

tu[i].name,stu[i].score[0],stu[i].score[1],stu[i].sc

ore[2],(1.0*(stu[i].score[0]+stu[i].score[1]+stu[i].

score[2]))/3);

}

//获取到每科成绩的最大值,并输出最高者的信息。也

输出每科的最高平均成绩

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

{

max[j] = 0;

sum[j] = 0;

for(i=0;i

{

if(stu[i].score[j]>max[j])

{

max[j]=stu[i].score[j];

h=i;

}

36

sum[j] += stu[i].score[j];

}

printf("The first class_Info is that:n");

aver = 1.0*sum[j]/N;

printf("tThe Aver is %lfn", aver);

printf("tThe Highest Score is:%d ntThe

Score Highest stu info is :%d %s %dn",max[j],

stu[h].num,stu[h].name,stu[h].score[j]);

}

}

return 0;

}

3、

#include

char *new(const int n)

{

return (char*)malloc(sizeof(char)*n)

}

int main(void)

{

char *str;

str=new(10);/*分配10个char连续空间*/

free(str); /*释放str指向的空间*/

return 0;

}

4、

#include

#include

#define N 20

struct person

{

char name[20];

int count;

}leader[N]

void main()

{

int i,j,n;

char leader_name[20];

scanf("%d",&n);

for(i=0;i

{

for(j=0;j

{

scanf("%s",leader_name);

if(strcmp(leader_name,leader[j].name))

{

leader[j].count++;

} /*error*/

}

}

printf("n");

for(i=0;i

{

printf("%5s:%dn",leader[i].name,leader[i].cou

nt);

}

}

5、

#include

#include

struct student

{

long num;

char name[10];

char sex[3];

int age;

struct student *next;

};

int n;

struct student *creat(int a)

{

struct student *head;

struct student *p1,*p2;

head=NULL;

for( n=0;n

{

p1=(struct student*)malloc(LEN);

scanf("%ld %s %s %d",&p1->num,p1->name,p1->sex,&p1->

age); //这里改成空格才可以保证name sex正确输入!!

if(n==0) head=p1;

else if(p1->num已有) printf(“学号重复!

“)

p2->next=p1;

p2=p1;

}

37

p1->next=NULL;

return(head);

}

int main()

{

struct student *p1,*head,*p2;

int n;

long t;

printf("please input the total number");

scanf("%d",&n);

head=p1=p2=creat(n);

printf("please input the num you want to delete");

scanf("%ld",&t);

//while(t!=p1->num&&p1!=NULL){ p2=p1;p1=p1->next;}

while( p1!=NULL && t!=p1->num){ p2=p1;p1=p1->next;}

//要先判断p1是否为空,再判断数据是否相同,否则找不到

数据时会出错

if(p1==NULL) printf("the num you want to delete is

not exist");

else

{

printf("%ld,n%s,n%s,n%dn",p1->num,p1->name,p1->s

ex,p1->age);

if(p1==head) head=p1->next;

p2->next=p1->next;

free(p1); //删除了,就释放掉这个结点

}

//显示一下 剩余的数据

printf("n" );

p1=head;

while ( p1 )

{

printf("%ld, %s, %s, %dn",p1->num,p1->name,p1->sex

,p1->age);

p1=p1->next;

}

return 0;

习 题11

1.C程序中对文件操作的一般步骤是什么?

答:C语言中,对文件一般的操作步骤为:

1)定义文件类型指针;

2)建立/打开文件;

3)从文件中读数据或向文件中写数据;

4)关闭文件。

2.试举例说明在什么情况下打开文件操作可能出错。忘记关

闭文件为什么可能造成数据的丢失。

答:打开文件出错的原因可能是用“r”方式打开一个并不存

在的文件、磁盘故障或磁盘已满无法建立新文件等。

在向文件写数据时,是先将数据输到缓冲区,待缓冲区充满

后才正式输出到文件。如果当数据未充满缓冲区而程序结束

运行,就会将缓冲区中的数据丢失。用fclose函数关闭文件,

可以避免这个问题,它先把缓冲区中的数据输出到磁盘文件,

然后才释放文件指针变量。

3.编写一个比较两个文本文件内容是否相同的程序。

#include

#include

void main()

{

FILE *fp1,*fp2;

if ((fp1=fopen("", "r"))==NULL)

{

}

if ((fp2=fopen("", "r"))==NULL)

{

}

while(!feof(fp1)||!feof(fp2))

{

}

if (feof(fp1)&&feof(fp2))

else

printf("两个文本文件内容不相同n");

printf("两个文本文件内容相同n");

if (getc(fp1)!=getc(fp2))

break;

printf("cannot open this filen");

exit(0); /*终止程序*/

printf("cannot open this filen");

exit(0); /*终止程序*/

fclose(fp1);

fclose(fp2);

38

}

4.将一个磁盘文件中的信息复制到另一个磁盘文件中。

#include

void main()

{

FILE *fp1,*fp2;

if ((fp1=fopen("", "rb"))==NULL)

{

printf("cannot open this filen");

exit(0); /*终止程序*/

}

fp2=fopen("", "wb");

while(!feof(fp1)) putc(getc(fp1),fp2);

printf("复制成功n");

fclose(fp1);

fclose(fp2);

}

5.从键盘输入字符串追加到指定的文件中。

#include

#include

void main()

{ char ch;

FILE *fp;

if ((fp=fopen("", "a"))==NULL)

{

printf("cannot open this filen");

exit(0); /*终止程序*/

}

printf("Input a string:n");

ch=getchar();

while (ch!='n')

{

fputc(ch,fp);

ch=getchar();

}

fclose(fp);

}

6.统计一篇英语短文中大写字母的个数和句子个数。

#include

void main()

{

char ch;

int ucase=0,sentence=0;

FILE *fp;

if ((fp=fopen("", "r"))==NULL)

{

printf("cannot open this filen");

exit(0); /*终止程序*/

}

while(!feof(fp))

{

ch=getc(fp);

if(ch>='A'&&ch<='Z')

ucase++;

if (ch=='.')

sentence++;

}

printf("文章中大写字母有%d个,句子数为%d个

n",ucase,sentence);

fclose(fp);

}

7.有10名学生,每名学生有3门课程成绩,从键盘输入学

生数据(包括学号、姓名、3门课程成绩),计算出每位学生

平均成绩,并将输入的学生数据和计算出的平均成绩存放在

学生成绩文件中。

#include

#define MAXN 10

typedef struct scores

{

float score1;

float score2;

float score3;

} SCORE;

typedef struct student

{

char num[15];

char name[12];

SCORE cj;

float aver;

} STUDENT;

void input(STUDENT *data)

{

int i;

39

for(i=0;i

{

printf("n请输入第 %d 名学生信息n",i+1);

printf("请输入学号:");

gets(data[i].num);

printf("请输入姓名:");

gets(data[i].name);

printf("请输入第1门课成绩:");

scanf("%f",&data[i].1);

printf("请输入第2门课成绩:");

scanf("%f",&data[i].2);

printf("请输入第3门课成绩:");

scanf("%f",&data[i].3);

data[i].aver=(data[i].1+data[i].

re2+data[i].3)/3;

getchar();

}

}

void save(STUDENT *data)

{

int i;

FILE *out;

if ((out=fopen("","wb"))==NULL)

{

printf("n不能打开数据文件n");

return ;

}

for(i=0;i

{

if

(fwrite(&data[i],sizeof(STUDENT),1,out)!=1)

printf("file write errorn");

}

fclose(out);

}

void main()

{

STUDENT stu[MAXN];

input(stu);

save(stu);

}

8.将上题“”文件中的数据,按平均成绩进行排序,

将已排序的学生数据存入一个新的学生成绩文件

stud_中。

#include

#define MAXN 10

typedef struct scores

{

float score1;

float score2;

float score3;

} SCORE;

typedef struct student

{

char num[15];

char name[12];

SCORE cj;

float aver;

} STUDENT;

void load(STUDENT *data,int *len)

{

FILE *in;

if ((in=fopen("","rb"))==NULL)

{

printf("n不能打开数据文件n");

return ;

}

printf("num name score1 score2 score3

avern");

while(fread(&data[*len],sizeof(struct

student),1,in)!=0)

{

printf("%5s %5s %5.2f %5.2f %5.2f %5.2fn",

data[*len].num,data[*len].name,data[*len].1,

data[*len].2,data[*len].3,data[*len]

.aver);

(*len)++;

}

fclose(in);

}

40

void sort(STUDENT *data, int len)

{

int i,j,k;

STUDENT temp[1];

for(i=0;i

{

k=i;

for(j=i+1;j

if (data[j].aver

k=j;/*记下最小元素位置*/

if (k!=i)

{

temp[0]=data[i];

data[i]=data[k];

data[k]=temp[0];

}

}

}

void save(STUDENT *data,int len)

{

int i;

FILE *out;

if ((out=fopen("stud_","wb"))==NULL)

{

printf("n不能打开数据文件n");

return ;

}

for(i=0;i

{

if

(fwrite(&data[i],sizeof(STUDENT),1,out)!=1)

printf("file write errorn");

}

fclose(out);

}

void main()

{

STUDENT stu[MAXN];

int len=0;

load(stu,&len);

sort(stu,len);

save(stu,len);

}

9.在上题已排序的学生成绩文件stud_中进行插入

处理。插入一名学生的学号、姓名、3门课程成绩,程序先计

算新插入学生的平均成绩,然后将它按成绩高低顺序插入,

插入后的数据存放到一个新文件中。

#include

#define MAXN 10

typedef struct scores

{

float score1;

float score2;

float score3;

} SCORE;

typedef struct student

{

char num[15];

char name[12];

SCORE cj;

float aver;

} STUDENT;

void input(STUDENT *s)

{

printf("n请输入要插入的学生信息n");

printf("请输入学号:");

gets(s->num);

printf("请输入姓名:");

gets(s->name);

printf("请输入第1门课成绩:");

scanf("%f",&s->1);

printf("请输入第2门课成绩:");

scanf("%f",&s->2);

printf("请输入第3门课成绩:");

scanf("%f",&s->3);

s->aver=(s->1+s->2+s->

3)/3;

}

void load(STUDENT *data,int *len)

{

41

FILE *in;

if ((in=fopen("stud_","rb"))==NULL)

{

printf("n不能打开数据文件n");

return ;

}

printf("num name score1 score2 score3

avern");

while(fread(&data[*len],sizeof(struct

student),1,in)!=0)

{

printf("%5s %5s %5.2f %5.2f %5.2f %5.2fn",

data[*len].num,data[*len].name,data[*len].1,

data[*len].2,data[*len].3,data[*len]

.aver);

(*len)++;

}

fclose(in);

}

void insert(STUDENT *data, int *len,STUDENT *s)

{

int i,k;

k=*len;

for(i=0;i<*len;i++)

{

if ((*s).aver<=data[i].aver)

{

k=i;

break;

}

}

for(i=*len-1;i>=k;i--)

{

data[i+1]=data[i];

}

data[k]=*s;

(*len)++;

}

void save(STUDENT *data,int len)

{

int i;

FILE *out;

if ((out=fopen("stud_sort_","wb"))==NULL)

{

printf("n不能打开数据文件n");

return ;

}

for(i=0;i

{

if

(fwrite(&data[i],sizeof(STUDENT),1,out)!=1)

printf("file write errorn");

}

fclose(out);

}

void main()

{

STUDENT stu[MAXN+1],s;

int len=0;

input(&s);

load(stu,&len);

insert(stu,&len,&s);

save(stu,len);

}

42


本文标签: 函数 输出 程序 输入 文件