C语言历年真题难点整理.docx

上传人:b****6 文档编号:6960786 上传时间:2023-01-13 格式:DOCX 页数:20 大小:241.35KB
下载 相关 举报
C语言历年真题难点整理.docx_第1页
第1页 / 共20页
C语言历年真题难点整理.docx_第2页
第2页 / 共20页
C语言历年真题难点整理.docx_第3页
第3页 / 共20页
C语言历年真题难点整理.docx_第4页
第4页 / 共20页
C语言历年真题难点整理.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

C语言历年真题难点整理.docx

《C语言历年真题难点整理.docx》由会员分享,可在线阅读,更多相关《C语言历年真题难点整理.docx(20页珍藏版)》请在冰豆网上搜索。

C语言历年真题难点整理.docx

C语言历年真题难点整理

1.一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率。

2.软件工程的主要思想是强调在软件开发过程中需要应用工程化原则。

3.数据库设计的根本目标是要解决数据共享问题。

4.T=RUS:

并操作,T为R和S两者之和;T=R∩S:

交操作,T为两者公共部分。

5.每个函数都可以被单独编译。

6.C语言中,随机文件以二进制代码形式存储数据。

7.C语言中的文本文件以ASCII码形式存储数据。

8.charc=32;正确。

9.(int)x不要写成int(x)。

10.若有语句:

char*line[5];,以下叙述中正确的是(A)

A)定义line是一个数组,每个数组元素是一个基类型为char的指针变量

B)定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组

C)定义line是一个指针数组,语句中的*号称为间址运算符

D)定义line是一个指向字符型函数的指针

11.设函数fun的定义形式为

void  fun(char  ch, float  x )  { …  }

则以下对函数fun的调用语句中,正确的是(D)

A)fun("abc",3.0);         B)t=fun('D',16.5);

C)fun('65',2.8);           D)fun(32,32);

'65'显然是错的,在ASCII码里,能用单引号表示字符的只有‘0’-‘9’

A“abc“表示的是字符串,所以不符合

B,因为定义的是void,所以没有return因此没有返回值,所以不能赋值

C,上面刚刚说了‘65’没有这样的说法

D是对的。

后面的32可以自动转成32.00000,而32在字符里可以转成对应的ASCII码。

12.有以下程序

  #include    

  main()  { 

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

    c1=getchar();  

    c2=getchar();

    putchar(c1);

    putchar(c2);

  }

  当运行时输入:

a<回车>后,以下叙述正确的是(A)

  A)变量c1被赋予字符a,c2被赋予回车符

  B)程序将等待用户输入第2个字符

  C)变量c1被赋予字符a,c2中仍是原有字符2

  D)变量c1被赋予字符a,c2中将无确定值

getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)。

13.有以下程序

  void sum(int  a[])

  {  a[0] = a[-1]+a[1];  }

  main()

  { int  a[10]={1,2,3,4,5,6,7,8,9,10};

    sum(&a[2]);

    printf("%d\n", a[2]);

  }

  程序运行后的输出结果是(A)

  A)6      B)7      C)5      D)8

13.在长度为64的有序线性表中进行顺序查找,最环境情况下需要比较的次数为____64____。

注:

线性查找也称顺序查找,最坏情况下,所需比较次数n(表长)。

14.对文件的读(写)操作完成之后,必须将它关闭,否则可能导致数据丢失。

15.一个关系表的行称为(记录)。

16.一个关系的属性名表称为关系模式。

16.C语言中没有专门的字符串变量,要存放字符串,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每个元素存放一个字符。

14.有以下程序

void swap1(int  c0[], int  c1[])

  { int  t ;

    t=c0[0];    c0[0]=c1[0];    c1[0]=t;

  }

  void swap2(int  *c0, int  *c1)

  { int  t;

    t=*c0;    *c0=*c1;    *c1=t;

  }

  main()

  { int  a[2]={3,5},  b[2]={3,5};

    swap1(a, a+1);    swap2(&b[0], &b[1]);

    printf("%d %d %d %d\n",a[0],a[1],b[0],b[1]);

  }

  程序运行后的输出结果是(D)

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

15.有以下程序

  # include    

  void f(char  *s, char  *t)

  { char  k; 

    k=*s;    *s=*t;    *t=k; 

    s++;    t--;

    if (*s)  f(s, t);

  }

  main()

  { char  str[10]="abcdefg", *p ;

    p=str+strlen(str)/2+1;

    f(p, p-2);

    printf("%s\n",str);

  }

  程序运行后的输出结果是(B)【交换的是*s和*t指向的值,不是*s和*t本身】

  A)abcdefg    B)gfedcba    C)gbcdefa    D)abedcfg

