0
votes

Codage VSS C pour imprimer un arbre de Noël

Ceci est mon code actuel

How Tall? 3
  *
  **
  ***

J'essaie de l'imprimer comme

How tall 3?
  *
 * *
* * *
_| |_
\___/

et c'est ce que j'obtiens. Quel est le problème avec mon code? et comment vais-je corriger le code?

void printer(int input)
{
    int star;
    int space;
    for (int i = 1; i <= input; i++)
    {
        star = i;
        space = i + input - star - 1;

        for (int j = 0; j < space; j++)
        {
            printf(" ");
        }

        for (int s = 0; s < star; s++)
        {
            printf("*");
        }

        printf("\n");
    }
}


2 commentaires

trouver le point médian et imprimer le coffre


ne publiez pas d'images de code. Postez le code.


4 Réponses :


0
votes

votre format est le problème. comme vous connaissez déjà la taille de l'arbre, vous pouvez déduire la taille du premier ensemble d'espaces (les premiers espaces sur chaque ligne), soit espaces = (taille - 1) - i . il devrait être, pour chaque i:

i1 = 2
i2 = 1
i3 = 0

qui semble être ce que le résultat donne. de plus, entre tous les astérisques, insérez simplement un espace jusqu'au dernier caractère, et c'est l'idée


0 commentaires

0
votes

Il y a trop de choses qui ont mal tourné avec cela. Je ne publierai pas le code correct, mais je pourrai vous guider à travers.

  • Puisque vous voulez de l'espace après les étoiles, imprimez "*" au lieu de "*"

  • Vous devez utiliser un espace décrémentiel au début, avant d'imprimer l'étoile, il y a un défaut logique à cela, c'est-à-dire que vous ajoutez et soustrayez i et étoile, qui sont la même chose. Vous devez donner des espaces (entrée - étoile) pour la boucle.

  • Pour le tronc, vous devez développer une logique symétrique. J'espère que cela vous aidera.


0 commentaires

0
votes

Essentiellement, cet extrait de code que vous utilisez ici:

  * 
 * * 
* * * 
_| |_
\___/

équivaut à écrire:

void printer(int input)
{
    int star;
    int space;
    // Store the original length of the space
    int space_length = input;
    for (int i = 1; i <= input; i++)
    {
        star = i;
        // Get the number of spaces for the current iteration
        space = space_length - 1;

        for (int j = 0; j < space; j++) {
            printf(" ");
        }

        for (int s = 0; s < star; s++) {
            printf("* ");
            //       ^ note this space after the asterisk
        }

        // Decrease the length of the space every step
        // So that it appears like a slope
        // Note how we are using 'space_length' instead of input
        // This is because if we decrement 'input', this loop
        // will get affected, which is not what we want
        space_length--;

        printf("\n");
    }

    ///////// bottom part of the tree /////////
    // number of spaces needed = input - length of "_| |_" - 1
    for (int i = 1; i <= input - (4 - 1); i++)
        printf(" ");
    printf("_| |_\n");
    // number of spaces needed = input - length of "\\___/" - 1
    for (int i = 1; i <= input - (4 - 1); i++)
        printf(" ");
    printf("\\___/\n");
}

C'est parce que i et star ont la même valeur (quoth star = i ), et par conséquent, s'annulent mutuellement.

Maintenant, pouvez-vous voir une constante ici? Oui, la valeur de input n'est jamais modifiée nulle part, et donc votre code est toujours ce que 1 de moins que l'entrée. (Dans ce cas, il est toujours précédé de 2 ( = 3-1 ) espaces) comme ceci:

  *
  **
  ***
^^ mark two spaces

Et vous avez également oublié d'ajouter un espace de fin après l'astérix et il n'y a donc pas d'espacement entre eux.


Par conséquent, pour résoudre votre problème, vous pouvez stocker temporairement la valeur de input et la réduire de 1 à chaque itération pour qu'elle ressemble à une pyramide.

Exemple:

star = i;
space = input - 1;

qui donne la sortie:

star = i;
space = i + input - star - 1; // or, space = input - 1 + i - star;


0 commentaires

0
votes

Vous pouvez le faire comme ceci:

#include <stdio.h>
void printer(int input)
{
    // for stars
    for (int i = 1; i <= input; i++) {
        for (int j = 1; j <= input - i; j++) {
            printf(" ");
        }    
        for (int k = 1; k <= i; k++) {
            if (k == 1) printf("*");
            else printf(" *");
        }
        printf("\n");
    }
    // for base
    int base_half_len = input - 1;
    for (int i = 1; i < base_half_len; i++) {
        printf("_");
    }
    printf("| |");
    for (int i = 1; i < base_half_len; i++) {
        printf("_");
    }
    printf("\n\\");
    for (int i = 1; i < 2 * input - 2; i++) {
        printf("_");
    }
    printf("/\n");
}
int main(void) {
    // your code goes here
    printer(10);
    return 0;
}

Voici le lien où je l'ai testé: https://ideone.com/7zpNeW


0 commentaires