一、选择题
1.结构化程序设计的三种基本结构是()。
A)函数结构、分支结构、判断结构B)函数结构、嵌套结构、平行结构
C)顺序结构、分支结构、循环结构D) 分支结构、循环结构、嵌套结构
答案C:常识,记下来。
2.以下()是正确的浮点数。
A)e3 B).62 C)2e4.5 D)123
答案:B,A错,e前要有整数,C错,e后要为整数,D是整形数据。
3.若有定义:int x=2,y=3;float i;,则以下符合C语言语法的表达式是()。
A)x=x*3=2 B)x=(y==1) C)i=float(x) D)i%(-3)
答案:B,A错,赋值号左边不能是表达式,C错,强制转换要括号,D错,不能用浮点型数据求余数
4.若有定义:int a,b;则表达式(a=2,b=5,a*2,b++,a+b)的值是()。
A)7 B)8 C)9 D)10
答案:B,注意a*2并不影响a,b++则让b变成了6,最后a+b为2+6=8
5.已有如下定义和输入语句
int a,b;
scanf(“%d,%d”,&a,&b);
若要求a、b的值分别为10和20,正确的数据输入是()。
A)10 20 B)10,20 C)a=10,b=20 D)10;20
答案:根据题目scanf的格式,有逗号,没赋值号,所以答案C。
6.若有定义:int x=3,y=4,z=5:则值为0的表达式是()。
A)’x’&&’y’B)x<=y C)x||y+z&&y-z D)!((x 答案:D,D中括号内为1,再加上非,那么就是0。 7.若有定义:int b=7;float a=2.5,c=4.7;表达式a+(b/2*(int)(a+c)/2)%4的值是 ( ). A)2.5 B)3.5 C)4.5 D)5.5 答案:C,这种题目要是不想思考,直接运行即可。 显示: 8.以下程序的运行结果是()。 void main() {int n=’c’; swithc(n++) {default:printf(”error”); break; case ’a’: case ’b’: printf(”good”);break; case ’c’: printf(”pass”); case ’d’: printf(”warn”); }} A)pass B)ward C)pass warn D)error 答案C,n++还是c,对应到case中,打印pass,后面没有break,直接往下运行,显示warn,所以最后显示是 C 9.以下程序的运行结果是()。 void main() {int sum=0,item=0; while(item<5) {item++; sum+=item; if(sum>=6) break; } printf(”%d\n”,sum); } A)10 B)15 C)6 D)7 答案:C,直接运行即可。 10.下面程序段的运行结果是()。 int i=0,a[]={7,5,7,3,8,3}; do{ a[i]+=2; }while(a[++i]> 5); for(i=0;i<6;i++) printf(”%d”,a[i]); A)9 7 9 5 10 5 B)9 5 9 3 10 3 C)9 5 7 3 8 3 D)7 5 7 3 8 3 答案:C,直接运行。 显示: 11.以下数组定义中,正确的是()。 A)int a[2][]={1,2,3,4,5}; B)int a[][2]={{0},{}}; C)int a[2][2]={{1,2},{3}}; D)int a[][]={1,2,3,4}; 答案C,AD都错,第二维不能缺省。B错,初始化不能出现:{},属于完全不赋值,对于二维的也不行。12.以下程序段运行后屏幕输出为()。 char str[80];strcpy(str,”hello”); printf(”%d”,strlen(str)); A)5 B)6 C)7 D)80 答案:A,hello之后就是\0,结束,5个字符。 13. 下面程序的输出结果是()。 #include int global=100; fun() {int global=5; return ++global;} void main() { printf(“%d\n”,fun());} A)100 B)101 C)5 D)6 答案:D,直接黏贴运行。 显示: 14.下面程序的输出结果是() #include #define ONE 1 #define TWO ONE+1 #define THREE TWO+1 void main() {printf(” %d\n”,THREE-ONE);} A)产生错误B)1 C)2 D)3 答案:C,这种题目注意不能合并,一不能加括号,而不能把+的结果算出来,最保险的办法就是运行, 显示: 如果要计算也可以,这样算:THREE-ONE= TWO+1- ONE= ONE+1+1- ONE=2 15.在16位编译系统上,若有定义int a[]={10,20,30},*p=&a;当执行p++;后下列叙述错误的是()。 A)p=向高地址移了一个字节B)p与a+1等价 C)语句printf(”%d”,*p);输出20 D)p指向数组元素a[1] 答案A,应该移动了一个元素单元,int是两个字节,所以是两个字节。 16.下面程序的输出结果是() #include void main() {char *str=”12345”,*ps=str+4; printf(”%c \n”,ps[-4]);} A)1 B)2 C)3 D)错误 答案A,直接运行: 显示: 17.以下程序的运行结果是()。 #include union Utype{ int i; float f; }; struct{ char ch[2]; int i; union Utpye u; }a; void main() {printf(”sizeof(a):%d\n”,sizeof(a));} A)5 B)6 C)7 D) 8 答案选D,Utpye占字节为4,结构体为成员之和,2+2+4=8 18. 若有如下定义,函数fun的功能是( )。其中head指向链表首结点,整个链表结构如下图: struct node{ int data; struct node *next; }; void fun(struct node *head) {struct node *t=head; while(t!=NULL) { if(t->data%2==0) printf(“%d”,t->data); t=t->next; } } A)遍历链表head,输出表中值为偶数的元素B)建立一个只有表头结点的链表head C)删除链表head中的第一个结点D)插入一个元素到链表head中 答案A,核心代码中有data%2==0,表示偶数,所以选A。 19.若有以下类型说明,叙述正确的是()。 typedef struct {int num; char *name; int score; }STU,*PSTU; A)STU是变量名B)PSTU是变量名 C)PSTU是指向结构体类型STU的指针类型名D)类型说明语句有错误 答案C,A错,STU是结构类型名,B错,PSTU是指向STU的指针类型,D错。 20.对下面程序正确的描述是()。 #include #include void main() {FILE *in,*out; if((in=fopen(“infile.txt”,”r”))==NULL) { printf(“cannot open infile\n”); exit(0);} if((in=fopen(“outfile.txt”,”w”))==NULL) { printf(“cannot open infile\n”); exit(0);} while(!feof(in)) fputc(fgetc(in),out); fclose(in); fclose(out); } A) 程序实现在屏幕上显示磁盘文件infile.txt的内容 B) 程序实现将两个磁盘文件infile.txt 和outfile.txt 的内容合二为一 C) 程序实现将磁盘文件infile.txt 复制到磁盘文件outfile.txt D) 程序实现将两个磁盘文件合并并在屏幕上输出 答案C ,fputc(fgetc(in)就是读入infile ,写到outfile ,这就是复制了。 二、改错题(共2小题,每题10分) 1.程序cmody081.c ,其功能是求一堆零件的总数(100到200之间)。 如果分成4个零件一组的若干组,则多2个零件;若分成7个零件一组,则多3个零件;若分成9个零件一组,则多5个零件。 #include void main() {int i; /**/for(i=100;i<200;i++);/**/ if((i-2)%4==0) if(!((i-3)%7)) if(i%9==5) printf(”%d\n ”,/**/ &I /**/); getch(); } 答案:for(i=100;i<=200;i++) printf(“%d\n ”,i);第一处,少了一个等号,因为包含了200,要小于等于,第二处是输出,不能带&。 2.程序cmody082.c 其功能是交换两个变量的值。 如 输入:2 3 输出:Original:a=2 b=3 Result a=3 b=2 #include /**/ void swap(int p1,int p2)/**/ {int temp; temp=*p1; /**/p1=p2;/**/ *p2=temp; } void main() {int a,b; printf(”Please input 2 number: \n ”); scanf(”%d%d ”,&a,&b); printf(”\nOriginal:a=%d b=%d\n ”,a,b); swap(&a,&b); printf(”\nResult:a=%d b=%d\n ”,a,b); getch(); } 答案:int swap(int p1,int p2) *p1=*p2;第一处错,注意返回是int 型,第二处错,是指针的内容在交换,应该改成:*p1=*p2; 三、填空题(共3小题,每题8分) 1.补充程序Ccon081.c ,根据输入的整数m(m>=0)值,计算 1m i i =∑ #include unsigned sum(unsigned n) {unsigned i, /**/ /**/ for(i=1;i<=n;i++) sum+=i; /**/ /**/ } void main() {int m; clrscr(); printf(”Please input a unsigned integer:”); scanf(“%d”,&m); while(m<0){ printf(”Please input a unsigned integer:”); scanf(“%d”,&m); } printf(”\nThe sum is %d\n”, /**/ /**/); getch(); } 答案:sum=0 return sum; sum(m) 第一空,赋初始值,第二处,返回结果,第三处,调用子函数。 2.补充程序Ccon082.c,使其实现将一个字符串str的内容反向存储。 #include #include void main() {int i,j; char str[]=”1234567”,/**/ /**/; for(i=0,/**/ /**/;i {k=str[i];str[i]=str[j];str[j]=k;} clrscr(); printf(“%s\n”,str); getch(); } 答案:k j=strlen(str)-1 第一处,填变量k的定义,第二处,str长度为strlen(str),而数组str最多则访问到长度-1,所以填j=strlen(str)-1,表示最后一个元素。 3.补充程序Ccon083.c,实现将结构体数组mystudent中存储的各学生信息按其学号的升序排列,并输出排序后各个学生的信息。 #include #include typedef struct{ int num; char name[20],sex[2]; int age,score; }STU; STU mystudent[]={ {1111,”Zhangqiang”,”m”,20,80},{2104,”Liminghong”,”w”,18,82}, {3121,”Wangxingda”,”m”,21,78},{1456,”Wuminghong”,”w”,35,86} }; void sort(STU* ps,int size) {int i,flag,pass; /**/ /**/ for(pass=1;pass {flag=0; for(i=0;i if(/**/ /**/) {flag+=1; temp=ps[i];ps[i]=ps[i+1];ps[i+1]=temp; } if(/**/ /**/) break; } } void main() {int i,size=sizeof(mystudent)/sizeof(STU); clrscr(); printf(”Students\’information before sort:\n\n ”); printf(”Number Name Age Sex Score\n\n ”); for(i=0;i (mystudent+i)->age, (mystudent+i)->sex, (mystudent+i)->score); sort(mystudent,size); printf(”\nStudents\’information after sort:\n\n ”); printf(”Number Name Age Sex Score\n\n ”); for(i=0;i printf(”%-7d%s%5d\t%s%7d\n ”,(mystudent+i)->num, (mystudent+i)->name, (mystudent+i)->age, (mystudent+i)->sex, (mystudent+i)->score); getch(); } 答案:STU temp ps[i].num>ps[i+1].num flag==0 第一处填:STU temp ,STU 型的临时变量,第二处填:ps[i].num>ps[i+1].num ,冒泡排序。第三处填:flag==0表示反序标识符,如果为0表示已经排序成功,就不继续往下排序。 四、编程题(共2小题,每题8分) 1.打开程序cprog081.c ,完成其中的f()函数,使其计算: ()()()202ln 20x x e x f x x x x ?+=?+≥?? 如:输入:-1.2输出:f(-1.200)=0.241 输入:2.4输出:f(2.400)=6.902输入:6输出:f(6.000)=19.879 #include #include double f(float x) {/**/ /**/ } void main() { float x; double y; printf (”Please input a number: \n ”); scanf(”%f ”,&x); y=f(x); printf (”f(%.3f)=%.3f\n”,x,y); getch(); } 答案: double y; if (x<0) y=(x+2)*exp(x); else y=(x+2)*log(2*x); return y; 注意ln怎么用程序表示。 2. 打开程序cprog082.c,完成其中的fun()函数,该函数将以指针数组形式存放的n个串升序排列后输出。注意:字符串比较函数为strcmp(str1,str2),字符串复制函数为strcpy(str1,str2)。 #include #include void f(char p[][20],int n); void main() {int i; char p[][20]={”abc”,”xabdfg”,”abbd”,”dcdbe”,”cd” }; f(p,5); clrscr(); for(i=0;i<5;i++) printf(”%s\n”,p[i]); getch(); } void f(char p[][20],int n) { /**/ /**/ } 答案: char *a[5]; char t[20]; //注意是字符数组,要有一定的空间,才不会容纳不下 int i,j; for(i=0;i for(j=i+1;j if(strcmp(p[i],p[j]>0) //如果反序 {strcpy(t,p[i]); strcpy(p[i],p[j]); strcpy(p[j],t);} //交换