C語言編程題_經(jīng)典40題(附解答)[1]1_第1頁
C語言編程題_經(jīng)典40題(附解答)[1]1_第2頁
C語言編程題_經(jīng)典40題(附解答)[1]1_第3頁
C語言編程題_經(jīng)典40題(附解答)[1]1_第4頁
C語言編程題_經(jīng)典40題(附解答)[1]1_第5頁
已閱讀5頁,還剩57頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 1、 定義一個(gè)帶參的宏,使兩個(gè)參數(shù)的值互換,并寫出程序,輸入兩個(gè)數(shù)作為使用宏時(shí)的參數(shù)。輸出已交換后的兩個(gè)值。 # define EXCHANGE(A,B,X) X=A; A=B; B=X main( ) int a , b , x ; printf( “input a and b:) ; scanf (“%d,%d , &a , &b ) ; EXCHANGE( a , b , x ) ; printf( “ a = %dn b = %dn , a , b ) ; 2 、編寫程序,輸入兩個(gè)整數(shù),求它們相除的余數(shù)。用帶參的宏來實(shí)現(xiàn)。 # define R(A , B) A%B main( )

2、int a , b ; printf( “input a and b:) ; scanf (“%d,%d , &a , &b ) ; printf( “%d mod %d = %dn , a , b , R( a , b ) ) ; 3、 分別用函數(shù)和帶參的宏,從3個(gè)數(shù)中找出最大值。 int max( int a , int b , int c ) int x ; x = ( a b ) ? a : b ; x = ( x c ) ? x : c ; return ( x ) ; main ( ) int x , y , z , m ; printf ( “ input x , y , z )

3、 ; scanf (“%d , %d , %d , &x , &y , &z ) ; printf ( “MAX=%dnn , MAX( x , y , z , m ) ) ; printf ( “max =%dn , max( x , y , z ) ) ; 宏展開為: ( m = x y ? x : y ) z ? m : z # define MAX( A , B , C , M ) ( M = A B ? A : B ) C ? M : C 4、求和:S1-(1/2)+(1/3)-(1/4)+(1/n), 其中 n=10。方法1:void main( ) int i,n=10; flo

4、at s=0; for( i=1; i=n; i+) s=s+(i%2= =1)?(1.0/i):(-1)* (1.0/i); printf(“s=%fn,s );方法2:求 s1-(1/2)+(1/3)-(1/4)+(1/n) 其中 n=10void main( ) int i, n=10,f= -1; float s=0; for( i=1; i=n; i+) f= -f; s+= f * (1.0/i); printf(“s=%fn,s ); 5、編寫程序,求sum1-3+5-7+-99+101方法1:void main( ) int i; float sum=0; for( i=1;

5、i=101; i+=4) sum+=i; for( i=3; i=99; i+=4) sum-=i; printf(“sum=%fn,sum );方法2: 求 sum1-3+5-7+-99+101void main( ) int i, f=-1; float sum=0; for( i=1; i=101; i+=2) f=-f; sum+=f*i; printf(“sum=%fn,sum ); 6、打印如下數(shù)字三角形: 1 121 12321 1234321 void main( ) int i,j; for( i=1; i10; i+) for( j=1; j10-i; j+) printf

6、(“ ); /*輸出9-i個(gè)空格*/ for( j=1; j0; j-) printf(“%d,j); printf(“n); 7、編寫程序,輸出左下三角的九九口訣表。 1*1= 1 1*2= 2 2*2= 4 1*3= 3 2*3= 6 3*3= 9 1*4= 4 2*4= 8 3*4=12 4*4=16 1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8= 8 2*8=16 3*8=2

7、4 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 輸出左下三角的九九口訣表的程序如下:void main( ) int i, j; for( i=1; i=9; i+) for( j=1; j=i; j+) printf(“%4d* %d= %2d, i, j, i*j); printf(“n); 8、鐵路托運(yùn)行李規(guī)定:行李重不超過50公斤的,托運(yùn)費(fèi)按每公斤0.15元計(jì)費(fèi);如超過50公斤,超過局部每公斤加收0.10元。編一程序?qū)崿F(xiàn)自動計(jì)費(fèi)功能。

8、double money(double w ) if (w0) f =money(w); printf(“nweight=%d,freight=%f,w,f); while (w= =0); 9、編寫函數(shù),將兩個(gè)遞增有序的表,合并成一個(gè)遞增有序的表。#define N 50#define SeqList struct seqlistSeqList int dataN; int length;合并函數(shù)如下:SeqList *mergelist(a,b)SeqList a,b; SeqList c; int i=0, j=0, k=0; while(ia.length)&(j b.length)

9、if(a.datai)=b.dataj) c.datak+= a.datai+); else c.datak+= b.dataj+); while(ia.length) c.datak+= a.datai+); while (j b.length) c.datak+= b.dataj+); c.length=k; return c; 10、冒泡排序Bubble Sorting李麗娟教材p156題7.37 兩兩比較相鄰元素,假設(shè)反序那么交換,直到無反序的記錄為止。 1冒泡排序的根本思想 在冒泡排序的過程中,各元素不斷接近自己的位置。如果一趟比較下來沒有進(jìn)行過交換,就說明記錄序列已經(jīng)有序,不需繼續(xù)

10、排序下去。因此設(shè)置一個(gè)標(biāo)志變量exchange,在每趟排序開始前,首先假設(shè)該趟不會有數(shù)據(jù)交換,置exchange為0;以后一旦發(fā)生數(shù)據(jù)交換,就對exchange置1。假設(shè)一趟排序結(jié)束,exchange仍然為0,那么說明該趟排序過程中已無反序記錄。因此,沒有必要再進(jìn)行下一趟排序。例如,n=6,數(shù)組R的6個(gè)關(guān)鍵字分別為: 14,20,25,17,3,9冒泡排序算法的執(zhí)行過程如以下圖所示。四三二一9172520172525201714201725201491435432193172520140ij 2冒泡排序算法void Bubblesort( int R , int n ) /*對數(shù)組R0.n-1

11、按遞增序進(jìn)行冒泡排序*/int i, j, temp, exchange ; for ( i=0; i i; j-) if (Rjn。 2對an按遞增序進(jìn)行排序。3輸出插入前的有序序列。4讀入要插入的數(shù)x。5設(shè)置游標(biāo)i從表尾開始搜索插入位置,假設(shè)ai大于x那么將ai移到ai+1位置。6一旦出現(xiàn)ai小于x,那么將x插入到i+1位置。7輸出插入后的有序序列。 3完整的程序如下#include “stdio.h#define N 10main( ) int i , j, x, n, aN; /*數(shù)字a的最大容量為N*/ printf(“請輸入數(shù)組的實(shí)際元素個(gè)數(shù)n:n); scanf(“%d, &n

12、); /*要求實(shí)際元素個(gè)數(shù)n小于N */ printf(“請輸入%d個(gè)整數(shù):n, n ); for( i=0; i=0) & ( x ai) ai+1=ai; i-; /*元素后移*/ ai+1=x; /*插入元素x*/ output( a, n);/*輸出插入后的序列*/ 直接選擇排序函數(shù)如下:void selectsort( int b , int n) int i, j, k, temp ; for (i=0; i=n-2; i+) k=i; /*假設(shè) i 位置上就是最小的*/ for ( j=i+1; j=n-1; j+) if (bjbk) k=j ; if ( k!=i) temp

13、=bi; bi=bk; bk=temp; 輸出一維數(shù)組的函數(shù)如下:void output( int b , int n) int i ; printf(“n); for (i=0; i0) x1=(x2+1)*2; x2=x1; day-; printf(“第一天的桃子數(shù)為:, x1); 13、分別用遞歸和非遞歸的方法將一個(gè)整數(shù)轉(zhuǎn)換成字符串。 李麗娟教材p126題6.46:非遞歸方法的根本思想 對于給定的整數(shù)n,從低位向高位逐位截取每一位上的數(shù)字,并保存到數(shù)組a的從0號位置開始的相應(yīng)位置上。然后,從數(shù)組a中反向逐位取出相應(yīng)位置上的數(shù)字并轉(zhuǎn)換為相應(yīng)的字符輸出。#include void conv

14、ert( int n ) int i, j, a5 ; i=0; while (n!=0) ai+=n%10; /*截取n的最低位上的數(shù)字保存到ai位置上 */ n=n/10; /*將n縮小10倍 */ 非遞歸函數(shù): 1234n1234a j=i-1; while (j=0) putchar(aj+0); /*將aj位置上的數(shù)字轉(zhuǎn)換為對應(yīng)的字符 */ j=j-1; #include void convert( int n ) int k ; if ( (k=n/10)!=0 ) convert( k ); /*截取n的最低位上的數(shù)字保存到棧中,并使 n 縮小10倍 */ putchar(n%1

15、0 +0); /*逐次彈出棧頂數(shù)字,并將其轉(zhuǎn)換為對應(yīng)的字符輸出 */遞歸函數(shù): void main( ) int num ; printf(“input a integer number:); scanf(“%d,&num); printf(“noutput:); if (num0; n/=10) num=num*10+n%10; return num; 17、將一個(gè)長度不超過4的數(shù)字字符串轉(zhuǎn)換成一個(gè)整數(shù)。例如,字符串為“3248,那么轉(zhuǎn)換成整數(shù)3248。 int atoi(char *nst ) int i, num=0; for( i=0; sti!=0; i+) num=num*10+n

16、sti-0; return num; 18、編寫程序,將任意一個(gè)字符串從第一個(gè)字符開始間隔地輸出該串。例如,字符串為:abcdef,輸出:ace。 #define N 20 void main( ) int i; char strN; printf(“please enter a string: ); scanf(“%s,str); output(str); void output(char str ) int i; printf(“n); for( i=0; sti!=0; i+) if (i%2= =0) putchar(stri); 19、輸入一串字符以結(jié)束,如果它是大寫字母,那么轉(zhuǎn)換為

17、小寫字母輸出,如果是小寫字母,那么轉(zhuǎn)換為大寫字母輸出,如果不是字母,那么照直輸出。 while(ch=getchar( )!=#) if ( ch=A& ch=a& ch=a& c=A& c=0& c=a& sti =A& sti =Z) sti= sti- A+27; else if (sti = ) sti= *; *26、 用結(jié)構(gòu)體存放下表中的數(shù)據(jù),然后輸出每人的姓名和實(shí)發(fā)工資數(shù)根本工資 + 浮開工資 支出。姓名基本工資浮動工資支出zhaoqiansun240.00360.00560.00400.00120.000.0075.0050.0080.00 【分析及解答】 顯然,該結(jié)構(gòu)體應(yīng)有四

18、個(gè)成員:姓名、根本工資、浮開工資和支出,實(shí)發(fā)數(shù)為后三個(gè)成員之和差運(yùn)算。 在輸出時(shí),要注意輸出格式的控制,特別是對實(shí)發(fā)工資應(yīng)定義其小數(shù)位數(shù)。 此題也可定義指向結(jié)構(gòu)體的指針,請同學(xué)們自已完成。程序如下:#include struct worker char name10; float base,flow,out; a3=zhao,240,400,75, qian,360,120,50,sun,560,0,80;main() int i; for( i=0;i3;i+) printf(name:%s, ); printf(salary:%10.2f,ai.base+ai.flow-a

19、i.out ); * 27、 編一個(gè)程序,輸入10個(gè)員工的序號、姓名、根本工資、職務(wù)工資;求出其中“根本工資職務(wù)工資最少的員工姓名并輸出。 【分析及解答】 此題要定義有四個(gè)成員的結(jié)構(gòu)體數(shù)組,并在該結(jié)構(gòu)體數(shù)組中求最小值。程序中,用變量flag存放最少工資員工的序號,其初值為0。同樣可使用結(jié)構(gòu)體指針來完成。 程序如下:#include struct worker int no; char name10; float base,rank;a10;main()int i,flag=0;for(i=0;i10;i+) scanf(%s,); scanf(%d,&ai.no); scanf(

20、%f %f,&ai.base,&ai.rank); for(i=1;i10;i+) if( ai.base+ai.rank aflag.base+aflag.rank )flag=i;printf(name:%s,); 28、 編一個(gè)程序,輸出10個(gè)學(xué)生的學(xué)號、姓名、門課程的成績,求出總分最高的學(xué)生姓名并輸出。 此題與李麗娟教材p231題9.38相似 【分析及解答】此題與上題類似,只是將求最小值改為求最大值而已。同樣是用變量flag存放最大值即最高分學(xué)生的序號,其初值也為0。程序如下:#include struct student int no; char name10;

21、float chinese,math,eng;a10;void main() int i,sum1, sum2, flag=0; for( i=0;i10;i+) scanf(%s,); scanf(%d,&ai.no );scanf(%f%f%f,&ai.chinese,&ai.math,&ai.eng); for( i=1;i sum1 ) flag=i; printf(name:%s,); 29、 編一個(gè)程序,輸出以下學(xué)生成績表中的數(shù)據(jù),并用結(jié)構(gòu)體數(shù)組存放。然后輸出三門課程的名稱和平均分?jǐn)?shù)。nameVFVBVCZhao97.589.078.0Qian90

22、.093.087.5Sun75.079.568.5Li82.569.554.0【分析及解答】 此題解法與以上幾題相似,只是增加了求平均值的運(yùn)算。另外,在輸出時(shí),注意換行控制。程序如下:#include struct student char name16; float score3; a4=Zhao,97.5,89,78, Qian,90,93,87.5, Sun,75,79.5,68.5, Li,82.5,69.5,54 ;char cases310=VF,VB,VC; /*cases0、cases1、cases2用來存放課程名稱*/void main() int i,j; float su

23、m; for( i=0;i3;i+) printf(n Case:%st,casesi);sum=0;for( j=0;j4;j+) sum+=aj.scorei;sum/=4;printf(Avg score:%fn,sum); 30、 某專業(yè)本學(xué)期開設(shè)課程有:數(shù)學(xué)(math)、英語(english)、程序設(shè)計(jì)(program),根據(jù)你所在班的實(shí)際人數(shù),設(shè)計(jì)5個(gè)函數(shù): 1從鍵盤輸入每一個(gè)同學(xué)的學(xué)號(num)、姓名(name)及各門課程的成績(score); 2求出每個(gè)同學(xué)的總成績。 3從屏幕輸出總分最高的學(xué)生的學(xué)號、姓名、各單科成績及總成績。 4從屏幕輸出某門課程、某個(gè)分?jǐn)?shù)段的學(xué)生的學(xué)號、姓

24、名和該門課程的成績。 5按平均分從高到低順序,輸出全班同學(xué)的學(xué)號、姓名和平均分。 再編寫一個(gè)主函數(shù)進(jìn)行測試。 31、 編一個(gè)程序,從鍵盤輸入200個(gè)字符,存入名為“ f1.t的磁盤文件中。 【分析及解答】 因?yàn)橛形募僮?,所以程序頭部必須有一條語句: #include stdio.h 程序先創(chuàng)立文件f1.t,然后從鍵盤每鍵入一個(gè)字符就往文件中寫一個(gè)字符,直至完成。 程序主函數(shù)中定義了一個(gè)局部變量int n,用做計(jì)數(shù)器,鍵盤讀取用庫函數(shù)int getchar()。它定義了數(shù)據(jù)類型FILE和文件操作庫函數(shù)的說明。#include stdio.hmain() FILE *fp; int n ; if

25、 (fp=fopen(f1.t,w)= =NULL) printf( Cannot open file!n); exit(1); for (n=0; n200; n+) fputc(getchar(),fp); fclose(fp); 程序如下: 32、從上一題中建立的名為 f1.t 的磁盤文件中讀取120個(gè)字符,并顯示在屏幕上?!痉治黾敖獯稹砍绦蛳确_文件f1.t,然后讀一字符顯示一個(gè)字符。程序主函數(shù)中定義了一個(gè)局部變量int n,用于計(jì)數(shù),從文件中讀取字符用庫函數(shù)int fgetc(FILE *fp),顯示字符用庫函數(shù)int putchar( int ch)。#include stdio.

26、h main() FILE *fp; int n ; if ( fp=fopen(f1.t , r) = =NULL ) printf( Cannot open file!n) ; exit(1) ; for ( n=0; n120 ; n+) putchar( fgetc(fp); fclose( fp ) ; 33、 輸入100個(gè)學(xué)生的信息含學(xué)號、姓名、年齡、7科成績、總分,統(tǒng)計(jì)所有學(xué)生的總分,并存入磁盤二進(jìn)制數(shù)據(jù)文件student.dat中。然后再讀取該文件,尋找總分最高的學(xué)生并輸出該生的所有信息?!痉治黾敖獯稹?用一個(gè)結(jié)構(gòu)體student來表示學(xué)生信息。先創(chuàng)立二進(jìn)制文件 student

27、.dat,在輸入學(xué)生信息后就計(jì)算總分,然后寫入文件。重復(fù)100次,完成學(xué)生信息存入。設(shè)置整型變量m存放最高總分值,整型變量n記錄最高總分者的編號。尋找結(jié)束后,用庫函數(shù)fseek定位至最高總分的學(xué)生所在的位置,讀出后顯示。#include stdio.hstruct student long num; char name10; int age ; int subj7; int scoret; s1; main() FILE *f1; int m,n,j; if (f1=fopen(student.dat, wb)= =NULL ) printf(Cannot open file!n); exit(0); /*以上先創(chuàng)立二進(jìn)制文件,作好寫準(zhǔn)備*/ /

溫馨提示

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

評論

0/150

提交評論