C語言圖形輸出習習題_第1頁
C語言圖形輸出習習題_第2頁
C語言圖形輸出習習題_第3頁
C語言圖形輸出習習題_第4頁
C語言圖形輸出習習題_第5頁
免費預覽已結束,剩余17頁可下載查看

下載本文檔

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

文檔簡介

1、【】輸入n值,輸出如圖所示矩形?!尽枯斎雗值,輸出如圖所示平行四邊形?!尽枯斎雗值,輸出如圖所示高為n的等腰三角形?!尽枯斎雗值,輸出如圖所示高為n的等腰三角形?!尽枯斎雗值,輸出如圖所示高和上底均為n的等腰梯形?!尽枯斎雗值,輸出如圖所示高和上底均為n的等腰空心梯形。【】輸入n值,輸出如圖所示邊長為n的空心正六邊型?!尽枯斎雗值,輸出如圖所示圖形?!尽枯斎雗值,輸出如圖所示圖形。【】輸入n值,輸出如圖所示圖形?!尽枯斎雗值,輸出如圖所示圖形。【】輸入n值,輸出如圖所示圖形?!尽枯斎雗值,輸出如圖所示圖形。(例為n=6時)【】編寫程序,輸出如圖所示sin(x) 函數0到2的圖形。【】編寫程序,

2、在屏幕上輸出一個由*號圍成的空心圓?!尽烤帉懗绦颍谄聊簧侠L制如圖余弦曲線和直線。若屏幕的橫向為x軸,縱向為y軸, 在屏幕上顯示0360度的cos(x)曲線與直線x=f(y)=45*(y-1)+31的迭加圖形。其中cos圖形用"*"表示,f(y)用"+"表示,在兩個圖形的交點處則用f(y)圖形的符號。 【】編寫程序,輸出如圖所示高度為n的圖形。 【】編寫程序,輸出如圖所示高度為n的圖形。 【】輸入n值,輸出如圖所示圖形。 【】輸入n值,輸出如圖所示的n×n(n<10)階螺旋方陣。1 2 3 4 51

3、6 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9圖 n=5時的螺旋方陣【】輸入n值,輸出如圖所示回型方陣?!尽枯敵鋈鐖D所示的數字金字塔【】輸入n值,輸出如圖所示圖形?!尽枯斎腠斝凶址蛨D形的高,輸出如圖所示圖形。 【】輸入首字符和高后,輸出如圖所示回型方陣。A A A A A A B B B A A B C B A A B B B A A A A A A 圖 首字符為'A'、高為5的方陣【】輸入中心字符和高后,輸出如圖所示回型方陣。X X X X X X Y Y Y X X Y Z Y X X Y Y Y YX X X X

4、X圖 中心字符為'Z'、高為5的方陣【】編寫程序,輸出如圖所示上三角形式的乘法九九表?!尽烤帉懗绦?,輸出如圖所示下三角乘法九九表。【】分析:打印此圖形用兩重循環實現。圖形要重復n行,故采用循環結構實現循環n次,循環體內部打印一行'*'號,把上述思路表示為:for(i=1;i<=n;i+)打印一行'*'號;每行有n個'*'號,再采用循環結構實現n次循環,循環內部用格式輸出語句打印一個'*'號,即:for(j=1;j<=n;j+)printf("*");按照上述思路,實現打印矩形。參考答

5、案:main() int i,j,n;printf("nPlease Enter n:");scanf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n;j+)printf("*");printf("n");【】分析:此圖形和上題的區別在于在每一行先要打印空格,然后再打印n個'*'號,在上題第一層循環體內打印'*'號的循環前面增加一個循環打印空格。每行空格的個數是逐行減少的,由于第一層循環的控制變量i是逐行增1,所以用一個固定值的數減去

6、i就可實現對空格個數的控制,在此題中固定值可使用變量n。參考答案: main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n-i;j+)printf(" ");for(j=1;j<=n;j+)printf("*");printf("n");【】分析:此題和上題的區別在于每行'*'的數量逐行減少,可以使用上題控制空格個數的思路來控制&#

7、39;*'號的個數,請注意每行'*'的個數都是奇數。參考答案:main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n-i;j+)printf(" ");for(j=1;j<=2*i-1;j+)printf("*");printf("n");【】分析:此題圖形是第3題圖形的垂直反轉,在編程上我們可以變換一個思路。對于圖形中的第

8、i行(1in),共需要輸出2n-i個字符,其中前面的i-1個字符為空格,后面的字符為'*'號。按照這一思路可以編寫出如下程序。參考答案:main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d", &n);for( i=1;i<=n;i+ ) /* 重復輸出圖形的n行 */ for( j=1;j<=2*n-i;j+ ) /* 重復輸出圖形一行中的每個字符 */if(j<=i-1) printf(" "); /* 輸出前面的空格 */else

