C語言圖形輸出習題_第1頁
C語言圖形輸出習題_第2頁
C語言圖形輸出習題_第3頁
C語言圖形輸出習題_第4頁
C語言圖形輸出習題_第5頁
已閱讀5頁,還剩17頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

【】輸入n值,輸出以以下圖矩形。【】輸入n值,輸出以以下圖平行四邊形。【】輸入n值,輸出以以下圖高為n的等腰三角形。【】輸入n值,輸出以以下圖高為n的等腰三角形。【】輸入n值,輸出以以下圖高和上底均為n的等腰梯形。【】輸入n值,輸出以以下圖高和上底均為n的等腰空心梯形。【】輸入n值,輸出以以下圖邊長為n的空心正六邊型。【】輸入n值,輸出以以下圖圖形。【】輸入n值,輸出以以下圖圖形。【】輸入n值,輸出以以下圖圖形。【】輸入n值,輸出以以下圖圖形。【】輸入n值,輸出以以下圖圖形。【】輸入n值,輸出以以下圖圖形。(例為n=6時)【】編寫程序,輸出以以下圖sin(x)函數0到2π的圖形。【】編寫程序,在屏幕上輸出一個由*號圍成的空心圓。【】編寫程序,在屏幕上繪制如圖余弦曲線和直線。若屏幕的橫向為x軸,縱向為y軸,在屏幕上顯示0~360度的cos(x)曲線與直線x=f(y)=45*(y-1)+31的迭加圖形。此中cos圖形用"*"表示,f(y)用"+"表示,在兩個圖形的交點處則用f(y)圖形的符號。【】編寫程序,輸出以以下圖高度為n的圖形。【】編寫程序,輸出以以下圖高度為n的圖形。【】輸入n值,輸出以以下圖圖形。【】輸入n值,輸出以以下圖的n×n(n<10)階螺旋方陣。12345161718196152425207142322218131211109圖n=5時的螺旋方陣【】輸入n值,輸出以以下圖回型方陣。【】輸出以以下圖的數字金字塔【】輸入n值,輸出以以下圖圖形。【】輸入頂行字符和圖形的高,輸出以以下圖圖形。【】輸入首字符和高后,輸出以以下圖回型方陣。AAAAAABBBAABCBAABBBAAAAAA圖首字符為'A'、高為5的方陣【】輸入中心字符和高后,輸出以以下圖回型方陣。XXXXXXYYYXXYZYXXYYYYXXXXX圖中心字符為'Z'、高為5的方陣【】編寫程序,輸出以以下圖上三角形式的乘法九九表。【】編寫程序,輸出以以下圖下三角乘法九九表。【】分析:打印此圖形用雙重循環實現。圖形要重復n行,故采納循環結構實現循環n次,循環體內部打印一行'*'號,把上述思路表示為:for(i=1;i<=n;i++)打印一行'*'號;每行有n個'*'號,再采納循環結構實現號,即:for(j=1;j<=n;j++)

n次循環,循環內部用格式輸出語句打印一個

'*'printf("*")

