編程部分程序設計(一)_第1頁
編程部分程序設計(一)_第2頁
編程部分程序設計(一)_第3頁
編程部分程序設計(一)_第4頁
編程部分程序設計(一)_第5頁
已閱讀5頁,還剩122頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

三、編寫程序。

1、請編寫函數fun,函數的功能是:將M行N列的二維數組中的數據,按列的順序依次放到

一維數組中。

例如,二維數組中的數據為:

33333333

44444444

55555555

則一維數組中的內容應是:

334455334455334455334455,

注意:部分源程序在文件PR0G1.C中。

請勿改動主函數main和其他函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

根據題目要求和對程序的分析可知:函數fun的形參中,(*s)[10]存儲的是M行N列二

維數組中的數據,*b存儲的是本函數的運行結果,*n存儲的是本函數的運行結果(…維數

組)的起始索引,mm存儲的是陰亍?^列的二維數組的行數,nn存儲的是M行N列的二維數組的

列數;

因此,要實現“將M行N列的二維數組中的數據,按列的順序依次放到一維數組中”,只

要用兩層循環(其中外層循環控制二維數組的列,內層循環控制二維數組的行,來保證按

列的順序存儲)按列的順序依次讀出(*s)[10]數組中的各元素,賦值給b[*n](其中*n

要依次進行自增運算)即可;

本題參考程序段如下:

voidfundnt(^s)[10],int*b,int*n,intmm,intnn)

{inti,j;

for(j=O;j〈rm;j++)

for(i=0;i<mm;i++)

{b[*n]==*(*(s+i)+j);

*n=*n+l;}

}

^include<stdio.h>

voidfun(int(*s)[10],int*b,int*n,intmm,intnn)

{inti,j;

for(j=0;j<nn;j++)

for(i=0;i<mm;i++)

{b[*n]=*(*(s+i)+j);

*n=*n+1;}

)

main()

