一、选择题
1、
下列不是C语言合法标识符的是__________。
A. _124 B. 124abc C. sum124 D. a_124
2、
若有如图1所示存储结构,且变量定义为struct node{int data;struct node *next;}p,q,r;若要实现图2所示的存储结构,可选用的赋值语句是__________。
A. p=r; B. p=q->next; C. p->next=q; D. p->next=q->next;
二、写程序结果
1、
#include <stdio.h>
main()
{
double x,y;
printf("%.2f",(x=5,y=x+3/2));
}
运行结果是____________________。
2、
#include <stdio.h>
#define CUBE(x) (x*x*x)
main()
{
int n=5;
int s=CUBE(++n);
printf("%d",s);
}
运行结果是____________________。
3、
#include <stdio.h>
void fun(int a,int *b)
{
a=*b*2;
*b=a*5;
}
main()
{
int x=10,*y;
y=&x;
fun(x,y);
printf("%d,%d",x,*y);
}
运行结果是____________________。
4、
#include <stdio.h>
void fun(int *a)
{
*a=*(a-1)+*(a+1);
}
main()
{
int i=0,s=0,arr[5]= {1,3,5,7,9};
fun(arr+2);
for(; i<5; i++)
s+=arr[i];
printf("%d",s);
}
运行结果是____________________。
三、程序填空
1、
下列函数rtrin_str实现的是删除字符串str尾部的所有空格。
char* rtrim_str(char* str)
{
int n=__________ 1 __________;
if(n<1)
return 0;
while(n>0)
{
if(*(str+n)!=' ')
{
__________ 2 __________
break;
}
else
__________ 3 __________
}
return str;
}
2、
某超市推行会员优惠购物,其中vip会员八八折,金牌会员九折,银牌会员九三折,普通会员九六折,非会员不打折。以下程序实现了超市购物的结算,其中非会员、普通会员、银牌会员、金牌会员、vip会员分别用0、1、2、3、4表示。
#include <stdio.h>
double computer(int n,int grade)
{
int amount,i;
double sum,price,discount[5]= { __________ 4 __________ };
sum=0.0;
for(i=0; i<n; i++)
{
printf("请输入商品单价和数量:\n");
scanf("%lf%d",&price,&amount); /*price:商品单价;amount:商品数量;*/
sum+=price*amount;
}
return __________ 5 __________ ;
}
main()
{
int n,grade; /*n:商品种数;grade:会员等级*/
printf("请输入商品种数和会员等级:\n");
scanf("%d%d",&n,&grade);
printf("%.2lf\n", __________ 6 __________);
}
四、改错
1、
以下程序的功能是:任意输入一个小于256的正整数,将其转换成二进制数并输出。程序中有两处错误,请将错误处的行号及正确语句填入答题卡相应位置中,不得增行或删行。
#include "stdio.h"
int main()
{
int x,i=0,j=0;
int result[8];
printf("请输入一个小于256的正整数:\n");
scanf("%d",&x);
do
{
result[i]=x%2;
i++;
x=x%2;
}
while(x>=1);
for(j=i-1; j>=0; j++)
printf("%d",result[j]);
printf("\n");
return 0;
}
五、程序设计题
1、
在全国青年歌手大奖赛中,有20个评委为参赛的选手打分,分数为1-100分。选手最后得分为:去掉一个最高分和一个最低分后其余18个分数的平均值。请编写程序实现,输入20个评委评分,求出选手最后得分。
六、程序方向
(一)、程序填空
设文件studs.dat中存放着学生的基本信息,基本信息由以下结构体来描述:
struct student
{
long int num; /*学号*/
char name[20]; /*姓名*/
char major[25]; /*专业*/
}
下列程序的功能是:输入要读取的学生人数,利用malloc动态分配内存来存储从文件中读取的学生信息(以方便进一步管理),并输出读取的学号,姓名,专业。请将正确的内容填入答题卡的相应位置上,使程序完整。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{
long int num;
char name[10];
char major[10];
};
FILE *fp;
int main()
{
struct student st,*pst;
int i ,num,realnum;
printf("请输入读取的学生数:");
scanf("%d",&num);
pst=(struct student *)malloc(______1______);
if(!pst) return 0;
fp=fopen("studs.dat","rb");
if(NULL==fp)
{
______2______;
return 0;
}
realnum=0;
printf("%s\t%s\t%s\n","number","name","major");
/*文件包含的学生数量可能少于输入的人数*/
for(i=0; i< ______3______ ; i++)
{
fread(pst+i,sizeof(struct student),1,fp);
realnum++;
______4______;
printf("%d\t%ld\t%s\t%s\n",realnum,st.num,st.name,st.major);
}
free(pst);
fclose(fp);
return 0;
}
(二)、程序设计
编写程序,输入5行5列整数方阵,计算并输出该方阵两条对角线上各元素的平方和。
参考答案:
一、选择题
1—2 BD
一、写程序结果
1、 6.00 2、 VC 512=8*8*8 DC 392=7*7*8 3、 100,100
4、 30
分析:对于第2题,以下代码在VC中均为512,在DC中均为392。
#include "stdio.h"
#define CUBE(x) (x*x*x)
int main()
{
int s;
int a=5; s=CUBE(++a); printf("\n %d",s);
int b=5; s=++b*++b*++b; printf("\n %d",s);
int c=5; printf("\n %d",++c*++c*++c);
int d=5; int e; e=CUBE(++d); printf("\n %d",e);
getchar();
}
二、程序填空
1、 n=strlen(str)-1 2、 *(str+n+1)='\0'; 3、 n--;
4、 1.00,0.96,0.93,0.9,0.88 5、 sum*discount[grade] 6、 computer(n,grade)
三、改错
1、 L12 x=x/2; // x=x%2;
2、 L15 for(j=i-1; j>=0; j--) // for(j=i-1; j>=0; j++)
四、程序设计题
1、参考代码
#include "stdio.h"
int main()
{
int x[21],min,max,n=1;
float aver;
while(n<=20)
{
printf("请输入第%d个评委的分数(1-100):",n);
scanf("%d",&x[n]);
if(x[n]>=1 && x[n]<=100)
n++;
}
aver=min=max=x[1];
for(n=2;n<=20;n++)
{
if(min>x[n])min=x[n];
if(max<x[n])max=x[n];
aver+=x[n];
}
aver=(aver-min-max)/18;
printf("\n 最后得分:%.2f",aver);
return 0;
}
不足:没有考虑计算多个选手的情况,只考虑了计算一个选手的得分。
五、程序方向
(一)、程序填空
1、 sizeof(struct student)
2、 free(pst);
3、 !feof(fp)&&(i<num)
4、 st=*(pst+i)
分析:本程序有bug,因为文件尾的情况存在多读一条数据的问题,因此,应该在循环外先读取一次,则不会出现多读一条数据的问题。
fread(pst+i,sizeof(struct student),1,fp);
realnum++;
st=*(pst+i);
for(i=0; !feof(fp)&&(i<num); i++)
{
printf("%d %ld %s %s\n",realnum,st.num,st.name,st.major);
fread(pst+i,sizeof(struct student),1,fp);
realnum++;
st=*(pst+i);
}
(二)程序设计
#include <stdio.h>
#define N 5
main()
{
int a[N][N],i,j,s=0;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
//printf("\n请输入第%d行第%d列数据:",i,j);
//scanf("%d",&a[i][j]);
a[i][j]=i+j;
}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
if(i==j || i+j==N-1)
s+=a[i][j]*a[i][j];
}
printf("\n对角线上各元素的平方和为%d",s);
}
// 0 1 2 3 4 0+4+16+36+64=120
// 1 2 3 4 5 16+16+16+16=64
// 2 3 4 5 6
// 3 4 5 6 7
// 4 5 6 7 8