9、printf("*"); /* 輸出后面的*號 */printf("n");【】分析:此題和第3題的區別僅是每行的'*'個數增加n-1個。參考答案:main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n-i;j+)printf(" ");for(j=1;j<=2*i-1+(n-1);j+)printf("*");

10、printf("n");【】分析:對于空心圖形,我們可以在上題的基礎上,對于打印'*'號的循環進行修改,僅在循環開始值(j=1)和循環結束值(j=2*(i-1)+n)時打印'*'號,其它位置都打印空格。另一種思路是將每行打印的空格和'*'的兩個循環合為一體考慮,在判斷出需要打印'*'的兩個位置及第一行和最后一行相應位置外,其余位置都打印空格。參考答案:main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d",&

11、n);for(i=1;i<=n;i+) for(j=1;j<=2*n+i-3;j+)if(j=n-i+1 | j>n-i+1 && (i=1|i=n) printf("*");else printf(" ");printf("*n");【】分析:此圖形可以理解為兩個空心梯形反向連接而成,因此可以利用上題的思路進行輸出。參考答案:main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d",&n);for(

12、i=1;i<=n;i+) /* 輸出圖形的上半部分(含中心行) */ for(j=1;j<=2*n-i-1;j+)if(j=i) printf("*");else printf(" ");printf("*n");for(i=1;i<n;i+) /* 輸出圖形的下半部分(不含中心行) */ for(j=1;j<=n+i;j+)if(j=n-i) printf("*");else printf(" ");printf("*n");【】分析:此題與上題的區

13、別在于打印'*'號的位置不同,編程時要找出應打印'*'號的位置和兩個循環變量i、j以及行數n的關系。參考答案:main( ) int i,j,n;printf("nPlease Enter n:");scanf ("%d", &n);for(i=1;i<=n;i+) /* 輸出圖形的上半部分(含中心行) */ for(j=1;j<=2*n-i;j+)if(j=n-i+1 | j>n-i+1 && i=1) printf("*");else printf(&quo

14、t; ");printf("*n");for(i=1;i<n;i+) /* 輸出圖形的下半部分(不含中心行) */ for(j=1;j<=3*(n-1)-i;j+)if(j=i+1 | j>i+1 && i=n-1) printf("*");else printf(" ");printf("*n");【】參考答案:main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d",&

15、;n);for(i=1;i<=n;i+) for(j=1;j<=n;j+)if(j=n-i+1 | i=1 | i=n) printf("*");else printf(" ");printf("n");【】參考答案:main( ) int i,j,n;printf("nPlease Enter n: ");scanf("%d", &n);for(i=1;i<=n;i+) /* 輸出圖形的上半部分(含中心行) */ for(j=1;j<=n-i;j+)if(j=1

16、 | j=n-i+1) printf("* ");else printf(" ");printf("n");for(i=1;i<n;i+) /* 輸出圖形的下半部分(不含中心行) */ for(j=1;j<=i+1;j+)if(j=1 | j=i+1) printf("* ");else printf(" ");printf("n");【】參考答案:main( ) int i,j,n;printf("nPlease Enter n: ");sc

17、anf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n;j+)if(j=1 | j=i | j=n) printf("*");else printf(" ");printf("n");【】參考答案:main( ) int i,j,n;printf("nPlease Enter n: ");scanf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n+i-1;j+)if(j>

18、n-i) printf("*");else printf(" ");printf("n");for(i=1;i<n;i+) for(j=1;j<=2*n-i-1;j+)if(j>i) printf("*");else printf(" ");printf("n");【】參考答案:main( ) int i,j,n;printf("nPlease Enter n: ");scanf("%d",&n);for(i=

19、1;i<=n;i+) for(j=1;j<=n+i-2;j+)if(j=n-i+1) printf("*");else printf(" ");printf("*n");【】分析:首先對圖形進行設計,坐標的X軸和Y軸分別對應屏幕的列和行,一個正弦函數的周期為0360度,我們把一個步長定義為10度,打印時每換一行等于函數的自變量增加10度;屏幕的列寬為80,函數值為0對應屏幕的第40列,sin(x)的值在-11,變換成列數為以0為中心的-3030,對應屏幕上第1070列。設計程序時,控制換行的自變量i乘以10得到正弦函數的X

