您的当前位置:首页正文

C C++程序设计课后答案

来源:汇意旅游网
第一章 一、 选择题

1.C/C++规定,在一个源程序中,main()函数的位置( )。C A.必须在最开始 B.必须在最后

C.可以任意 D.必须在系统调用的库函数的后面 2.以下()是C/C++合法的标识符。A A.char2 B.@x C.int D.7Bw

3.下面的程序,对于输入:2 9 15,输出的结果是( )。B #include\"iostream.h\" void main() {int a; float b;

cout<<\"input a,b:\"<>a>>b;

cout<<\"a+b=\"<A.2 B.11 C. 26 D.24

4. 在Visual C++中,打开一个项目只需要打开对应的项目工作区文件即可,项目工作区文件的扩展名为( )。C A.obj B.dsp C.dsw D.cpp

5.下面关于C语言与C++关系的说法中,( )是正确的。D A.C语言是C++的子集 B.C++对C语言进行了改进

C.C++和C语言都是面向对象的 D.C++继承了C语言的众多优点

6.设置一个断点的方法是将光标移到需要设置断点的行上,然后按( )键。A A.F9 B.F10 C.F11 D.F12

7.下面关于编译预处理命令的说法中,正确的是( )。C A.一条文件包含命令能包含多个文件 B.文件包含命令不可以嵌套使用

C.编译预处理命令是在编译之前被处理的命令 D.编译预处理命令中的“#”可以省略 8.使用( )可以设置数据输出的宽度。B

A.setbase(int n) B.setw(int n) C.setfill(int n) D.setprecision(int n) 二、 填空题

1.C/C++程序是由一个或多个函数组成的,但必须要有一个( )函数,程序从这个函数开始运行的。 main()

2.C/C++字符集包括大、小写英文字母、( )、( )和包括运算符在内的特殊字符,程序中出现字符集以外的字符就是一个语法错误。 数字0-9、下划线

3.在Visual C++中编写程序时,除了注释中可以出现汉字,还能在( )中使用汉字。字符串

4.文件包含命令是以( )开始的预处理命令,而宏定义命令是以 ( )开始的预处理命令。#include #define

1 / 51

5.在cout命令中,使用 ( )格式控制符可以把一个数据以十六进制的形式输出。hex 6.在C/C++中,头文件的扩展名一般为( )。.h 7.程序的错误一般分两种:( )和( )。前者是编译器可以发现的,而后者编译器则无法发现。语法错误和逻辑错误

8.在Visual C++中调试程序时,可以使用快捷菜单中的 ( )命令来插入断点和清除断点。Insert/Remove Breakpoint 9.C++源程序的扩展名为( )。.cpp 10.在Visual C++中,浏览当前项目中的所有源程序文件应在工作区的( )选项卡。Fileview 三、 简答题

1. C++与C语言的主要区别是什么?C++是C语言的超集。C++中的类和对象部分,C语言没有,C++是面向对象的程序设计。见教材P3。

2. C/C++程序由哪些部分组成?C/C++程序是由一个或多个函数组成,其中必须要有一个main()函数。在一个函数内,语句的执行是从上到下的。 3. 判断下列符号中哪些不能作为C/C++的标识符: a? , 3a, a-b, f(x), A D, a.txt, D $, ∏, double 能作为C/C++的标识符:abc,b,s_2,Int

4. C/C++语言的书写格式有哪些特点?C/C++程序书写形式自由。一行可以写多条语句,一条语句也可以分别写在不同行上。区别大小写字母。

5. 何时在#include中使用尖括号,何时使用双引号?用尖括号时,预处理程序在系统指定的文件夹中寻找文件;用双引号时,预处理程序首先在当前文件所在的文件目录中寻找文件,若找不到再到系统指定的文件夹中查找。 6. 如果程序顺利地通过编译、连接,但是程序运行时结果有错误,最好的调试手段是什么?最好的调试手段是设置断点,并让程序运行到该断点,然后在Debug窗口观察各变量的值,从中发现错误。

第二章 一、 选择题

1.下列选项中可以作为C/C++的合法整型常量的是( )。B A.1011B B.047 C.x23 D.20H 2.下列不合法的常量是( )。C

A.2.7 B.1.0E+3 C.3.5E-3.0 D.3.4e-5 3.下列常量中不是字符型常量的是( )。D A. '\\x44' B.'\' C.'\\\\' D.\"m\" 4.下列选项中合法的变量名为( )。C A.#define B.float C.a12_3 D.sqrt(x) 5.下列不正确的变量定义方法是( )。D

A.int a,&b=a; B.float a,*b=&a; C.int a(4),b(0); D.int a=b=5; 6.下列运算符优先级按由高到低的顺序排列正确的是( )。C

A.*=、&&、!=、% B.*=、%、&&、!= C. %、!= 、&&、*= D.&&、!=、%、= 7.已知x、y为整型,z为实型,ch为字符型,下列表达式中合法的是( )。C A.z=(y+x)++ B.x+y=z C.y=ch+x D.y=z%x

2 / 51

8.若有定义\"int x;\",则经过表达式\"x=(float)7/3\"运算后,x的值为( )。C A.0 B.2.3 C.2 D.1

9.若有定义\"int x=13,y=5;\",则表达式\"x++,y+=2,x/y\"的值为( )。B

10.设整型变量m、n、a、b、c、d均为数值1,表达式(m=a>b)&&(n=c>d)运算后,m、n的值分别是( )。B

A.0,0 B.0,1 C.1,0 D.1,1

二、把下列数学表达式写成C/C++表达式。 1.x+y≠a+b : (x+y)!=(a+b).

2.(ln10+xy)3 :pow(log(10)+x*y),3) 3.

sin():sin(w*u)/(cos(45*180/3.14)+3*pow(x,y)) ycos453x4.e3(:exp(3)+sqrt(2*x+3*y) 2x3y)5.x-y6.

xy:fabs(x-y)+(x+y)/(3*x) 3x1:1/(1/r1+1/r2+1/r3)

111r1r2r3

三、根据下列条件写一个C/C++表达式。 1.a和b中有一个大于d:a>d||b>d

2.将x、y中较大的值送给z:z=x>y?x : y

3.将直角坐标系中点(x,y)表示在第3象限内:x<0&&y<0 4.3个数据x、y、z能组成三角形:x+y>z||y+z>z||x+z>y

5.将含有3位小数的实型变量x的值,四舍五入到百分位:(int)(x*100+0.5)/100. 6.d是不大于100的偶数:d>0&&d<=100&&d%2==0 7.x、y中至少有一个是5的倍数:x%5==0||y%5==0

8.对n(>0)个人进行分班,每班k(>0)个人,最后不足k人也编一个班,问要编几个班:n%k==0?n/k : n/k+1 四、编程题:

1 编程序求半径为r、高为h的圆柱体的体积。 #include \"iostream.h\" void main() {float r,h,v; cin>>r>>h;

v=3.1416*r*r*h; cout<2.任意输入3个数据,输出它们的平均值和最小的一个数。 #include \"iostream.h\"

3 / 51

