8.该程序运行的结果是【9】。
#include<conio.h>
#include<stdio.h>
#define M 100
void fun(int m,int *a,int *n)
{ int i,j=0;
for(i=1;i<=m;i++)
if(i%7==0||i%11==0)
a[j++]=i;
*n=j;
}
main()
{ int aa[M],n,k;
clrscr();
fun(10,aa,&n);
for(k=0;k<n;k++)
if((k+1)%20==0)printf(″\n″);
else printf(″%4d″,aa[k]);
printf(″\n″);
}
【参考答案】
【9】 ###“7”(#表示空格)
9.下面程序把从终端读入的文本(用@作为文本结束标志)输出到一个名为bi.dat的新文件中,请填空。
#include <stdio.h>
FILE *fp;
{ char ch;
if((fp=fopen(【10】))==NULL)exit(0);
while((ch=getchar( ))!=′@′)fputc(ch,fp);
fclose(fp);
}
【参考答案】
【10】 “bi.dat”,“w”或“bi.dat”,“w+”
10.以下程序将数组a的4个元素和数组b的6个元素写到名为lett.dat的二进制文件中,请填空。
#include <stdio.h>
main()
{ FILE *fp;
char a[4]=″1234″,b[6]=″abcedf″;
if((fp=fopen(″【11】″,″wb″))=NULL)exit(0);
fwrite(a,sizeof(char),4,fp);
fwrite(b,【12】,1,fp);
fclose(fp);
}
【11】 lett.dat
【12】 6*sizeof(char)
11.以下程序输出的结果是【13】。
main()
{ int a=5,b=4,c=3,d;
d=(a>b>c);
printf(″%d\n″,d);
}
【参考答案】
【13】 0
12.以下函数用来求出数组的最大元素在数组中的下标并存放在k所指的存储单元中。请填空。
#include <conio.h>
#include <stdio.h>
int fun(int *s,int t,int *k)
{ int i;
*k=0;
【14】
if(s[*k]<s[i]*k=i;
return【15】;
}
main()
{
int a[10]={876,675,896,101,301,401,980,431,451,777},k;
clrscr();
fun(a,10,&k);
printf(″%d,%d\n″,k,a[k]);
}
【参考答案】
【14】 for(i=0;i<t;i++)
【15】 0
13.以下程序段中,错误的行号是【16】。
① #include <stdio.h>
② main()
③ { char str[14];str[ ]={″I love China″};
④ printf(″%s″,str);
⑤ }
【参考答案】
【16】 3行
14.设x和y均为int型变量,且x=1,y=2,则表达式double(1+x/y)的值为【17】。
【参考答案】
【17】 1.000000
15.设有以下定义和语句,则*(*(p+2)+1)的值为【18】。
int a[3][2]={10,20,30,40,50,60},(*p)[2];
p=a;
【参考答案】
【18】 60
16.以下程序的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
例如,若一维数组中的数据是2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。删除后,数组中的内容应该是2 3 4 5 6 7 8 9 10。
请填空。
#include <stdio.h>
#define N 80
int fun(int a[ ],int n)
{ int i,j=1;
for(i=1;i<n;i++)
if(a[j-1]【19】a[i])
a[j++]=a[i];
【20】;
}
main()
{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10},i,n=19;
printf(″The original data :\n″);
for(i=0;i<n;i++)printf(″%3d″,a[i]);
n=fun(a,n);
printf(″\nThe data after deleted :\n″);
for(i=0;i<n;i++)printf(″%3d″,a[i]);printf(″\n\n″);
}
【参考答案】
【19】 !=
【20】 return j
上机部分
一、填空题
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其他学生数据不变;若找不到,则什么都不做。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 5
typedef struct student
{long sno;
char name[10];
float score[3];
}STU;
void fun(char *filename, long sno)
{
FILE *fp;
STU n; int i;
fp=fopen(filename,"rb+");
while(! 1 )
{
fread(&n,sizeof(STU),1,fp);
if(n.sno 2 ) break;
}
if(!feof(fp))
{
for(i=0;i<3;i++) n.score[i]+=3;
fseek(fp,1L* 3 ,SEEK_CUR);
fwrite(&n, sizeof(STU), 1, fp);
}
fclose(fp);
}
main()
{
STU t[N]={{10001,"MaChao",91,92,77},
{10002,"CaoKai",75,60,88},
{10003,"LiSi",85,70,78},
{10004,"FangFang",90,82,87},
{10005,"ZhangSan",95,80,88}},ss[N];
int i,j; FILE *fp;
fp=fopen("student.dat","wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n");
fp=fopen("student.dat","rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for(j=0; j<N; j++)
{
printf("\nNo:%ld Name:%-8sScores: ",
ss[j].sno,ss[j].name);
for(i=0;i<3;i++)
printf("%6.2f ",ss[j].score[i]);
printf("\n");
}
fun("student.dat",10003);
fp=fopen("student.dat","rb");
fread(ss,sizeof(STU),N,fp);
fclose(fp);
printf("\nThe data aftermodifying :\n");
for(j=0;j<N;j++)
{
printf("\nNo:%ld Name: %-8s Scores:",
ss[j].sno,ss[j].name);
for(i=0;i<3;i++)
printf("%6.2f",ss[j].score[i]);
printf("\n");
}
}
【答案及解析】
(1)fun函数中进行文件操作,fp是文件指针,指向打开的二进制读写文件filename,后面应该读入数据,由于空1是在while条件中,通常用是否读到文件尾作为读文件的循环终止条件,如果未到文件尾,函数feof(fp)的返回值为0,!feof(fp)为真,因此填入:feof(fp)。(2)空2由于题目要求从指定文件中找出指定学号sno的学生数据。因此应该填入:==sno。(3)空3是移动文件指针,将修改后的学生记录写回到文件的原来位置上,覆盖原来的数据,因此需要将文件指针从当前位置向前移动一个记录的字节数,也就是sizeof(STU),应填入:sizeof(STU)。
二、改错题
给定程序中,函数fun的功能是:计算正整数num的各位上的数字之积。
例如,若输入252,则输出应该是20;若输入202,则输出应该是0。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
long fun(long num)
{
long k;
do
{
k*=num%10 ;
num\=10;
}while(num);
return (k);
}
main()
{
long n;
printf("\Please enter a number:");
scanf("%ld",&n);
printf("\n%ld\n",fun(n));
}
【答案及解析】
仔细阅读题目和程序后可以知道k是连乘的结果,但k未赋初值,应该给k赋值1。因此将long k;改为long k=1;或long k;k=1;第2处错误为/=被误写成\=,因此应该改为:num/=10。
三、编程题
程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N], int n),函数的功能是:使N×N的二维数组左下三角元素中的值乘以n。
例如:若n的值为3,a数组中的值为:
1 9 7
(1)本题主要考查二维数组的有关概念。题目要求是使N×N的二维数组左下三角元素中的值乘以n。即第1行1个,第2行2个,……,第N行N个元素乘n。这就需要用双重循环来进行判断,并设变量j、k,j从0到N-1,k从0到j,将a[j][k]乘n。
(2)按上述分析写出的函数是:
int fun(int a[][N],int n)
{
int j,k;
for(j=0;j<N;j++)
for(k=0;k<j+1;k++)
a[j][k]*=n;
}
2 3 8
4 5 6
则返回主程序后a数组中的值应为:
3 9 7
6 9 8
12 15 18
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <stdlib.h>
#define N 5
int fun(int a[][N],int n)
{
}
main()
{
int a[N][N],n,i,j;
printf("***The array***\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
a[i][j]=rand()%10;
printf( "%4d", a[i][j] );}
printf("\n");
}
do n=rand()%10; while(n>=3);
printf("n=%4d\n",n);
fun(a,n);
printf ("***THE RESULT***\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
【答案及解析】