⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2010-

📁 计算机二级机考南开一百题
💻
📖 第 1 页 / 共 5 页
字号:
s++ ; 
} 
return k ; 
} 

※※※※※※※※※※※※※※※※※※※※※※※※※ 
第04套: 
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所 
有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指 
的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的 
学生数据输出到filename所指的文件中,覆盖原来的文件内容。 
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 
果。 
注意:源程序存放在考生文件夹下的BLANK1.C中。 
不得增行或删行,也不得更改程序的结构! 
给定源程序: 
#include <stdio.h> 
#define N 5 
typedef struct student { 
long sno; 


char name[10]; 
float score[3]; 
} STU; 
void fun(char *filename) 
{ FILE *fp; int i, j; 
STU s[N], t; 
/**********found**********/ 
fp = fopen(filename, __1__); 
fread(s, sizeof(STU), N, fp); 
fclose(fp); 
for (i=0; i<N-1; i++) 
for (j=i+1; j<N; j++) 
/**********found**********/ 
if (s[i].sno __2__ s[j].sno) 
{ t = s[i]; s[i] = s[j]; s[j] = t; } 
fp = fopen(filename, "wb"); 
/**********found**********/ 
__3__(s, sizeof(STU), N, fp); /* 二进制输出 */ 
fclose(fp); 
} 
main() 
{ STU t[N]={ {10005,"ZhangSan", 95, 80, 88}, {10003,"LiSi", 85, 70, 78}, 
{10002,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}, 
{10001,"MaChao", 91, 92, 77}}, ss[N]; 
int i,j; FILE *fp; 
fp = fopen("student.dat", "wb"); 
fwrite(t, sizeof(STU), 5, fp); 
fclose(fp); 
printf("\n\nThe original data :\n\n"); 
for (j=0; j<N; j++) 
{ printf("\nNo: %ld Name: %-8s Scores: ",t[j].sno, t[j].name); 
for (i=0; i<3; i++) printf("%6.2f ", t[j].score[i]); 
printf("\n"); 
} 
fun("student.dat"); 
printf("\n\nThe data after sorting :\n\n"); 
fp = fopen("student.dat", "rb"); 
fread(ss, sizeof(STU), 5, fp); 
fclose(fp); 
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"); 
} 
} 
解题思路: 
本题是考察把结构中的数据写入文件。 
 第一处:建立文件的类型,考虑到是把结构中的数据(结构中的数据包含不打印的字符) 
从文件中读出,所以应填:"rb"。 
第二处:判断当前学号是否大于刚读出的学号进行相比,如果大于,则进行交换,所以应
填:>。 
第三处:把已排序的结构数据,重新写入文件,所以应填:fwrite。 
*************************************************** 
给定程序MODI1.C中函数fun的功能是: 在字符串的最前端加入n个*号, 形成 
新串, 并且覆盖原串。 
注意: 字符串的长度最长允许为79。 
请改正函数fun中指定部位的错误, 使它能得出正确的结果。 
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构! 
给定源程序: 
#include <stdio.h> 
#include <string.h> 
void fun ( char s[], int n ) 
{ 
char a[80] , *p; 
int i; 
/**********found***********/ 
s=p; 
for(i=0; i<n; i++) a[i]='*'; 
do 
{ a[i]=*p; 
i++; 
} 
/**********found***********/ 
while(*p++) 
a[i]=0; 
strcpy(s,a); 
} 
main() 
{ int n; char s[80]; 
printf("\nEnter a string : "); gets(s); 
printf("\nThe string \"%s\"\n",s); 
printf("\nEnter n ( number of * ) : "); scanf("%d",&n); 
fun(s,n); 
printf("\nThe string after insert : \"%s\" \n" ,s); 
} 
解题思路: 
第一处: 指针p应指向s,所以应改为:p=s;。 
第二处: 死循环,当do while循环执行一次,临时变量p应该指向字符串的下一位置,所以
应改为:while(*p++);。 
请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机 
函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0] 
中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中, 
其余依此类推, 把100岁 (含100)以上年龄的人数都放在d[10]中。结果在主函数
中输出。 
注意:部分源程序在文件PROG1.C中。 
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 
你编写的若干语句。 
给定源程序: 
#include <stdio.h> 
#define N 50 
#define M 11 
void fun( int *a, int *b) 
{ 
} 
double rnd() 
{ static t=29,c=217,m=1024,r=0; 
r=(r*t+c)%m; return((double)r/m); 
} 
main() 
{ int age[N], i, d[M]; 
for(i=0; i<N;i++)age[i]=(int)(115*rnd()); 
printf("The original data :\n"); 
for(i=0;i<N;i++) printf((i+1)%10==0?"%4d\n":"%4d",age[i]); 
printf("\n\n"); 
fun( age, d); 
for(i=0;i<10;i++)printf("%4d---%4d : %4d\n",i*10,i*10+9,d[i]); 
printf(" Over 100 : %4d\n",d[10]); 
NONO(d); 
} 
解题思路: 
本题是统计各年龄段的人数。 
1. 初始化各年龄段人数为0。 
2. 使用for循环以及求出各年龄的十位数字作为存放人数的地址,如果大于值大于10,则
存入d[10]中(大于110岁的人)。 
参考答案: 
void fun( int *a, int *b) 
{ 
int i, j ; 
for(i = 0 ; i < M ; i++) b[i] = 0 ; 


for(i = 0 ; i < N ; i++) { 
j = a[i] / 10 ; 
if(j > 10) b[M - 1]++ ; else b[j]++ ; 
} 
} 
double rnd() 
{ static t=29,c=217,m=1024,r=0; 
r=(r*t+c)%m; return((double)r/m); 
} 

