Лучший способ реорганизовать этот код C? CS50 - mario.c (больше) - PullRequest
0 голосов
/ 02 сентября 2018

Итак, я беру курс cs50 и решаю задачу mario.c больше из pset 1

Я на самом деле решил это с 3 для циклов, но я хотел реорганизовать его всего с 2 циклами, и я придумал этот код, который дает следующее решение для "высоты: 5"

Result:
    #  #
   ##  ##
  ###  ###
 ####  ####
#####  #####

#include <stdio.h>

int main(void)
{
   
    int side = 5;
    int max = side + 2;

    for (int i = 1 ; i <= side ; i++)
    {
      int j = 1;
      while(j != max+1)
      {
        if(j <= side-i)
        {
        printf(" ");
        j++;
        }
        else if(j > side-i && j < side+1)
        {
        printf("#");
        j++;
        }
        else if(j == side+1)
        {
        printf("  ");
        j++;
        } 
        else 
        {
        printf("#");
        j++;
        }
      }
    max++;
    printf("\n");
    }
}

Мне бы хотелось узнать, можете ли вы, ребята, показать мне более элегантное решение, поскольку я думаю, что это слишком ... повторяющееся.

Кроме того, возможно ли использовать случай переключения вместо многих других, если? Пытался это сделать, но код не принимал логические значения для j: (

Заранее спасибо! :)

1 Ответ

0 голосов
/ 02 сентября 2018

Если вы знаете верхний предел для высоты, вы можете сделать это за один цикл.

Как:

int main(void) {
    char s[] = "#############################################";
    char f[32];

    int n = 5;  // height

    sprintf(f, "%%%ds  %%s", n);   // Create a format string like "%5s  %s"
    char* p = s + strlen(s) - 1;   // Let p point to the last char in s

    for(int i=0; i<n; i++)         // Loop n times
    {
        printf(f, p, p);
        printf("\n");
        p--;                       // Increase the number of # that p points to
    }
    return 0;
}

Примечание: Если вы не знаете верхний предел для высоты, вы все равно можете использовать этот подход, но тогда s должен быть динамически распределен.

...