;依據上述思路,實現打印矩形。參照答案:main( ){inti,j,n

;printf("\nPleaseEntern:")

;scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("*");printf("\n")

;}}【】分析:此圖形和上題的差別在于在每一行先要打印空格,而后再打印n個'*'號,在上題第一層循環體內打印'*'號的循環前面增添一個循環打印空格。每行空格的個數是逐行減少的,因為第一層循環的控制變量i是逐行增1,所以用一個固定值的數減去i即可實現對空格個數的控制,在本題中固定值可使用變量n。參照答案:main( ){inti,j,n

;printf("\nPleaseEntern:")

;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");}}【】分析:本題和上題的差別在于每行'*'的數目逐行減少,能夠使用上題控制空格個數的思路來控制'*'號的個數,請注意每行'*'的個數都是奇數。參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");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題圖形的垂直反轉,在編程上我們能夠變換一個思路。關于圖形中的第i行(1≤i≤n),共需要輸出2n-i個字符,此中前面的i-1個字符為空格,后邊的字符為'*'號。依據這一思路能夠編寫出以下程序。參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)/*重復輸出圖形的n行*/{for(j=1;j<=2*n-i;j++)/*重復輸出圖形一行中的每個字符*/if(j<=i-1)printf("");/*輸出前面的空格*/elseprintf("*");/*輸出后邊的*號*/printf("\n");}}【】分析:本題和第3題的差別僅是每行的'*'個數增添n-1個。參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");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("*");printf("\n");}}【】分析:關于空心圖形,我們能夠在上題的基礎上,關于打印'*'號的循環進行改正,僅在循環開始值(j=1)和循環結束值(j=2*(i-1)+n)時打印'*'號,其他地點都打印空格。另一種思路是將每行打印的空格和'*'的兩個循環合為一體考慮,在判斷出需要打印'*'的兩個位置及第一行和最后一行相應地點外,其他地點都打印空格。參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&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("*");elseprintf("");printf("*\n");}}【】分析:此圖形能夠理解為兩個空心梯形反向連結而成,所以能夠利用上題的思路進行輸出。參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)/*輸出圖形的上半部分(含中心行)*/{for(j=1;j<=2*n-i-1;j++)if(j==i)printf("*");elseprintf("");printf("*\n");}for(i=1;i<n;i++)/*輸出圖形的下半部分(不含中心行)*/{for(j=1;j<=n+i;j++)if(j==n-i)printf("*");elseprintf("");printf("*\n");}}【】分析:本題與上題的差別在于打印'*'號的地點不一樣,編程時要找出應打印'*'號的地點和兩個循環變量i、j以及行數n的關系。參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");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("*");elseprintf("");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("*");elseprintf("");printf("*\n");}}【】參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(j==n-i+1||i==1||i==n)printf("*");elseprintf("");printf("\n");}}【】參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++)/*輸出圖形的上半部分(含中心行)*/{for(j=1;j<=n-i;j++)if(j==1||j==n-i+1)printf("*");elseprintf("");printf("\n");}for(i=1;i<n;i++)/*輸出圖形的下半部分(不含中心行)*/{for(j=1;j<=i+1;j++)if(j==1||j==i+1)printf("*");elseprintf("");printf("\n");}}【】參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(j==1||j==i||j==n)printf("*");elseprintf("");printf("\n");}}【】參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n+i-1;j++)if(j>n-i)printf("*");elseprintf("");printf("\n");}for(i=1;i<n;i++){for(j=1;j<=2*n-i-1;j++)if(j>i)printf("*");elseprintf("");printf("\n");}}【】參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n+i-2;j++)if(j==n-i+1)printf("*");elseprintf("");printf("*\n");}}【】分析:第一對圖形進行設計,坐標的X軸和Y軸分別對應屏幕的列和行,一個正弦函數的周期為0~360度,我們把一個步長定義為10度,打印時每換一行等于函數的自變量增添10度;屏幕的列寬為80,函數值為0對應屏幕的第40列,sin(x)的值在-1~1,變換成列數為以0為中心的-30~30,對應屏幕上第10~70列。設計程序時,控制換行的自變量i乘以10獲得正弦函數的X值,調用庫函數sin( )求出函數值再乘以30輸出的列寬,因為我們以屏幕的第40列為0點,故再加上40獲得應在屏幕上顯示的點。參照答案:#definePAI#include<>main( ){doublex;inty,i,yy;for(i=1;i<80;i++)/*打印圖形的第一行*/if(i==40)printf("*");/*i控制打印的列地點*/elseprintf("-");printf("\n");for(x=;x<=;x+=10.)/*從10度到360度*/{y=40+30*sin(x*PAI/;/*計算對應的列*/yy=40>y?40:y;/*下一行要打印的字符總數*/for(i=1;i<=yy;i++)/*控制輸出圖形中的一行*/{if(i==y)printf("*");/*i控制打印的列地點*/elseif(i==40)printf("|");/*打印中心的豎線*/elseprintf("");}printf("\n");}}【】分析:第一設計屏幕圖形,假如估計圓形在屏幕上打印20行,所以定義圓的直徑就是20,半徑為10,圓的方程是X2×Y2=R2,因為圖形不是從中心開始打印而是從邊緣開始,所以Y從10變化到-10,依據方程求出X,對求得的X值再依據屏幕行寬進行必需的調整獲得應打印的屏幕地點。參照答案:#include<>main( ){doubley

;intx,m;for(y=10;y>=-10;y--)/*{m=*sqrt(100-y*y);

/*

圓的半徑為10*/計算行y對應的列坐標

