⑴ 急!c語言如何顯示漢字
先說明一下:在TC下面顯示漢字是比較麻煩的,實在想用,可以用VC。
DOS下的點陣漢字
你是否碰到過用啟動盤啟動系統後用DIR命令得到一串串莫名其妙的字元?有經驗的朋友會告訴你:那是漢字。漢字?你不禁會問:怎麼一個我一個也不認識。但那確確實實是漢字,如果你啟動UCDOS或其他的漢字系統後,就會看到那是一個個熟悉的漢字。同樣是漢字,為什麼前後會看到不同的結果?呵呵,其實在電腦硬體中,根本沒有漢字這個概念,也沒有英文的概念,這鐵玩意認識的概念只有——內碼。
☆漢字的內碼
點頭表示什麼?是「對」、「YES」,偏偏有的地方表示的意義卻恰恰相反。一個動作,有不同的詮釋;一個問題,有不同的答案;而一個符號,卻有不同的意義,關鍵在於:你是如何地理解。在電腦中亦如此,所有的數據都是以0和1保存的,按不同的數據操作,可以得到不同的結果。對於顯示英文操作,由於英文字母種類很少,只需要8位(一位元組)即可。而對於中文,常用卻有5000以上,於是我們的DOS前輩想了一個辦法,就是將ASCII表的高128個很少用到的數值以兩個為一組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文字元使用,即英文的內碼。不信,你可以用記事本寫一C文件:
main()
{
unsigned char *s,*e="ABcd",*c="你好";
clrscr();
printf("English char =");
s=e;
while(*s!=0) /*C的字元串以0為結束符*/
{
printf("%3d,",*s);
s++;
}
printf("\nChinease char=");
s=c;
while(*s!=0)
{
printf("%3d,",*s);
s++;
}
getch();
}
再用TC輸入*.txt打開運行,看見了沒有,那些數值即英文和漢字的各位元組內碼。
☆漢字字模
得到了漢字的內碼後,還僅是一組數字,那又如何在屏幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了根本的變化,它是用數字的各位信息來記載英文或漢字的形狀。在硬體系統內,英文的字模信息一般固化在ROM里,即使在沒有進入系統的CMOS里,也可以讓你看到英文字元。而在DOS下,中文的字模信息一般記錄在漢字型檔文件HZK16里。
☆漢字型檔文件
了解字母和漢字是按字模位信息顯示的原理後,那如何得到漢字的字模信息呢?難道要我們自己去做?NO。DOS前輩們經過艱辛的努力,將製作好的字模放到了一個個標準的庫中以免去後輩的麻煩,這就是點陣字型檔文件。一般我們使用16*16的點陣宋體字型檔,所謂16*16,是每一個漢字在縱、橫各16點的區域內顯示的。不過後來又有了HZK12、HZK24,HZK32和HZK48字型檔及黑體、楷體和隸書字型檔。雖然漢字型檔種類繁多,但都是按照區位的順序排列的。前一個位元組為該漢字的區號,後一個位元組為該字的位號。每一個區記錄94個漢字,位號則為該字在該區中的位置。因此,漢字在漢字型檔中的具體位置計算公式為:94*(區號-1)+位號-1。減1是因為數組是以0為開始而區號位號是以1為開始的。這僅為以漢字為單位該漢字在漢字型檔中的位置,那麼,如何得到以位元組為單位得到該漢字在漢字型檔中的位置呢?只需乘上一個漢字字模佔用的位元組數即可,即:(94*(區號-1)+位號-1)*一個漢字字模佔用位元組數,而按每種漢字型檔的漢字大小不同又會得到不同的結果。以16*16點陣字型檔為例,計算公式則為:(94*(區號-1)+(位號-1))*32。漢字型檔文該從該位置起的32位元組信息即記錄了該字的字模信息。
☆點陣漢字的顯示
了解點陣漢字及漢字型檔的構成原理後,顯示漢字就變得簡單。以16*16點陣字型檔為例,通常的方法是:將文件工作指針移到需要的漢字字模處、將漢字型檔文件讀入一2*16數組再用for循環一位位地顯示。以使用VGAHI模式顯示「我」字為例,程序如下:
#include "graphics.h"
#include "stdio.h"
main()
{
int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*獲得區碼與位碼*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*測試為1的位則顯示*/
putpixel(i*8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}
怎麼樣?只要掌握了正確的方法,顯示漢字並不復雜。
☆列印字型檔文件和HZK12
如果你有UCDOS的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體),你還可以使用不同字體的大字模漢字了。HZK24系列是24*24的點陣字型檔,每字模佔用3*24位元組。如果你按照HZK16的顯示方法的話,你會看到......呵呵,字被放倒了。這是因為該類字型檔與一般的漢字型檔不同,這類大字模漢字型檔是專供列印的列印字型檔,為了列印的方便將字模都放倒了,你使用時,只要將字模的位信息縱橫轉置顯示即可。例如你如果定義為mat[24][3]則應該這樣輸出:
for(i=0;i<24;i++)
for(j=0;j<24;j++)
if((0x80>>i%8)&mat[j][i/8]) /*轉置顯示*/
putpixel(j+x,y+i,color);
還有一類字型檔HZK12,雖然屬於標准字型檔類型,但如果你將它的字模當作12*12位計算的話,根本無法正常顯示漢字。因為字型檔設計者為了使用的方便,字摸每行的位數均補齊為8的整數倍,於是實際該字型檔的位長度是16*12,雖然每行都多出了4位,但這4位都是0(不顯示),並不影響顯示效果。
☆理論差不多了下面是我寫的一個實踐例子
/*
*TC下的漢字顯示演示程序
*LO幾又VE 22:58 2005-5-23
*將hzk16文件放至TC安裝目錄下
*hzk16文件下載地址
*下載字體文件
*/
#include <graphics.h>
#include <stdio.h>
#define MAXX 640 /*屏幕寬度 */
#define MAXY 480 /*屏幕高度 */
#define WIDTH 20 /*每一漢字寬度*/
#define HIGH 20 /*每一漢字高度*/
int priChi(unsigned char *); /*中文列印函數,傳入參數:中文數組指針 返回值 -1 異常 0 正常*/
int X=0; /*全局變數X Y控制中文列印格式*/
int Y=0;
int main()
{
char chinese[][60]={/*TC編譯器不支持長行 所以將中文字元串以二維形式存放*/
"我放棄清華計算機專業的保送資格而選擇參加高考的消息震撼了全校",
"從校長到班主任到各科目任課老師都找我談過話我有點驚異他們的變",
"化在我獲得全國信息大賽一等獎外加特別獎以前我似乎是個可有可無",
"的人物突然間變的如此的炙手可熱我覺得我的大腦前所未有的不夠用",
"說起這個特別獎還真的挺有意思雖然叫全國決賽但也無非是出幾個筆",
"試題再弄個上機程序編一下限時總共是三小時規定語言是西語言或者",
"派司卡在我花了半個小時分別用兩種語言把該程序完成後我覺得坐在",
"那實在是浪費我的大好青春於是我決定用匯編語言把它再寫一遍本來",
"我准備用微操作的十六進制碼寫的但考慮到時間問題只好放棄有人說",
"是金子總會發光此話誠不欺我啊正當我熱火朝天全心投入編程的時候",
"卻不知道自己已經被某人注意了很久了三小時之後我走出考場之後某",
"人趕緊抓住我很興奮的叫了一聲小朋友這聲小朋友直接導致我在數年",
"後還經常從噩夢中驚醒同時也是我拒絕清華邀請的直接導火索我們把",
"話題回到事發現場我在嚇了很大一跳後把頭轉了回來一個瘦干老頭正",
"抓著我的手兩眼放光的樣子還似乎是略帶深情的看著我我全身雞皮疙",
"瘩頓時爭先恐後的向外鑽我渾身一個機靈趕緊抖手老頭似乎感覺到了",
"異樣送開我的手略帶尷尬的道小朋友我自我介紹一下我是清華大學計",
"算機系的主任受邀到比賽的現場觀看順便看看有沒有什麼可挖掘的人",
"才那個你明白我的意思吧這句話很是影響清華學生理解力在我心目中",
"的地位你這意思不就是認為我是可挖掘的人才嗎我點了點頭老頭看我",
"能理解顯的很興奮然後開始滔滔不決的向我介紹清華計算機專業的實",
"力如何如何的雄厚在國內甚至國際是如何如何的有影響力最後滿懷深",
"情的看了我眼嚴肅的告訴我他將代表清華計算機專業歡迎我去他們那",
"念書我苦苦忍耐著他的飛濺唾沫委婉的表示這件事非同小可我必須回",
"家和父母商量一下然後逃也似的離開當然第一個去的地方是衛生間我",
"的臉啊誰知道老頭的唾沫會不會讓我的臉起老年斑回到學校的一個禮",
"拜後我就接到了清華正式邀請這個消息經我班主任的烏鴉嘴迅速在全",
"校蔓延而後又經過各種渠道迅速匯總到我父母耳朵"};
if(-1 == priChi(chinese))
{ /*列印異常*/
printf("Press any key to exit...");
fflush(stdin);
getch();
return 1;
}
return 0;
}
int priChi(unsigned char *chi)
{
unsigned char mat[16][2];
int i=VGA,j=VGAHI,k;
int sec,pot;
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL) /*打開字體庫文件*/
{
printf("Open style file (hzk16) failed!\n");
return -1;
}
initgraph(&i,&j,"");
while(*chi)
{
sec = *chi-0xa0; /*獲得區碼*/
pot = *(chi+1)-0xa0; /*獲得位碼*/
fseek(HZK,(94*(sec-1)+(pot-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i] & (0x80 >> k)) /*測試為1的位則顯示*/
putpixel(X+i*8+k,Y+j,WHITE);
X += WIDTH; /*下一字元的橫坐標*/
if(X >= MAXX)
{
X = 0;
Y += HIGH; /*下一字元的縱坐標*/
if(Y >= MAXY) /*滿一頁*/
{
printf("press any key to print other words");
getch();
system("cls"); /*清屏*/
Y = 0;
}
}
chi += 2; /*指針指向下一中文字元*/
}
getchar();
closegraph();
fclose(HZK);
return 0;
}
⑵ C語言如何顯示文本文件的全部信息
#include <stdio.h>
void main()
{
FILE *fp;
char buff[128];
printf("請輸入文件名");
scanf("春帶手%s",buff);
fp=fopen(buff,"r"); //打開文件
char ch;
while((ch=fgetc(fp))!=EOF) //判斷是行並否文件尾,直到沒有字元就結束。
putchar(ch); //輸出扒嫌一個字元
fclose(fp); //關閉文件指針
}
⑶ C語言中顯示小數部分
首先一點
把printf("c
is
%d\n",c);改成
printf("c
is
%f\n",c);就可以達到輸出1.75
下面開始說為什麼輸出的是0的問題。
因為整型和浮點型在內存中存儲的位元組位不同,如果把浮點型數值按整型格式化輸出的話,會有「缺位」的效果。就如上例,實際按%d格式輸出的是0.
按照樓主的題目是想得到一個浮點型的小數部分了,可以這樣修改
c=a/b
c=c-(int)c;//小數部分,(int)c意思是去C的整數部分
希望對樓主有幫助
⑷ C語言年歷顯示程序設計
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
char* month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nev","Dec"};
char* week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int j_leapyear(int year) //定義函數檢測輸入年份是否為閏年
{
if((/*year%400==0*/year%4==0&&year%100!=0)||(year%400==0))
return (1);
// else if(year%4==0&&year%100!=0)
// return (1);
else return 0;
}
int month_day(int year,int month) //檢測該年月份有多少天
{
int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(j_leapyear(year)&&month==2)
return 29;
else return (mon_day[month-1]);
}
int j_week(int year,int month,int day) //檢測該天是星期幾
{
int d=0,i; //d表示該天在該年份的累計天數
int w;
/* int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(j_leapyear(year)==1)
month_day[1]=29;
for(i=0;i<month;i++)
d+=month_day[i];
d=d+day;*/
for(i=1;i<month;i++)
d+=month_day(year,i);
d+=day;
w=(year-1)+(int)(year-1)/4-(int)(year-1)/100+(int)(year-1)/400+d;//網上公式
return ((int)w%7);
}
int allyear(int year) //輸出全年日歷
{
int i,j,b;
printf("\n%d 日歷",year);
for(i=1;i<=12;i++)
{
printf("\n\n\t%s\n",month[i-1]);
// printf(" 7 1 2 3 4 5 6 \n");
printf(" S M T W T F S \n");
b=j_week(year,i,1);
for(j=1;j<=month_day(year,i)+b;j++)
{
if(j<=b)
printf(" ");
else if(j-b<10)
printf("%2d ",j-b);
else printf("%2d ",j-b);
//else printf("%2d ",j-b);
if(j%7==0)
putchar('\n');
}
putchar('\n');
}
return 0;
}
void month_print(int year,int month) //輸入一個年月,輸出這個月的日歷
{
int i,c,d;
c=month_day(year,month);
printf("\n\n %d年%d月日歷\n",year,month);
printf(" S M T W T F S \n");
d=j_week(year,month,1);
for(i=1;i<=c+d;i++)
{
if(i<=d)
printf(" ");
else printf("%2d ",i-d);
if(i%7==0)
putchar('\n');
}
putchar('\n');
}
int jisuan_day(int year,int month,int day,int x,int y,int z) //輸入年月日,輸出距x年y月z日有多少天,星期幾,以及是否是公歷節日
{
int i,a,b,c=0,d=0,days=0,m=0,n=0,t;
a=year>=x?year:x;
b=year<x?year:x;
if(a>b)
{
for(i=b+1;i<a;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=x)
d=a-b-1;
else d=0;
m=365*d+c;
if(year<x)
{
for(i=month;i<=12;i++)
n+=month_day(year,i);
days=m+n+z-day;
}
else if(year>x)
{
for(i=y;i<=12;i++)
n+=month_day(x,i);
for(i=1;i<month;i++)
n+=month_day(year,i);
days=m+n+day-z;
}
else
{
for(i=month>=y?y:month;i<(month>=y?month:y);i++)
n+=month_day(x,i);
days=abs(day-z)+n; //輸出距離y月z日有多少天
}
printf("這天離%d年%d月%d號有%d天\n",x,y,z,days);
t=j_week(year,month,day);
if(t==0) //輸出星期幾
printf("這天星期日");
else if(t==1)
printf("這天星期一");
else if(t==2)
printf("這天星期二");
else if(t==3)
printf("這天星期三");
else if(t==4)
printf("這天星期四");
else if(t==5)
printf("這天星期五");
else if(t==6)
printf("這天星期六");
putchar('\n');
if(month==1&&day==1)
printf("這天是元旦節");
else if(month==2&&day==14)
printf("這天是情人節");
else if(month==3&&day==8)
printf("這天是婦女節");
else if(month==3&&day==12)
printf("這天是植樹節");
else if(month==4&&day==1)
printf("這天是愚人節");
else if(month==4&&day==4)
printf("這天是清明節");
else if(month==5&&day==1)
printf("這天是勞動節");
else if(month==6&&day==1)
printf("這天是兒童節");
else if(month==8&&day==1)
printf("這天是建軍節");
else if(month==9&&day==10)
printf("這天是教師節");
else if(month==10&&day==1)
printf("這天是國慶節");
else if(month==12&&day==25)
printf("這天是聖誕節");
else printf("這天不是特殊節日");
putchar('\n');
return days;
}
void fish_or_net(int year,int month,int day) //判斷是打魚還是曬網
{
int q;
int i,a,b,c=0,d=0,days=0,m=0,n=0;
a=year>=1990?year:1990;
b=year<1990?year:1990;
if(a>b)
{
for(i=b+1;i<a;i++)
c+=j_leapyear(i);
}
else c=0;
if(year!=1990)
d=a-b-1;
else d=0;
m=365*d+c;
if(year<1990)
{
for(i=month;i<=12;i++)
n+=month_day(year,i);
days=m+n+1-day;
}
else if(year>1990)
{
for(i=1;i<=12;i++)
n+=month_day(1990,i);
for(i=1;i<month;i++)
n+=month_day(year,i);
days=m+n+day-1;
}
else
{
for(i=month>=1?1:month;i<(month>=1?month:1);i++)
n+=month_day(1990,i);
days=abs(day-1)+n; //先確定這天離1990年1月1日有多少天
}
q=days%5+1;
if(q==1||q==2||q==3) //判斷打魚還是曬網
printf("漁人今天打魚");
else printf("漁人今天曬網");
putchar('\n');
}
/*int main() //這部分內容用來校檢
{
int j_leapyear(int year);
int month_day(int year,int month);
int j_week(int year,int month,int day);
int allyear(int year);
void month_print(int year,int month);
int jisuan_day(int year,int month,int day,int x,int y,int z);
void fish_or_net(int year,int month,int day);
int x,y,z,year,month,day;
// allyear(2015);
//month_print(2016,12);
printf("請輸入今天的日期(按年,月,日輸入,如2016,1,14表示2016年1月14日):");
scanf("%d,%d,%d",&x,&y,&z);
printf("\n請隨便輸入一個日期,格式同上:");
scanf("%d,%d,%d",&year,&month,&day);
jisuan_day(year,month,day,x,y,z);
// fish_or_net(x,y,z);
return 0;
} // 這部分內容是用來檢測上述函數是否出錯的
*/
int main()
{
int j_leapyear(int year);
int month_day(int year,int month);
int j_week(int year,int month,int day);
int allyear(int year);
void month_print(int year,int month);
int jisuan_day(int year,int month,int day,int x,int y,int z);
void fish_or_net(int year,int month,int day); //函數聲明
int option,year,month,day,x,y,z;
char ny;
system("color 1f");
while (1)
{
printf("\n\n\t 歡迎來到由...編寫的程序\n\n");
printf(" 請選擇您需要的服務,輸入編號回車結束\n");
printf(" 1.輸入一個年份,輸出該年的日歷\n");
printf(" 2.輸入年月,輸出這個月的日歷。\n");
printf(" 3.輸入年月日,輸出據今天還有多久,星期幾,是否是公歷節日。\n");
printf(" 4.某人自1990年1月1日開始打魚,「三天打魚,兩天曬網」,輸入一個1990年以後的日期,輸出他這一天是打魚還是曬網。\n");
printf(" 5.退出\n");
scanf("%d",&option);
switch(option) //switch分支結構
{
case 1:
while(1) //while循環,後面的1是常數,表示一直到break才結束循環
{
printf("請輸入一個年份:");
scanf("%d",&year);
allyear(year);
printf("你想繼續查詢日歷么?(y表示繼續,n表示結束)");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 2:
while (1)
{
printf("輸入年月:");
scanf("%d,%d",&year,&month);
month_print(year,month);
printf("你想繼續查詢日歷么?(y表示繼續,n表示結束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 3:
while (1)
{
printf("輸入年月日:");
scanf("%d,%d,%d",&year,&month,&day);
printf("請輸入今天的日期:");
scanf("%d,%d,%d",&x,&y,&z);
jisuan_day(year,month,day,x,y,z);
printf("你想繼續查詢么?(y表示繼續,n表示結束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 4:
while (1)
{
printf("輸入1990年1月1日以後的一個日期:");
scanf("%d,%d,%d",&year,&month,&day);
fish_or_net(year,month,day);
printf("你想繼續查詢漁人是打魚還是曬網么?(y表示繼續,n表示結束):");
scanf("%c",&ny);
if(ny=='n')
break;
}
break;
case 5:
while (1)
{
printf("確認么?y表示是的,n表示不是");
scanf("%c",&ny);
if(ny=='y')
exit(1); //表示退出程序
else if(ny=='n')
break;
}
break;
default:printf("對不起,暫時沒有這個服務");
break;
}
}
return 0;
}
⑸ c語言字元顯示怎麼查找顯示字元的地址
c語言字元顯示怎麼查找顯示字元的地址方法如下
chr() 將會找出 str 字元串中第一次出現的字元 c 的地址,然後將該地址返回。
注意:字元串 str 的結束標志 NUL 也會被納入檢索范圍,所以 str 的組後一個字元也可以被定位。
【返回值】如果找到指定的字元則返回該字元所在地址,否則返回 NULL。
返回的地址是字元串在內存中隨機分配的地址再加上你所搜索的字元在字元串位置。設字元在字元串中首次出現的位置為 i,那麼返回的地址可以理解為 str + i。
⑹ 如何在2012c語言中顯示
1、首先創建一個c語言代碼示例文件。
2、然後在C語言中使用printf顯示多個變數值即可。
⑺ c語言怎麼顯示運算過程
首先,點擊桌面上的vc++6.0,打開c語言編
打開軟體以後,點擊右上角的【文件】,【新建】。出現新的對話框後,再點擊【文件】,選擇下方C++ Source File。文件名必須以.c結尾,最後點擊【確定】。
輸入代碼:
//如何用c語言將計算冊氏結果顯示在畫面上
//顯示整數15和37的和
#include<stdio.h>
int main(void)
{
printf("%d\n",15+37);
return 0;
解析:
「//」是注釋符號,計算機不會讀取,用於編程人員的理解。
「#include<stdio.h>」是調用stdio.h 函數,printf就包含當中。
」int main(void)「是主函數,函數從這里開始讀取,必須要包含{}。
」 printf("%d\n",15+37)「 ,printf可以在顯示器上進行輸出操作。
」return 0「是將計算結果返回。
1688
根據文章內耐姿燃容為您推薦
廣告
Q1MEM512SEplcfx2n編程入門
¥1071 元¥1071 元
查看,編寫好以後:點擊1的圖標,行編譯,查找錯誤。
點擊2進行連接。點擊3進行運行。點擊運行後,計算結果會顯示在畫面中,按任意鍵就能退出昌虛。
⑻ 如何用c語言程序顯示完整的中文
用C語言顯示中文,其實重點並不是編程
而是系統編碼格式
以及系統輸出的編碼
如果二者相同,
那麼在寫代碼的時候直接打漢字,存成字元串輸出即可。
如果不同,
就需要做轉碼。
比如
編碼用utf-8
輸出用gbk等。
由於很難在運行時判斷系統編碼,所以不建議C語言使用中文輸出,很容易出現亂碼。
⑼ C語言怎樣顯示一張圖片
1、如果有圖片(例如 wzzx.jpg) 程序中插一句:
system("mspaint wzzx.jpg"); 就可以 在運行時顯示這張圖片。
用字元串變數調用也可以:
char pic_name[80]="wzzx.jpg";
char cmd[100];
sprintf(cmd,"mspaint %s",pic_name);
system(cmd); // 顯示圖片
2、system函數:
原型:int system(const char * command);
功能:執行 dos(windows系統) 或 shell(Linux/Unix系統) 命令,參數字元串command為命令名;
說明:在windows系統中,system函數直接在控制台調用一個command命令。在Linux/Unix系統中,system函數會調用fork函數產生子進程,由子進程來執行command命令,命令執行完後隨即返回原調用的進程;
頭文件:stdlib.h;
返回值:命令執行成功返回0,執行失敗返回-1。
⑽ 編寫C語言,顯示以下圖案
可以用2維數組,
也可以將他分成2塊,一個正三角,和一個倒三角,然後用循環列印