回覆列表
  • 1 # 碼中尋樂

    程式碼截圖:

    執行效果截圖:

    程式碼:

    void print_polygon(int rows)

    {

    if (rows % 2 == 0)

    rows++;

    int dir = 1;

    int cx = rows / 2;

    for (int i = 0; i < rows; i++) {

    for (int j = 0; j < rows; j++) {

    int offset = i;

    if (i > rows / 2)

    offset = rows - i - 1;

    if (j == cx - offset || j == cx + offset)

    printf("*");

    else

    printf(" ");

    }

    printf("\n");

    }

    }

  • 2 # 特別行動科

    畫圖畫圖(不畫圖難以會意)。下面是一個草圖(找了個線上白板畫的,漂亮吧~^(* ̄(oo) ̄)^)。

    如圖所示,假設要畫一個規格為2a*2b的◇。a,b分別為對應方向的中心位置。不難看出,程式一共需要列印2b+1行,2a+1列(因為第0行0列也是需要列印的,但是程式是從0開始計數的,因此最後的行列下標就是2a和2b,2a+1和2b+1是數量)。

    程式列印通常會使用空格和*作為列印菱形的字元,由於基本的輸出單位是字元(相當於菱形內的所有角的大小是固定的,不論多麼大的菱形都是相似的),所以2a和2b會相互制約。我想列印一個10*50的菱形時,當列印到第5行是就已經從橫向偏移量為0的位置開始列印了,第6行將會從-1列開始列印,這樣打印出的圖案將會是一個不完成的菱形,如下圖,虛線部分將不會被列印。

    程式以行為輸出,因此我們不在控制y軸,只通過控制x軸方向的a來控制菱形的大小。我們不妨來歸納一下列印的規則:

    第0行需要列印a個空格、列印一個*、換行。

    第1行需要列印a-1個空格、列印1個*、列印1個空格、列印1個*、換行。

    第2行需要列印a-2個空格、列印1個*、列印3個空格、列印1個*、換行。

    第3行需要列印a-3個空格、列印1個*、列印5個空格、列印1個*、換行。

    第n行需要列印a-n個空格、列印1個*、列印2n-1個空格、列印1個*、換行。

    一直需要列印到n==a。列印0個空格、列印1個*、列印2a-1個空格、列印1個*、換行。

    之後開始往回畫。

    第a+1行需要列印1個空格、列印1個*、列印2a-3個空格、列印1個*、換行。

    第a+2行需要列印2個空格、列印1個*、列印2a-5個空格、列印1個*、換行。

    第a+m行需要列印m個空格、列印1個*、列印2a-(2m+1)個空格、列印1個*、換行。

    當列印到2a-(2m+1)<0[2a-2m<1=>m==a]時,則只直接列印換行,結束程式。

    不難計算得出,一共需要列印2a+1行(和上面的2b+1相對應)。

    示例如下圖,網格里的大點點就是我們需要列印的點:

    這樣,虛擬碼基本就出來了:

    引數:a 橫向的中心點

    // 列印上半截

    for(n = 0; i <= a; n ++){

    // 列印一行內容

    for(i = 0; i < a-n; i ++){

    print(" ");//列印a-n個空格

    }

    print("*");//列印1個*

    if((2n - 1) < 0){

    print("\n");// 未列印空格直接換行

    continue;

    }

    for(i = 0; i < (2n - 1); i ++){

    print(" ");//列印2n - 1個空格

    }

    print("*");// 列印1個*

    print("\n");// 換行

    }

    // 列印下半截

    for(m = 1; m <=a; m ++){

    for(i = 0; i < m; i ++){

    print(" ");// 列印m個空格

    }

    print("*");// 列印1個*

    if(2a-(2m+1) < 0){

    print("\n");// 換行

    break;// 終止程式

    }

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

    print(" ");// 列印2a-(2m+1)個空格

    }

    print("*");// 列印1個*

    print("\n");// 換行

    }

    以上就思路啦,趕緊去試一試吧~

    以上內容只是說明了思路,大家還有什麼好方法呢?一起來聊聊吧~

    我是一名程式設計師,更多精彩請關注:空心小窩頭

  • 3 # elverys

    我們在學習語言過程中,其實每種語言都有它自身的特點,用C語言可以實現for迴圈打出一個空心菱形,其實用Python,java,C++,Shell等都可以打印出一個空心菱形。

    用Python語言for迴圈打出一個空心菱形

    程式碼如下:

    n=input("請輸入菱形每邊星星個數,n= ")

    n=int(n)

    m=t=2*n-1 #雙重賦值

    while m=1:

    if(m==t or m==1):#列印第一行和最後一行

    print(" "*n + "*" + " "*4*(n-1))

    elif(m=n):#列印下半部分

    print(" "*(m-n+1)+"*"+" "*(2*(t-m)-1)+" *")

    else:#列印上半部分

    print(" "*(n-m+1)+"*"+" "*(2*m-3)+" *")

    m-=1

    用c語言for迴圈打出一個空心菱形

    程式碼如下:

    //菱形

    #include stdio.h

    void main()

    {

    int i,j;

    //菱形的上半部分的三角形

    for(i=0;i4;i++)

    {

    for(j=3;ji;j--)

    {

    printf(" ");

    }

    for(j=0;j2*i+1;j++)

    {

    printf("*");

    }

    printf("\n");

    }

    //下半部分的倒三角形

    for(i=0;i3;i++)

    {

    for(j=0;ji+1;j++)

    {

    printf(" ");

    }

    for(j=6;j2*i+1;j--)

    {

    printf("*");

    }

    printf("\n");

    }

    printf("\n");

    //空心菱形

    //空心菱形的上半部分

    for(i=0;i4;i++)

    {

    for(j=0;j4-i;j++)

    {

    printf(" ");

    }

    for(j=0;j2*i+1;j++)

    {

    //判斷在需要列印的地方的第一位和最後一位列印*號,中間位置空格

    if((j==0)||(j+1==2*i+1))

    {

    printf("*");

    }

    else

    {

    printf(" ");

    }

    }

    printf("\n");

    }

    for(i=0;i3;i++)

    {

    for(j=0;ji+2;j++)

    {

    printf(" ");

    }

    for(j=6;j2*i+1;j--)

    {

    //判斷在需要列印的地方的第一位和最後一位列印*號,中間位置空格

    if((j==6)||(j-1==2*i+1))

    {

    printf("*");

    }

    else{

    printf(" ");

    }

    }

    printf("\n");

    }

    printf("\n");

    //數字的排列

    for(i=1;i6;i++)

    {

    for(j=1;ji+1;j++)

    {

    printf("%d",j);

    }

    for(j=1;ji;j++)

    {

    printf("%d",i-j);

    }

    printf("\n");

    }

    for(i=5;i1;i--)

    {

    for(j=1;ji;j++)

    {

    printf("%d",j);

    }

    for(j=2;ji;j++)

    {

    printf("%d",i-j);

    }

    printf("\n");

    }

    printf("\n");

    }

    用Java語言for迴圈打出一個空心菱形

    程式碼如下:

    public static void main(String[] args) {

    int line = 99;//列印行數

    int blank2 = (line-1)/2;//最大空格數

    for(int i=0;iline;i++){

    int blank = (blank2-i)0?blank2-i:-(blank2-i);//每次空格數

    for(int j=0;jline;j++){

    // if(j=blankjline-blank){//列印實心菱形方法

    // System.err.print("*");

    // }else{

    // System.err.print(" ");

    // }

    if(j==blank||j==(line-blank)-1){//列印空心菱形方法

    System.err.print("*");

    }else{

    System.err.print(" ");

    }

    }

    System.err.println();

    }

    }

    用C++語言for迴圈打出一個空心菱形

    程式碼如下:

    #include iostream

    using namespace std;

    int main(int argc, char** argv) {

    int n;

    cout "input a numer n: ";

    cin n;

    for (int i = 1; i = n; i++) {

    for (int j = n - i - 1; j = 0; j--) {

    cout " ";

    }

    cout i;

    for (int j = 4 * (i - 1) - 2; j = 0; j--) {

    cout " ";

    }

    if (i == 1) {

    cout endl;

    } else {

    cout i endl;

    }

    }

    for (int i = 1; i n; i++) {

    for (int j = 1; j i + 1; j++) {

    cout " ";

    }

    cout n - i;

    for (int j = 4 * (n - i - 1) - 2; j = 0; j--) {

    cout " ";

    }

    if (i == n - 1) {

    cout endl;

    } else {

    cout n - i endl;

    }

    }

    system("pause");

    return 0;

    }

    用Shell語言for迴圈打出一個空心菱形

    程式碼如下:

    #!/bin/bash

    read -p "輸入菱形半徑:" r

    for((y=0; y=2*r; y++))

    do

    for((x=0; x=2*r; x++))

    do

    #if ((y==-x+r || y==-x+3*r || y==x+r || y==x-r)) 空心

    if ((y=-x+r y=-x+3*r y=x+r y=x-r)) #實心

    then

    echo -n "*"

    else

    echo -n " "

    fi

    done

    echo ""

    done

  • 中秋節和大豐收的關聯?
  • 1月18日,NBA匿名高管建議快船交易得到恩比德,哈雷爾、沙梅特為籌碼你怎麼看?