C语言复习题 下载本文

内容发布更新时间 : 2024/5/18 8:11:17星期一 下面是文章的全部内容请认真阅读。

① 上机编辑、编译、链接和运行程序,观察程序的运行结果是否符合要求。

② 用动态跟踪法查找错误原因,并观察数组num值的变化情况,分析错误的原因。 ③ 修改程序,直到符合题目要求为止。

(2) 用选择法对10个整数排序。10个整数用scanf函数输入。

算法分析:选择法的基本思想是:设有10个元素a[1]~a[10],将a[1]与a[2]~a[10]比较,若a[1]比a[2]~a[10]都小,则不进行交换,即无任何操作。若a[2]~a[10]中有一个以上比a[1]小,则将其中最大的一个(假设为a[i])与a[1]交换,此时a[1]中存放了10个中最小的数。第二轮将a[2]与a[3]~a[10]比较,将剩下9个数中的最小者a[i]与a[2]对换,此时a[2]中存放的是10个中第2小的数。依此类推,共进行9轮比较,a[1]到a[10]就已按由小到大顺序存放。程序的第一个for语句是完成输入操作,第二个for语句则是将这个数组输出。第三个for语句则是进行排序。 程序代码:

#include int main() { int i,j,min,temp,a[11]; printf(\ for(i=1;i<=10;i++) { printf(\ scanf(\ } printf(\ printf(\ for(i=1;i<=10;i++) printf(\ printf(\ for(i=1;i<=9;i++) { min=i; for(j=i+1;j<=10;j++) if(a[min]>a[j]) min=j; temp=a[i]; a[i]=a[min]; a[min]=temp; } printf(\ for(i=1;i<=10;i++) printf(\ printf(\ return 0; }

① 上机编辑、编译、链接和运行程序,体会输入数据时的提示信息及该语句的格式设计。 ② 比较选择法与冒泡法的区别是什么?请用动态跟踪法观察选择法排序算法的实现过程。 (3)以下是方阵转置的程序代码。方阵转置如图6-5所示。

图6-5 方阵转置

算法分析:转置是:a[i][j]=a[j][i];主对角线:行下标i=列下标j;上三角:行下标i<=列下标j;下三角: 行下标i>=列下标j。因此要控制好行列下标,防止第1次转换了,而第2次又被转换过来的现象发生。

程序代码:

#include int main()

{

int i,j,tem,num[4][4];

printf(\ for(i=0;i<4;i++) for(j=0;j<4;j++) scanf(\ for(i=0;i<4;i++) for(j=0;j<4;j++) { tem=num[i][j]; num[i][j]=num[j][i]; num[j][i]=tem; } for(i=0;i<4;i++) { printf(\ for(j=0;j<4;j++) printf(\ } return 0; }

① 上机运行程序,查看结果是否符合要求,若不符合,请找出原因,改正后重新运行,直到结果正确为止。

② 上述实现的行列相等的正矩阵转置,若要实现行列不相等的矩阵转置操作,则程序中的数据结构及算法如何实现?

(4) 将两个字符串连接起来,不要用strcat函数。

算法分析:查找字符串1的结束标志\\0,然后用字符串2的值一一填充到字符串1从\\0开始及其以后的位置上。最后再在字符串1最后加上结束标志\\0。

程序代码:

#include int main() {

char s1[80],s2[40]; int i=0,j=0;

printf(\ scanf(\

printf(\ scanf(\ while(s1[i]!='\\0') i++;

while(s2[j]!='\\0') s1[i++]=s2[j++]; s1[i]='\\0';

printf(\ return 0; }

习题7

1.选择题

(1)以下函数声明正确的是( )。

A)double fun(int x, int y) B)double fun(int x; int y)

C)double fun(int x, int y); D)double fun(int x, y)

(2)C语言规定,简单变量作实参,它与对应形参之间的数据传递方式是( )。

A)地址传递; B)单向值传递;

C)双向值传递; D)由用户指定传递方式

(3)以下关于C语言程序中函数的说法正确的是( )。

A)函数的定义可以嵌套,但函数的调用不可以嵌套;

B)函数的定义不可以嵌套,但函数的调用可以嵌套; C)函数的定义和调用均不可以嵌套; D)函数的定义和点用都可以嵌套。

(4)以下正确的函数形式是( )。

A)double fun(int x,int y) B)fun (int x,y)

{z=x+y;return z;} {int z;return z;} C)fun(x,y) D)double fun(int x,int y) {int x,y; double z; {double z;

z=x+y; return z;} z=x+y; return z;}

(5)C语言规定 。以下说法不正确的是( )。

A)实参可以是常量、变量或表达式

B)形参可以是常量、变量或表达式 C)实参可以是任意类型