16.在进行模块测试时,要为每个被测试的模块另外设计两类模块:

驱动模块和承接模块(桩模块)。

其中【(驱动模块)】的作用是将测试数据传送给被测试的模块,并显示被测试模块所产生的结果。

17.一棵二叉树第六层(根结点为第一层)的结点数最多为【32】个。

2k-1

18.以下程序运行后的输出结果是  【1】  。

      main()  {

       int  a=1,b=2,c=3;

       if(c=a)/*(c==a)才为2,否则为赋值c=a=1*/

         printf("%d\n",c);

       else

         printf("%d\n",b);

18.若有定义:

char*x=“abcdefghi”;,以下选项中正确运用了strcpy函数的是___D_____。

A)chary[10];strcpy(y,x[4]);

B)chary[10];strcpy(++y,&x[1]);

C)chary[10],*s;strcpy(s=y+5,x);

D)chary[10],*s;strcpy(s=y+1,x+1);

注:

A不对。

x[4]不代表地址B不对。

数组名自身不能被++如果++y,相当于y=y+1,此时首地址y改变。

那么不再是原来的数组存储地址。

会出错;

C,错的。

y+5不够接收x的字符D是对的。

从第二个字符开始接收

18若有以下函数首部

intfun(doublex[10],int*n)

则下面针对此函数声明语句中正确的是____D____。

A)intfun(doublex,int*n);B)intfun(double,int);

C)intfun(double*x,intn);D)intfun(double*,int*);.

注:

说明第一个参数是一个数组,大小为10,所以传入的应该是数组首地址或者指向数组的指针。

第二个参数比较明显,传的是指针。

19.有以下程序

  # include    

  struct STU 

  { char  name[10];  

    int  num; };

  void f(char  *name,  int  num)

  { struct STU  s[2]={{"SunDan",20044},{"Penghua",20045}};

    num = s[0].num;

    strcpy(name, s[0].name);

  }

  main()

  { struct STU  s[2]={{"YangSan",20041},{"LiSiGuo",20042}},*p;

    p=&s[1];   f(p->name, p->num);

    printf("%s  %d\n", p->name, p->num);

  }

  程序运行后的输出结果是(A)

  A)SunDan  20042        B)SunDan  20044

  C)LiSiGuo  20042         D)YangSan  20041

20.以下程序运行后的输出结果是 【220.000000】

  main()

  { char  c;   int  n=100;

    float  f=10;    double  x;

    x=f*=n/=(c=50);

    printf("%d  %f\n",n,x);

  }

*号后面必须要有数字,*号后面没有数字这说明现在还不是四则运算的时候,你还得从右向左代。

比如到n/=50还不行,你还得代到n=n/50.然后这样再按四则运算的优先来算。

就是n/50=2

21.已有定义:

double  *p;,请写出完整的语句,利用malloc函数使p指向一个双精度型

的动态存储单元p=(double*)malloc(sizeof(double))。

22.数据的存储结构是指数据的逻辑结构在计算机中的表示。

23.栈有顺序存储结构和链式存储结构。

24.以下叙述中错误的是(C)

A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

B)数组名代表的是数组所占存储区的首地址,其值不可改变

C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息

D)可以通过赋初值的方式确定数组元素的个数

注释:

A:

C中能够用数组名对数组进行整体输入或输出的就只有字符数组即字符串而已...

B:

数组名是指针常量,不可改变,既然a是常量,所以a++是无法实现的。

C:

越界是非法的,但是不会报错,C语言中系统不会自动给出“下标越界”的出错信息,

但是其他语言有的有,如VB就有。

25.有以下程序

  #include 

  void WriteStr(char *fn, char *str)

  { FILE *fp;

    fp=fopen(fn,"w"); fputs(str,fp); fclose(fp);

  }

  main()

  { WriteStr("t1.dat","start");

    WriteStr("t1.dat","end");

  }

程序运行后, 文件t1.dat中的内容是(end)书P333打☆。

26.isdigit:

功能:

判断字符c是否为数字.

27.在两种基本测试方法中, 【白盒】测试的原则之一是保证所测模块中每一个独立路径至少要执行一次.

26.以下程序运行时若从键盘输入:

10 20 30<回车>。

输出结果是10300。

  #include 

  main()

  { int i=0,j=0,k=0;

    scanf("%d%*d%d",&i,&j,&k); printf("%d%d%d\n",i,j,k);

  }

注:

在输入时scanf中%*d表示跳过此项,也就是说,i接受值为10,j跳过20的数接受的是30

k根本没有接受值因为应该是初始值0。

输入整数时,空格不会输入,但%c就会输入,而且遇空格认为数据输入结束。

