一、选择题
1、
以下正确的C语言自定义标识符是__________。
A.int B.a.3 C._7c D.5d_
2、
已知i=3,执行j=i++后,i和j的值分别为__________。
A.i=4 j=2 B.i=4 j=3 C.i=3 j=3 D.i=3 j=2
3、
C语言中,以下语句能跳过循环体中未执行的语句,接着执行本循环下一次迭代的语句是__________。
A.空语句 B.break语句 C.return语句 D.continue语句
二、填空题
1、
C语言中,文件操作fopen函数的原型为FILE * fopen(char *filename, char *mode),用于打开一个指定文件,若成功则返回一个与之关联的流,否则返回_____ 1 _____;代码片段FILE * fp=fopen("C:\\test.dat","a")的含义是以_____ 2 _____的方式打开路径"C:\\test.dat"对应的文件,当访问的文件是二进制文件时,还需要在字符串“a”后增加一个字符_____ 3 _____,以上代码片段对应的关闭文件的C语言代码是_____ 4 _____。
三、综合应用题
1、
30人参观博物馆共花50美元,其中成年男子门票为3美元/人,成年女子2美元/人,小孩1美元/人。编程输出成年男子、成年女子和小孩人数的所有组合。
题目分析如下:
设x,y,z分别代表成年男子、成年女子和小孩人数。按题目要求,可得下面方程:
x+y+z=30 (1)
3x+2y+z=50 (2)
用程序求此不定方程的非负整数解,可先通过(2)-(1)式得:
2x+y=20 (3)
由(3)式可知,x变化范围是______1______
根据以上分析编写程序如下:
#include <stdio.h>
main()
{
int x,y,z; /*x,y,z分别代表成年男子、成年女子、小孩人数*/
printf("Men Women Chlidren\n");
for(x=0;______2______;x++)
{
______3______; /*按照(3)式根据x求y*/
______4______; /*由(1)式求得z*/
if(3*x+2*y+z==50) /*当前得到的一组解是否满足式(2)*/
printf("%d %d %d\n",x,y,z);
}
}
四、写程序结果
1、
#include <stdio.h>
main()
{
int a=3,b=4;
a%=b+=a+=(a+b);
printf("%d,%d",a,b);
}
运行结果是____________________。
2、
#include <stdio.h>
main()
{
int x=2,y=7,z=5;
switch(x>2)
{
case 1:
switch(y>0)
{
case 1: printf("1");break;
case 2: printf("2");break;
}
case 0:
switch(z==5)
{
case 0: printf("3");break;
case 1: printf("4");break;
default:printf("5");break;
}
default:printf("6");
}
}
运行结果是____________________。
3、
#include <stdio.h>
main()
{
int a=8,y=0;
do
{
a+=2;
y+=a;
if(y>30)
break;
}
while(a=10);
printf("a=%d y=%d\n",a,y);
}
运行结果是____________________。
4、
#include <stdio.h>
int func(int a,int b)
{
return a=a+b,a%b;
}
main()
{
int x=9,y=7,z=3,rels;
rels=func(func(x,y),z);
printf("%d\n",1<<rels);
}
运行结果是____________________。
五、程序填空
1、
下面程序输出x,y,z三个数中的最大值。
#include <stdio.h>
int main()
{
int x=3,y=7,z=6;
int a,b;
a=x<y?_____ 1 _____;
b=a<z?_____ 2 _____;
printf("%d",b);
return 0;
}
2、
下面程序接受键盘上的输入,直到按回车键为止,然后将输入的字符串输出,输出时如果原输入字符是英文大写字母则转成小写字母输出,如果是小写字母则转成大写字母输出,如果有连续的一个以上的空格时只输出一个空格。
#include<stdio.h>
main()
{
char cx,pre='\0';
while(_____ 3 _____!='\n')
{
if(cx!=' ')
if(cx>='a'&&cx<='z')
putchar(cx-32);
else
if(cx<'Z'&&cx>='A')
_____ 4 _____;
else putchar(cx);
else if(pre!=' ')
putchar(cx);
_____ 5 _____;
}
}
六、改错
1、
以下程序用于输入两个学生的姓名和成绩,然后输出这两个学生的平均成绩,运行结果如图7所示。程序中存在3处错误。(注:严格意义上是四个错误,找出错误比较大的三个)。
#include <stdio.h>
define N 2
struct Student
{
char name[4];
float score;
};
main()
{
struct Student stu[N];
int i=0;
for(; i<N; i++)
{
printf("input scores of student%d:\n",i+1);
printf("name:");
scanf("%s",stu[i].name);
printf("score:");
scanf("%f",stu[i].score);
}
float rels=0;
for(; i<N; i++)
{
rels+=stu[i].score;
}
printf("avg score is:%3.2f",rels/N);
}
2、
以下程序将数组中元素逆序输出,运行结果如下所示。程序中存在2处错误。
dd cc bb aa
#include <stdio.h>
int main()
{
char *array[]= {"aa","bb","cc","dd"};
char (**pt)[];
int j;
pt=array+3;
for(j=3; j>=0; j--)
printf("%s ",*(pt)[j]);
}
七、程序设计题
1、
Merge函数用于将两个升序的链表head1和head2合并成一个链表,并保持合并后链表依然升序。排序的依据为结构体类型Node中的data成员,合并中不得删除节点。下面给出Merge函数的主体框架,在空出的五个位置补充该主体框架缺失的代码段。
注意:不能定义新的变量,可不用已定义的某些变量。
#include "stdio.h"
typedef struct Node
{
int data;
struct Node *next;
} Node;
Node *Merge(Node *head1,Node *head2)
{
if(head1==NULL)
return head2;
if(head2==NULL)
return head1;
Node *head=NULL; //head指针用于指向合并后链表的头结点
Node *p1=NULL;
Node *p2=NULL;
if(head1->data<head2->data)
{
head=head1;
_____ 1 _____;
p2=head2;
}
else
{
head=head2;
_____ 2 _____;
p1=head1;
}
Node *pcurrent=head;
while(p1!=NULL&&p2!=NULL)
{
if(p1->data<=p2->data)
{
pcurrent->next=p1;
_____ 3 _____;
p1=p1->next;
}
else
{
pcurrent->next=p2;
_____ 4 _____;
p2=p2->next;
}
}
if(p1!=NULL)
_____ 5 _____;
if(p2!=NULL)
pcurrent->next=p2;
return head;
}
参考答案:
一、选择题
1—3 C、B、D
二、填空题
1、NULL 、追加、b、fclose(fp)
三、综合应用题
1、[0,10] 或者 x>=0 and x<=10 2、x<=10 3、y=20-2*x 4、z=30-x-y
四、写程序结果
1、 10,14 2、 46 3、 a=12 y=34 4、 4
五、程序填空
1、 y:x 2、z:a
3、(cx=getchar()) 4、putchar(cx+32) 5、pre=cx;
六、改错
1、
L02 #define N 2 //本语句非逻辑错误,可能为打印错误
L18 scanf("%f",&stu[i].score);
L21 for(i=0; i<N; i++)
L25 printf("avg score is:%04.1f",rels/N);
2、
L05 char **pt;
L09 printf("%s ",*pt--);
L09 printf("%s ",pt[j-3]);//也可以
七、程序设计题
1、 p1=head1->next 2、 p2=head2->next
3、 pcurrent=p1 4、 pcurrent=p2
5、 pcurrent->next=p1
补充测试头文件
int main()
{
Node a[5]={{6,&a[3]},{2,&a[4]},{10,NULL} ,{8,&a[2]},{4,&a[0]}};
Node b[5]={{5,&b[3]},{1,&b[4]},{9,NULL} ,{7,&b[2]},{3,&b[0]}};
Node *h1=&a[1],*h2=&b[1],*h;
h=Merge(h1,h2);
while(h)
{
printf("%d ",h->data);
h=h->next;
}
}