第05套: 
给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本 
文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将 
字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 
注意:源程序存放在考生文件夹下的BLANK1.C中。 
不得增行或删行,也不得更改程序的结构! 
给定源程序: 
#include <stdio.h> 
#include <stdlib.h> 
void fun(char *s, int a, double f) 
{ 
/**********found**********/ 
__1__ fp; 
char str[100], str1[100], str2[100]; 
int a1; double f1; 
fp = fopen("file1.txt", "w"); 


fprintf(fp, "%s %d %f\n", s, a, f); 
/**********found**********/ 
__2__ ; 
fp = fopen("file1.txt", "r"); 
/**********found**********/ 
fscanf(__3__,"%s%s%s", str, str1, str2); 
fclose(fp); 
a1 = atoi(str1); 
f1 = atof(str2); 
printf("\nThe result :\n\n%s %d %f\n", str, a1, f1); 
} 
main() 
{ char a[10]="Hello!"; int b=12345; 
double c= 98.76; 
fun(a,b,c); 
} 
解题思路: 
本题是考察先把给定的数据写入到文本文件中,再从该文件读出并转换成相应的整数、浮
点数显示在屏幕上。 
第一处:定义文本文件类型变量,所以应填:FILE *。 
第二处:关闭刚写入的文件,所以应填:fclose(fp)。 
第三处:从文件中读出数据,所以应填:fp。 
给定程序MODI1.C中函数fun的功能是: 对N名学生的学习成绩,按从高到低的 
顺序找出前m(m≤10)名学生来, 并将这些学生数据存放在一个动态分配的连续存 
储区中, 此存储区的首地址作为函数值返回。 
请改正函数fun中指定部位的错误, 使它能得出正确的结果。 
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构! 
给定源程序: 
#include <stdio.h> 
#include <alloc.h> 
#include <string.h> 
#define N 10 
typedef struct ss 
{ char num[10]; 
int s; 
} STU; 
STU *fun(STU a[], int m) 
{ STU b[N], *t; 
int i,j,k; 
/**********found**********/ 
t=(STU *)calloc(sizeof(STU),m) 
for(i=0; i<N; i++) b[i]=a[i]; 
for(k=0; k<m; k++) 
{ for(i=j=0; i<N; i++) 
if(b[i].s > b[j].s) j=i; 
/**********found**********/ 
t(k)=b(j); 
b[j].s=0; 
} 
return t; 
} 
outresult(STU a[], FILE *pf) 
{ int i; 
for(i=0; i<N; i++) 
fprintf(pf,"No = %s Mark = %d\n", a[i].num,a[i].s); 
fprintf(pf,"\n\n"); 
} 
main() 
{ STU a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77}, 
{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} }; 
STU *pOrder; 
int i, m; 
printf("***** The Original data *****\n"); 
outresult(a, stdout); 
printf("\nGive the number of the students who have better score: "); 
scanf("%d",&m); 
while( m>10 ) 
{ printf("\nGive the number of the students who have better score: "); 
scanf("%d",&m); 
} 
pOrder=fun(a,m); 
printf("***** THE RESULT *****\n"); 
printf("The top :\n"); 
for(i=0; i<m; i++) 
printf(" %s %d\n",pOrder[i].num , pOrder[i].s); 
free(pOrder); 
} 
解题思路: 
第一处: 语句最后缺少分号。 
第二处: 应该使用方括号,而不是圆括号。 
像此类,使用编译,即可发现。 
3.请编写函数fun, 函数的功能是: 删去一维数组中所有相同的数, 使之只剩一 
个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 
例如, 一维数组中的数据是: 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。 
注意:部分源程序在文件PROG1.C中。 
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入 
你编写的若干语句。 
给定源程序: 
#include <stdio.h> 
#define N 80 
int fun(int a[], int n) 


