第26套:?
給定程序中已建立一個(gè)帶有頭結(jié)點(diǎn)的單向鏈表,鏈表中的各結(jié)點(diǎn)按數(shù)據(jù)域遞增有序鏈接。函數(shù)fun的功能是:刪除鏈表中數(shù)據(jù)域值相同的結(jié)點(diǎn),使之只保留一個(gè)。?
請(qǐng)?jiān)诔绦虻南聞澗€處填入正確的內(nèi)容并把下劃線刪除,使程序得出正確的結(jié)果。?
注意:源程序存放在考生文件夾下的BLANK1.C中。?
不得增行或刪行,也不得更改程序的結(jié)構(gòu)!?
給定源程序:?
#include?<stdio.h>?
#include?<stdlib.h>?
#define?N?8?
typedef?struct?list?
{?int?data;?
struct?list?*next;?
}?SLIST;?
void?fun(?SLIST?*h)?
{?SLIST?*p,?*q;?
p=h->next;?
if?(p!=NULL)?
{?q=p->next;?
while(q!=NULL)?
{?if?(p->data==q->data)?
{?p->next=q->next;?
/**********found**********/?
free(___1___);?
/**********found**********/?
q=p->___2___;?
}?
else?
{?p=q;?
/**********found**********/?
q=q->___3___;?
}?
}?
}?
}?
SLIST?*creatlist(int?*a)?
{?SLIST?*h,*p,*q;?int?i;?
h=p=(SLIST?*)malloc(sizeof(SLIST));?
for(i=0;?i<N;?i++)?
{?q=(SLIST?*)malloc(sizeof(SLIST));?
?
q->data=a[i];?p->next=q;?p=q;?
}?
p->next=0;?
return?h;?
}?
void?outlist(SLIST?*h)?
{?SLIST?*p;?
p=h->next;?
if?(p==NULL)?printf("\nThe?list?is?NULL!\n");?
else?
{?printf("\nHead");?
do?{?printf("->%d",p->data);?p=p->next;?}?while(p!=NULL);?
printf("->End\n");?
}?
}?
main(?)?
{?SLIST?*head;?int?a[N]={1,2,2,3,4,4,4,5};?
head=creatlist(a);?
printf("\nThe?list?before?deleting?:\n");?outlist(head);?
fun(head);?
printf("\nThe?list?after?deleting?:\n");?outlist(head);?
}?
解題思路:?
本題是考察考生對(duì)鏈表的操作,主要是解決刪除鏈表中數(shù)據(jù)域值相同的結(jié)點(diǎn)。程序中共有三處要填上適當(dāng)?shù)膬?nèi)容,使程序能運(yùn)行出正確的結(jié)果。?
函數(shù)fun中使用兩個(gè)臨時(shí)結(jié)構(gòu)指針變量p和q對(duì)鏈表進(jìn)行操作。首先p指向鏈表開始的next指針,q指向p的next指針,再利用while循環(huán)語(yǔ)句來(lái)判斷指針q是否NULL,如果q指針是指向NULL,那么函數(shù)結(jié)束返回。如果不是NULL,那么就要判斷p和q中data值是否相同,如果值相同,則要?jiǎng)h除該結(jié)點(diǎn),然后繼續(xù)判斷下一結(jié)點(diǎn)值是相同,如果還相同,那么繼續(xù)刪除結(jié)點(diǎn),直至不相同為止。如果兩個(gè)結(jié)點(diǎn)的值不相同,那么p就指向q,q指向q的next指針再繼續(xù)操作上述過(guò)程。?
刪除結(jié)點(diǎn)的方法是:先將p的next指針指向q的next指針,再釋放q指針指向的內(nèi)存,最后把q指針再指向p的next指針就可以刪除一個(gè)鏈表中的結(jié)點(diǎn)了。?
第一處:釋放q指針?biāo)傅膬?nèi)存空間,應(yīng)填q。?
第二處:q指針指向p的next指針,重新完成鏈接,應(yīng)填next。?
第三處:兩個(gè)結(jié)點(diǎn)的值不相同,那么q就指向q的next指針,應(yīng)填next。?
***************************************************?
給定程序MODI1.C中函數(shù)fun的功能是:用選擇法對(duì)數(shù)組中的n個(gè)元素按從小到大的順序進(jìn)行排序。?
請(qǐng)修改程序中的錯(cuò)誤,使它能得出正確的結(jié)果。?
注意:不要改動(dòng)main函數(shù),不得增行和刪行,也不得更改程序的結(jié)構(gòu)!?
給定源程序:?
#include?<stdio.h>?
#define?N?20?
void?fun(int?a[],?int?n)?
{?int?i,?j,?t,?p;?
for?(j?=?0?;j?<?n-1?;j++)?{?
/************found************/?
?
p?=?j?
for?(i?=?j;i?<?n;?i++)?
if(a[i]?<?a[p])?
/************found************/?
p?=?j;?
t?=?a[p]?;?a[p]?=?a[j]?;?a[j]?=?t;?
}?
}?
main()?
{?
int?a[N]={9,6,8,3,-1},i,?m?=?5;?
printf("排序前的數(shù)據(jù):")?;?
for(i?=?0;i?<?m;i++)?printf("%d?",a[i]);?printf("\n");?
fun(a,m);?
printf("排序后的數(shù)據(jù):")?;?
for(i?=?0;i?<?m;i++)?printf("%d?",a[i]);?printf("\n");?
}?
解題思路:?
第一處:語(yǔ)句后缺少分號(hào)。?
第二處:保存最小值的位置,所以應(yīng)改為:p?=?i;。?
***************************************************?
請(qǐng)編寫一個(gè)函數(shù)fun,它的功能是:求出1到m之間(含m)能被7或11整除的所有整數(shù)放在數(shù)組a中,通過(guò)n返回這些數(shù)的個(gè)數(shù)。例如,若傳送給m的值為50,則程序輸出:?
7?11?14?21?22?28?33?35?42?44?49?
注意:?部分源程序存在文件PROG1.C中。?
請(qǐng)勿改動(dòng)主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號(hào)中填入你編寫的若干語(yǔ)句。?
給定源程序:?
#include?<stdio.h>?
#define?M?100?
void?fun?(?int?m,?int?*a?,?int?*n?)?
{?
}?
main(?)?
{?int?aa[M],?n,?k;?
fun?(?50,?aa,?&n?);?
for?(?k?=?0;?k?<?n;?k++?)?
if((k+1)%20==0)?printf("\n");?
else?printf(?"%4d",?aa[k]?);?
printf("\n")?;?
NONO(?);?
}?
解題思路:?
本題是考察考生對(duì)某個(gè)數(shù)能被其他的數(shù)整除方式,并把符合條件的數(shù)存放在數(shù)組a中。?
我們給出的程序是使用for循環(huán)語(yǔ)句以及取模的方式來(lái)解決這個(gè)問(wèn)題的。?
參考答案:?
#include?<stdio.h>?
#define?M?100?
void?fun?(?int?m,?int?*a?,?int?*n?)?
{?
int?i?;?
*n=0?;?
for(i=7?;?i<=m;?i++)?
if((i?%?7?==?0)?||?(i?%?11?==?0))?a[(*n)++]=i?;?
}?
※※※※※※※※※※※※※※※※※※※※※※※※※?
第27套:?
給定程序中,函數(shù)fun的功能是:計(jì)算下式前n項(xiàng)的和作為函數(shù)值返回。?
例如,當(dāng)形參n的值為10時(shí),函數(shù)返回:9.612558。?
請(qǐng)?jiān)诔绦虻南聞澗€處填入正確的內(nèi)容并把下劃線刪除,使程序得出正確的結(jié)果。?
注意:源程序存放在考生文件夾下的BLANK1.C中。?
不得增行或刪行,也不得更改程序的結(jié)構(gòu)!?
給定源程序:?
#include?<stdio.h>?
double?fun(int?n)?
{?int?i;?double?s,?t;?
/**********found**********/?
s=__1__;?
/**********found**********/?
for(i=1;?i<=__2__;?i++)?
{?t=2.0*i;?
/**********found**********/?
s=s+(2.0*i-1)*(2.0*i+1)/__3__;?
}?
return?s;?
}?
main()?
{?int?n=-1;?
while(n<0)?
{?printf("Please?input(n>0):?");?scanf("%d",&n);?}?
printf("\nThe?result?is:?%f\n",fun(n));?
}?
解題思路:?
第一處:根據(jù)公式可知,累加和變量s,應(yīng)置0。?
第二處:for循環(huán)的終止值應(yīng)為形參n。?
第三處:根據(jù)公式以及函數(shù)體中t變量?jī)?nèi)容,所以應(yīng)填:t*t。?
***************************************************?
給定程序MODI1.C中函數(shù)?fun?的功能是:統(tǒng)計(jì)substr所指子字符串在str所指字符串中出現(xiàn)的次數(shù)。?
例如,若字符串為aaas?lkaaas,子字符串為as,則應(yīng)輸出2。?
請(qǐng)改正程序中的錯(cuò)誤,使它能計(jì)算出正確的結(jié)果。?
注意:不要改動(dòng)main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!?
給定源程序:?
#include?<stdio.h>?
?
fun?(char?*str,char?*substr)?
{?int?i,j,k,num=0;?
/************found************/?
for(i?=?0,?str[i],?i++)?
for(j=i,k=0;substr[k]==str[j];k++,j++)?
/************found************/?
If(substr[k+1]=='\0')?
{?num++;?
break;?
}?
return?num;?
}?
main()?
{?
char?str[80],substr[80];?
printf("Input?a?string:")?;?
gets(str);?
printf("Input?a?substring:")?;?
gets(substr);?
printf("%d\n",fun(str,substr));?
}?
解題思路:?
第一處:循環(huán)for語(yǔ)句中應(yīng)有分號(hào)。?
第二處:if錯(cuò)寫成If。?
***************************************************?
請(qǐng)編寫一個(gè)函數(shù)fun,它的功能是:根據(jù)以下公式求π的值(要求滿足精度0.0005,?即某項(xiàng)小于0.0005時(shí)停止迭代):?
π?1?1×2?1×2×3?1×2×3×4?1×2×…×n?
─?=?1+─+─—+────+──────+……+────────?
2?3?3×5?3×5×7?3×5×7×9?3×5×…×(2n+1)?
程序運(yùn)行后,如果輸入精度0.0005,則程序輸出為3.14…。?
注意:?部分源程序存在文件PROG1.C文件中。?
請(qǐng)勿改動(dòng)主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號(hào)中填入你編寫的若干語(yǔ)句。?
給定源程序:?
#include?<stdio.h>?
#include?<math.h>?
double?fun?(?double?eps)?
{?
}?
main(?)?
{?double?x;?
printf("Input?eps:")?;?
scanf("%lf",&x);?printf("\neps?=?%lf,?PI=%lf\n",?x,?fun(x));?
NONO();?
}?
解題思路:?
本題是根據(jù)公式進(jìn)行計(jì)算。?
參考答案:?
double?fun?(?double?eps)?
{?
double?s=1,t=1./3;?
int?n=1;?
while(t>=eps){?s+=t;?n++;?t=t*n/(2.0*n+1);?}?
return?(s*2.0);?
}?
main(?)?
{?double?x;?
printf("Input?eps:")?;?
scanf("%lf",&x);?printf("\neps?=?%lf,?PI=%lf\n",?x,?fun(x));?
NONO();?
}?
※※※※※※※※※※※※※※※※※※※※※※※※※?
第28套:?
?
給定程序中,函數(shù)fun的功能是:統(tǒng)計(jì)形參s所指字符串中數(shù)字字符出現(xiàn)的次數(shù),并存放在形參t所指的變量中,最后在主函數(shù)中輸出。例如,形參s所指的字符串為:abcdef35adgh3kjsdf7。輸出結(jié)果為:4。?
請(qǐng)?jiān)诔绦虻南聞澗€處填入正確的內(nèi)容并把下劃線刪除,使程序得出正確的結(jié)果。?
注意:源程序存放在考生文件夾下的BLANK1.C中。?
不得增行或刪行,也不得更改程序的結(jié)構(gòu)!?
給定源程序:?
#include?<stdio.h>?
void?fun(char?*s,?int?*t)?
{?int?i,?n;?
n=0;?
/**********found**********/?
for(i=0;?___1___?!=NULL;?i++)?
/**********found**********/?
if(s[i]>='0'&&s[i]<=?___2___?)?n++;?
/**********found**********/?
___3___?;?
}?
main()?
{?char?s[80]="abcdef35adgh3kjsdf7";?
int?t;?
printf("\nThe?original?string?is?:?%s\n",s);?
fun(s,&t);?
printf("\nThe?result?is?:?%d\n",t);?
}?
解題思路:?
第一處:在for循環(huán)中終止值要判斷字符串是否結(jié)束符,所以應(yīng)填:s[i]。?
第二處:判斷是否是數(shù)字,所以應(yīng)填:'9'。?
第三處:字符串中數(shù)字字符出現(xiàn)的次數(shù)n,并存放在形參t所指的變量中,所以應(yīng)填:*t=n。?
***************************************************?
給定程序MODI1.C中函數(shù)fun的功能是:通過(guò)某種方式實(shí)現(xiàn)兩個(gè)變量值的交換,規(guī)定不允許增加語(yǔ)句和表達(dá)式。例如變量a?中的值原為8,b中的值原為3,?程序運(yùn)行后?a?中的值為?3,b中的值為8。?
請(qǐng)改正程序中的錯(cuò)誤,使它能得出正確的結(jié)果。?
注意:?不要改動(dòng)?main?函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!?
給定源程序:?
#include?<stdio.h>?
int?fun(int?*x,int?y)?
{?
int?t?;?
/**************found**************/?
t?=?x?;?x?=?y?;?
/**************found**************/?
return(y)?;?
}?
main()?
?
{?
int?a?=?3,?b?=?8?;?
printf("%d?%d\n",?a,?b)?;?
b?=?fun(&a,?b)?;?
printf("%d?%d\n",?a,?b)?;?
}?
解題思路:?
第一處:由于x是整型指針變量,所以地址不能賦值給整型變量,因此必須取x地址上的值,所以應(yīng)改為t=*x;*x=y;。?
第二處:已交換后的值存放在t中,所以返回值應(yīng)為return(t);。?
***************************************************?
請(qǐng)編寫函數(shù)fun,它的功能是:?求出?1?到?1000?之間能被?7?或11整除、但不能同時(shí)被?7?和?11?整除的所有整數(shù)并將它們放在a所指的數(shù)組中,通過(guò)?n?返回這些數(shù)的個(gè)數(shù)。?
注意:?部分源程序在文件PROG1.C中。?
請(qǐng)勿改動(dòng)主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號(hào)中填入你編寫的若干語(yǔ)句。?
給定源程序:?
#include?<stdio.h>?
void?fun?(int?*a,?int?*n)?
{?
}?
main(?)?
{?int?aa[1000],?n,?k?;?
fun?(?aa,?&n?)?;?
for?(?k?=?0?;?k?<?n?;?k++?)?
if((k?+?1)?%?10?==?0)?printf("\n")?;?
else?printf("%5d",?aa[k])?;?
NONO(?);?
}?
解題思路:?
本題是利用for循環(huán)語(yǔ)句以及取模%運(yùn)算來(lái)得出符合條件的整數(shù)并存入a所指的數(shù)組。?
參考答案:?
void?fun?(int?*a,?int?*n)?
{?
?
int?i?;?
*n?=?0?;?
for(i?=?7?;?i?<?1000?;?i++)?
if(((i?%?7)?==?0?||?(i?%?11)?==?0)?&&?(i?%?77)?!=?0)?a[(*n)++]?=?i?;?
}?
※※※※※※※※※※※※※※※※※※※※※※※※※?
第29套:?
程序通過(guò)定義學(xué)生結(jié)構(gòu)體變量,存儲(chǔ)了學(xué)生的學(xué)號(hào)、姓名和3門課的成績(jī)。函數(shù)fun的功能是對(duì)形參b所指結(jié)構(gòu)體變量中的數(shù)據(jù)進(jìn)行修改,最后在主函數(shù)中輸出修改后的數(shù)據(jù)。?
例如:?b所指變量t中的學(xué)號(hào)、姓名、和三門課的成績(jī)依次是:?10002、"ZhangQi"、93、85、87,修改后輸出t中的數(shù)據(jù)應(yīng)為:10004、"?LiJie?"、93、85、87。?
請(qǐng)?jiān)诔绦虻南聞澗€處填入正確的內(nèi)容并把下劃線刪除,?使程序得出正確的結(jié)果。?
注意:源程序存放在考生文件夾下的BLANK1.C中。?
不得增行或刪行,也不得更改程序的結(jié)構(gòu)!?
給定源程序:?
#include?<stdio.h>?
#include?<string.h>?
struct?student?{?
long?sno;?
char?name[10];?
float?score[3];?
};?
void?fun(?struct?student?*b)?
{?int?i;?
/**********found**********/?
?
b__1__?=?10004;?
/**********found**********/?
strcpy(b__2__,?"LiJie");?
}?
main()?
{?struct?student?t={10002,"ZhangQi",?93,?85,?87};?
int?i;?
printf("\n\nThe?original?data?:\n");?
printf("\nNo:?%ld?Name:?%s\nScores:?",t.sno,?t.name);?
for?(i=0;?i<3;?i++)?printf("%6.2f?",?t.score[i]);?
printf("\n");?
/**********found**********/?
fun(__3__);?
printf("\nThe?data?after?modified?:\n");?
printf("\nNo:?%ld?Name:?%s\nScores:?",t.sno,?t.name);?
for?(i=0;?i<3;?i++)?printf("%6.2f?",?t.score[i]);?
printf("\n");?
}?
解題思路:?
本題是對(duì)結(jié)構(gòu)體變量中的值進(jìn)行修改并通過(guò)函數(shù)中的參數(shù)進(jìn)行返回。?
第一處:對(duì)學(xué)號(hào)進(jìn)行更改,所以應(yīng)填:->no。?
第二處:對(duì)姓名進(jìn)行更改,所以應(yīng)填:->name。?
第三處:對(duì)函數(shù)的調(diào)用,所以應(yīng)填:&t。?
***************************************************?
給定程序MODI1.C中函數(shù)fun的功能是:應(yīng)用遞歸算法求形參a的平方根。求平方根的迭代公式如下:?
1?a?
x1?=?─?(?x0?+?─?)?
2?x0?
例如,a為2時(shí),平方根值為:1.414214。?
請(qǐng)改正程序中的錯(cuò)誤,使它能得出正確結(jié)果。?
注意:不要改動(dòng)main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)。?
給定源程序:?
#include?<stdio.h>?
#include?<math.h>?
/**********found**********/?
double?fun(double?a,?dounle?x0)?
{?double?x1,?y;?
x1=(x0+?a/x0)/2.0;?
/**********found**********/?
if(?fabs(x1-xo)>0.00001?)?
\TAB?y=fun(a,x1);?
else?y=x1;?
return?y;?
}?
main(?)?
{?double?x;?
?
printf("Enter?x:?");?scanf("%lf",&x);?
printf("The?square?root?of?%lf?is?%lf\n",x,fun(x,1.0));?
}?
解題思路:?
第一處:?第二個(gè)變量定義的保留字double寫錯(cuò)。?
第二處:?變量x0錯(cuò)寫成xo了。?
***************************************************?
學(xué)生的記錄由學(xué)號(hào)和成績(jī)組成,N名學(xué)生的數(shù)據(jù)已在主函數(shù)中放入結(jié)構(gòu)體數(shù)組s中,?請(qǐng)編寫函數(shù)fun,它的功能是:把高于等于平均分的學(xué)生數(shù)據(jù)放在b所指的數(shù)組中,高于等于平均分的學(xué)生人數(shù)通過(guò)形參n傳回,平均分通過(guò)函數(shù)值返回。?
注意:?部分源程序在文件PROG1.C文件中。?
請(qǐng)勿改動(dòng)主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號(hào)中填入你編寫的若干語(yǔ)句。?
給定源程序:?
#include?<stdio.h>?
#define?N?12?
typedef?struct?
{?char?num[10];?
double?s;?
}?STREC;?
double?fun(?STREC?*a,?STREC?*b,?int?*n?)?
{?
}?
main()?
{?STREC?s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},?
\TAB?\TAB?{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},?
\TAB?\TAB?{"GA09",60},{"GA11",79},{"GA12",73},{"GA10",90}};?
STREC?h[N],?t;FILE?*out?;?
int?i,j,n;?double?ave;?
ave=fun(?s,h,&n?);?
printf("The?%d?student?data?which?is?higher?than?%7.3f:\n",n,ave);?
for(i=0;i<n;?i++)?
printf("%s?%4.1f\n",h[i].num,h[i].s);?
printf("\n");?
out?=?fopen("c:\\test\\out.dat","w")?;?
fprintf(out,?"%d\n%7.3f\n",?n,?ave);?
for(i=0;i<n-1;i++)?
for(j=i+1;j<n;j++)?
if(h[i].s<h[j].s)?{t=h[i]?;h[i]=h[j];?h[j]=t;}?
for(i=0;i<n;?i++)?
fprintf(out,"%4.1f\n",h[i].s);?
fclose(out);?
}?
解題思路:?
本題是計(jì)算平均分并把高于平均分的記錄存入結(jié)構(gòu)體數(shù)組中,最后平均分t通過(guò)函數(shù)值返回,人數(shù)n和符合條件的記錄b由形參傳回。?
1.?利用for循環(huán)計(jì)算平均分t。
?
2.?利用for循環(huán)把高于平均分的學(xué)生記錄存入b中,人數(shù)*n加1。?
參考答案:?
double?fun(?STREC?*a,?STREC?*b,?int?*n?)?
{?
double?t=0?;?
int?i?;?
*n?=?0?;?
for(i?=?0?;?i?<?N?;?i++)?t?=?t?+?a[i].s?;?
t?=?t?/?N?;?
for(i?=?0?;?i?<?N?;?i++)?if(a[i].s?>?t)?b[(*n)++]?=?a[i]?;?
return?t?;?
}?
※※※※※※※※※※※※※※※※※※※※※※※※※?