m*/for(x=1

;x<30-m;x++)printf("");/*輸出圓左邊的空白*/printf("*");/*輸出圓的左邊*/for(;x<30+m;x++)printf("");/*輸出圓的空心部分*/printf("*\n");/*輸出圓的右邊*/}}【】參照答案:#include<>#include<>main( ){doubley;intx,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("+");elseif(x==n)printf("+");elseif(x==m||x==62-m)printf("*");elseprintf("");printf("\n");}}【】分析:編程的要點為兩點,一是使用控制輸出的行和列,這方面的內容在前面已經表達,另一點是輸出的數字和所內行、列關系。本題第一行輸出的數字恰巧是列數,從第二行起每行的數字均比上一行增n。參照答案:main( ){inti,j,n;printf("\nPleaseEntern:")scanf("%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;相同由第j列推出第j+1列的數字是ai,j+1=ai,j+i+j其他只有當j<i時才輸出數字。參照答案:

行。main( ){inti,j,m,n,k=1;/*kprintf("Pleaseenterm="")

是第一列元素的值;

*/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("\n");k=k+i;/*計算下一行中第1個元素*/}}【】參照答案:main( ){inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(j<=i)printf("1");elseprintf("%3d",j-i+1);printf("\n");}}【】分析:可用不一樣的方案解決此問題,為了寬闊讀者的思路,這里給出了兩個參照答案,此中第二個答案是使用了遞歸方法。方案一:第一找尋數字輸出數字和隊列的關系。每圈有四個邊,把每邊的最后一個數字算為下面的開始,最外圈每邊數字個數是n-1個,以后每邊比外邊一邊少兩個數字。因為數字是一行一行輸出的,再分析每行數字的規律。實質沒有的數字有三種規律:位于對角線之間的數字是上半圖增一,下半圖減一。對角線左邊的各列,右邊比左邊增添了一圈數字,比方數字39和它左邊的22比較,數字39所在的圈每邊4個數字,左邊22加上一圈16個數字在加1就是39。同理,對角線右邊的各列,則減少一圈的數字個數。依據以上分析,用兩個對角線將圖形分為四個地區,以以下圖所示,圖中黑斜體字為對角線上的數字。1234567242526272829823404142433092239484944311020373635343312為表達方便我們稱四個地區為上、下、左、右區。設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。此刻問題是,假如知道一行在不一樣地區開始第一個地點的數字,而后該區后續的數字即可利用前面分析的規律獲得。關于右區開始各行第一個數字最易求出,為4*(n-1)-i+1。后續一個和同行前一個數字之差是4*[n-1-(j-1)*2]+1,此中方括號內是每邊的數字個數。對角線上的數字是分區點,對角線上相臨數字仍舊相差一圈數字個數,讀者自行分析獲得計算公式。右區開始的第一個數字能夠從上區結束時的數字按規律求出。下述程序用變量s保留分區對角線上的數字。參照答案一:main( ){inti,j,k,n,s,m,t;printf("Pleaseentern:");scanf("%d",&n);for(i=1;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*(n-2*(n-j+1))+1;if(j<i&&j<n-i+1)/*左區*/{if(j==1)t=4*(n-1)-i+2;elset+=4*(n-2*j+1)+1;}printf("%4d",t);}printf("\n");}}方案二:依據本題圖形的特色,我們能夠結構一個遞歸算法。我們能夠將邊長為N的圖形分為兩部分:第一部分最外層的框架,第二部分為中間的邊長為N-2的圖形。關于邊長為N的正方型,若此中每個元素的行號為i(1≤i≤N),列號為j(1≤j≤N),第1行第1列元素表示為a1,1(a11=1),則有:關于最外層的框架能夠用以下數學模型描繪:上面:a1,j=a1,1+j-1(j≠1)右邊:ai,N=a1,1+N+i-2(i≠1)下面:ai,1=a1,1+4N-i-3(i≠1)左邊:aN,j=a1,1+3N-2-j(j≠1)關于內層的邊長為N-2的圖形能夠用以下數學模型描繪:左上角元素:ai,i=ai-1,i-1+4(N-2i-1)(i>1)若令: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*(min-1))我們能夠依據上述原理,分別推導出i和

j

為其他取值范圍時的

min

