一、选择题
1、
下列选项中正确的C语言变量定义是__________。
A.char a1='A', a2=A; B.unsigned long a=1000;
C.float a1=a2=10.0; D.double a=0.618,a=3.14;
2、
假设有:float a=5,b=a+5/2;则执行语句printf("%f",b)的输出结果为__________。
A.7.500000 B.7 C.5.000000 D.7.000000
3、
有输入语句:scanf("a=%d,b=%d",&a,&b);为使变量a的值为1,b的值为2,正确的数据输入方式是__________。
A.12 B.1,2 C.a=1,b=2 D.a=1 b=2
二、填空题
1、
在C语言中,可以使用函数 _____ 1 _____ 来获取字符串的长度,使用函数_____ 2 _____来对两个字符串进行比较,使用宏定义命令_____ 3 _____来定义宏,使用文件包含命令_____ 4 _____实现“文件包含”操作。
三、综合应用题
1、
民警小张在某个案件中带回4个嫌疑人A,B,C,D,其中有一位是小偷,现在小张分别对4个嫌疑人进行询问:
A说:我不是罪犯;
B说:C是罪犯;
C说:D是罪犯;
D说:我不是罪犯而且B也不是罪犯。
已知其中3人说的是真话,1人说的是假话,请根据以上信息帮助小张找出罪犯。
#include <stdio.h>
#include <stdlib.h>
main()
{
    int i;
    char who='A';
    int isFound=0;
    for(i=0; _____ 1 _____ ;i++)
    {
        int sum=0;
        who= _____ 2 _____ ;
        if(who!='A')    sum++;
        if(who=='C')    sum++;
        if(who=='D')    sum++;
        if( _____ 3 _____ ) sum++;
        if( _____ 4 _____ )
        {
            printf("罪犯是%c\n",who);
            isFound=1;
        }
    }
    if(!isFound)
        printf("没有找到符合条件的人");
}四、写程序结果
1、
#include <stdio.h>
int main()
{
    int a=7,b=3,c=2;    
    int d=(a>b!=c);
    printf("%d",d);
    return 0;
}运行结果是____________________。
2、
#include <stdio.h>
main()
{
    int c;
    while((c=getchar())!='\n')
    switch(c-'2')
    {
        case 0:
        case 1:putchar(c+4);
        case 2:putchar(c+4);break;
        case 3:putchar(c+3);
        default:putchar(c+2);break;
    }
}当输入为125时,运行结果是____________________。
3、
#include <stdio.h>
static int f=1;
int func(int n)
{
    f=f+n;
    return f;
}
main()
{
    int i;
    for(i=2;i<=3;i++)
        printf("%d",func(i));
}运行结果是____________________。
4、
#include <stdio.h>
main()
{
    int a[9]={1,2,3,4,5,6,7,8};
    int *p=a;
    int sum=0;
    for(;p<a+8;p++)
    if(*p%2==0)
        sum=sum+*p;
    printf("%d",sum);
}运行结果是____________________。
5、
#include <stdio.h>
void f(int *q)
{
    int i;
    for(i=0;i<3;i++)
        (*q)--;
}
main()
{
    int a[5]={8,7,6},i;
    f(a);
    for(i=0;i<3;i++)
        printf("%d",a[i]);
}运行结果是____________________。
五、程序填空
1、
下面的程序从文本文件test.txt逐个读入字符,并显示在屏幕上。
#include <stdio.h>
#include <stdlib.h>
main()
{
    FILE *fp;
    char ch,*filename="test.txt";
    if((fp= _____ 1 _____(filename,"r"))==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    while(! _____ 2 _____(fp))
    {
        ch=fgetc(fp);
        putchar(ch);
    }
    fclose(fp);
}2、
以下程序的功能是:读入一行字符,以回车结束,按输入时的逆序使用单向链表进行存储,先输入的位于链表尾,然后再遍历输出链表,如输入abc↙,链表结构如图所示,程序最后输出cba.

#include "stdlib.h"
#include "stdio.h"
struct node
{
    char value;
    struct node *link;
};
int main()
{
    struct node *top,*p;
    char c;
    top=NULL;
    while((c=getchar())_____ 3 _____)
    {
        p=(struct node *)malloc(sizeof(struct node));
        p->value=c;
        p->link=top;
        _____ 4 _____
    }
    while(top)
    {
        p=top;
        top=top->link;
        putchar(_____ 5 _____);
    }
    return 0;
}六、改错
1、
矩阵乘法是指两个矩阵相乘,生成一个新矩阵,其乘法公式如下:

以下程序实现了两个2×2的矩阵相乘,只对程序中的2行代码进行修改,使其可以正确运行。
#include <stdio.h>
#define M 2
#define N 2
#define K 2
int main()
{
    int a[M][K]= {1,-1,0,2};
    int b[K][N]= {4,0,2,5};
    int c[M][N]; 
    int i,j,l;
    for(i=0; i<M; i++)
    {
        for(j=0; j<N; j++)
        {
            for(l=0; l<K; l++)
            {
                c[i][j]=a[i][l]*b[l][j];
            }
        }
    }
    return 0;
}2、
某班举行歌唱比赛,赛后需要显示成绩最高的选手名字和成绩,以下程序实现了查找得分最高选手的功能,只对程序中的3行代码进行修改,使其可以正确运行。
#include <stdio.h>
#define MAX 3
struct PLAYER
{
    char *name;
    float score;
} Player;
int main()
{
    Player players[]= {{"丁一",90.3}, {"陈二",95.8}, {"张三",89.6}};
    Player *player;
    Player topPlayer=players[0];
    for(player=players; player<players+MAX;player++)
    {
        if(player.score>topPlayer.score)
        {
            topPlayer=player
        }
    }
    printf("Top Player is %s,score is %6.2f",topPlayer.name,topPlayer.score);
    return 0;
}七、程序设计题
1、
折半查找也称为二分查找,适用于有序数组,其查找的基本过程是:先确定待查记录所在的范围,然后逐步缩小范围,直到找到,或找不到该记录为止。假定数组按照升序排列,对于给定值K,从数组中间位置开始比较,如果当前数据元素的值等于k,则查找成功。否则,若k小于当前数据元素的值,则在数组的前半部继续查找;反之,则在数组的后半部继续查找,依次重复进行,直至获得查找成功或不成功的结果。请补充完成下列程序中的相应部分:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int BinarySearch(int key,int data[]); 
    int key=0;
    printf("请输入要查找的数:");
    scanf("%d",&key);
    int data[10]= {1,3,5,7,8,9,13,18,22,28};
    int ret=BinarySearch(key,data);
    if(ret>=0)
        printf("\n %d 是数组中的第%d个数\n",key,ret+1);
    else
        printf("\n %d在数组中未找到!\n",key);
    system("pause");
    return 0;
}
int BinarySearch(int key,int data[])
{
    int low=0,high=9,middle;
    while(______1______)            /*查找结束条件*/
    {
        int middle=______2______;       /*获取数组中间位置*/
        if(______3______)               /*如查当前数据元素的值等于k*/
            return middle;      /*返回所在位置*/
        if(key<data[middle])    /*如果若k小于当前数据元素的值*/
            ______4______;  /*在数组的前半部继续查找*/
        else
            ______5______;  /*在数组的后半部继续查找*/
    }
    return -1;  /*返回查找不成功标记*/
}参考答案:
一、选择题
1—3 B、D、C
二、填空题
1、strlen()、strcmp()、#define 、#include
三、综合应用题
1、i<=3 2、'A'+i 3、who!='D' && who!='B'
4、sum==3 5、 876
四、写程序结果
1、 1 2、 36687 3、 36 4、 20
五、程序填空
1、 fopen 2、feof
3、!='\n' 4、top=p; 5、p->value
六、改错
1、
L09 int c[M][N]={0};
L17 c[i][j]+=a[i][l]*b[l][j];
2、
L03 typedef struct PLAYER
L15 if(player->score>topPlayer.score)
L17 topPlayer=*player;
七、程序设计题
1、low<=high 2、 (low+high)/2
3、 key==data[middle] 4、high=middle-1
5、 low=middle+1