void main() {

float a,b,c,ave,min; cin>>a>>b>>c; ave=(a+b+c)/3; min=(amin=(ccout<<\"ave=\"<3.将字符串“12”转换为整数12并输出。 #include \"iostream.h\" void main() {

char c1='1',c2='2'; int x;

x=10*(c1-'0')+c2-'0'; cout<4.编写程序,输入一个三位整数,反向输出该三位整数。 #include \"iostream.h\" void main() {int x;

int c1,c2,c3; cin>>x; c1=x/100; c2=x/10%10; c3=x%10;

x=100*c3+10*c2+c1; cout<5.输入一个年份,判断是否为闰年。 解1:

#include \"iostream.h\" void main() {int year,x; cin>>year;

x=year%400==0||year%4==0&&year%100!=0;

x!=0?cout<解2:

#include \"iostream.h\" void main() {int year;

4 / 51

char x; cin>>year;

x=(year%400==0||year%4==0&&year%100!=0)?'y': 'n'; cout<6.编写程序,求函数ylg(x3)22*cos40的值,要求输入x,程序就输入y的值

#include \"iostream.h\" #include \"math.h\" void main() {double x,y; cin>>x;

y=log(x*x+3)/log(10)+3.14/2*cos(40*3.14/180); cout<第三章 一、选择题

1.为了避免嵌套的if else 语句的二义性,C/C++语言规定else总是与( )组成配对关系。C

A. 缩排位置相同的if B.在其之前未配对的if C. 在其之前未配对的最近的if D.同一行上的if

1,x02.设有函数关系为y0,x0,下面( )选项不能正确表示上述关系。D

1,x0A. if(x<=0) B. y=1;

if(x<0)y=-1; if(x<=0)

else y=0; if(x<0)y=-1; else y=1; else y=0; C.y=-1; D. y=-1; if(x>=0) if(x!=0)

if(x==0)y=0; if(x>0)y=1; else y=1; else y=0; 3.若有变量定义“int a=7;”,则下列语句组对应的输出结果是( )。D(该答案后还应附“其他值”) switch(a%5)

{case 0:cout<default: cout<<”其他值”; }

A.其他值 B.5 C. 7 D.7 5其他值

5 / 51

4.以下程序段中循环体语句“k++”执行的次数为( )。C for(k=0,m=4;m;m-=2) for(n=1;n<4;n++) k++;

A. 16 B.12 C.6 D.8

5.执行下面程序段后,变量k的值为( )。B for(k=0,m=1;m<4;m++) {

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

if(m*n%3==0)continue; k++; }

A. 1 B.3 C.6 D.12 6.下面叙述中正确的是( )。C

A.for循环只能用于循环次数已经确定的情况

B.for循环同do-while语句一样,先执行循环体再判断

C.不管哪种形式的循环语句,都可以从循环体内转到循环体外 D.for循环体内不可以出现while语句 7.下面语句中不是死循环的是( ).A A. int i=100; B. int i,sum(0);

while(1) for(i=1;;i++)sum++; {

i=i%100+1; if(i==20)break; }

C. int k=0; D. int s=3379

do{ while(s++%2+3%2)s++ ++k;

}while(k>=0);

8.若输入字符串“ABC”,下面程序段的输出为( )。C char c;

while(cin>>c,c!=’\\n’) cou<A.222 B.CDE C.676869 D.333 9.以下程序段的输出结果是( )。B A.45 B.457810 C.69 D.678910 二、阅读程序,写出程序运行结果。 (1)试说明下列语句组的功能: while(1) {

cin>>m>>n;

if(m>0&&n>0)break; }

功能:输入两个正整数给m和n。

6 / 51

(2)若有变量定于“int count=0,m=1;”,试写出下列语句组对应的输出结果。 do {

if(m%5)continue; count++;

while(++m<=100); }

结果:20

(3)#include”iostream.h” void main() {

int m,n(4),k; long int t,s=0;

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

for(t=1,k=1;k<=m;k++) t*=m; s+=t ; }

cout<<”s=”<输出为:s=288 (4)若输入:“AB20dfz5”,则下列程序输出结果是什么? #include”iostream.h” void main() {

char c;

while(cin>>c,c!=’.’) {

if(c>=’a’&&c<’z’) c+=1;

if(c==’z’)c=’a’; cout<输出为:AB20ega5

(5) #include”iostream.h”

#include”iomanip.h” void main() {

int i,j;

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

7 / 51

cout<输出: * * * * * *

三、程序填空题:

(1)下面的程序是检查输入的算术表达式中括号是否配对,并显示相应的结果。本程序边输入,边统计,以输入‘?’作为表达式输入结束,然后显示结果。

#include”iostream.h” void main() {

int count(0); char c;

cout<<”请输入表达式,以输入?表示结束”<>c,c!=’?’) {

if(c==’(‘) count++;

else if( ) count--; }

if( ) cout<<”左右括号配对”<cout<<”左括号多于右括号”<cout<<” 右括号多于左括号”<< count<<”个”<填空结果: c==')' count==0 count>0 count

(2) 用辗转相减法求两个正整数m和n的最大公约数。 #include”iostream.h” void main() {

int m,n; ; while(m-n!=0)

8 / 51

if(m>n) ; else ; cout<<”gcd(m,n)=”<填空结果: cin>>m>>n m=m-n n=n-m

(3)求100的阶乘的末尾包含多少个0?程序通过找出1-100之间的所有整数中包含5这个因子的个数来求解。如100=5*5*4含5的因子个数为2,在求阶乘过程中会在末尾产生2个0。 #include \"iostream.h\" void main() {

int m,n,k=0;

for(m=5;m<100;) { ; while(n%5==0) {

k++;

; }

; }

cout<<”100!include”<填空结果: n=m n=n/5 m=m+5

四、编程题:

1.编一程序,实现下列分段函数的求值:

|x|,x52 y3x2x1,5x20

x/5,x20#include \"iostream.h\" #include \"math.h\" void main() {float x,y;

cout<<\"input x:\"<>x; if(x<5)

y=fabs(x);

9 / 51

else if(x<20)

y=3*x*x-2*x+1; else

y=x/5;

cout<<\"x=\"<2.按工资的高低纳税,已知不同工资s的税率p如下: s<1000 p=0% 1000≤s<2000 p=5% 2000≤s<3000 p=8% 3000≤s<5000 p=10% 5000≤s p=15%

编一程序,输入工资数,求纳税款和实得工资数。 #include \"iostream.h\" void main() {

float s,p,t,w;

cout<<\"input s:\"<>s;

switch(int(s)/1000) {case 0:p=0;break; case 1:p=0.05;break; case 2:p=0.08;break; case 3:

case 4:p=0.1;break; default:p=0.15;break; }

t=s*p; w=s-t;

cout<<\"纳税款=\"<3.编一程序,求100~1000之间有多少个整数,其各个数位数字之和等于5? #include \"iostream.h\" void main() {int m,count=0;

for(m=100;m<1000;m++)

{if(m%10+m/10%10+m/100==5) count++; }

cout<<\"count=\"<10 / 51

4.鸡兔共笼有30个头,90只脚,求鸡兔各有多少? #include \"iostream.h\" void main() {int m,n;

for(m=0;m<=30;m++) for(n=0;n<=30;n++)

if(m*2+n*4==90&&m+n==30)

cout<<\"鸡:\"<5.利用格里高利公式求的近似值,公式为:/4≈1-1/3+1/5-1/7+....,要求直到最后一

-4

项小于10为止。 #include \"iostream.h\" void main() {double pi=1.0; int n,t=1;

for(n=1;1.0/(2*n+1)>1e-6;n++) { t=(-1)*t;

pi=pi+t/(2.0*n+1.0); }

pi=4*pi;

cout<<\"pi=\"<法二:

#include \"iostream.h\" void main() {float pi=0.0; int n,t=-1;

for(n=1;1.0/n>1e-6;n=n+2) { t=(-1)*t;

pi=pi+1.0*t/n; }

pi=4*pi;

cout<<\"pi=\"<6.编一程序,求出方程x2+2x=y3(其中1≤x≤100,1≤y≤100)的所有整数解。 #include \"iostream.h\" void main() {int x,y;

for(x=1;x<=100;x++) for(y=1;y<=100;y++)

11 / 51

if(x*x+2*x==y*y*y)

cout<<\"x=\"<7.输入一个英文句子(以句号结束),要求将句中单词分行打印,试编写符合上述要求的程序。

#include \"iostream.h\" #include \"stdio.h\" void main() {char ch;

while((ch=getchar())!='.') if(ch==' ') cout<cout<8.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,求1000以内满足该条件的数。 #include \"iostream.h\" #include \"math.h\" void main() {int m,k1,k2;

for(m=0;m<=1000;m++) {k1=sqrt(m+100);

k2=sqrt(m+100+168);

if(k1*k1==m+100&&k2*k2==m+100+168) cout<9.用二分法求x9-4x5-5x3-270000=0在(0,10)之间的根,要求精度达到0.00001

二分法的步骤为等分区间[x1,x2]成[x1,x]和[x,x2],其中,若f(x)与f(x1)同号,则取[x,x2]作为新的区间,否则取[x1,x]作为新的区间,

依次类推,当新区间的长度或f(x)的绝对值小于eps时,x 就作为所求的实根。 #include \"iostream.h\" #include \"math.h\" void main()

{float x1=0,x2=10,x,y1,y2,y,eps=1e-6; do{x=(x1+x2)/2;

y1=pow(x1,9)-4*pow(x1,5)-5*pow(x1,3)-270000; y=pow(x,9)-4*pow(x,5)-5*pow(x,3)-270000; if(y1*y>0)

12 / 51

x1=x; else x2=x; }while(fabs(x2-x1)>eps); cout<第四章 一、选择题

1.下列数组定义语句中,正确的是( )。C

A.int a[3,4]; B.int n=3,m=4,int a[n][m]; C.int a[3][4]; D.int a(3)(4); 2.以下不能对二维数组a初始化的语句是( )。A A. int a[2][]={{1},{2}}; B.int a[2][3]={1,2,3,4,5,6}; C. int a[2][3]={1}; D.int a[2][3]={ {1},{2}};

3.要使字符数组str中存放串”Lucky”并能正确处理,下列正确的定义语句是( )。C A.char str[]={‘L’,’u’,’c’,’k’,’y’} ; B. char str[5]={‘L’,’u’,’c’,’k’,’y’} ; C. char str[]=”Lucky”; D. char str [5]= ”Lucky” ;

4.已知有语句“int a[3][4]={{1,2,5,3},{2,4,7,9},{3,6,5,8}},*p=&a[0][0];”,则表达式(*p+2)+*(p+2)的值应为( )。D

A.10 B.5 C. 6 D.8 5.已知有语句“int a[5]={1,3,5,7,9},*p=&a[3];”,则表达式p[-1]的值为( )。C A.表达形式不合法 B.值不确定 C.5 D.6

6.要比较两个字符数组a、b中字符串是否相等,下面正确的是( )。B A.a==b B.strcmp(a,b)==0 C. strcpy(a,b) D. strcmp(a,b)=0 7.下面正确的描述是( )。A A.gets函数可以输入包括空格的字符串

B.cin可以输入包含空格的字符串

C.使用gets函数不需要声明头文件:#include “stdio.h” D.使用gets函数必须需要声明头文件:#include “iostream.h”

8.已知如下变量的定义“char s[10],*p;”下列正确的语句是( )。B

A.s=”asdfghj”; B.p=”asdfgh”; C.cin<void main() {

char s[ ]=”1234567890”,*p; int i;

for(p=s+5;*p!=’\\0’;p++)cout<<*p; p=s+4;i=0;

while(i++<5)cout<结果是:678904321

2.若分别输入4和8,则以下程序的输出结果各是什么? #include”iostream.h”

13 / 51

. void main() {

char b[17]=”0123456789ABCDEF”; int i=0,h,n,c[10];long int m;

cin>>m>>h; do {

c[i++]=m%h;

}while((m=m/h)!=0); for(--i;i>=0;--i) {

n=c[i];cout<结果是:4 3. #include”iostream.h”

void main() {

int a[ ]={-2,3,0,-5,-4,6,9},*p=a,m,n; m=n=*p;

for(p=a;p{if(*p>m)m=*p; if(*pcout <<”m-n=”<三、程序填空题。

1.利用一维数组显示Fibonacci数列的前20项,每行显示5个数,每个数宽度5位。即:0,1,1,2,3,5,8,13,…,如图所示。

#include”iostream.h” #include\"iomanip.h\"

void main() { int i;

int x[20]= ; for(i=2;i<20;i++) ; 14 / 51

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

if(i%5==0)cout<}

cout<}

填空为:(1){0,1} (2)x[i]=x[i-1]+x[i-2] (3)setw(5)<#include\"iostream.h\" #include\"stdlib.h\" void main() {

int a[6],i,j;

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

a[i]= ;

for(j=0; ;j++) cout<<'*'; cout<< <填空为:(1)rand()%101 (2)j3.下列程序将数组a中的每4个相邻元素的平均值存放于数组b中。 #include\"iostream.h\" void main() {

int a[10],m,n; float b[7]; for(m=0;m<10;m++)cin>>a[m]; for(m=0;m<7;m++) {

;

15 / 51

for(n=m; ;n++) b[m]=b[m]+a[n]; ; } for(m=0;m<7;m++) cout<填空为:(1)b[m]=0 (2)n4.下面程序按字母顺序比较两个字符串s1和s2的大小,若相等,则输出0;否则输出其第一个不相等的字符的ASCII编码差值。 #include\"iostream.h\" void main() {

char ch1[40],ch2[40],*s1=ch1,*s2=ch2; int r; ; ; while(*s1!='\\0'&& ) {

s1++;s2++;

} if(*s1=='\\0'&&*s2=='\\0') ; else r=*s1-*s2; cout<<\"The result is\"<填空为:(1)cin>>s1 (2) cin>>s2 (3)*s1==*s2 (4) r=0

5.已知数组a和b都是按由小到大顺序排列的有序数组,试将其合并后放入数组c中,使c也按由小到大的顺序排列。 #define M 3 #define N 3

#include\"iostream.h\" void main() {

int a[M],b[N],c[M+N],j,k,l; for(k=0;k>a[k]; for(k=0;k>b[k]; ; while(lj++;l++; } else ; } while(l填空为:(1)j=k=l=0 (2)j1.利用随机数生成两个矩阵(数据不一定相同,前者30~70范围、后者101~135)。

3533A4730675250103476639133B 111566641123695538115125101127132135 103134118109113130要求:

(1)将两个矩阵相加结果放入C矩阵中。 (2)统计C矩阵中最大值和下标。

(3)以下三角形式显示A矩阵、上三角形式显示B矩阵。

(4)将A矩阵第1行与第3行对应元素交换位置,即第1行元素放到第3行;第3行元素放到第1行。

(5)求A矩阵两条对角线元素之和。 (1)

#include \"stdlib.h\" #include \"iostream.h\" void main()

{int a[4][4],b[4][4],c[4][4],i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=rand()%41+30; for(i=0;i<4;i++) for(j=0;j<4;j++) b[i][j]=rand()%35+101; cout<<\"矩阵A的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++) cout<cout<<\"矩阵B的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++)

17 / 51

cout<for(i=0;i<4;i++) for(j=0;j<4;j++) c[i][j]=a[i][j]+b[i][j]; cout<<\"矩阵C的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++) cout<#include \"stdlib.h\" #include \"iostream.h\" void main()

{int a[4][4],b[4][4],c[4][4],i,j,max,imax,jmax; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=rand()%41+30; for(i=0;i<4;i++) for(j=0;j<4;j++) b[i][j]=rand()%35+101; cout<<\"矩阵A的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++) cout<cout<<\"矩阵B的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++) cout<for(i=0;i<4;i++) for(j=0;j<4;j++) c[i][j]=a[i][j]+b[i][j]; cout<<\"矩阵C的内容如下:\\n\"; for(i=0;i<4;i++)

18 / 51

{for(j=0;j<4;j++) cout<max=c[0][0]; for(i=0;i<4;i++) for(j=0;j<4;j++) if(c[i][j]>max) {max=c[i][j]; imax=i; jmax=j; }

cout<<\"max=c[\"<#include \"stdlib.h\" #include \"iostream.h\" void main()

{int a[4][4],b[4][4],i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=rand()%41+30; for(i=0;i<4;i++) for(j=0;j<4;j++) b[i][j]=rand()%35+101;

cout<<\"矩阵A的主对角线以下元素内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<=i;j++) cout<cout<<\"矩阵B的主对角线以上元素内容如下:\\n\"; for(i=0;i<4;i++) {for(j=i;j<4;j++) cout<#include \"stdlib.h\" #include \"iostream.h\" void main()

19 / 51

{int a[4][4],i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=rand()%41+30; cout<<\"矩阵A的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++) cout<for(j=0;j<4;j++) {int t=a[0][j]; a[0][j]=a[2][j]; a[2][j]=t;} cout<<\"改变后矩阵A的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++) cout<#include \"stdlib.h\" #include \"iostream.h\" void main()

{int a[4][4],i,j,s=0; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=rand()%41+30; cout<<\"矩阵A的内容如下:\\n\"; for(i=0;i<4;i++) {for(j=0;j<4;j++) cout<for(i=0;i<4;i++) for(j=0;j<4;j++) if(i==j||i+j==3) s=s+a[i][j];

cout<<\"对角线元素之和为:\"<2.不使用strcpy()函数,用字符指针的形式将一个字符串的内容复制到另一个字符数组中。 用字符数组实现

20 / 51

#include \"stdio.h\" void main()

{int i;char s1[50],s2[20]; gets(s1);

for(i=0;s1[i]!='\\0';i++) s2[i]=s1[i]; s2[i]='\\0'; puts(s2); }

用字符指针实现 #include \"stdio.h\" void main()

{int i;char s1[50],*p1=s1,*p2; p2=new char[20]; gets(p2);

while(*p2!='\\0') *p1++=*p2++; *p1='\\0'; puts(s1); }

3.编一个程序,将一串字符逆序存放后输出。 #include \"stdio.h\" void main() { char s[80],ch; int i,len=0; gets(s);

while(s[len]!='\\0')len++; for(i=0;i4.编写程序,将某一指定字符从一个已知的字符串中删除。 #include \"stdio.h\" #include \"iostream.h\" void main() {char s[80],ch; int i,j; gets(s);

21 / 51

cin>>ch;

for(i=j=0;s[i]!='\\0';i++) if(s[i]!=ch) {s[j]=s[i];j++;} s[j]='\\0'; puts(s); }

第五章 一、选择题

1. 下列叙述错误的是____A_____。

A. 主函数中定义的变量在整个程序中都是有效的 B. 复合语句中定义的变量只在该复合语句中有效 C. 其它函数中定义的变量在主函数中不能使用 D. 形式参数是局部变量

2. 若函数的形参为一维数组,则下列说法中错误的是____B_____。 A. 形参数组可以不指定大小

B. 函数调用时对应的实参只能是数组名

C. 函数调用时,系统会为形参数组分配存储单元 D. 函数中对形参的修改将会影响对应的实参值

3. 若函数的类型和return语句中的表达式的类型不一致,则____D_____。 A. 编译时出错

B. 运行时出现不确定结果

C. 不会出错,且返回值的类型以return语句中表达式的类型为准 D. 不会出错,且返回值的类型以函数类型为准 4. 下面的函数定义正确的是_____D____。

A. float f(float x;float y) B. float f(float x,y) {return x*y;} {return x*y;}

C. float f(x,y) D. float f( int x, int y) {int x,y ; return x*y;} {return x*y;} 5. 下面函数头的定义格式正确的是____C_____。

A. void sort(int a[n],int n) B. void sort(int a[ ][ ],int n) C. void sort(int a[ ],int n) D. void sort(int a[ ],n)

6. 下面4个程序中输出结果是125的有____*****(34)*****_____。 (1). #include \"iostream.h\" void cube(int x) { x=x*x*x; } void main() {

int x=5;cube(x); cout<(3). #include \"iostream.h\" int cube(int x) { x=x*x*x; return(x); }

22 / 51

void main() {

int x=cube(5); cout<7. 设函数m()的说明形式为void m(int,int *); 利用函数m()对数5和整数j作函数m()定义的计算,正确的调用形式为_____C_____。

A. m(&5,&j) B. m(5,j) C. m(5,&j) D. m(&5,j)

8. 设函数的说明为: void fun(int a[],int m); ,若有定义:int a[10],n,x; 则下面调用该函数正确的是____A_____。

A. fun( a, n); B. x=fun( a, n); C. fun( a[10], 10); D. x=fun( a[], n); 9. 下面函数说明正确的是____C_____。

A. void f1(int a=3, int b, int c); B. void f2 int a, int b=3, int c); C. void f3(int a, int b, int c=3); D. void f4(int a, int b, int 3);

10. 有两个函数分别为: int f(int);和int f(int,int =100);,则下面说法正确的是_____B_____。 A. 不能在同一个程序中定义

B. 可以在同一个程序中定义,但不可以重载 C. 可以在同一个程序中定义并可重载 D. 以上说法均错误

11. 以下几种函数模板的定义正确的是____A_____。 A. template T fun1(T a,int b) {…… }

C. template void fun1(int a,int b) {T i; …… }

12. 下面程序的输出结果是____B_____。 #include \"iostream.h\" int m=10;

void f(int m,int &n) { m=m+2; n=n+2;} void main() {

int n=5; f(m,n);

cout<<\"m=\"<A. m=10 n=5 B. m=10 n=7 C. m=12 n=7 D. m=12 n=5

二、阅读程序,写出运行结果 1. #include\"iostream.h\"

int isprime(int m)

23 / 51

{ for(int i=2;m%i!=0;i++); return (i==m); }

void main() {

int m=3; while(isprime(m)) {cout<<\"yes\"<结果:yes 3 not 4

2. #include\"iostream.h\" int count(double *a) { double *p=a; while(*p!=0)p++; return (p-a); }

void main() {

double a[ ]={1.0,2.0,8.0,3.0,0.0,4.0,7.0}; cout<结果:4 3.

#include\"iostream.h\" #include\"iomanip.h\" int sum(int a[],int n) { for(int s=0,int i=0;ivoid main() {

int i,a[]={5,4,3,2,1}; cout<结果:12

24 / 51

25 16 9 2 1

4. #include\"iostream.h\" void f(int *p,int n) { for(int i=0;ivoid main() {

int i,a[]={0,1,2,3,4},*p=&a[0]; f(p,2); for(i=0;i<5;i++)cout<结果: 21234 5.

#include\"iostream.h\" int m=10; void a(int n) { n=15/n;m=m/2; }

void main() {

int n=3;a(n); cout<<\"m=\"<结果: m=5n=3 6.

#include\"iostream.h\" int x=5; int p(int x) { int y=1;static int z=1; y++;z++; return x+y+z; }

void main() {

for(int i=1;i<3;i++)cout<结果:911 三、程序填空

1. 该程序功能:对x=1,2,...,10,求f(x)x5xsin(x)的最大值。 #include \"iostream.h\"

25 / 51

2#include \"math.h\" float f(int x) {

float y;

y=x*x-5*x+sin(x); ____________; }

void main() {

int x; float max;

_____________; for(x=2;x<=10;x++)

________________ ; cout<填空:(1) return y (2)max=f(1) (3)max=f(x)>max?f(x):max; 2. 函数backmove()是把字符指针x所指的字符串平移m个字符,即将最后m个字符移到串首。如“abcdefghij”, 平移3个字符,成“hijabcdefg”。 #include \"stdio.h\" #include \"string.h\"

void backmove(char *x,int m) {

int i,j,n;char w; n=strlen(x);

for(j=0;j{ w=__________;

for(i=0;ivoid main() {

char s[20]; gets(s);

_______________; //假设平移3个字符 puts(s); }

填空:(1) *(x+n-1) (2) *(x+n-2-i) (3) *x (4) backmove(s,3)

3. 函数index()为查找字符串sub是否是字符串st的子串。若是,返回sub在st中首次出现的下标,否则返回-1。字符串sub和st非空。如sub: \" cd \",st: \"abcdefcd \",返回2。 #include \"iostream.h\" #include \"stdio.h\" void main() {

26 / 51

char s1[80],s2[80]; _______________; gets(s1);gets(s2);

if(_______________)

cout<<\"子串在字符串中首次出现的下标:\"<cout<<\"找不到\"; }

int index(char st[],char sub[]) {

int i,j,k;

for(i=0;st[i]!='\\0';i++) {

for(j=i,k=0;sub[k]!= '\\0'&&st[j]==sub[k] ;____________); if(sub[k]== '\\0')________________; } return -1; }

填空:(1) int index(char [],char []) (2) index(s1,s2) (3) k++,j++ (4) return(i)

4. 函数root为用二分法求方程f(x)=0在[x1,x2]的实根,精度为eps。二分法求根的基本思想为 f(x)在区间[a,b]上连续,f(a) 与 f(b)异号,区间中点 c=(a+b)/2 的 f(c) 符号和 f(a) 符号确定 c 代替 a 或 b,使根所在区间每次减半,直到|a- b|double root(double x1, double x2, double eps=1e-6) {

________________ ; double x,y,y1; y1=f(x1); do{

x=0.5*(x1+x2); y=f(x);

if(y1*y>0.0)____________________; else if (y1*y<0.0) ___________________; }while(fabs(y)>=eps______fabs(x2-x1)>=eps); return(x); }

double f(double x) {

return x*x*x-5*x*x+16*x-80; }

void main()

{cout<<__________<27 / 51

填空:(1) double f(double x) (2) x1=x (3) x2=x (4) && (5) root(1,7)

5.随机生成10个1~100之间的数放在一维数组中,求其平均值及最大的元素值。 #include \"iostream.h\" #include \"stdlib.h\" const int N=10;

void fun(float *p,float *p1,float *p2) {

float sum,max1; ______________; for(int i=1;i________________; _______ _________; }

void main() {

float a[10],aver,max,x; for(int i=0;i<10;i++) {

x=rand() % 100+1; a[i]=x; }

for(i = 0;i<10;i++) cout<cout<<\"平均值:\"<填空:(1) max1=*p,sum=0 (2) *p1=max1 (3) *p2=sum/N (4)fun(a,&max,&aver) 6. 函数convert的功能是将一个十进制整数转换为二到十六进制的字符串。 #include \"iostream.h\"

void convert(int m,int h,char ch[]) {

char b[17]=\"0123456789ABCDEF\"; int c[10],i=0,k=0; do

c[ _____ ]=m%h; while(_________); for(--i;i>=0;--i)

{ ch[k++]=b[ _________ ]; } ________________; }

void main()

28 / 51

{

char ch[10];int m,h; cin>>m>>h; convert(m,h,ch); cout<填空:(1) i++ (2) (m=m/h)!=0 (3) c[i] (4) ch[k]='\\0' 四、编程题

1. 编写函数,功能为将字符串s中的字符c1用字符c2替换,并加以调用。函数形式为: void match(char s[], char c1,char c2);

#include\"iostream.h\"

void match(char s[], char c1,char c2) {char *p=s; while(*p!='\\0') { if(*p==c1) *p=c2; p++; } }

void main( )

{ char s[80],c1,c2;

cout<<\"input a string:\"<>s;

cout<<\"input c1:\"<>c1;

cout<<\"input c2:\"<>c2;

match(s,c1,c2); cout<2. 编写函数,功能为求圆的周长和面积。函数分别定义为如下形式: double area(double r, double * girth ,double pi=3.14159);

void fun(double r, double &girth ,double &area,double pi=3.14159); 分别编二个程序实现,半径从键盘输入。 方法一、

#include

double area(double r,double *girth,double pi=3.14159) { *girth=2*pi*r; return(pi*r*r); }

29 / 51

void main() {double r,len,s; cin>>r;

s=area(r,&len);

cout<<\"len=\"<方法二

#include

void fun(double r,double &girth,double &area,double pi=3.14159) { girth=2*pi*r; area=pi*r*r; }

void main() {double r,len,s; cin>>r; fun(r,len,s);

cout<<\"len=\"<3. 编写函数,功能是求二维数组中最大元素所在的行号和列号,再编写主函数调用之。 #define SIZE1 3 #define SIZE2 4

#include \"iostream.h\" #include \"stdlib.h\"

float max_value(float x[][4],int &ii,int &jj) {

float max=x[0][0];

for(int i=0;imax)

{max=x[i][j]; ii=i; jj=j; } return(max); }

void main() {

int i,j,t1,t2;float a[SIZE1][SIZE2]; cout<<\"enter the array:\\n\"; for(i=0;i30 / 51

}

cout<<\"max value is\" << max_value(a,t1,t2); cout<<\" line=\"<法三:

#define SIZE1 3 #define SIZE2 4

#include \"iostream.h\" #include \"stdlib.h\" #include\"time.h\"

float max_value(float x[][4],int *ii,int *jj) {

float max=x[0][0];

for(int i=0;imax)

{max=x[i][j]; *ii=i; *jj=j; } return(max); }

void main() {

int i,j,t1,t2;float a[SIZE1][SIZE2]; srand(time(NULL));

cout<<\"enter the array:\\n\"; for(i=0;icout<<\"max value is\" << max_value(a,&t1,&t2); cout<<\" line=\"<4. 编写函数,将两个字符串s和t的前n个字符拼接成新的字符串,结果存放在s中。如果s或t中字符串的长度不足n,按实际长度处理。例如,如果有\"ABCDEFGH\"和\"abcdefghijk\为3,则新的字符串为”ABCabc”,并加以调用。函数形式为: void mystrcat(char s[],char t[],int n); #include #include

void mystrcat(char s[],char t[],int n) {

31 / 51

int l1=strlen(s),l2=strlen(t); int k1=l1>n?n:l1,k2=l2>n?n:l2; for(int i=0;ivoid main() { char s[30],t[30]; int n; cin>>s>>t; cin>>n; mystrcat(s,t,n); cout<5. 编写函数,其功能是逐字符比较两个字符串s1和s2,并将s1中第一个与s2不相同字符的地址返回给主函数。再编写主函数调用该函数,并在主函数中输出s1从这个位置开始的子串。函数形式为:

char *dif(char s1[],char s2[]); #include #include \"stdio.h\"

char *dif(char s1[],char s2[]) { int i=0; while(s1[i]==s2[i]&&s1[i]!='\\0') i++; if(s1[i]!='\\0') return(&s1[i]); else return NULL; }

void main() { char s[30],t[30]; cin>>s>>t; char *p; if((p=dif(s,t))!=NULL) cout<6. 用递归方法求正整数m,n的最大公约数。 #include int gcd(int m,int n) {

32 / 51

int r=m%n; if(r!=0) return gcd(n,r); else return(n); }

void main() { int m,n; cin>>m>>n; cout<7. 编写四个同名函数max,分别求两个整数、三个整数,两个双精度数、三个双精度数的最大值。

#include int max(int a,int b) { return(a>b?a:b); }

int max(int a,int b,int c) { int t=max(a,b); return(max(t,c)); }

double max(double a,double b) { return(a>b?a:b); }

double max(double a,double b,double c) { double t=max(a,b); return(max(t,c)); }

void main() {double x,y,z; int a,b,c;

cin>>a>>b>>c; cin>>x>>y>>z;

cout<第六章 一、选择题

1.有如下结构类型的定义,则系统为指向结构变量的指针p分配( )个存储单元。A(答

33 / 51

案有问题,指针变量的存储单元应同字长有关,在VC++中为4) struct student {

int num;

char name[8]; float score; }stud,*p;

A. 2 B.12 C.16 D.20

2.下面定义中,对成员变量x的引用正确的是( )。D struct a {

int x,y; };

struct aa {

char c; struct a p ; }b;

A.p.x B.b.a.x C.b.x D.b.p.x 3.若有如下说明: struct s {

int a ; int b;

}x[2]={{1,2},{3,4}},*p=x;

则表达式++p->a的值是( ),表达式(++p)->a的值是( )。B ,C A.1 B.2 C.3 D.4

4.下列程序的输出结果是( )。D void main() {

struct com {int x ; int y ;

}c[2]={1,3,5,7} ;

Cout<A.0 B.1 C.3 D.15

5.若有如下说明,则对初值中字符b的引用方式为( )。 static struct {

char ch; int i; float x;

}a[2][3]={{‘a’,1,1.23},{‘b’,2,2.34 }};(原题此处有问题)

34 / 51

A. a[0][1].ch B. a[1][2].ch C. a[1][1].ch D. a[2][2].ch (没有标准答案:a[1][0].ch) 6.当说明一个结构体变量时,系统分配给它的内存是( )。A A.各成员所需要内存量的总和 B.结构中第一个成员所需内存量 C.结构中最后一个成员所需内存量 D.成员中内存量最大者所需内存

7.若要使p指向一个存储double类型变量的存储单元,下划线处应选择( )。C double *p;

p= malloc ( sizeof(double)) A.int B.double C.(double *) D.double *

8.若有如下定义,则要把a的值赋给b,应选择( )。B struct {

int i; char c[5]; }a={12,”345”},b;

A.b.i=a.i ;b.c=a.c B.b=a C.strcpy(a,b) ; D.b={a.i,a.c} ;

9.若已建立一个链表结构,假设指针域为next,则欲把s所指结点插到表中p所指结点的后面,应选择( )。A

A. s->next=p->next ;p->next=s ; B. p->next=s;s->next=p->next;

C. p->next=s;s=s->next; D. p->next=s;p=s;s->next=p->next;

10. 在一个单链表中,假设指针域为next,若删除p所指的后续结点,则执行( )。A A. p->next=p->next->next; B.p= p->next; p->next=p->next->next; C. p->next=p ->next; D. p=p->next ->next; 二、程序填空题

1.下面程序用一个结构类型表示学生的学号和成绩,通过选择法对班中30名学生按成绩从高到低进行排序,并输出排序后的学号、成绩和全班的平均分。 #include \"stdio.h\" #include \"iostream.h\" #define STNUM 5 struct student { int num; int score; }stu[STNUM]; void main() {

struct student *ptemp,*p[STNUM];/* p为指向结构的指针数组*/ int i,j,k,sum=0; for(i=0;i>stu[i].num>>stu[i].score; p[i]=&stu[i]; sum+= ;

35 / 51

}

for(i=0;i<=STNUM-2;i++) {

k=i;

for(j=i;j<=STNUM-1;j++) if(p[k]->scorescore) ; if(k!=i) { ptemp=p[k]; ; ; } }

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

cout<num<score<填空:(1) stu[i].score (2)k=j (3)p[k]=p[i] (4) p[i]=ptemp 2.已知head指向一个单向链表的头结点,链表中每个结点包含数据域(data)和指针域(next),函数sum的功能是求出链表中所有结点数据域的和,并将它作为函数值返回。 struct link { int data; struct link *next; };

int sum(link *head) {struct link *p; int s=0; p=head;

while( ) {

s+= ; p= ; }

return (s); }

填空:(1)p!=NULL (2)p->data (3)p->next

3.以下函数creatlist用来建立一个带表头结点的单链表,新结点总是插在链表的末尾,链表的头指针作为函数值返回,最后一个结点的next域为NULL。数据域为字符型,以输入#表示结束(#不存在链表)。 struct node { char data;

36 / 51

struct node *next; };

creatlist( ) {

struct node *h,*r,*s; char ch;

h=(struct node *)malloc(sizeof(struct node)); //h指向头结点 r=h; //r指向尾结点 ch=getchar(); while(ch!='#') {

s=(struct node *)malloc(sizeof(struct node));//s指向待插入结点 ; r->next=s;

; ch=getchar(); }

r->next= ; return h; }

填空:(1)struct node * (2)s->data=ch (3)r=s (4) NULL 三、编程题

1.输入若干个职工的工资信息,输出工号和实发工资。职工的工资信息包括工号、姓名、基本工资、附加工资和扣除工资。 #include \"iostream.h\" struct employer { long no; char name[10]; float jbgz; float fjgz; float kcgz; struct employer *next; };

struct employer *create(int n ) {

struct employer *head = NULL; struct employer *tail,*newnode; int x;

for (int i=0; inewnode=new employer ; cin>>newnode->no>>newnode->name>>newnode->jbgz >>newnode->fjgz>>newnode->kcgz;

37 / 51

if(head==NULL)

head=newnode ; else

tail->next=newnode ; tail = newnode; }

tail->next=NULL; return(head); }

void print(struct employer *head) { struct employer *p=head; while(p!=NULL) { cout<no<<'\'<jbgz+p->fjgz-p->kcgz<next; } }

void main( ) {

struct employer *head; int n;

cout<<\"请输入职工数:\"; cin>>n;

head = create(n); print(head); }

2.输出一字符串,以与输入次序相反的顺序建立链表,统计链表中大写字母的个数,并输出该链表。

#include \"iostream.h\" #include \"string.h\" struct str { char ch; struct str *next; };

struct str *revcreate(char a[] ) {

struct str *head = NULL; struct str *tail,*newnode; for (int i=strlen(a)-1; i>=0; i--) {

newnode=new str ; newnode->ch=a[i];

38 / 51

if(head==NULL)

head=newnode ; else

tail->next=newnode ; tail = newnode; }

tail->next=NULL; return(head); }

int print(struct str *head) { int i=0; struct str *p=head; while(p!=NULL) { cout<ch; if(p->ch>='A'&&p->ch<='Z')i++; p=p->next; } return i; }

void main( ) {

struct str *head; char a[80];

cout<<\"请输入一字符串:\"<>a;

head = revcreate(a);

cout<<\"大写字母个数为:\"<3.输入一串字母,将它们按从小到大的次序存放在一个链表中,表中每个结点由存放的字母、该字母出现的次数以及指向下一个结点的指针组成。 #include \"iostream.h\" #include \"string.h\" struct str { char ch; //出现的字母 int time; //出现的次数 struct str *next; };

struct str *create(char a[] ) {

struct str *head=NULL; struct str *newnode,*p,*p1;

for (int i=0; i<=strlen(a)-1; i++) //判断每个字母

39 / 51

{ p=head; while(p!=NULL&&p->chnext;} if(p!=NULL&&p->ch==a[i])p->time++;//该字母若在链表中存在时出现次数+1 else //插入链表 { newnode=new str ; newnode->ch=a[i]; newnode->time=1; if(head==NULL) //空表时 {head=newnode; newnode->next=NULL;} else if(p==head) //插入到第一结点前 {newnode->next=head;head=newnode; } else if(p==NULL) //插入到第一结点前 {p1->next=newnode;newnode->next=NULL; } else { p1->next=newnode;newnode->next=p;} } }

return(head); }

void print(struct str *head) { struct str *p=head; while(p!=NULL) { cout<ch<<'\'<time<next; } }

void main( ) {

struct str *head; char a[80];

cout<<\"请输入一字符串:\"<>a;

head = create(a); print(head); }

4.一个多项式可以用一个链表表示,一个结点存放多项式中一项的系数和指数。例如,多项式5x6+x3-2x可用图所示的链表表示: head 

5 6 

1 3 

-2 1 NULL 编一个程序,读入两个多项式的系数和指数,分别建立链表,然后将这两个多项式相加,要求相加产生的新多项式仍然用一个链表存储,最后输出该多项式。如果两项相加后系数为0,

40 / 51

则应删除此项。

#include struct LNode {

int coef; int expn;

struct LNode *next; };

struct LNode *creatpolyn(int m) {

cout<<\"creatpolyn\"<struct LNode *s,*behind,*front,*head=NULL;

for(i=1;i<=m;++i) { behind=head; s=new LNode;

cout<<\"请输入一元多项式的系数和指数:\"<>s->coef>>s->expn; if(head==NULL) //空表时 { head=s; s->next=NULL; } else { while(behind!=NULL&&s->expnexpn)//找插入位置 { front=behind; behind=behind->next; } if(behind==head) //插入到第一结点前 { s->next=head; head=s; }

else if(behind==NULL) //插入到最后一结点后 { front->next=s; s->next=NULL; }

else //插到front之后、behind之前 { front->next=s;

41 / 51

s->next=behind; } } }

return head; }//CreatPolyn

struct LNode *addpolyn(struct LNode *pa,struct LNode *pb) {

struct LNode *c,*pc=NULL,*tail=pc; {while(pa&&pb) {

if((pa->expn)==(pb->expn)) { if((pa->coef+pb->coef)!=0) {c=new LNode;

c->expn=pa->expn;

c->coef=((pa->coef)+(pb->coef)); }

pa=pa->next; pb=pb->next; } //if

else if((pa->expn)<(pb->expn)) {

c=new LNode; c->expn=pb->expn; c->coef=pb->coef; pb=pb->next; } //if else {

c=new LNode; c->expn=pa->expn; c->coef=pa->coef; pa=pa->next; } //if

if(pc==NULL) pc=c; else

tail->next=c;

42 / 51

tail=c; }//while

if(!pa && pb) while(pb!=NULL) { c=new LNode;

c->expn=pb->expn; c->coef=pb->coef; pb=pb->next; if(pc==NULL) pc=c; else

tail->next=c; tail=c;}//while if(!pb && pa) while(pa!=NULL) { c=new LNode;

c->expn=pa->expn; c->coef=pa->coef; pa=pa->next; if(pc==NULL) pc=c; else

tail->next=c; tail=c; }//while }

tail->next=NULL; return pc;

}//AddPolyn */

void printpolyn(LNode *p) {

while(p->next!=NULL) { if(p->next->coef>0.0)

cout<coef<<\"X^\"<expn<<\"+\"; else if(p->next->coef<0.0)

cout<coef<<\"X^\"<expn; p=p->next; }

cout<coef<<\"X^\"<expn<void main()

43 / 51

{

int n,m;

struct LNode *pa,*pb,*pc;

cout<<\"请输入一元多项式pa的项数:\"<>n;

pa=creatpolyn(n);

cout<<\"请输入一元多项式pb的项数:\"<>m;

pb=creatpolyn(m); pc=addpolyn(pa,pb);

cout<<\"结果是:pa+pb=\"<第七章 一、选择题

1.C语言中,文件由( )组成。D

A.记录 B. 数据行 C. 数据块 D.字符或字符序列 2.以下正确的写法是( )。A

A.fp=fopen(“c:\\xu\\ex1.txt”,”w”); B. fp=fopen(“c:\\xu\\\\ex1.txt”,”w”); C.while(c=getchar()!=”\\n”) ; D.file *fp;

3.若使用fopen()函数以二进制方式打开一个已经存在的文件,并对其进行读取和修改的操作,则正确的“文件使用方式”是()。B

A. “rb” B.”rb+” C.”wb+” D.”wb”

4.以下方式中不能打开一个不存在的文件的是( )。AC A.”r+” B. “w” C.”ab+” D. ”wb”

5.若ch为字符变量,fp为文本文件指针,从fp所指文件中读入一个字符,下列正确的输入语句是( )。B

A.fgetc(fp,ch); B.ch=fgetc(fp); C. ch=getchar( ); D. fgetc(ch, fp); 6.若有定义“int a[5];”,fp是指向某一已经正确打开了的文件指针,下面的函数调用形式中不正确的是( )。A

A.fread(a[0],sizeof(int),5,fp) ; B. fread(&a[0],5*sizeof(int),1,fp) ; C. fread(a,sizeof(int),5,fp) ; D. fread(a,5*sizeof(int),1,fp) ; 7.系统的标准输出文件是( )。D A.键盘 B. 硬盘 C. 内存 D. 显示器

8.在C语言中,从计算机的内存中将数据写入文件,称为( )。B A.输入 B.输出 C.修改 D. 删改

9.函数调用语句“fseek(fp,-20,2);”的含义是( )。C A.将文件位置指针移到距离文件头20个字节处 B.将文件位置指针从当前位置向后移动20个字节

44 / 51

C.将文件位置指针从文件末尾处后退20个字节 D.将文件位置指针移到离当前位置20个字节处

10.若执行fopen函数时发生错误,则函数的返回值是( )B or NULL A.地址值 B. 0 C. 1 D. EOF 二、程序填空题

1.以下程序中由键盘输入一个文件名,然后输入一字符串(用#结束输入)存放到此文件中,形成文本文件,并要求将字符个数在屏幕上输出。 #include \"stdio.h\" #include\"stdlib.h\" #include \"iostream.h\" void main() { FILE *fp;

char ch,fname[30]; int count=0;

cout<<\"input the filename:\\n\" ; cin>>fname;

if((fp=fopen( ))==NULL) { cout<<\"error\\n\"; exit(1); }

while( ) { fputc(ch,fp); ; }

cout<填空:(1)fname,\"w\" (2)(ch=getchar())!='#' (3)count++

2.有一文本文件,以’\\n’字符作为分行的标志,下面程序的功能是找出该文件中第几行是最长的行,该行有多少个字符。 #include \"stdio.h\" #include\"stdlib.h\" #include \"iostream.h\" void main() {

char name[20],c;

int length=0,maxlength=0,line=0,maxline=0; FILE *fp;

cout<<\"input the filename:\\n\" ; cin>>name;

if((fp=fopen(name,\"r\"))==NULL) {

45 / 51

cout<<\"can't open the file!\\n\"; exit(1); }

while( !=EOF) { if(c=='\\n') { line++; if(length>maxlength) { maxlength=length; maxline=line; } ; } else ; }

cout<填空:(1)(c=fgetc(fp)) (2)length=0 (3)length++ 3.将10个职工数据(工号、姓名、年龄)从键盘输入,存放到一个新建的二进制文件employer中,并将年龄大于50岁的职工姓名输出。 #include \"stdio.h\" #include\"stdlib.h\" #include \"iostream.h\" void main() {

FILE *fp;

struct employer { long no; char name[10]; int age; }emp; int k;

if((fp=fopen(\"employer\ \"))==NULL) { cout<<\"error\\n\"; exit(1); }

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

46 / 51

cin>>emp.no>>emp.name>>emp.age; fwrite( ); }

;

if((fp=fopen(\"employer\ \"))==NULL) {

cout<<\"error\\n\"; exit(1); }

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

fread( ); if(emp.age>=50) cout<fclose(fp); }

填空:(1)wb (2)&emp,sizeof(struct employer),1,fp (3)fclose(fp) &emp,sizeof(struct employer),1,fp 三、编程题

1.编写程序,将一个文本文件的内容连接到另一文本文件的末尾。 #include \"stdio.h\" #include \"stdlib.h\" #include \"iostream.h\" void main( )

{ FILE *fp1,*fp2; char ch;

if((fp1=fopen(\"a.txt\ { cout<<\"can't open A file\\n\"; exit(0); }

if((fp2=fopen(\"b.txt\ { cout<<\"can't open B file\\n\"; exit(0); }

while((ch=fgetc(fp2))!=EOF) fputc(ch,fp1);

fclose(fp1); fclose(fp2); }

2.从键盘中输入10个整数,将它们按由大到小的顺序排序后写入文件中。#include \"stdio.h\" #include \"stdlib.h\" #include \"iostream.h\" #define N 10

47 / 51

4)rb (5)( void main( ) { FILE *fp;

int a[N],i,j,temp,max; for(i=0;i>a[i]; for(i=0;ia[max])max=j;

temp=a[max];a[max]=a[i];a[i]=temp; }

if((fp=fopen(\"a.txt\ { cout<<\"can't open B file\\n\"; exit(0); }

fwrite(a,sizeof(int),10,fp); fclose(fp); if((fp=fopen(\"a.txt\显示a文件内容 { cout<<\"can't open B file\\n\"; exit(0); } for(i=0;i3.编写程序,统计某个文本文件中每个英文字母出现的次数(字母不区分大小写)。 #include \"stdio.h\" #include \"stdlib.h\" #include \"iostream.h\" void main( ) { FILE *fp; char c;

int a[26]={0},i;

if((fp=fopen(\"a.txt\ { cout<<\"can't open a file\\n\"; exit(0); }

while((c=fgetc(fp))!=EOF) { if(c>='A'&&c<='Z') c=c+32; if (c>='a'&&c<='z') { i=c-'a'; a[i]++;

48 / 51

} }

cout<<\"统计结果:\"<for(i=0;i<=25;i++) if(a[i]) { c=i+'a'; cout<fclose(fp); }

4.某学习小组有5个学生,每个学生的信息包括:学号、姓名、数学成绩、物理成绩、化学成绩。要求从键盘输入其信息,并求出每个学生的平均成绩,然后连同平均成绩一起存储到一个文件中。 #include \"stdlib.h\" #include \"iostream.h\" #include \"stdio.h\" #define SIZE 5 struct student { long num; char name[20]; float math; float phys; float chem; float ave; }stu[SIZE],s; void main( ) { FILE *fp; int i; for(i=0;i>stu[i].num; cout<<\"Input name:\"; cin>>stu[i].name; cout<<\"Input math:\"; cin>>stu[i].math; cout<<\"Input physics:\"; cin>>stu[i].phys; cout<<\"Input chemistry:\"; cin>>stu[i].chem; stu[i].ave=(stu[i].math+stu[i].phys+stu[i].chem)/3; }

if((fp=fopen(\"a\ { cout<<\"can't open file.\\n\"; exit(0); }

fwrite(stu, sizeof(stu), 1, fp); //整个数组内容一次写入文件 fclose(fp);

if((fp=fopen(\"a\输出文件内容

49 / 51

{ cout<<\"can't open file.\\n\"; exit(0); }

for(i=0;i{ fread(&s, sizeof(student), 1, fp); //一次只读出一条记录,反复读出

cout<fclose(fp); }

链表的逆序,必将涉及到两个以上指针,一般用三个指针, 下面是一个人的程序:

struct List1 *reverse(List1 *h) //h为链表的头指针 {

struct List1 *p,*v1,*v2; v2=h; v1=NULL;

while( v2!=NULL ){ p=v2->pNext; v2->pNext=v1; v1=v2; v2=p; }

return v1; }

另一个人的:

struct IntNode* res(struct IntNode* h) {

struct IntNode *s, *s1; s = h;

50 / 51

}

h = NULL; while (s) {

s1 = s;

s = s->next; s1->next = h; h = s1; } return h;

算法都是一致,但顺序不一样,这直接点明了链表操作的核心——顺序,链表的算法主要难在顺序上。

逆序操作中,要将一个指针指向前一个节点,中间必然断开,这就需要两个指针指向断开处的一前一后。

上面两个程序都是这样,不同在于指针移动的位置。

给出int型的x、 y两个数,要求不借助第三个变量交换x和y的值 void swap1(int &x, int &y) {

x=x+y; /* x存储x与y的和值(核心思想:x同时先把x和y两者的信息都存储下来) */ y=x-y; /* 保持x内存和值不变,y先赋值,即减去y的原始值使其等于x原始的值 */ x=x-y; /* 保持x内存和值不变,x再赋值,即减去y现在存储的原始x值,更新x值为原始y的值 */ }

51 / 51

因篇幅问题不能全部显示,请点此查看更多更全内容