27.以下程序运行后的输出结果是abcbcc。

  #include 

  main()

  { char ch[]="abc",x[3][4];int i;

    for(i=0;i<3;i++) strcpy(x[i],ch);

    for(i=0;i<3;i++) printf("%s",&x[i][i]);

    print("\n");

  }

28.以下程序运行后的输出结果是4599

main()

{inta=3,b=4,c=5,t=99;

if(b

if(a

printf("%d%d%d\n"a,b,c);

}

注意for后面都是分号,if(b

29.有以下程序

point(char*p){p+=3;}

main()

{charb[4]={'a','b','c','d'},*p=b;

point(p);printf("%c\n",*p);

}

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

注:

不要以为用指针做参数就是地址传递方式,因为你主函数中的p是指针,要想在函数中改变主函数中指针的值,应该以指针的指针的方式传递参数:

不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

(*p+=3)就会变成d了。

P228

30.用矩形表示实体(等同于表)用椭圆形表示实体的属性(等同于表中字段)

用菱形表示实体关系(等同于外键),还要将有关系的实体用线连接上,线上画菱形。

31.在面向对象方法中, 类(Class)描述的是具有相似属性与操作的一组对象,而一个具体对象则是其对应类的一个实例。

32.当数据的存储结构改变时,其逻辑结构可以不变,因此,基于逻辑结构的应用程序不必修改,称为物理独立性。

当数据库总体逻辑结构改变,不需要修改应用程序,这是数据的逻辑独立性。

33.scanf读到空格或者回车时会把空格或回车转化为\0(字符串结束符)而gets函数则把空格作为字符接收。

34.不改变关系表中的属性个数但能减少元组个数的是(交)

35.函数返回值的类型最终取决于(函数定义时在函数值首部所说明的函数类型)

36.若变量均已正确定义并赋值,以下合法的C语言赋值语句是(A)

A)x=y==5;B)x=n%2.5;C)x+n=I;D)x=5=4+1;A可以是赋值语句啊(先判断y是否等于5,并将返回值赋给x)注:

B中取模右边不是整数C中赋值号左侧不是一个变量D中第二个赋值号左侧不是一个变量。

34.

A)p->next=q->next;B)p->next=p->next->next;C)p->next=r;D)p=q->next;

注:

A.B.C的作用都是删除q节点,D的作用是让p指针指向r。

删除结点只要让它第一个点脱离就行了,后面的q->next还指向r结点不管的,没事。

选D

35./*/*programming*/*/中/*programming做为注释内容(/*和他后面的第一个*/结合),但多出的*/是非法的。

而/*/programming/*/是对的。

36.有以下程序

#include

main()

{charc1,c2,c3,c4,c5,c6;

scanf("%c%c%c%c",&c1,&c2,&c3,&c4);

c5=getchar();c6=getchar();

putchar(c1);putchar(c2);

printf("%c%c\n",c5,c6);

}

程序运行后,若从键盘输入(从第1列开始)

一,123<回车>45678<回车>二,1234<回车>45678<回车>三,12<回车>45678<回车>

则输出结果是1245,12\n4,1256

说明这里的回车键也是一个字符,与书P85~86的区别下。

37.有以下程序

main()

{inta=0,b=0,c=0,d=0;

if(a=1)b=1;c=2;

elsed=3;

printf("%d,%d,%d,%d\n",a,b,c,d);

}

程序输出(D)

A)0,1,2,0B)0,0,0,3

C)1,1,2,0D)编译有错

注:

首先程序肯定会出错的,if和else之间不可以超过一句语句;如果改成这样的话

main()

{inta=0,b=0,c=0,d=0;

if(a=1){b=1;c=2;}//注意这里的a=1是赋值语句,所以是永真,因此执行b=1;c=2不执行else

elsed=3;

printf("%d,%d,%d,%d\n",a,b,c,d);//a=1,b=1,c=2,d=0;

或者改成

if(a=1)b=1,c=2;也可以。

这里是逗号表达式。

只有一个分号,只有一句语句

注意if和else之间不能超过一句语句。

37.在C语言中,预处理命令行都以"#"开头。

38.每个C程序必须在开头包含预处理命令行:

#include是错误的。

39.可以通过typedef增加新的类型错误:

用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。

40.用typedef定义新的类型名后,原有类型名仍有效。

41.用typedef可以为各种类型起别名,但不能为变量起别名。

42.以下选项中,值为1的表达式____B____。

 A)1-"0" B)1-"\0" C)"1"-0 D)"\0"-"0"

注:

“0”代表‘0’和‘\0’(字符串结束符)

43.&与运算,|或运算,^异或运算,~取反运算。

38.有以下程序

main()