{ 
} 
main() 
{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20; 
printf("The original data :\n"); 
for(i=0; i<n; i++)printf("%3d",a[i]); 
n=fun(a,n); 
printf("\n\nThe data after deleted :\n"); 
for(i=0;i<n;i++)printf("%3d",a[i]); printf("\n\n"); 
NONO(); 
} 

解题思路: 
本题是删除已排序过数组中的相同数。 
1. 取出数组中的第1个数存放在临时变量k中,再利用for循环来依次判断所有的数。 
2. 如果取出的数和k相比,如果不相同,则仍存放在原数组中,其中存放的位置由j来控制, 
接着把这个数重新存入k。如果相同,则取下一数。 
参考答案: 
int fun(int a[], int n) 
{ 
int i, j = 1, k = a[0] ; 
for(i = 1 ; i < n ; i++) 
if(k != a[i]) { 
a[j++]=a[i] ; 
k = a[i] ; 
} 
a[j] = 0 ; 
return j ; 
} 
第06套: 
给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正 
确时, 程序输出: 
x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000 
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 
果。 
注意:源程序存放在考生文件夹下的BLANK1.C中。 
不得增行或删行,也不得更改程序的结构! 
给定源程序: 
#include <stdio.h> 
double f1(double x) 
{ return x*x; } 
double f2(double x, double y) 
{ return x*y; } 
/**********found**********/ 
__1__ fun(int i, double x, double y) 
{ if (i==1) 
/**********found**********/ 
return __2__(x); 
else 
/**********found**********/ 
return __3__(x, y); 
} 
main() 
{ double x1=5, x2=3, r; 
r = fun(1, x1, x2); 
r += fun(2, x1, x2); 
printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r); 
} 
解题思路: 
本题是根据给定的公式来计算函数的值。 
第一处:程序中使用双精度double类型进行计算,所以函数的返回值类型也为double,所
以应填:double。 
第二处:当i等于1时,则返回f1函数的值,所以应填:f1。 
第三处:如果i不等于1,则返回f2函数的值,所以应填:f2。 
1.给定程序MODI1.C中函数fun的功能是: 比较两个字符串,将长的那个字符串 
的首地址作为函数值返回。 
请改正函数fun中指定部位的错误, 使它能得出正确的结果。 
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构! 
给定源程序: 
#include <stdio.h> 
/**********found**********/ 
char fun(char *s, char *t) 
{ int sl=0,tl=0; char *ss, *tt; 
ss=s; tt=t; 
while(*ss) 
{ sl++; 
/**********found**********/ 
(*ss)++; 
} 
while(*tt) 
{ tl++; 
/**********found**********/ 
(*tt)++; 
} 
if(tl>sl) return t; 
else return s; 
} 
main() 
{ char a[80],b[80],*p,*q; int i; 
printf("\nEnter a string : "); gets(a); 
printf("\nEnter a string again : "); gets(b); 
printf("\nThe longer is :\n\n\"%s\"\n",fun(a,b)); 
} 
解题思路: 
第一处: 试题要求返回字符串的首地址,所以应改为:char *fun(char *s,char *t) 
第二处: 取字符串指针ss的下一个位置,所以应改为:ss++;。 
第三处:取字符串指针tt的下一个位置,所以应改为:tt++;。 
2.请编写函数fun,函数的功能是: 移动字符串中的内容,移动的规则如下: 把第 
1到第m个字符, 平移到字符串的最后, 把第m+1到最后的字符移到字符串的前部。 
例如, 字符串中原有的内容为: ABCDEFGHIJK, m的值为3, 则移动后, 字符串 
 中的内容应该是: DEFGHIJKABC。 
注意:部分源程序在文件PROG1.C中。 
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入 
你编写的若干语句。 
给定源程序: 
#include <stdio.h> 
#include <string.h> 
#define N 80 
void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */ 
{ 
int i; char t; 
t=w[0]; 
for(i=0;i<strlen(w)-1;i++) 
w[i]=w[i+1]; 
w[strlen(w)-1]=t; 
} 
void fun(char *w, int m) /* 可调用fun1函数左移字符 */ 
{ 
} 
main() 
{ char a[N]= "ABCDEFGHIJK"; 
int m; 
printf("The original string:\n");puts(a); 
printf("\n\nEnter m: ");scanf("%d",&m); 
fun(a,m); 
printf("\nThe string after moving:\n");puts(a); 
printf("\n\n"); 
NONO(); 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -