C语言部分一、选择题(每小题2分,共10分)(下在各小题,分别有一个或多个正确答案,请将所有正确答案的编号,填写在该小题题干后的括号内。
错选或漏选均不得分)。
1、若定义:int a[2][3]{0,2,4,6,8,10};以下描述正确的有( A,C,D,E )A、*(a+1)为元素6的地址这里a+1=a[1]的地址;*(a+1)的值是6,故A正确。
B、*(a[1]+1)的值为2为8,故B不正确C、**(a+1)+2的值为8这里a+1是一个指针,指向的是a[1]. *(a+1)为a[1],a[1]指向的是a[1][0]. **(a+1)为6,加2得8,故C正确;D、a[0]与a相同因二者都是指针,指针的地址都是指向数组中的第一个元素的地址,故D正确。
E、a[1][2]的值为10它是指第二行的第三个元素,为10,正确2、对函数的正确使用方法描述( A,C,D )。
A、用数组做函数参数时,必须在主调函数和被调函数中分别定义数组B、实参数组元素和形参数组元素类型可以不一致C、形参数组长度可以不指定D、形参数组长度可以大于实参数组长度E、数组名做参数属于值传递3、对静态变量的正确描述( A,B,D,E )A、静态局部变量在静态存储区内分配单元()B、静态外部变量可以赋初值,也可以不赋初值C、静态外部变量的作用与外部变量相同D、静态局部变量在函数调用结束时,仍保存其值,不会随着消失。
E、静态局部变量只赋一次初值4、下列描述正确的是( A ,C)。
A、由main 函数及其参数argc和* argv[]可以实现命令行方式B、使用fclose关闭文件时,先释放文件指针,再写缓冲区数据到文件中//先写缓冲区数据到文件中,再释放文件指针C、字符数组并不要求它的最后一个字符是‘\0’//是的,以字符指针指向的字符串才要求,因为只有这样,才能知道字符串的长度,而在字符数组中,不用\0,一样可以知道到哪里是字符数组的结尾。
D、‘A’和“A”都是字符串常量E、若char*S=“\ta\017bc”;则指针变量S指向的字符串所占的字节数是75、在缓冲文件系统中用于读写的函数有( 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 〈stdin.h〉struct m {int x;int *y;} *p;int a [4]={12,33,-40,100};struct m b [4]={10,&a[2],9,&a[3],8,&a[0],7,&a[1]}'main(){p=b; 输出结果:printf(“%d\n”,++p->x); //->的优先级高于++,因此等于是++(p->x),为11printf(“%d\n”,(++p)->x); //p后移一个元素,其x值为9;printf(“%d\n”,++(*p->y));//->的优先级高于*, 此时p已指向b[1],故*(p->y)为a[3]为100.自加后为101;}故输出结果为:119101三、程序设计(共10分)设在文件a.txt和文件b.txt中分别存有两个字符串,设计一个程序将这两个字符串按依序交叉的方式合并为一个字符串(例如“aaaaa”与“bbb”的合并结果为“abababaa”,而“bbb”与“aaaaa”的合作结果为“ bababaa”,)并将结果存入文件a.txt中。
【答案】写程序时,可以分别读取a.txt文件和b.txt文件,注意(1),无论a文件先读完还是b文件先读完,程序都能作出适应性的判断。
注意(2)把a和b合并的结果,写到一个临时文件c中,最后把c的文件覆盖到a文件中,达到题意的要求。
#include<stdio.h>main(){FILE *fp,*fq,*fr;char ch;if((fp=fopen("a.txt","r+"))==NULL){ printf("cannot open file a.txt");exit(0);网址:/doc/26/9315.html}if((fq=fopen("b.txt","r"))==NULL){ 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);fputc(ch,fp);}fclose(fp); fclose(fq); fclose(fr);}1.2 四川大学2001年攻读硕士学位研究生入学考试试题及答案1.2.1第2001年――C语言程序设计题目一、单项选择题(在每小题的四个备选答案中,选出一个正确的答案,并将其号码写在答题纸上。
请注意注明题号。
每小题1分,共计6分)1、‘\t’表示什么?①字符串常数②标识符③变量④字符常量答案:④2、对宏定义不正确的描述是哪一个?①在进行宏定义时,可以引用已经定义的宏名,可以层层置换//可以引用已经定义了的宏名,可以层层置换②宏名的有效范围包括本文件的任何位置//宏名的有效范围定义命令之后到本源文件结束,可以用#define终止宏定义的作用域③宠定义不是语句,不必在行末加分号//是预处理定义语句④对程序中双引号括起来的字符串,即使与宏名相同,也不进行置换3、若定义static char s[20]=”computer”;则执行语句x = strlen(s);之后,x的值为多少?①20 ②9 ③8 ④19//strlen函数计算char*型字符串的长度的时候,并不包含末尾的\0;4、以下哪一个表达式取值是正确的?①6>5结果为6 ②6&&5结果为7③6||5结果为7 ④6<5结果为05、如定义enum weekday {one, two, thr, fou, fiv};enum weekday working;以下哪个是不正确的枚举变量的使用?①working = thr; ②working =2;③working = (enum weekday)2;④working = (enum weekday) (5-3);//不能对其赋值6、下列说法中正确的是哪一个?①sizeof (char) 是结果为整型的表达式②sizeof (char) 是一个不合法的表示形式③sizeof (char) 是一种函数调用④sizeof (char) 是结果为实型的表达式二、阅读程序,并回答问题(共12分)1、下列程序的输出是什么?(3分)# include <stdio. h>void main ()﹛char * aplha [6] = ﹛“ABC”,“DEF”,“GHI”,“JKL”,“MNO”,“PQR”﹜;char **p;int i;p = aplha;for (i = 0; i<4; i++)printf (“%s”, p[i]);printf (“\n”);﹜//输出结果ABCDEFGHIJKL刚好是字符串数组里面的前四个元素的内容连接起来2、下列程序为什么无法将用户输入的三个整数按从小到大排序输出?应该如何修改?(6分)# include <stdio.h>void 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 (a>b) swap (a, b);if (a>c) swap (a, c);if (b>c) swap (b, c);printf (“%d, %d, %d”, a, b, c);﹜//函数swap采用值传递,虽然将形参x和y交换了,但是并不影响到实参。
将值传递改成指针传递就可以了。
C函数参数采用值传递方式,虽然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(a>b) swap(&a,&b);if(a>c) swap(&a,&c);if(b>c) swap(&b,&c);3、假设系统为基本整型量分配2个字节,为字符型量分配1个字节。
下列程序完成的功能是什么?(3分)# include <stdio. h>union﹛int n;char ch [2];﹜u;void main ()﹛int m;scanf (“%d”,&m);u.n = m;printf (“\n%u, %u”,u.ch[0], u.ch[1]);﹜//该程序的功能,取用户输入的整数值的高字节和低字节,并按照任意整数的低字节和高字节分别输出。
三、程序设计题(12分)假设一个文本文件中保存着100个整数,请将这100个整数按从小到大的顺序写到另一个文本文件中去,并且在新文件中每10个整数占一行。
源文件名和目标文件名通过命令行参数获取。
分数分配:变量定义 2分命令行参数处理 1分文件打开 1分文件读 2分排序 3分文件写 2分文件关闭 1分# include <stdio. h>void main(int argc, char *argv[])﹛FILE *fin, *fout;Int a [100], i, j, t;if(argc!=3)﹛printf (“ You forgot to enter a filename\n”);return;﹜fin = fopen (argv[1], “r”);fout = fopen (argv[2], “w”);for (i = 0; i<100; i++)fscanf (fin, “%d”, &a[i]);for (i = 0; i<99; i++)for (i = 0; i<99-i; i++)if (a[j]>a[j+1])﹛t = a[j]; a[j] = a[j+1]; a[j+1]=t;﹜for (i = 0; i<100; i++)﹛if (i%10 = 0)fprintf (fout, “%s”, “\n”);fprintf (fout, “%d”, a[i]);﹜fclose (fin);fclose (fout);﹜1.3 四川大学2002年攻读硕士学位研究生入学考试试题及答案1.3.1 第2002年――C语言题目C语言程序设计(共30分)一、单项选择题(在每小题的四个备选答案中,选出一个正确答案。