{char*p[]={"3697","2584"};//定义了p[0]=”3697”,p[1]=”2584”

inti,j;longnum=0;

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

{j=0;

while(p[i][j]!

=′\0′)

{if((p[i][j]-′0′)%2)num=10*num+p[i][j]-′0′;//注意while循环,执行了两次

j+=2;

}

}

printf("%d\n",num);

}

程序执行后的输出结果是39

39.对下列二叉树进行,前序,中序,后序遍历的结果是前:

FCADBEG中:

ACBDFEG后:

ABDCGEF

39.有以下程序

main()

{union

{charch〔2〕;

intd;

}s;

s.d=0x4321;

printf("%x,%x\n",s.ch〔0〕,s.ch〔1〕);

}

在16位编译系统上,程序执行后的输出结果是21,43。

注;ch[0]为低字节;ch[1]高字节。

40.若有定义语句:

intk[2][3],*pk[3];,则以下语句中正确的是____B____。

A)pk=k;B)pk[0]=&k[1][2];C)pk=k[0];D)pk[1]=k;

注:

*pk[3]相当于*pk[0],*pk[1],*pk[2].因为〔〕的优先比*号高,所以代表的是数组元素p[0]-p[2]的地址。

A如果是A的话,应该改成*pk[2]而不是*pk[3]

B是对的pk[0]=&k[1][2]就是一个元素的地址

C其实和A一样,k[0]代表首行地址,相当于k

Dpk[1]代表是一个数组的地址,而不是行地址

注意区别(*pk)[3]如果是这样的话,分别表示(*pk)[0]-(*pk)[2],是一个数组,数组里三个元素都是地址。

此时p就指向包含四个元素的一维数组,p就指向行,所以pk=k就可以。

P248

(*pk)[3]整个表示的是第一行三个列元素的地址

41.在深度为7的满二叉树中,度为2的结点个数为___63______。

注:

度为2的节点就是该节点既有左子树,又有右子树

深度为7的满二叉树总共的节点数为2^7-1=127;又因为是满二叉树,所以只有度为2的和度为0的节点

<度为0的就是叶子节点>,叶子节点的数目为:

2^(7-1)=64,所以有度为2的结点个数为=127-64=63个.

42.在结构化分析使用的数据流图(DFD)中,使用【数据字典】对其中的图形元素进行解释。

43.逗号表达式:

a=3*5,a*4解:

a的值为15,整个逗号表达式的值为60。

(a=3*5,a*4),a+5解:

先计算出a=15,再a*4得到60,但a值未变,所以整个表达式的值为20。

例如:

inta=10;a=(3*5,a+4);printf(“a=%d\n”,a);结果为a=14

44.strlen("IBM\n012\1\\")这个的长度是多少?

答案9个。

IBM\n012\1\\

\1(此处显示的为ASCII码的001的字符笑脸).

45.若程序中有宏定义行:

#define N 100 表示在编译程序对C源程序进行预处理时用100替换标识符N。

41.main()

{第一次n=0,k=4;因为default后面没

intk=5,n=0;break,所以执行下面的case2,case4.

do第二次n=2,k=3;

{第三次n=3,k=2;

switch(k)第四次n=5,k=1;此时n<5不成立,退出。

{程序运行的输出结果为235

case1:

case3:

n+=1;k--;break;

default:

n=0;k--;

case2:

case4:

n+=2;k--;break;

}

printf("%d",n);

}while(k>0&&n<5);

}

42.

答案:

D【f(a)中的a不是数组名或指针所以传的是变量也就是值,没返回。

43.有以下函数

intfun(char*s)

{char*t=s;

while(*t++);

retum(t-s);

}

该函数的功能是(B)字节比字符串长度多1个

A)比较两个字符串的大小B)计算s所指字符串占用内存字节的个数

C)计算s所指字符串的长度D)将s所指字符串复制到字符串t中

注:

注意while后面的分号,还有就是执行到*t='\0'=0;退出while循环。

此时t还要加1。

44.

inta=4;

intf(intn)

{intt=0;staticinta=5;

if(n%2){inta=6;t+=a++;}

else{inta=7;t+=a++;}//n=0,执行else,t=0+7=7

returnt+=a++;//但此时的a不是上面的a=7加1的a=8,因为上面ifelse的a为局部变量,

}此时a应为staticinta=5,所以t=12,a此时为6,由于a静态保留上次的。

main()

{ints=a,i=0;

for(;i<2;i++)s+=f(i);

printf("%d\n",s);

}运行后结果为28

45.

结果为136

注:

argv是保存参数的二维字符数组

argv[0]指向程序路径:

"tt.exe"argv[1]指向第一个参数:

"12"argv[2]指向第二个参数:

"345"

argv[3]指向第三个参数:

"678"显然*argv[1]='1'*argv[2]='3'*argv[3]

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1