{intw[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;

inta[100]={0},n=0;

printf(^Thematrix:\n");

for(i=0;i<3;i++)

{for(j=0;j<4;j++)printf(*%3d*,w[i][j]);

printf(〃\n");

)

fun(w,a,&n,3,4);

printf("TheAarray:\n");

for(i=0;i<n;i++)printf("%3d",a[i]);printf("\n\n");

N0N0();

)

N0N0()

{/*請在此函數內打開文件,輸入測試數據,調用fun函數,輸出數據,關閉文件。*/

FILE*rf,*wf;inti,j,k;

intw[10]E10],a[100],n=0,mm,nn;

rf=fopen(be.in,r);

wf=fopen("bc.out","w");

for(k=0;k<5;k++){

fsceinf(rf,"%d%d”,&mm,&nn);

for(i=0;i<mm:i++)

for(j=0;j<nn:j++)fscanf(rf,"%d”,&w[i][j]);

fun(w,a,&n,nun,nn);

for(i=0;i<n;i++)fprintf(wf,"%3d”,a[i]);fprintf(wf,"\n");

)

fclose(rf);fclose(wf);

)

2、假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:除了字符串前

導和尾部的*號之外,招串中其他*號全部刪除。形參h已指向字符串中第一個字母,形

參P已指向字符串中最后一個字母。在編寫函數時,不得使用C語言提供的字符串函數。

例如,字符串中的內容為:****A*BC*DEF*G********,刪除后,字符串中的內容應當是:

****ABCDEFG********。在編寫函數時,不得使用C語言提供的字符串函數。

注意:部分源程序在文件PROGLC文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

解本題可分以下三個步驟進行:

①由于“形參h已指向字符串中第一個字母”,因此可先用while循環將該字符串的前導*

(第?個字母之前的所有*)復制到數組a口中;

②又由于“形參P已指向字符串中最后一個字母“,所以可以用while循環判斷字符串第一

個字母至最后一個字母之間(包括第一個字母和最后一個字母)的字符是否為“*”:若不是

“*”,就將其復制到數組a口中;若是“*”,就什么也不做;

③將字符串尾部的*號復制到數組a口中;

最后在數組a[]的末尾加上,(T即可;

注意:以上過程中要用變量控制數組2口中各元素索引的變化;

本題參考程序段如下:

voidfun(char*a,char*h,char*p)

{inti=0;char*q=a;

while(q<h)

{a[i]=*q;

Q++;

i++;}

while(q<=p)

{a[i]=*q;

i++;

)

q++;

}

while(*q)

{a[i]=*q;

i++;

q++;

}

a[i]=\Of;

)

ttinclude<stdio.h>

#include<conio.h>

voidfun(char*a,char*h,char*p)

main()

{chars[81],*t,*f;

printf("Enterastring:\nz,);gets(s);

t=f=s;

while(*t)t++;

t—;

while(*t==,*')t一;

while(*f==,*')f++;

fun(s,f,t);

printf(,zThestringafterdeleted:\n〃);puts(s);

NONO();

)

NONOO

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*in,*out;

inti;chars[81],*t,*f;

in=fopen(〃in5.dat〃,〃r〃);

out=fopen(,zout5.dat,z,〃w〃);

for(i=0;i<10;i++){

fscanf(in,〃%s〃,s);

t=f=s;

while(*t)t++;

while(*t=='*')t一;

while(*f=='*')f++;

fun(s,f,t);

fprintf(out,繪s\n”,s);

)

fclose(in);

fclose(out);

)

3、假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:將字符串中

的前導*號全部移到字符串的尾部。

例如,字符串中的內容為:*******A*BC*DEF*G****,移動后,字符串中的內容應當是:

A*BC*DEF*G***********。在編寫函數時,不得使用C語言提供的字符串函數。

注意:部分源程序在文件PROG1.C文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

解本題可分以下三個步驟進行:

①用一字符指針P指向字符串*a的起始位置;然后用while循環計數該字符串中的前導

*個數存儲在變量n中,并使字符指針p指向字符串的第一個字母;

②用while循環將字符串中第一個字母至最后一個字符之間(包括邊界值)的所有字符

都前移n個位置;

③在字符串*a的尾部加上n個*號;

最后在字符串*a的末尾加上\0'即可;

本題參考程序段如下:

voidfun(char*a)

{inti=0,n=0;

char*p;

P=a;

while(*p==,*')

{n++;p++;}

while(*p)

{a[i]=*p;

i++;

p++;

}

while(n!=0)

i++;

n—;}

a[i]='\O';

Sinclude<stdio.h>

ttinclude<conio.h>

voidfun(char*a)

)

main()

{chars[81],*p;intn=0;

printf("Enterastring:\n");gets(s);

fun(s);

printf("Thestringaftermoveing:\n");puts(s);

NONOO;

)

NONOO

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*in,*out;

inti;chars[81];

in=fopen("inl0.dat","r");

out=fopen("outlO.dat","w");

for(i=0;i<10:i++){

fscanf(in,"%s”,s);

fun(s);

fprintf(out,"%s\n",s);

)

fclose(in);

fclose(out);

)

4、學生的記錄由學號和成績組成,N名學生的數據已在主函數中放入結構體數組s中,

請編寫函數fun,它的功能是:把指定分數范圍內的學生數據放在b所指的數組中,分數范

圍內的學生人數由函數值返回。

例如,輸入的分數是6069,則應當把分數在60到69的學生數據進行輸出,包含60

分和69分的學生數據。主函數中將把60放在low中,把69放在heigh中。

注意:部分源程序在文件PROGl.C文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

fun函數中,形參結構體數組@口中存儲的是N名學生的原始數據,函數運行結束后指

定分數范圍內的學生數據將放在b所指的數組中,int型變量1、h分別保存的是分數范圍

的較小值、較大值;

因此,要實現本題的要求,可在fun函數中用for循環依次判斷結構體數組a口中各元

索的分數域是否大于等于變量1且小于等于變量h,若滿足要求,就將該元素添加到數組

b[]中,并將計數變量j的值加1;若不滿足,則什么也不做,在最后返回計數變量j。

參考程序段如下:

intfun(STREC*a,STREC*b,int1,inth)

{inti,j=0;

for(i=0;i<N;i++)

if(a[i].s>=l&&a[i].s<=h)

{b[j]=a[i];

J++;

returnj;

}

ftinclude<stdio.h>

^defineN16

typedefstruct

{charnum[10];

ints;

}STREC;

intfun(STREC*a,STREC*b,int1,inth)

main()

{STRECs[N]={{"GA005”,85},{"GA003”,76},{"GA002”,69},{"GA004〃,85),

{“GA001〃,96},{"GA007”,72},{"GA008”,64},{"GA006〃,87},

{"GA015”,85},{"GA013”,94},{"GA012”,64},{"GA014”,91},

{〃GA011”,90},{"GA017〃,64},{〃GA018〃,64},{〃GA016〃,72}};

STREChLN],tt;FILE*out;

inti,j,n,low,heigh,t;

printf("Enter2integernumberlow&heigh:");

scanf("%d%d”,&low,&heigh);

if(heigh<low){t=heigh;heigh=low;low=t;}

n=fun(s,h,low,heigh);

printf("Thestudent'sdatabetween%d--%dAn",low,heigh);

for(i=0;i<n;i++)

printf("%s%4d\n”,h[i].num,h[i].s);

printfC\n");

out=fopen("outl8.dat","w");

n=fun(s,h,80,98);

fprintf(out,"%d\n",n);

for(i=0;i<n-l;i++)

for(j=i+l;j<n;j++)

if(h[i].s>h[j].s){tt=h[i];h[i]=h[j];h[j]=tt;}

for(i=0;i<n;i++)

fprintf(out,"%4d\n”,h[i].s);

fprintf(out,"\n");

fclose(out);

)

5、程序定義了NXN的二維數組,并在主函數中自動賦值。請編寫函數fun,函數的功能

是:使數組右上三角元素中的值乘以mo例如:若m的值為2,a數組中的值為

|197I|218141

a=|238|則返回主程序后檄組中的值應為|2616|

|456||45121

注意:部分源程序存在文件PR0G1.C文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫

的若干語句。

試題分析:

要實現本題fun函數的功能,可以在fun函數中用兩層for循環來實現,具體為:

外層for循環控制二維數組的列,其中循環變量的初始值為0,循環變量的最大值為N-1;

內層循環控制二維數組的行,其中循環變量的初始值為0,循環變量的最大值由于要改

變的是數組右上三角元素,因此,循環變量的最大值不能為N-1,而是當前的外層循環變

量j.

在兩層循環的循環體中將數組元素擴大m倍后即可完成題面要求;

本題參考程序段如下:

intfun(inta[][N],intm)

{inti,j;

for(j=0;j<N;j++)

for(i=0;i<=j;i++)

a[i][j]=a[i]

}

ttinclude<stdio.h>

#include<conio.h>

ttinclude<stdlib.h>

#defineN5

intfun(inta[][N],intm)

main()

{inta[N][N],m,i,j;

clrscr();

printf(〃*****Thearray*****\n〃);

for(i=0;i<N;i++)

{for(j=0;j<N;j++)

{a[i][j]=rand()%20;printf(〃%4d〃,a[i][j]);}

printf(〃\n〃);

)

dom=rand()%10;while(m>=3);

printf(/zm=%4d\n,z,m);

fun(a,m);

printf(〃THERESULT\n〃);

for(i=0;i<N;i++)

{for(j=0;j<N;j++)printf(〃%4d〃,a[i][j]);

printf(〃\n〃);

}

NONO();

}

NONO()

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*rf,*wf;

inti,j,n,a[5][5];

rf二fopen(,zbc02.in〃,〃r〃);

wf二fopen(〃bc02.out",〃w");

for(i=0;i<5;i++)

for(j=0;j<5;j++)

fscanf(rf,"%d”,&a[i][j]);

fscanf(rf,〃%d〃,&n);

fun(a,n);

for(i=0;i<5;i++){

for(j=0;j<5;j++)fprintf(wf,〃%4d〃,a[i][j]);

fprintf(wf,〃\n");

)

fclose(rf);

fclose(wf);

i

6、請編寫函數fun,其功能是:計算并輸出給定數組(長度為9)中每相鄰兩個元素之平

均值的平方根之和。

例如,給定數組中的9個元素依次為12.0、34.0、4.0、23.0、34.0、45.0、18.0、3.0、

11.0,輸出應為:s=35.951014c

注意:部分源程序在文件PR0G1.C中。

請勿改動主函數main和其他函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

求數組x□(長度為9)中每相鄰兩個元素之平均值的平方根(假定i為數組某元素下標且

0<=i<8)的表達式為“sqrt((x[i]+x[i+l])/2.0)”;要求得平方根之和,只要用for循環遍

歷數組各元素將求得的各平方根累加即可;

注意:由于數組x口下標為0到8且要取下標為i+1的元素,因此for循環的執行條件為

“i〈8”而不是

本題參考程序段如下:

doublefun(doublex[9])

{doublesum=0.0;

inti;

for(i=0;i<8;i++)

sum+=sqrt((x[i]+x[i+1])/2.0);

returnsum;

ftinclude<stdio.h>

itinclude<math.h>

doublefun(doublex[9])

)

main()

{doubles,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};

inti;

printf(*\nTheoriginaldatais:\n");

for(i=0;i<9;i++)printfC%6.Ifa[i]);printf("\n\n");

s=fun(a);

printf("s=%f\n\n",s);

N0N0();

)

N0N0()

{/*請在此函數內打開文件,輸入測試數據,調用fun函數,輸出數據,關閉文件。*/

FILE*rf,*wf;inti,j;doubles,a[9];

=fopen(be.in,r);

wf=fopen("bc.out","w");

ford=0;i<5;i++){

for(j=0:j<9;j++)fscanf(rf,;

s=fun(a);

fprintf(wf,"%lf\n”,s);

)

fclose(rf);fclose(wf);

)

7、編寫一個函數,從num個字符串中找出最長的一個字符串,并通過形參指針max傳回

該串地址。(注意:主函數中用****作為結束輸入的標志)

注意:部分源程序在文件PR0G1.C中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

fun函數中,形參(*a)[81]中存儲的是num個字符串;

因此,要從num個字符串中找出最長的一個,可以先假設字符串數組(*公[81]的第一個

元素最長,用*max存儲其地址;

然后用循環依次判斷字符串數組(*a)[81]中的其他元素是否比*max所指向的字符串長;

若是比*max所指向的字符串長,就使*max指向該字符串;

循環結束,將*max所指向字符串的地址返回;

注意:本題中,形參max的定義為“char**max",即max為二級指針,因此,表示由max

所指向字符串的地址應該用“*max”,而不是“max”;

本題參考程序段如下:

fun(char(*a)[81J,intnum,char**max)

{inti;

*max=a[0];

for(i=0;i<num;i++)

if(strlen(*max)<strlen(a[i)])

*max=a[i];

return*max;

)

#include<stdio.h>

ttinclude<string.h>

tfinclude<conio.h>

fun(char(*a)[81],intnum,char**max)

)

main()

(

charss[10][81],*ps;

intn,i=0;

clrscr();

printf(〃輸入若干個字符串:");

gets(ss[i]);

puts(ss[i]);

while(!strcmp(ss[i],"****")=0)

(

i++;

gets(ss[i]);

puts(ss[i]);

)

n=i;

fun(ss,n,&ps);

printf("\nmax=%s\n",ps);

NONO();

)

NONO()

(

/*請在此函數內打開文件,輸入測試數據,調用fun函數,

輸出數據,關閉文件。*/

charss[20][81],*ps;

intn,i=0;

FILE*rf,*wf;

rf=fopen("b0603.in","r");

wf=fopen("b0603.out","w");

fgets(ss[i],81,rf);

while(!strncmp(ss[i],^*****,4)==0)

i++;

fgets(ss[i],81,rf);

)

n=i;

fun(ss,n,&ps):

fprintf(wf,"%s",ps);

fclose(rf);

fclose(wf);

)

8、函數fun的功能是:將兩個兩位數的正整數a、b合并形成一個整數放在c中。合并的

方式是:將a數的十位和個位數依次放在c數的個位和百位上,b數的十位和個位數依次

放在c數的十位和千位上。

例如,當a=45,b=12,調用該函數后,c=2514。

注意:部分源程序存在文件PROG1.C中。數據文件INI.DAT中的數據不得修改。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

求兩位正整數的十位上的數字可用除法"/”運算,即十位上的數字=兩位正整數/10;

求兩位正整數的個位上的數字可用求余?”運算,即個位上的數字=兩位正整數%10;

因此,用以上方法分別求得正整數a、b的個位及十位上的數字后,要將求得的數字形成

一?個整數放在c中,只要將求得的數字分別乘上其在c中相應位的權值(如在千位就乘上

1000、在百位就乘上100......)相加即可;

綜上,fun函數中用一條語句即可完成本題的要求,該語句如下:

*c=(b%10)*l000+(a%10)*100+(b/10)*10+a/10;}

本題參考程序段如下:

voidfun(inta,intb,long*c)

(

*c=(b%10)*1000+(a%10)*100+(b/10)*10+a/10;

}

ftinclude<conio.h>

ftinclude<stdio.h>

voidfun(inta,intb,long*c)

)

main()

{inta,b;longc;

clrscr();

printf("Inputa,b:');

scanf("%d%d”,&a,&b);

fun(a,b,&c);

printf("Theresultis:%ld\n”,c);

NONOO;

)

NONO()

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*rf,*wf;

inti,a,b;longc;

rf=fopen("inl.dat","r");

wf=fopen("bc05.dat","w");

for(i=0:i<10:i++){

fscanf(rf,"%d,%d",&a,&b);

fun(a,b,&c);

fprintf(wf,"a=%d,b=%d,c=%ld\n”,a,b,c);

)

fclose(rf);

fclose(wf);

)

9、假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:使字符串中

尾部的*號不得多于n個;若多于n個,則刪除多余的*號;若少于或等于n個,則什么也不

做,字符串中間和前面的*號不刪除。

例如,字符串中的內容為:****A*BC*DEF*G*******,若n的值為4,刪除后,字符串中

的內容應當是:****A*BC*DEF*G****;若n的值為7,則字符串中的內容仍為:

****A*BC*DEF*G*******。n的值在主函數中輸入。在編寫函數時,不得使用C語言提供的

字符串函數。

注意:部分源程序在文件PROG1.C文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

解本題可分以下三個步驟進行:

(1)用一變量i計數字符串中從頭到最后一個字符的長度;

(2)用while循環從字符串的尾部依次向前判斷各字符是否為“*":若是“*”,就將記數“*”

個數的變量k加1;若不是“*”,循環結束;

(3)判斷字符串的“*”個數k是否多于n個:

若是多于n個,就將字符串中下標為i+1+n(此時i+1是字符串尾部第一個*號在字符串

中的下標)的字符賦值為'VT以刪除多余的*號;

本題參考程序段如下:

voidfun(char*a,intn)

{inti,k=0;

i=strlen(a)-l;

while(*(a+1)--'*')

{k++;

i—;

}

if(k>n)

*(a+i+l+n)=\0";

#include<stdio.h>

#include<conio.h>

voidfun(char*a,intn)

)

mainO

{chars[81];intn;

printf(z,Enterastring:\nz,);gets(s);

printf(,zEntern:〃);scanf(〃%d〃,&n);

fun(s,n);

printf(/zThestringafterdeleted:\n,z);puts(s);

NONO();

)

NONOO

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*in,*out;

inti,n;chars[81];

in=fopcn(〃in9.dat〃,〃r〃);

out=fopen(〃out9.dat〃,〃w〃);

for(i=0;i<10;i++){

fscanf(in,〃%s〃,s);

fscanf(in,〃%d〃,&n);

fun(s,n);

fprintf(out,〃%s\n〃,s);

)

fclose(in);

fclose(out);

)

10、請編寫一個函數fun,它的功能是:計算并輸出給定整數n的所有因子(不包括1與自

身)之和。規定n的值不大于1000。

例如,在主函數中從鍵盤給n輸入的值為856,則輸出為:sum=763。

注意:部分源程序在文件PR0G1.C中。

請勿改動主函數main和其他函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

本題考的是結構的運用。

fun函數的功能是:判斷一個正整數i是否為另一正整數n的因子,可以用求余?”運算符:

若n%i的值為0,則i是n的因子;否則i不是n的因子;

因此,解本題可用for循環依次判斷2、3、4...n-2、n-1是否為n的因子:若是,就

將其累加到一變量中;若不是,就什么也不做。

本題參考程序段如下:

intfun(intn)

{ints=Ofi;

for(i=2;i<=n-l;i++)

if(n%i==O)

s+=i;

returns;

}

ttinclude<stdio.h>

intfun(intn)

main()

{intn,sum;

printf("Inputn:");scanf&n);

sum=fun(n);

printf("sum=%d\n”,sum);

NONO();

)

NONO()

{/*請在此函數內打開文件,輸入測試數據,調用fun函數,輸出數據,關閉文件。*/

FILE*rf,*wf;inti,n,sum;

=fopen(be.in,r);

wf=fopen("bc.out","w");

for(i=0;i<10;i++){

fscanf(rf,"%d",&n);

sum=fun(n);

fprintf(wf,"%d=%d\n”,n,sum);

)

fclose(rf);fclose(wf);

)

11、請編寫函數fun,其功能是:計算并輸出3到n之間所有素數的平方根之和。

例如,在主函數中從鍵盤給n輸入100后,

輸出為:sum=148.874270?

注意:要求n的值大于2但不大于100。

部分源程序在文件PR0G1.C中。

請勿改動主函數main和其他函數中的任何內容,僅在函數fun的花括號中填入你

編寫的若干語句。

試題分析:

判斷一個正整數m是否為素數,可用通過一個循環判斷2、3、4......(int)sqrt(m)這

些數分別除m的余數是否為0:若這些數都不能整除m,表明m是素數,否則只要有一個數

能整除m,就表明m不是素數;

因此,要輸出3到n之間所有素數的平方根之和,只要再完成以下兩個步驟即可:

(1)在上述算法的外面加一個取3到n各數的循環;

(2)循環體中,在判斷3到n之間的某數是素數后,將其平方根累加到?個變量中;

本題參考程序段如下:

doublefun(intn)

{intmtk,i;

doubles=0.0;

for(m=3;m<=n;m++)

{k=sqrt(m);

for(i=2;i<=k;i++)

if(m%i==O)break;

if(i>=k+l)s+=sqrt(m);

)

returns;

}

tJinclude<math.h>

ttinclude<stdio.h>

doublefun(intn)

mainO

{intn;doublesum;

printf('\n\nlnputn:");scanf("%d",&n);

sum=fun(n);

printf('\n\nsum=%f\n\n",sum);

NONO();

)

NONOO

{/*請在此函數內打開文件,輸入測試數據,調用fun函數,輸出數據,關閉文件。*/

FILE*rf,*wf;intn,i;doubles;

=fopen(be.m,r);

wf=fopen("bc.out","w");

for(i=0;i<10;i++){

fscanf(rf,"%d",&n);

s=fun(n);

fprintf(wf,s);

)

fclose(rf);fclose(wf);

)

12、編寫函數fun,它的功能是:計算并輸出下列級數和:

111

S=------+-------+???+----------

1X22X3nS+1)

例如,當n=10時,函數值為:0.909091o

注意:部分源程序在文件PROGLC文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

觀察本題的級數可以發現,其通項為:

1

a(n)=------

n(n+l)

因此,要求該級數的和S,只要用循環將該級數的各項(1至n項)累加到變量s中,

然后將s返回即可,要注意:因為fun函數為Double型變量,所以作為返回值的總和變量也

要定義成Double;

本題參考程序段如下:

doublefun(intn)

{doubles=0.0;

inti;

for(i=l;i<=n;i++)

s=s+l.0/(i*(i+1));

returns;

}

tfinclude<conio.h>

ttinclude<stdio.h>

doublefun(intn)

mainO/*主函數*/

{clrscr();

printf("%f\n”,fun(10));

N0N0();

)

NONO()

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*fp,*wf;

inti,n;

doubles;

fp=fopen(/zbc07.in","r");

if(fp=NULL){

printf("數據文件bc07.in不存在!”);

return;

}

wf=fopen("bc07.out","w");

ford=0;i<10;i++){

fscanf(fp,"%d",&n);

s=fun(n);

fprintf(wf,"%f\n",s);

)

fclose(fp);

fclose(wf);

)

13、編寫函數fun,它的功能是:求Fibonacci數列中大于t的最小的一個數,結果由函數

返回。其中Fibonacci數列F(n)的定義為:

F(0)=0,F(l)=l

F(n)=F(n-l)+F(n-2)

例如:當t=1000時,函數值為:1597。

注意:部分源程序在文件PR0G1.C文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

由題面知Fibonacci數列F(n)的定義為:

F(0)=0,F(l)=l,F(n)=F(n-l)+F(n-2)(nN2);

即Fibonacci數列F(n)的定義用語言描述為:第n項的值為第n-1項的值與第n-2項

的值之和,其中Fibonacci數列的第一、二項分別是0、1;

又由題面知,函數fun的功能是:求Fibonacci數列中大于t的最小的一個數,這可以用

循環來實現,具體為:

循環的初始化為:變量門的值為0,變量f2的值為1,變量fn的值為fl+f2,即1;

循環體為:將變量f2的值賦給變量門,將變量fn的值賦給變量f2,然后用公式fn=fl+f2

來求變量fn的值,直到fn大于t的值為止;

循環條件為"fn<=t";這樣當循環結束時,fn的值就是題面中要求的值,將fn返回

給主調函數即可;

參考函數程序段如下:

intfun(intt)

fintfl=0,f2=l,fn;

fn=fl+f2;

while(fn<=t)

{fl=f2;

f2=fn;

fn=fl+f2;}

returnfn;

}

ftinclude<conio.h>

ftinclude<math.h>

ftinclude<stdio.h>

intfun(intt)

mainO/*主函數*/

{intn;

clrscr();n=lOOO;

printf("n=%d,f=%d\n”,n,fun(n));

NONOO;

)

NONO()

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*fp,*wf:

inti,n,s:

fp=fopen("bc06.in","r");

if(fp=NULL){

printf("數據文件bc06.in不存在!”);

return;

)

wf=fopen("bc06.out","w");

for(i=0;i<10;i++){

fscanf(fp,"%d",&n);

s=fun(n);

fprintf(wf,"%d\n",s);

)

fclose(fp);

fclose(wf);

14、請編寫一個函數fun,其功能是:將ss所指字符串中所有下標為奇數位置上的字母轉

換為大寫(若該位置上不是字母,則不轉換)。

例如,若輸入"abc4EFg”,則應輸出"aBc4EFg"。

注意:部分源程序在文件PR0G1.C文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

解題思路是這樣的:將一個字符(若不是字母,則不轉換)由小寫字母轉換為大寫,可

以先判斷其ASCH碼是否在a與9之間:若是,就將其ASCH碼減去32即可;

要實現將ss所指字符串中所有下標為奇數位置上的字符進行變化,可以利用循環依次取

字符串中索引(下標)為1、3、5.......的字符進行相應的轉換;

本題參考程序段如下:

voidfun(char*ss)

{inti,n;

n-strlen(ss);

for(i=l;i<n;i+=2)

if(ss[i]>=,a'&&ss[,i]<=,z")

ss[i]=ss[.i]~32;

ttinclude<conio.h>

#include<stdio.h>

voidfun(char*ss)

)

voidmain(void)

(

chartt[51];

clrscr();

printf(〃\nPleaseenterancharacterstringwithin50characters:\n,z);

gets(tt);

printf(z,\n\nAfterchanging,thestring\n\〃%s\〃〃,tt);

fun(tt);

printf(/z\nbecomes\n\〃%s\〃〃,tt);

N0N0();

}

N0N0()

(

/*請在此函數內打開文件,輸入測試數據,調用fun函數,

輸出數據,關閉文件。*/

chartt[51],ch;

FILE*rf,*wf;

intlen,i=0;

rf=fopen(z,bl003.in",〃r");

wf二fopen(/zb1003.out/z,〃w〃);

while(i<10){

fgets(tt,50,rf);

len=strlen(tt)-1;

ch=tt[len];

if(ch=='\n'|ch==Oxla)tt[len]=0;

fun(tt);

fprintf(wf,〃%s\n”,tt);

i++;

)

fclose(rf);

fclose(wf);

)

15、函數fun的功能是:將a、b中的兩個兩位正整數合并形成一個新的整數放在c中。合

并的方式是:將a中的十位和個位數依次放在變量c的千位和十位上,b中的十位和個位數依

次放在變量c的個位和百位匕

例如,當a=45,b=12o調用該函數后,c=4251o

注意:部分源程序存在文件PR0G1.C中。數據文件INI.DAT中的數據不得修改。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

求兩位正整數的十位上的數字可用除法"/”運算,即十位上的數字=兩位正整數/10;

求兩位正整數的個位上的數字可用求余?”運算,即個位上的數字=兩位正整數%10;

因此,用以上方法分別求得正整數a、b的個位及十位上的數字后,要將求得的數字形成

一個整數放在c中,只要將求得的數字分別乘上其在c中相應位的權值(如在千位就乘上

1000、在百位就乘上100......)相加即可;

綜上,fun函數中用一條語句即可完成本題的要求,該語句如下:

*c=a/l0*1000+b%10*100+a%10*10+b/10;

本題參考程序段如下:

voidfun(inta,intb,long*c)

(

*c=a/10*1000+b%10*100+a%10*10+b/10;

}

#include<conio.h>

#include<stdio.h>

voidfun(inta,intb,long*c)

)

main()

{inta,b;longc;

clrscr();

printf(Z/Inputa,b:〃);

scanf("%d%d〃,&a,&b);

fun(a,b,&c);

printf("Theresultis:%ld\nz,,c);

NONO();

)

NONO()

{/*本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。*/

FILE*rf,*wf;

inti,a,b;longc;

rf=fopen(〃inl.dat","r〃);

wf=fopcn(〃bc06.dat〃,“w〃);

for(i=0;i<10;i++){

fscanf(rf,〃%d,%d〃,&a,&b);

fun(a,b,&c);

fprintf(wf,"a=%d,b=%d,c=%ld\n〃,a,b,c);

)

fclose(rf);

fclose(wf);

16、請編寫函數fun,函數的功能是:將大于形參m且緊靠m的k個素數存入xx所指的數組

中。

例如,若輸入17,5,則應輸出:19,23,29,31,37。

注意:部分源程序在文件PROGLC文件中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

判斷一個正整數i是否為素數可以這樣:

通過循環依次用2到n-1之間(包括邊界值)的各個數字去除i求余數:只要有一個數字

能整除i,就表明i不是素數;只有所有的數字都不能整除i,才表明i是素數;

因此,解本題的思路可以是這樣:

在一個結束條件永遠為真的循環中,依次判斷比m大的各個數字是否為素數:若是素數,

就將記錄題目要求素數個數的變量k自減1,并將該素數存進XX所指的數組中;當k的值

為。時,用break語句結束此循環;

本題參考程序段如下:

voidfun(intin,intk,intxx[])

{intg=0,i,j,flag=l;

i-m;

while(1)

{i++;

for(j^2;j<i;j++)

{if(i%j!=O)

flag=l;

else

{flag=O;break;}

}

if((flag==l)&&(j>=i))

{if(k〉=O)

{xx[g++]=i;k~~;}

else

break;

#include<conio.h>

ttinclude<stdio.h>

voidfun(intm,intk,intxx[])

)

main()

intm,n,zz[1000];

clrscr():

printf(*\nPleaseentertwointegers/);

scanf("%d%d”,&m,&n);

fun(m,n,zz);

for(m=0;m<n;m++)

printf('%d”,zz[m]);

printf('\n");

N0N0();

)

NONO()

{/*本函數用于打開文件,輸入測試數據,調用fun函數,輸出數據,關閉文件。*/

intm,n,zz[1000],i;

FILE*rf,*wf;

rf=fopen("bc08.in","r");

wf=fopen("bc08.out","w");

for(i=0:i<10;i++){

fscanf(rf,"%d%d”,&m,&n);

fun(m,n,zz);

for(m=0;m<n;m++)fprintf(wf,"%d”,zz[m]);

fprintf(wf,"\n");

)

fclose(rf);

fclose(wf);

)

17、請編寫函數fun,函數的功能是:統計各年齡段的人數。N個年齡通過調用隨機函數

獲得,并放在主函數的age數組中;要求函數把0至9歲年齡段的人數放在d[0]中,把10至

19歲年齡段的人數放在d[l]中,把20至29歲年齡段的人數放在d[2]中,其余依此類推,把

100歲(含100)以上年齡的人數都放在d[10]中。結果在主函數中輸出。

注意:部分源程序在文件PR0G1.C中。

請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入你編寫的

若干語句。

試題分析:

解本題可分兩個步驟進行:

(1)在fun函數中,招統計各年齡段人數的計數器b□的各元素進行初始化(即清0);

(2)fun函數中,由于a[]存放的是所有人的年齡,因此,可以用for循環依次判斷a口

數組的各元素:

若a[i]在0至9之間(包括邊界值),就將計數器d[0]加1;

若a[i]在10至19之間(包括邊界值),就將計數器d[l]加1;

若a[i]的值大于或等于100,就將計數器d[10]加1;

這樣,fun函數就實現了題面要求的功能;

本題參考程序段如下:

voidfun(int*a,int*b)

{inti,j;

for(j=0;J<M;J++)

b[J]=O;

for(i=O;i<N;i++)

if(a[i]>=O&&a[i]<=9)

b[O]+=l;

elseif(a[i]>=10&&a[i]<=19)

b[l]+=l;

elseif(a[i]>=20&&a[i]<=29)

b[2]+=l;

elseif(a[i]>=30&&a[i]<=39)

b[3]+=l;

elseif(a[i]>=40&&a[i]<=49)

b[4]+-l;

elseif(a[i]>-50&&a[i]<-59)

b[5]+-l;

elseif(a[i]>=60&&a[i]<=69)

b[6]+=l:

elseif(a[i]>=70&&a[i]<=79)

b[7]+=l;

elseif(a[i]>-80&&a[i]<-89)

b[8]+-l;

elseif(a[i]>=90&&a[i]<=99)

b[9]+=l;

else

b[10]+=l;

}

^include<stdio.h>

#defineN50

#defineM11

voidfun(int*a,int*b)

doublernd()

{statict=29,c=217,m=1024,r=0;

r=(r*t+c)%m;return((double)r/m);

}

mainO

{intage[N],i,d[M];

for(i=0;i<N;i++)age[i]=(int)(115*rnd

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論