取值。依據上述遞歸公式,能夠獲得以下參照程序。參照答案二:#include<>#defineMIN(x,y)(x>y)?(y):(x)fun(inta11,inti,intj,intn){intmin,a22;if(i==j&&i<=1)return(a11);elseif(i==j&&i<=(n+1)/2)return(fun(a11,i-1,i-1,n)+4*(n-2*i+3));elseif(i==1&&j!=1)return(a11+j-1);elseif(i!=1&&j==n)return(a11+n+i-2);elseif(i!=1&&j==1)return(a11+4*n-3-i);elseif(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);elseif(i<(n+1)/2&&j>=(n+1)/2)min=MIN(i,n-j+1);elseif(i>=(n+1)/2&&j<(n+1)/2)min=MIN(n-i+1,j);elsemin=MIN(i,j);a22=fun(a11,min,min,n);return(fun(a22,i-min+1,j-min+1,n-2*(min-1)));}}main( ){inta11=1,i,j,n;printf("Entern=");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%4d",fun(a11,i,j,n));printf("\n");}}【】分析:本題的要點還是要找到輸出數字

aij

和隊列數

i、j

的關系。為此將圖形分為四個地區以以下圖:3333332223321233222333333(此圖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)/2、j>(n+1)/2時,輸出數字為max{(n+1)/2-i+1,j-n/2};在左下區,即i>(n+1)/2、j<=(n+1)/2時,輸出數字為max{i-n/2,(n+1)/2-j+1};在右下區,即i>(n+1)/2、j>(n+1)/2時,輸出數字為max{i-n/2,j-n/2}

。參照答案:#definemax(x,y)((x)>(y)?(x):(y))main( ){inti,j,n

;printf("\nPleaseEntern:")

;scanf("%d",&n);for(i=1;i<=n;i++){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));elseif(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");}}【】分析:前面我們已經見到過上下對稱的圖形,這是一個左右對稱的圖形,垂直中心線上的數字恰巧是行號,在每行位于圖形垂直中心線左方的數字是逐漸增添的,而右方是逐漸減小的。j==i是分區的標記,左方輸出數字就是列數j,而右方的數字從i開始逐漸減小1。參照答案:main( ){inti,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("\n");}}【】分析:這種輸出字符的圖形和輸出數字的圖形考慮是近似的,因為字符的ASCII碼就是一個整數。在字符碼值的變化過程中,應當注意應當判斷碼值能否高出字符的范圍,進行必要的辦理,為了保持程序的簡短,本題沒有考慮這個問題,在下題里對這個問題進行了辦理。參照答案:main( ){charc='Z';inti,j,n;printf("\nPleaseEntern:");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n+i-2;j++)if(j==n-i+1)printf("%c",c--);elseprintf("");printf("%c\n",c--);}for(i=1;i<n;i++){for(j=1;j<=2*(n-1)-i;j++)if(j==i+1)printf("%c",c--);elseprintf("");printf("%c\n",c--);}}【】分析:本題與上題周邊,差別在于輸出時字符的ASCII碼值的變化在圖形的中間一行為最大,同時一行的兩個字符是相同的。程序考慮在輸入字符時設計了一個循環,保證輸入的是英文字母。字符變化后進行了辦理,程序中使用條件運算。在字符碼值增添的過程中,首先判斷是大寫還是小寫字符,而后判斷字符碼值能否高出英文字母z(或Z),假如高出則重新賦為a(或A);在輸出圖象下半部分時,ASCII碼值減少用相同的思路進行判斷。在判斷字符大小寫(條件語句的第一個判斷)時,用的是兩個不一樣的值,請讀者自行思慮為何,用同一個值能否能夠?參照答案:main( ){charcinti,j,n

;;do{printf("\nPleaseEntern,char:")

;scanf("%d,%c",&n,&c);}while(c<'A'||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)

;elseprintf("")

;printf("%c\n",c++)

;c=c<'a'?(c>'Z'?'A':c):(c>'z'?'a':c)

;}c-=2;c=c<'Z'?(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);elseprintf("");printf("%c\n",c--);c=c<'Z'?(c<'A'?'Z':c):(c<'a'?'z':c)}

;}【】參照答案:#definemax(x,y)((x)>(y)?(x):(y))main( ){charc;inti,j,n;do{printf("\nPleaseEnte

溫馨提示

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

評論

0/150

提交評論