1、C 语言试题及答案(一) C 语言部分一、选择题(每小题 2 分,共 10 分)(下在各小题,分别有一个或多个正确答案,请将所有正确答案的编号,填写在该小题题干后的括号内。错选或漏选均不得分) 。1、若定义:int a230,2,4,6,8,10 ;以下描述正确的有( A,C,D,E )A、*(a+1)为元素 6 的地址 这里 a+1=a1的地址;*(a+1)的值是 6,故 A 正确。B、*(a1+1)的值为 2为 8,故 B 不正确C、*(a+1)+2 的值为 8 这里 a+1 是一个指针,指向的是 a1. *(a+1)为 a1,a1指向的是 a10. *(a+1)为 6,加2 得 8,故
2、C 正确;D、a0与 a 相同 因二者都是指针,指针的地址都是指向数组中的第一个元素的地址,故 D 正确。E、a12 的值为 10它是指第二行的第三个元素,为 10,正确2、对函数的正确使用方法描述( A,C,D ) 。A、用数组做函数参数时,必须在主调函数和被调函数中分别定义数组B、实参数组元素和形参数组元素类型可以不一致 C、形参数组长度可以不指定 D、形参数组长度可以大于实参数组长度E、数组名做参数属于值传递3、对静态变量的正确描述( A,B,D,E )A、静态局部变量在静态存储区内分配单元( )B、静态外部变量可以赋初值,也可以不赋初值C、静态外部变量的作用与外部变量相同D、静态局部变
3、量在函数调用结束时,仍保存其值,不会随着消失。E、静态局部变量只赋一次初值4、下列描述正确的是( A ,C) 。A、由 main 函数及其参数 argc 和* argv可以实现命令行方式B、使用 fclose 关闭文件时,先释放文件指针,再写缓冲区数据到文件中/先写缓冲区数据到文件中,再释放文件指针C、字符数组并不要求它的最后一个字符是0 /是的,以字符指针指向的字符串才要求,因为只有这样,才能知道字符串的长度,而在字符数组中,不用0,一样可以知道到哪里是字符数组的结尾。D、 A和“A”都是字符串常量 E、若 char*S=“ta017bc”;则指针变量 S 指向的字符串所占的字节数是 75、
4、在缓冲文件系统中用于读写的函数有( A,B,D )A、putchar () B、fread() C、rewind () D、purw() E、fseek()二、程序阅读,并给出运行结果(共 10 分,每题 5 分) 。(1)main() unsigned a,b,xint n;a=0x763 输出结果:n=6;b=a(12-n); x=(a n-2)b; /+,-,的优先级比高。printf(“nb=%x,nx=%x”,b,x);在用 2 个字节表示整数的系统中结果为d8c0d8b6在用 4 个字节表示整数的系统中结果为1d8c01d8b6故以上两种结果都正确。(2) #include std
5、in.hstruct m int x;int *y; *p;int a 4=12,33,-40,100 ;struct m b 4=10, 输出结果:printf(“%dn”,+p-x); /-的优先级高于+,因此等于是+(p-x),为 11printf(“%dn”,(+p)-x); /p 后移一个元素,其 x 值为 9;printf(“%dn”,+(*p- y));/-的优先级高于*, 此时 p 已指向 b1,故*(p-y)为 a3为 100.自加后为 101;故输出结果为:119101三、程序设计(共 10 分)设在文件 a.txt 和文件 b.txt 中分别存有两个字符串,设计一个程序将
6、这两个字符串按依序交叉的方式合并为一个字符串(例如“aaaaa”与“bbb”的合并结果为“abababaa” ,而“bbb”与“aaaaa”的合作结果为“ bababaa” , )并将结果存入文件 a.txt 中。【答案】写程序时,可以分别读取 a.txt 文件和 b.txt 文件,注意( 1) ,无论 a 文件先读完还是 b 文件先读完,程序都能作出适应性的判断。注意(2)把 a 和 b 合并的结果,写到一个临时文件c 中,最后把 c 的文件覆盖到 a 文件中,达到题意的要求。#includemain()FILE *fp,*fq,*fr;char ch;if(fp=fopen(“a.txt“
7、,“r+“)=NULL) printf(“cannot open file a.txt“);exit(0);网址:http:/ printf(“cannot open file b.txt“);exit(0);fr=fopen(“c.txt“,“w+“);while(!feof(fp)ch=fgetc(fp);fputc(ch,fr);if(!feof(fq)ch=fgetc(fq);fputc(ch,fr);while(!feof(fq)ch=fgetc(fq);fputc(ch,fr);rewind(fp); rewind(fr);while(!feof(fr)ch=fgetc(fr);f
8、putc(ch,fp);fclose(fp); fclose(fq); fclose(fr);1.2 四川大学 2001 年攻读硕士学位研究生入学考试试题 及 答案1.2.1 第 2001 年C 语言程序设计 题目一、单项选择题(在每小题的四个备选答案中,选出一个正确的答案,并将其号码写在答题纸上。请注意注明题号。每小题 1 分,共计 6 分)1、 t表示什么?字符串常数 标识符 变量 字符常量答案:2、对宏定义不正确的描述是哪一个?在进行宏定义时,可以引用已经定义的宏名,可以层层置换/可以引用已经定义了的宏名,可以层层置换宏名的有效范围包括本文件的任何位置/宏名的有效范围定义命令之后到本源文
9、件结束,可以用#define 终止宏定义的作用域宠定义不是语句,不必在行末加分号/是预处理定义语句对程序中双引号括起来的字符串,即使与宏名相同,也不进行置换3、若定义 static char s20=”computer”;则执行语句 x = strlen(s);之后,x 的值为多少?20 9 8 19/strlen 函数计算 char*型字符串的长度的时候,并不包含末尾的0;4、以下哪一个表达式取值是正确的?65 结果为 6 65 结果为 76|5 结果为 7 6void main ()char * aplha 6 = “ABC” , “DEF”, “GHI”, “JKL”, “MNO”, “
10、PQR”;char *p;int i;p = aplha;for (i = 0; ivoid swap (int x, int y)int t = x;x = y;y = t;void main ()int a, b, c;scanf (“%d, %d, %d”, a, b, c);if (ab) swap (a, b);if (ac) swap (a, c);if (bc) swap (b, c);printf (“%d, %d, %d”, a, b, c);/函数 swap 采用值传递,虽然将形参 x 和 y 交换了,但是并不影响到实参。将值传递改成指针传递就可以了。C 函数参数采用值传递
11、方式,虽然 swap 函数将形式参数 x 和 y 的值进行了调换,但是影响不到相应的实在参数。所以在主函数中,通过调用 sawp 函数调换 a 和 b(或 a 或 c,或 b和 c)的值是根本达不到目的的。修改:(1) (2 分)void swap (int *x, int*y)int t = *x;*x = *y;*y = t;(2) (2 分)主函数if(ab) swap(a,b) ;if(ac) swap(a ,c ) ;if(bc) swap(b,c) ;3、假设系统为基本整型量分配 2 个字节,为字符型量分配 1 个字节。下列程序完成的功能是什么?(3 分)# include uni
12、onint n;char ch 2;u;void main ()int m;scanf (“%d”, m);u.n = m;printf (“n%u, %u”,u.ch0, u.ch1);/该程序的功能,取用户输入的整数值的高字节和低字节,并按照任意整数的低字节和高字节分别输出。三、程序设计题(12 分)假设一个文本文件中保存着 100 个整数,请将这 100 个整数按从小到大的顺序写到另一个文本文件中去,并且在新文件中每 10 个整数占一行。源文件名和目标文件名通过命令行参数获取。分数分配:变量定义 2 分命令行参数处理 1 分文件打开 1 分文件读 2 分排序 3 分文件写 2 分文件关闭
13、 1 分# include void main(int argc, char *argv)FILE *fin, *fout;Int a 100, i, j, t;if(argc!=3)printf (“ You forgot to enter a filenamen”);return;fin = fopen (argv1, “r”);fout = fopen (argv2, “w”);for (i = 0; iaj+1)t = aj; aj = aj+1; aj+1=t;for (i = 0; i100; i+)if (i%10 = 0)fprintf (fout, “%s”, “n”);fp
14、rintf (fout, “%d”, ai);fclose (fin);fclose (fout);1.3 四川大学 2002 年攻读硕士学位研究生入学考试试题 及 答案1.3.1 第 2002 年C 语言题目C 语言程序设计(共 30 分)一、单项选择题(在每小题的四个备选答案中,选出一个正确答案。每小题 1 分,共 6 分)1、如果 I 为整型变量,f 为 float 型变量,c 表达式a+I*f 的类型为 。A、字符型 B、整型 C、单精度型 D、双精度型/即使是两个 float 型的数据相加,都化成 double 型 float 型的数据在运算时一律转化成双精度型,提高其运算精度2、关
15、于 c 表达式 5|(a=b+c)=3 的值,正确的说法为 。A、值为 1 B、值为 5 C、值为 0 D、仅这一个表达式,不能确定值,必须知道 a,b,c 的值后才能计算。/等号= 的优先级高于| 所以先计算(a=b+c)=3 但是不论它为真或假,在与 5 进行或运算时,按照或运算的法则,只要一方为真,表达式的结果为真。3、若整型变量 a 的值为 50,则 c 表达式 a2 的值为 。A、50 B、25 C、12.5 D、12/每右移一位除以 2,且由于 a 为整型,结果为整型4、若 c,c1,c2 均为字符型变量,下列语句执行后。c=a;c1=+c;c2=c+;c1,c2 的值分别为 。A
16、、c1=b,c2=c B、c1=a, c2=c C、c1=b,c2=b D 、c1=a,c2=b/前加加,先加 1 后使用值,后加加是先使用其值在加加,所以 c 加加后的值赋予 c1,c1得值 b,c2 先使用值,再加加,c2 得值 b5、以下 c 语句执行后,int i, s=0;for (i=0;i10;i+)s+=i;printf (%dn, i);输出的内容为 。A、0 B、9 C、10 D、11/i 值在循环外定义,所以其值循环结束仍有意义,得值 106、以下 c 语句执行后,char s1100 =I like C 1anguage,s2100;strcpy(s2, s1);str
17、cat (s1, s2);puts (s2);输出的内容为 。A、I B、I like C language C、I like C language I like C languageD、I like C language I like C language I like C language/连接后的串存在 s1 里,对 s2 没有影响二、阅读程序,写出该程序的执行结果。 (4 分)# include stdio.hvoid main ( ) char a 3 10=“Beijing “,“Shanghai“, “Chengdu“;char p1, (*p2)10;p1=a0;p2=a;pr
18、intf(“%cn“,*(a1+1);/ a1代表是第一行字符串 Shanghai,加 1 后得值第一个字符 h 的地址,*取出其地址里的值 hprintf(“%cn“,*(*(a+1)+2);/ *(a+i)=ai 代表是第一行字符串 Shanghai,加 2 后得值第 2 个字符 a 的地址,*取出其地址里的值printf(“%cn“,*(p1+1);/p1 是一字符指针,加一指向第零行第 1 个字符 e 的位置, *取出其地址里的值printf(“%cn“,*(*(p2+1)+2);/p2 为一指向数组的指针,p2 是与数组名等价的指针,它指向 2 维数组的首行,p21 指针指向了第一行
19、字串 Shanghai,加 2 后得值第 2 个字符 a 的地址,*取出其地址里的值printf(“%sn“,*(p1+1); /打印的从第一个字符开始的第零行余下的字符串 eijingprintf(“%sn“,*(p22);/p22指的是第二行,打印第二行字符串 Chengduprintf(“%sn“,*(p21); /p2+1 指向的是第一行字符串 shanghai三、按要求编写函数。 (8 分)在一程序中定义了如下结构类型用于处理单向链表:struct linkage int value;struct linkage *pNext;现已经编写出按节点的成员 a 值从小到大建立初始链表的函
20、数create ( ),如下所示:struct linkage * create (void )struct linkage * pHead;int a4=2,1,3,5;pHead=NULL;for (i=0;i4;i+)pHead=addItem(pHead,ai);return pHead;在该函数的 for 循环前,pHead 为 NULL;在执行整个 for 循环后,创建的链表如下所示:即在被调函数 addItem( )中,需要动态分配内存,生成新节点,将传入的第二参数的值赋给该节点的成员 value:并通过第一个参数链表首节点确定适当位置放置该新节点。请完成函数:struct li
21、nkage * addItem (struct linkage *pHead, int value );返回值指向单向链表头节点。你可能用到下面的动态内存分配函数。void* malloc (unsigned int size);其作用是在内存的动态存储区中分配一个长度为 size 的连续空间。返回值为指向分配域起始地址的指针。1、在空链表中加第一个节点 2 分;2、加到当前链表头节点前 2 分;3、加到当前链表头节之后适当位置,可分为两步。2 分;4、其它部分 2 分,包括整体结构,变量定义,返回值。struct linkage *addItem (struct linkgae *pHead
22、 ,int value) struct linkage *p ,*q,*r,*s;p=pHead;if (!p) r=(struct linkage *) malloc (sizeof (struct linkage);r-a=value;r-pNext =NULL;pHead=r;else if (value =p-a) r=(struct linkage *) malloc (sizeof (struct linkage);r-a=value;r-pNext =p;pHead=r;else q=ppNext;while (q)if (value=q- a)break;else p=q;q=p-pNext;r=(struct linkage *)malloc (sizeof (struct linkage);r-a=value;r-pNext=q;p-pNext=r;return pHead;