20、值,調用庫函數sin()求出函數值再乘以30輸出的列寬,因為我們以屏幕的第40列為0點,故再加上40得到應在屏幕上顯示的點。參考答案:#define PAI #include <>main( ) double x;int y,i,yy;for(i=1;i<80;i+) /* 打印圖形的第一行 */if(i=40) printf("*"); /* i控制打印的列位置 */ else printf("-");printf("n");for(x=;x<=;x+=10.) /* 從10度到360度 */ y = 40+

21、30*sin(x*PAI/; /* 計算對應的列 */yy = 40>y 40 : y; /* 下一行要打印的字符總數 */for (i=1;i<=yy;i+) /* 控制輸出圖形中的一行 */ if(i=y) printf("*"); /* i控制打印的列位置 */else if(i=40) printf("|"); /* 打印中心的豎線 */else printf(" ");printf("n");【】分析:首先設計屏幕圖形,如果預計圓形在屏幕上打印20行,所以定義圓的直徑就是20,半徑為10,圓的

22、方程是X2×Y2=R2,因為圖形不是從中心開始打印而是從邊沿開始,所以Y從10變化到-10,根據方程求出X,對求得的X值再根據屏幕行寬進行必要的調整得到應打印的屏幕位置。參考答案:#include <>main( ) double y;int x,m;for(y=10;y>=-10;y-) /* 圓的半徑為10 */ m = * sqrt(100-y*y); /* 計算行y對應的列坐標m */for(x=1;x<30-m;x+) printf(" "); /* 輸出圓左側的空白 */printf("*"); /* 輸出圓

23、的左側 */for(;x<30+m;x+) printf(" "); /* 輸出圓的空心部分 */printf("*n"); /* 輸出圓的右側 */【】參考答案:#include <>#include <>main( ) double y;int x, m, n, yy;for( yy=0;yy<=20;yy+) y = *yy;m = acos(1-y)*10;n = 45 * (y-1)+31;for( x=0;x<=62;x+ )if( x=m && x=n ) printf("

24、+");else if(x=n) printf("+");else if(x=m | x=62-m) printf("*");else printf(" ");printf("n");【】分析:編程的關鍵為兩點,一是使用控制輸出的行和列,這方面的內容在前面已經敘述,另一點是輸出的數字和所在行、列關系。此題第一行輸出的數字恰好是列數,從第二行起每行的數字均比上一行增n。參考答案:main( ) int i,j,n;printf("nPlease Enter n: ");scanf(&qu

25、ot;%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n;j+)printf("%4d",(i-1)*n+j);printf("n");【】分析:此題的關鍵是找到輸出數字和行、列數的關系。審查圖形中每行中數字的關系發現,右邊數字和前面數字之差逐次增1;同列數字依然是這樣的關系,編程的關鍵轉換為找到每一行左方的第一個數字,然后利用行和列的循環變量進行運算就可得到每個位置的數字。用ai,j此表示第i行第j列的數字,則a11=1;由第i行第一列的數字推出第i+1行第一列的數字是ai+1,1 = ai,1+i

26、;同樣由第j列推出第j+1列的數字是ai,j+1 = ai,j+i+j。另外只有當j<i時才輸出數字。參考答案:main( ) int i,j,m,n,k=1; /* k是第一列元素的值 */printf("Please enter m=" ");scanf("%d",&m);for(i=1;i<=m;i+) n=k; /* n第i行中第1個元素的值 */for(j=1;j<=m-i+1;j+) printf("%3d",n);n = n+i+j; /* 計算同行下一個元素的值 */printf(&

27、quot;n");k=k+i; /* 計算下一行中第1個元素 */ 【】參考答案:main( ) int i,j,n;printf("nPlease Enter n: ");scanf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n;j+)if(j<=i) printf(" 1");else printf("%3d",j-i+1);printf("n");【】分析:可用不同的方案解決此問題,為了開闊讀者的思路,這里給出了兩個參考答

28、案,其中第二個答案是使用了遞歸方法。方案一:首先尋找數字輸出數字和行列的關系。每圈有四個邊,把每邊的最后一個數字算為下邊的開始,最外圈每邊數字個數是n-1個,以后每邊比外邊一邊少兩個數字。因為數字是一行一行輸出的,再分析每行數字的規律。實際沒有的數字有三種規律:位于對角線之間的數字是上半圖增一,下半圖減一。對角線左側的各列,右側比左側增加了一圈數字,例如數字39和它左側的22比較,數字39所在的圈每邊4個數字,左側22加上一圈16個數字在加1就是39。同理,對角線右側的各列,則減少一圈的數字個數。根據以上分析,用兩個對角線將圖形分為四個區域,如下圖所示,圖中黑斜體字為對角線上的數字。1 2 3

29、 4 5 6 724 25 26 27 28 29 8 23 40 41 42 43 30 9 22 39 48 49 44 31 1021 38 47 46 45 32 1120 37 36 35 34 33 1219 18 17 16 15 14 13為敘述方便我們稱四個區域為上、下、左、右區。設i、j為行列號,n為圖形的總行數,則滿足各區的范圍是,上區:j>=i 且 j<=n-i+1 ;下區:j<=i 且 j>=n-i+1 ;左區:j<i 且 j<n-i+1 ;右區:j>i 且 j>n-i+1 ?,F在問題是,如果知道一行在不同區域開始第一個

30、位置的數字,然后該區后續的數字就可利用前面分析的規律得到。對于右區開始各行第一個數字最易求出,為4*(n-1)-i+1。后續一個和同行前一個數字之差是4*n-1-(j-1)*2+1,其中方括號內是每邊的數字個數。對角線上的數字是分區點,對角線上相臨數字仍然相差一圈數字個數,讀者自行分析得到計算公式。右區開始的第一個數字可以從上區結束時的數字按規律求出。下述程序用變量s保存分區對角線上的數字。參考答案一:main() int i,j,k,n,s,m,t;printf("Please enter n:");scanf("%d",&n);for(i=1

31、;i<=n;i+) s=(i<=(n+1)/2) 1:3*(n-(n-i)*2-1)+1;m=(i<=(n+1)/2) i:n-i+1; /* m-1是外層圈數 */for(k=1;k<m;k+) s+=4*(n-2*k+1);for(j=1;j<=n;j+) if(j>=n-i+1 && j<=i) /* 下區 */t=s-(j-(n-i)+1;if(j>=i && j<=n-i+1) /* 上區 */t=s+j-i;if(j>i && j>n-i+1) /* 右區 */t-=4

32、*(n-2*(n-j+1)+1;if(j<i && j<n-i+1) /* 左區 */ if(j=1) t=4*(n-1)-i+2;else t+=4*(n-2*j+1)+1;printf("%4d",t);printf("n"); 方案二:根據本題圖形的特點,我們可以構造一個遞歸算法。我們可以將邊長為N的圖形分為兩部分:第一部分最外層的框架,第二部分為中間的邊長為N-2的圖形。對于邊長為N的正方型,若其中每個元素的行號為i(1iN),列號為j(1jN),第1行第1列元素表示為a1,1(a11=1),則有:對于最外層的框架可以

33、用以下數學模型描述:上邊: a1,j=a1,1+j-1 (j1)右邊: ai,N=a1,1+N+i-2 (i1)下邊: ai,1=a1,1+4N-i-3 (i1)左邊: aN,j=a1,1+3N-2-j (j1)對于內層的邊長為N-2的圖形可以用以下數學模型描述:左上角元素:ai,i=ai-1,i-1+4(N-2i-1) (i1)若令:ai,j=fun(ai-1,i-1+4(N-2i-1),當:i(N+1)/2且j(N+1)/2時,min=MIN(i,j),則有:a2,2 = fun(a1,1, min, min, n)ai,j=fun(a2,2, i-min+1, j-min+1, n-2*

34、(min-1) )我們可以根據上述原理,分別推導出i和j為其它取值范圍時的min取值。根據上述遞歸公式,可以得到以下參考程序。參考答案二:#include <>#define MIN(x,y) (x>y) (y) : (x)fun ( int a11, int i, int j, int n) int min, a22;if( i=j && i<=1 ) return(a11);else if( i=j && i<=(n+1)/2) return( fun(a11,i-1,i-1,n)+4*(n-2*i+3);else if( i=

35、1 && j!=1) return( a11+j-1 );else if( i!=1 && j=n) return( a11+n+i-2 );else if( i!=1 && j=1 ) return ( a11+4*n-3-i );else if( i=n && j!=1 ) return ( a11+3*n-2-j );else if(i>=(n+1)/2 && j>=(n+1)/2) min = MIN(n-i+1,n-j+1);else if(i<(n+1)/2 && j&

36、gt;=(n+1)/2) min = MIN(i,n-j+1);else if(i>=(n+1)/2 && j<(n+1)/2) min = MIN(n-i+1,j);else min = MIN(i,j);a22 = fun(a11,min,min,n);return(fun(a22, i-min+1, j-min+1, n-2*(min-1);main() int a11=1, i, j, n;printf("Enter n=");scanf("%d", &n);for(i=1; i<=n; i+) for(

37、j=1; j<=n; j+)printf("%4d", fun(a11,i,j,n) );printf("n"); 【】分析:此題的關鍵還是要找到輸出數字aij和行列數i、j的關系。為此將圖形分為四個區域如下圖:3 3 3 3 3 3 2 2 2 3 3 2 1 2 3 3 2 2 2 3 3 3 3 3 3 (此圖n為5)在左上區域,即i<=(n+1)/2、j<=(n+1)/2時,輸出數字為(n+1)/2-i+1和(n+1)/2-j+1中的大者,記為max(n+1)/2-i+1,(n+1)/2-j+1;在右上區,即i<=(n+1

38、)/2、j>(n+1)/2時, 輸出數字為max(n+1)/2-i+1,j-n/2;在左下區,即i>(n+1)/2、j<=(n+1)/2時,輸出數字為maxi-n/2,(n+1)/2-j+1;在右下區,即i>(n+1)/2、j>(n+1)/2時,輸出數字為maxi-n/2,j-n/2。參考答案:#define max(x,y) (x)>(y)(x):(y)main( ) int i,j,n;printf("nPlease Enter n:");scanf("%d",&n);for(i=1;i<=n;i+)

39、 for(j=1;j<=n;j+)if(i<=(n+1)/2)if(j<=(n+1)/2)printf("%4d",max(n+1)/2-i+1,(n+1)/2-j+1);elseprintf("%4d",max(n+1)/2-i+1,j-n/2);else if(j<=(n+1)/2)printf("%4d",max(i-n/2,(n+1)/2-j+1);elseprintf("%4d",max(i-n/2,j-n/2);printf("n");【】分析:前面我們已經見

40、到過上下對稱的圖形,這是一個左右對稱的圖形,垂直中心線上的數字恰好是行號,在每行位于圖形垂直中心線左方的數字是逐漸增加的,而右方是逐漸減小的。j=i是分區的標志,左方輸出數字就是列數j,而右方的數字從i開始逐步減小1。參考答案:main() int i,j;for(i=1;i<=9;i+) for(j=1;j<=9-i;j+) printf(" ");for(j=1;j<=i;j+) printf("%2d",j);for(j=i-1;j>=1;j-) printf("%2d",j);printf("

41、n"); 【】分析:這類輸出字符的圖形和輸出數字的圖形考慮是近似的,因為字符的ASCII碼就是一個整數。在字符碼值的變化過程中,應該注意應該判斷碼值是否超出字符的范圍,進行必要的處理,為了保持程序的簡潔,本題沒有考慮這個問題,在下題里對這個問題進行了處理。參考答案:main( ) char c='Z';int i,j,n;printf("nPlease Enter n:");scanf("%d",&n);for(i=1;i<=n;i+) for(j=1;j<=n+i-2;j+)if(j=n-i+1) prin

42、tf("%c",c-);else printf(" ");printf("%cn",c-);for(i=1;i<n;i+) for(j=1;j<=2*(n-1)-i;j+)if(j=i+1) printf("%c",c-);else printf(" ");printf("%cn",c-);【】分析:此題與上題相近,區別在于輸出時字符的ASCII碼值的變化在圖形的中間一行為最大,同時一行的兩個字符是相同的。程序考慮在輸入字符時設計了一個循環,保證輸入的是英文字母。

43、字符變化后進行了處理,程序中使用條件運算。在字符碼值增加的過程中,首先判斷是大寫還是小寫字符,然后判斷字符碼值是否超出英文字母z(或Z),如果超出則重新賦為a(或A);在輸出圖象下半部分時,ASCII碼值減少用同樣的思路進行判斷。在判斷字符大小寫(條件語句的第一個判斷)時,用的是兩個不同的值,請讀者自行思考為什么,用同一個值是否可以參考答案:main( ) char c;int i,j,n;do printf("nPlease Enter n,char:");scanf("%d,%c",&n,&c);while(c<'A&#

44、39;|c>'Z'&&c<'a'|c>'z');for(i=1;i<=n;i+) for(j=1;j<=n+i-2;j+)if(j=n-i+1) printf("%c",c);else printf(" ");printf("%cn",c+);c=c<'a'(c>'Z''A':c):(c>'z''a':c);c-=2;c=c<'Z&

45、#39;(c<'A''Z':c):(c<'a' 'z':c);for(i=1;i<n;i+) for(j=1;j<=2*(n-1)-i;j+)if(j=i+1) printf("%c",c);else printf(" ");printf("%cn",c-);c=c<'Z'(c<'A''Z':c):(c<'a' 'z':c);【】參考答案:#define max(x,y) (x)>(y)(x):(y)main( ) char c;int i,j,n;do printf("nPlease Enter n,char:");scanf("

溫馨提示

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

評論

0/150

提交評論