1. 程式人生 > >向標準輸出上列印一些用ASCII字元組成的圖形(彙總)(迴圈巢狀)(關鍵是找要輸出物與行數n之間的關係,找規律)

向標準輸出上列印一些用ASCII字元組成的圖形(彙總)(迴圈巢狀)(關鍵是找要輸出物與行數n之間的關係,找規律)

1 不考慮空格型的

#include <stdio.h>
int main()
{
   int i,j,n;
   scanf("%d",&n);//有n行
   for(i=1;i<=n;i++)
       {for(j=1;j<=2*i-1;j++)//控制列
        printf("*");
         printf("\n");}//別忘加換行

}

或者是這樣,用putchar(), c語言用putchar是用來輸出單個字元的, 拓展: 若用來輸出字串,可以先取得字串,然後獲取每位的字元,最後輸出。

比如一個字串為a[20],已經確定有了15位。

那麼如果想要輸出的話,可以用:

for(int i = 0 ; i < 15; i++) putchar(a[i]);

putchar,c語言函式之一,作用是向終端輸出一個字元。其格式為putchar©,其中c可以是被單引號(英文狀態下)引起來的一個字元,可以是介於0~127之間的一個十進位制整型數(包含0和127),也可以是事先用char定義好的一個字元型變數。

#include <stdio.h>
int main()
{
   int i,j,n;
   scanf("%d",&n);//有n行
   for(i=1;i<=n;i++)
       {for(j=1;j<=2*i-1;j++)//控制列
        putchar('*');
         printf("\n");}//別忘加換行

}

2、金字塔形

金字塔形

#include <stdio.h>
int main()
{
   int n,i,j,k;
   scanf("%d",&n);//n代表有幾行
   for(i=1;i<=n;i++)
   {
       for(j=1;j<=n-i;j++)//此處需注意,
       {
        printf(" ");}
       for(k=1;k<=2*i-1;k++)
            printf("*");
       printf("\n");
}
}

3、用字母搭出金字塔 同行同字母

#include <stdio.h>
int main()
{
   int n,i,j,k;
char s='a';
   scanf("%d",&n);//n代表有幾行
   for(i=1;i<=n;i++)
   {
       for(j=1;j<=n-i;j++)
       {
        printf(" ");
        }
           for(k=1;k<=2*i-1;k++)
            putchar(s);
       s++;
       printf("\n");
}
}

4、用字母搭出金字塔(同行不同字母) 在這裡插入圖片描述

#include <stdio.h>
int main()
{
   int n,i,j,k;
char s='a';
   scanf("%d",&n);//n代表有幾行
   for(i=1;i<=n;i++)
   {
       for(j=1;j<=n-i;j++)
       {
        printf(" ");
        }
           for(k=1;k<=2*i-1;k++)//也可以是for(k=1;k<-2*i-1;k++;s++)  putchar(s);
           //也可以是for(k=1;k<-2*i-1;k++)  putchar(s++);
            {putchar(s);
            s++;}
       printf("\n");
}
}

這個方法有缺陷,當行數多了時,會出現這種情況在這裡插入圖片描述 這是因為字母只有26個,(下一個會講述這個問題的解決方法) 對比兩個金字塔,唯一的區別就在於在這裡插入圖片描述 此處有沒有花括號,沒有花括號的時候,s++與for迴圈是並列關係,i++一次,s++一次,因此行中是相同的字母; 有花括號的時候,s++是在for迴圈裡面的,因此,第三個for迴圈每迴圈一次,s++,所以同一行的字母不相同。 5、解決多行後輸出錯誤的問題 (讓其從a-z一圈圈迴圈)

#include <stdio.h>
int main()
{
    int n,i,j,k;
    char s='a';
    scanf("%d",&n);//n代表有幾行
    for(i=1;i<=n;i++)
    {
       for(j=1;j<=n-i;j++)
       {
        printf(" ");
        }
           for(k=1;k<=2*i-1;k++)
            {putchar(s);
            s++;
            if(s=='z'+1)//此處有關鍵點
                s='a';//
            }
       printf("\n");
}
}

6、 在這裡插入圖片描述

#include <stdio.h>
int main()
{
    int n,i,j,k,m;
    char s='a';

    scanf("%d",&n);//n代表有幾行
    for(i=1;i<=n;i++)
    {
       for(j=1;j<=n-i;j++)
       {
        printf(" ");
        }
       for(k=1;k<=i;k++)
            putchar(s++);

       for(m=1;m<=i-1;m++)
       {

       s=97-m+i;//注意此處,此處是輸出右半部分的關鍵
        printf("%c",s);
       }

       printf("\n");

}
}

方法二利用對稱與絕對值

#include <stdio.h>
#include<math.h>
int main()
{
    int n,i,j,c;
    char s='a';

    scanf("%d",&n);//n代表有幾行
    for(i=0;i<=n;i++)
    {
       for(j=1;j<=n-i;j++)
       {
        printf(" ");
        }
       for(j=-i;j<=i;j++)//從-i到i是每行要輸出的字元的個數
       {

        c=97+i-abs(j);//理解此處
       printf("%c",c);
       }

       printf("\n");

}
}

6、輸出倒三角(平面圖形問題用兩層)

#include <stdio.h>
int main()
{
  int n,i,j,k;
  scanf("%d",&n);
  for(i=1;i<=n;i++)
    {
      for(j=0;j<=i-1;j++)
      printf(" ");
      for(k=2*(n-i)-1;k>0;k--)//理解此處,
      printf("*");
      printf("\n");
    }
}