D)形参应与其对应的实参类型一致

(6)C语言允许函数返回值类型缺省定义,此时该函数返回值隐含的类型是( )。

A)float型 B)int型 C)long型 D)double型 (7)函数调用可以 。以下错误的描述是( )。

A)出现在执行语句中 B)出现在一个表达式中

C)作为一个函数的实参 D)作为一个函数的形参

(8)如果在一个函数中的复合语句中定义了一个变量,则该变量 。以下正确的说法是(A)只在该复合语句中有效 B)在该函数中有效

C)在本程序范围内有效 D)为非法变量

(9)以下不正确的说法为( )。

A)在不同函数中可以使用相同名字的变量

B)形式参数是局部变量

C)在函数内定义的变量只在本函数范围内有效

D)在函数内的复合语句中定义的变量在本函数范围内有效

(10)凡是函数中未指定存储类别的局部变量,其隐含的存储类别为( )。

A)自动(auto) B)静态(static)

C)外部(extern) D)寄存器(register)

(11)下面程序的正确运行结果是( )。

#include

int main(int argc, char *argv ) {

int a=2, i;

for(i=0;i<3;i++) printf(“M”,f(a) ); }

int f( int a) {

int b=0;static int c=3;

b++;c++;

return(a+b+c); }

A)7 7 7 B)7 10 13 C)7 9 11 D)7 8 9

(12)有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5);该函数调用语句中,含有的实参个数是( A)3 B)4 C)5 D)有语法错

(13)有如下程序

int runc(int a,int b) {

return(a+b);

)。

)。

}

#include

int main(int argc, char *argv ) {

int x=2,y=5,z=8,r; r=func(func(x,y),z); printf(“%\\d\\n”,r); }

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

A)12 B)13 C)14 D)15

(14)有如下程序

long fib(int n) {

if(n>2) return(fib(n-1)+fib(n-2)); else return(2); }

#include

int main(int argc, char *argv ) {

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

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

A)2 B)4

2.读程序,写出运行结果。

#include int main() {

int fun(int x);

printf(\ printf(\ printf(\ printf(\ return 0; }

int fun(int x) {

static int f=0,y=0; if(f= =0) y+=2*x; else if(f= =1) y+=3*x; else y+=4*x; f++; return y; }

1.选择题。

(1)若函数fun( )定义如下: void fun(char *p,char *s)

{ while(*p++=*s++)

C)6 习题8

D)8

;

}则函数fun()的功能是 。

A.串比较 B.串复制 C.求串长 D.串反向 (2)有定义int array[10]={0,1,2,3,4,5,6,7,8,9}; int *p,i=2;

则执行语句:p=array;

Printf(“%d”,*(p+i)); 则输出结果为 。

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

(3)在定义int str[ ][3]={1,2,3,4,5,6};以下几种方法中,不能正确表示i行j列元素的是 。 A.str[i][j] B.*(str[i]+j) C.*(*(str+i)+j) D.*(str+i+j) (4)已知:int *p,a;则语句p=&a;中的运算符&的含义是 。

A.位与运算 B.逻辑与运算 C.取指针内容 D.取变量地址 (5)已知:int a ,*p=&a;则下列函数调用中错误的是 。 A.scanf(\ B.scanf(\ C.printf(\ D.printf(\(6)说明语句:int (*p)();的含义是 。 A.p是指向一维数组的指针变量 B.p是指针变量,指向一个整型数据

C.p是一个指向函数的指针,该函数的返回值是一个整型 D.以上说明都不对

(7) 已知:int x;则下面的说明指针变量pb的语句 是正确的。 A.int pb=&x; B.int *pb=x; C.int *pb=&x; D.*pb=*x;

(8)已知:int b[ ]={1,2,3,4},y,*b=b;则执行语句y=(*--p)++;之后,变量y的值是 。 A.1 B.2 C.3 D.4

(9)已知:int *ptr1,*ptr2;均指向同一个int型一维数组中的不同元素,k为整型变量,则下面错误的赋值语句是 。

A.k=*ptr1+*ptr2; B.*ptr2=k; C.ptr1=ptr2; D.k=*ptr1*(*ptr2); (10)已知:char str[4]= \;char *ptr;则执行以下语句的输出为 。 ptr=str;

printf(\

A.字符?2? B.字符?1? C.字符?2?的地址 D.不确定 2.阅读程序,分析程序运行的结果。 (1) #include

int main()

{ static char a[]=\ for(ptr=a;ptr

则程序的执行结果是 。 (2) #include

int main()

{ static char b[]=\ char *ptr1=a,*ptr2=b; int k;

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

if(*(ptr1+k)= =*(ptr2+k)) printf(\ printf(\ return 0; }

则程序的执行结果是 。