第38套:?
函數fun的功能是:把形參a所指數組中的奇數按原順序依次存放到a[0]、a[1]、a[2]、……中,把偶數從數組中刪除,奇數個數通過函數值返回。例如:若a所指數組中的數據最初排列為:9、1、4、2、3、6、5、8、7,刪除偶數后a?所指數組中的數據為:9、1、3、5、7,返回值為5。?
請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結果。?
注意:源程序存放在考生文件夾下的BLANK1.C中。?
不得增行或刪行,也不得更改程序的結構!?
給定源程序:?
#include?<stdio.h>?
#define?N?9?
int?fun(int?a[],?int?n)?
{?int?i,j;?
j?=?0;?
for?(i=0;?i<n;?i++)?
/**********found**********/?
if?(a[i]%2==___1___)?
{?
/**********found**********/?
a[j]?=?a[i];?___2___;?
}?
/**********found**********/?
return?___3___;?
}?
main()?
{?int?b[N]={9,1,4,2,3,6,5,8,7},?i,?n;?
printf("\nThe?original?data?:\n");?
for?(i=0;?i<N;?i++)?printf("%4d?",?b[i]);?
printf("\n");?
n?=?fun(b,?N);?
printf("\nThe?number?of?odd?:?%d?\n",?n);?
printf("\nThe?odd?number?:\n");?
for?(i=0;?i<n;?i++)?printf("%4d?",?b[i]);?
printf("\n");?
}?
解題思路:?
第一處:判斷a[i]是否是奇數,若是,則仍保留在原數組中a[j],所以應填:1。?
第二處:數組a中的元素位置由j來控制,每增加一個元素,則j加1,所以應填:j++。?
第三處:返回刪除偶數后a所指數組中數據的元素j,所以應填:j。?
***************************************************?
給定程序MODI1.C中函數fun的功能是:求出兩個非零正整數的最大公約數,并作為函數值返回。?例如,若給num1和num2分別輸入49和21,則輸出的最大公約數為7;若給num1和num2分別輸入27和81,則輸出的最大公約數為27。?
請改正程序中的錯誤,使它能得出正確結果。?
注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。?
給定源程序:?
#include?<stdio.h>?
int?fun(int?a,int?b)?
{?int?r,t;?
if(a<b)?{?
/************found************/?
t=a;?b=a;?a=t;?
}?
r=a%b;?
while(r!=0)?
{?a=b;?b=r;?r=a%b;?}?
/************found************/?
return(a);?
}?
main()?
{?int?num1,?num2,a;?
printf("Input?num1?num2:?");?scanf("%d%d",&num1,&num2);?
printf("num1=?%d?num2=?%d\n\n",num1,num2);?
a=fun(num1,num2);?
printf("The?maximun?common?divisor?is?%d\n\n",a);?
}?
解題思路:?
第一處:交換值的次序有問題,所以應改為:t=a;a=b;b=t;。?
第二處:返回值錯誤,應改為:return(b);。?
***************************************************?
假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:刪除字符串中所有的*號。在編寫函數時,不得使用C語言提供的字符串函數。?
例如,字符串中的內容為:****A*BC*DEF*G*******,刪除后,字符串中的內容應當是:ABCDEFG。?
注意:?部分源程序在文件PROG1.C中。?
請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的若干語句。?
給定源程序:?
#include?<stdio.h>?
void?fun(?char?*a?)?
{?
}?
main()?
{?char?s[81];?
printf("Enter?a?string:\n");gets(s);?
fun(?s?);?
printf("The?string?after?deleted:\n");puts(s);?
NONO();?
}?
解題思路:?
本題是考察字符串的操作。?
1.?利用循環(huán)掃描字符串中所有的字符是否是'*',如果不是'*',則把這些字符存放字符串a首地址開始的位置上。?
2.?最后給字符串a加上結束符。?
參考答案:?
void?fun(?char?*a?)?
{?
int?j?=0?;?
char?*p=a;?
while(*p)?{?
if(*p?!=?'*')?a[j++]=*p?;?
p++?;?
}?
a[j]=0;?
}?
※※※※※※※※※※※※※※※※※※※※※※※※※?
第39套:?
給定程序中,函數fun的功能是:在形參ss所指字符串數組中,刪除所有串長超過k的字符串,函數返回所剩字符串的個數。ss所指字符串數組中共有N個字符串,且串長小于M。?
請在程序的下劃線處填入正確的內容并把下劃線刪除,?使程序得出正確的結果。?
注意:源程序存放在考生文件夾下的BLANK1.C中。?
不得增行或刪行,也不得更改程序的結構!?
給定源程序:?
#include?<stdio.h>?
#include?<string.h>?
#define?N?5?
#define?M?10?
int?fun(char?(*ss)[M],?int?k)?
{?int?i,j=0,len;?
/**********found**********/?
for(i=0;?i<?__1__?;?i++)?
{?len=strlen(ss[i]);?
/**********found**********/?
if(len<=?__2__)?
/**********found**********/?
strcpy(ss[j++],__3__);?
}?
return?j;?
}?
main()?
{?char?x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"};?
int?i,f;?
printf("\nThe?original?string\n\n");?
for(i=0;i<N;i++)puts(x[i]);?printf("\n");?
f=fun(x,7);?
printf("The?string?witch?length?is?less?than?or?equal?to?7?:\n");?
for(i=0;?i<f;?i++)?puts(x[i]);printf("\n");?
}?
解題思路:?
本題是根據給定的字符串數組中刪除串長大于某個值的字符串。?
第一處:利用for循環(huán),從幾個字符串中進行查找,程序中已經給定了N個字符串,所以應填:N。?
第二處:串長由形參k來傳遞,所以應填:k。?
第三處:如果字符串ss[i]的串長小于k,則該字符串仍存在原字符串數組中,位置由變量j?來控制,所以應填:ss[i]。?
?
***************************************************?
給定程序MODI1.C中函數fun的功能是:逐個比較p、q所指兩個字符串對應位置中的字符,把ASCII值大或相等的字符依次存放到c所指數組中,形成一個新的字符串。?
例如,若主函數中a字符串為:aBCDeFgH,?
主函數中b字符串為:ABcd,?
則c中的字符串應為:aBcdeFgH。?
請改正程序中的錯誤,使它能得出正確結果。?
注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。?
給定源程序:?
#include?<stdio.h>?
#include?<string.h>?
void?fun(char?*p?,char?*q,?char?*c)?
{?
/************found************/?
int?k?=?1;?
/************found************/?
while(?*p?!=?*q?)?
{?if(?*p<*q?)?c[k]=*q;?
else?c[k]=*p;?
if(*p)?p++;?
if(*q)?q++;?
k++;?
}?
}?
main()?
{?char?a[10]="aBCDeFgH",?b[10]="ABcd",?c[80]={'\0'};?
fun(a,b,c);?
printf("The?string?a:?");?puts(a);?
printf("The?string?b:?");?puts(b);?
printf("The?result?:?");?puts(c);?
}?
解題思路:?
第一處:?存放字符串初始位置也是從0開始存放的,由于k是控制c字符串的位置值,所以k應為0。?
第二處:?判斷兩個字符串中是否有字符串結束符產生,所以應改為:while(?*p?||?*q?),而不是兩字符串中對應位置的值不相等。?
***************************************************?
假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:除了字符串前導的*號之外,將串中其它*號全部刪除。在編寫函數時,不得使用C語言提供的字符串函數。函數fun中給出的語句僅供參考。?
例如,字符串中的內容為:****A*BC*DEF*G*******,刪除后,?字符串中的內容應當是:****ABCDEFG。?
注意:?部分源程序在文件PROG1.C文件中。?
請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的若干語句。?
給定源程序:?
#include?<stdio.h>?
void?fun(?char?*a?)?
{?
/*?以下代碼僅供參考?*/?
int?i=0,k;?
while(a[i]=='*')?i++;?
k=i+1;?
while(a[i]!='\0')?/*?以下程序段實現非*字符前移?*/?
{?
}?
a[i+1]='\0';?
}?
main()?
{?char?s[81];?
printf("Enter?a?string:\n");gets(s);?
fun(?s?);?
printf("The?string?after?deleted:\n");puts(s);?
NONO();?
}?
解題思路:?
本題是考察字符串的操作。?
1.?使用while循環(huán)語句求出字符串前導*號的個數。?
2.?使用while循環(huán)語句判斷a[i]是否是字符串結束符標志,如果不是字符串結束標志,則再判斷是否是字符*號,如果不是*號,則把a[i]字符存入a[k]中,如果是*號則跳過該*號,直至字符串結束為止。?
參考答案:?
void?fun(?char?*a?)?
{?
/*?以下代碼僅供參考?*/?
int?i=0,k;?
while(a[i]=='*')?i++;?
k=i;?
?
while(a[i]!='\0')?/*?以下程序段實現非*字符前移?*/?
{?
if(a[i]?!=?'*')?a[k++]=a[i];?
i++;?
}?
a[k]='\0';?
}?
※※※※※※※※※※※※※※※※※※※※※※※※※?
第40套:?
給定程序中已建立一個帶有頭結點的單向鏈表,鏈表中的各結點按結點數據域中的數據遞增有序鏈接。函數fun的功能是:把形參x的值放入一個新結點并插入到鏈表中,插入后各結點數據域的值仍保持遞增有序。?
請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結果。?
注意:源程序存放在考生文件夾下的BLANK1.C中。?
不得增行或刪行,也不得更改程序的結構!?
給定源程序:?
#include?<stdio.h>?
#include?<stdlib.h>?
#define?N?8?
typedef?struct?list?
{?int?data;?
struct?list?*next;?
}?SLIST;?
void?fun(?SLIST?*h,?int?x)?
{?SLIST?*p,?*q,?*s;?
?
s=(SLIST?*)malloc(sizeof(SLIST));?
/**********found**********/?
s->data=___1___;?
q=h;?
p=h->next;?
while(p!=NULL?&&?x>p->data)?{?
/**********found**********/?
q=___2___;?
p=p->next;?
}?
s->next=p;?
/**********found**********/?
q->next=___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?x;?
int?a[N]={11,12,15,18,19,22,25,29};?
head=creatlist(a);?
printf("\nThe?list?before?inserting:\n");?outlist(head);?
printf("\nEnter?a?number?:?");?scanf("%d",&x);?
fun(head,x);?
printf("\nThe?list?after?inserting:\n");?outlist(head);?
}?
解題思路:?
本題是要求在一個有序的鏈表中插入一個數,插入后各結點仍然是有序的。程序中共有三處要填上適當的內容,使程序能運行出正確的結果。?
第一處:在函數fun的開始處,已經對結構指針s分配了內存,其中data是一個整型變量,實際要求填入一個整型數據。根據本題要求在一個鏈表插入一個整型數,該數已通過函數的形參x傳入,因此應填x。?
第二處:使用一個while循環(huán)找出要插入一個數的位置,在循環(huán)體中q實際上保留當前鏈表p?位置的臨時變量,如果x>p->data時,那么再移動鏈表指針到下一個結果,再進行判斷是否符合條件,如果仍大于,則仍q保留鏈表p的位置。因此,此處應填p。?
第三處:當找到結點位置后,就要插入這個數,完成插入過程。由于函數體中分配了結構指針s,s的next指針已經指向了p,所以,當前位置q的next指針就應該指向指針s完成鏈表的鏈接。因此,此處應填s。?
***************************************************?
給定程序MODI1.C中函數fun的功能是:計算正整數num的各位上的數字之積。?
例如,若輸入:252,則輸出應該是:20。若輸入:202,則輸出應該是:0。?
請改正程序中的錯誤,使它能得出正確的結果。?
注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構!?
給定源程序:?
#include?<stdio.h>?
long?fun?(long?num)?
{?
/************found************/?
long?k;?
do?
{?k*=num%10?;?
/************found************/?
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。?
第二處:整除的符號是/。?
***************************************************?
請編寫一個函數fun,它的功能是:計算n門課程的平均分,計算結果作為函數值返回。?
例如:若有5門課程的成績是:90.5,?72,?80,?61.5,?55?
則函數的值為:71.80。?
注意:?部分源程序存在文件PROG1.C中。?
請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的若干語句。?
給定源程序:?
#include?<stdio.h>?
float?fun?(?float?*a?,?int?n?)?
{?
}?
?
main()?
{?float?score[30]={90.5,?72,?80,?61.5,?55},?aver;?
aver?=?fun(?score,?5?);?
printf(?"\nAverage?score?is:?%5.2f\n",?aver);?
NONO?(?);?
}?
解題思路:?
本題是使用循環(huán)來計算平均值且結果由函數值返回。?
參考答案:?
float?fun?(?float?*a?,?int?n?)?
{?
int?i;?
float?ave=0.0;?
for(i=0;?i<n;?i++)?ave=ave+a[i]?;?
ave=ave/n;?
return?ave;?
}?
※※※※※※※※※※※※※※※※※※※※※※※※※?