?? 2010-
字號:
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 + -