Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algorithme losange en *

Sujet résolu
10 octobre 2016 à 18:48:05

Bonjour,

Je cherche à dessiner un losange de N ligne (N étant le milieu du losange donc là où il y a le plus d'étoile).
Donc je pense qu'il faut utilser deux boucles for, une pour les lignes et une pour les colonnes mais j'ai du mal à le faire. Pouriez vous m'aider ? J'ai du mal à gérer à la fois les * et les espaces.
Ex :
  *
 **
***
 **
  *
Merci.:
  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 18:55:21

salut,

stp explique bien le problème, ton exemple semble incorrect, dans la deuxième ligne on peut pas ajouter un espace avant les deux étoiles (**) et un autre après car on aura une chaîne avec quatre caractères et ça dépasse la taille de la ligne de milieu,

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 19:03:26

Hello,

Il y a déjà eu un topic à ce sujet: cerf-volant. Tu peux t'en inspirer, mais quand tu poses une question, il est bien que tu montres ce que tu as déjà écrit....

Edgar;

-
Edité par edgarjacobs 10 octobre 2016 à 19:04:00

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

10 octobre 2016 à 19:08:56

il faut inclure les espaces j'ai recopié l'exemple de l'énoncé.

J'ai rien écrit comme code car c'est niveau algorithme que j'ai un problème. Je ne comprends pas comment trouver la solution.

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 19:15:25

si les lignes doivent être centrées alors on peut pas le faire dans la deuxième ligne (**) avec N impaire car on peut pas diviser un espace (si ton programme va s'exécuter en mode console),

le nombre des espaces avant les étoiles et après est : (N - nombre_étoiles_de_la_ligne)/2;

-
Edité par manoranx 10 octobre 2016 à 19:16:28

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 19:25:49

Voici mon énoncé

-
Edité par Baroud 11 octobre 2016 à 11:18:36

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 19:43:45

voila mon ami, tu t'es trompé, les nombres des étoiles dans les lignes sont impaires : 1 3 5 7 9 11 ......

ya pas une ligne qui contient deux étoiles,

je veux pas te donner toute la réponse mais je vais t'aider à résoudre ton problème:

la première chose que tu dois faire c'est extraire les règles de losange,

1- le nombre des étoiles dans chaque ligne est impaire,

2 - tu peux constater que le nombre des espaces avant les étoiles est (N - nombre_des_étoiles_de_ligne)/2,

3 - il y'a deux étapes: 

     1- créer les lignes de la première ligne jusqu'à la ligne de milieu,

     2- inverser la première étape

alors essaye de commencer et je suis la pour t'aider, bon courage ;)

-
Edité par manoranx 10 octobre 2016 à 19:44:13

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 19:46:32

Donc en fait faut faire deux triangles isocèles en quelques sortes?

J'essaie de faire ça et je te dis si je bloque ou autre!

Merci

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 19:51:16

(Pendant que je tapais (lentement) mon message, une réponse a été apportée, du coup ce message est redondant.)

Bonjour ! Il y a sûrement plusieurs façons de faire ça. Une possibilité, ce serait de faire une boucle dans laquelle chaque tour de boucle correspond à une ligne, dans laquelle il faut afficher un certain nombre de blancs et un certain nombre d'étoiles. Regarde l'exemple fourni :

─ 1ère ligne : combien de blancs avant les étoiles ? combien d'étoiles ?

─ 2ème ligne : combien de blancs avant les étoiles ? combien d'étoiles ?

─ et ainsi de suite jusqu'à la ligne du milieu.

Si tu écris sur un bout de papier ces nombres, tu remarqueras qu'on passe de l'un à l'autre d'une façon très particulière.

Du coup on pourrait définir deux variables, 'nombre_de_blancs' et 'nombre_d_etoiles'. À toi de voir comment les initialiser et comment les faire varier dans la boucle.

(On peut faire deux boucles, une pour la phase croissante du motif et une pour la phase décroissante. À moins de gérer le "retournement" de la progression arithmétique.)

-
Edité par robun 10 octobre 2016 à 19:52:45

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 19:53:16

Bonjour,

il faut toujours commencer avec une feuille de papier et un crayon. Si on compte les espaces et les * ça pourrait donner :

    *     4 espaces 1 étoile
   ***    3    "    3    "
  *****   2    "    5    "
 *******  1    "    7    "

********* 0    "    9    "

 *******  1    "    7    "
  *****   2    "    5    "
   ***    3    "    3    "
    *     4    "    1    "

Une première idée part du principe qu'on a afficher un triangle, un trait et «le même triangle» dans l'autre sens. On se dit aussi qu'on va utiliser des boucles …

Alors comment avec une boucle obtenir 4,3,2,1 ? 1,3,5,7 ?

  • Partager sur Facebook
  • Partager sur Twitter
First solve the problem. Then, write the code. ~ John Johnson
10 octobre 2016 à 20:36:11

Rha c'est frustrant!

Je comprends ce que je dois faire mais je vois pas comment le formaliser algorithmiquement.

A chaque ligne, le nombre d'espaces diminue de 1 et le nombre d'etoiles de 2 mais pourtant je parviens pas à trouver la bonne boucle pour faire ça. J'arrive pas à trouver une boucle qui affiche le bon nombre d'espace ou d'étoiles.

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 20:39:11

Bah, c'est le but de chercher ^^

Tu peux «essayer» par tâtonnement par exemple pour i=0,1,2,3 tu peux remarquer que 4-i=4,3,2,1 et que 2*i+1=1,3,5,7 …

  • Partager sur Facebook
  • Partager sur Twitter
First solve the problem. Then, write the code. ~ John Johnson
10 octobre 2016 à 20:41:24

C'est comme avoir la réponse sur le bout de la langue mais pas réussir à la sortir. Merci pour le conseil je vais essayer de travailler ça
  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 20:44:49

salut,

le nombre des étoiles est impaire, 1 3 5....,

en Math quel est le format d'un nombre impaire :

je te donne un coup de main, c'est bien 2*i+1 (i=0,1,2,3,......)

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 20:46:33

Je comprends bien ça mais je comprends pas comment indiquer de mettre x fois un caractère automatiquement.
  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 20:49:09

Puisque tu as du mal à trouver les relations entre nombre de blancs et d'étoiles et numéro de ligne, je te conseille de faire une boucle sur les lignes plutôt que sur les blancs et les étoiles. L'avantage est que tu n'as pas besoin de calculer le nombre d'étoiles ou le nombre de blancs en fonction du numéro de la ligne, il suffit juste d'incrémenter ou décrémenter correctement ces nombres, et ça tu sais le faire (voir ton message plus haut). En fait, le calcul le plus difficile est celui du numéro de ligne qui correspond au plus grand nombre d'étoiles. C'est un calcul que je ferais a priori avant les deux boucles (celle-ci, puis la boucle pour la phase décroissante).

Ça ressemblerait à ça pour la phase croissante (le schéma de programme qui suit n'utilise que les remarques que tu viens de faire, en mettant un peu d'ordre et en te laissant plein de choses à remplir, donc je ne pense pas t'avoir mâché le boulot) :

int num_ligne ; // numéro de la ligne
int nb_etoiles ; // nombre d'étoiles
int nb_blancs ; // nombre de blancs

/* Initialisation */
/* À toi de voir à combien il faut initialiser nb_blancs et nb_etoiles */

/* Phase croissante */
for (num_ligne = 1 ; num_ligne < /* combien ? */ ; num_ligne++)
{
    /* affichage des blancs et des étoiles */
    nb_etoiles += 2 // « le nombre d'étoiles augmente de 2 » (je te cite)
    nb_blanc -= 1 // « le nombre d'espaces diminue de 1 » (je te cite)
}

 > je comprends pas comment indiquer de mettre x fois un caractère automatiquement.

Avec une boucle : pour i de 1 à x, afficher le caractère.


-
Edité par robun 10 octobre 2016 à 20:56:01

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 20:50:11

cher ami Baroud moi je peux faire ça en 5 minutes mais je veux pas te donner la réponse tout de suite, il sera mieux que tu la trouves seul,

essaye de bien réfléchir, découpe ton problème en plusieurs sous-problèmes pour le rendre facile

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 21:06:27

#include <stdio.h>

int main()
{
    int numLigne, nbEtoile,nbBlanc,ligneMax,i,j;

    printf("Veuillez entrez le nombre de lignes du losange\n");
    scanf ("%i", &ligneMax);
    nbBlanc= ligneMax/2;
    nbEtoile= 1;
    for(numLigne=1;numLigne<=(ligneMax/2)+1; numLigne++)
    {
        for(i=0; i<=nbBlanc; i++)
            printf(" ");
            for (j=1; j<=nbEtoile; j++)
                printf("*");
        nbEtoile+=2;
        nbBlanc-=1;
        printf("\n");
    }
return 0;
}
J'ai plus qu'à renverser ça pour finir non?

-
Edité par Baroud 10 octobre 2016 à 21:07:40

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 21:28:30

* - le nombre que l'utilisateur doit entrer n'est pas le nombre de lignes mais le nombre maxi des étoiles qui est N,

* - t'as met for(numLigne=1;numLigne<=(ligneMax/2)+1; numLigne++)

enlève le (+1) => for(numLigne=1;numLigne<=(ligneMax/2); numLigne++)

car la ligne pivot sera traité en dernier hors la boucle (c'est mon choix)

ce code t'as donné un bon résultat ?

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 21:33:17

Mon code donne le bon résultat 


Si j'enlève le +1 dans la boucle j'affiche pas la ligne de n étoiles.

-
Edité par Baroud 11 octobre 2016 à 11:17:48

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 21:43:16

bravo, je te félicite,

moi je voulais créer la dernière ligne à part, mais bon, ajoute le +1 alors, et pour l'autre partie tu n'as qu'inverser les choses,

nbrBlanc = 0 initialiement et à chaque itération on l'incrémenter (+=1),

nbrEtoiles = N initialement et à chaque itération on le décrémente par 2 (-=2);

mais tu aura la ligne max doublée, après on discutera  sur ça

-
Edité par manoranx 10 octobre 2016 à 21:50:57

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 21:57:26

Le code suivant fonctionne parfaitement je crois, merci éternellement pour votre aide et patience.

#include <stdio.h>

int main()
{
    int numLigne, nbEtoile,nbBlanc,ligneMax,i,j;

    printf("Veuillez entrez le nombre de lignes du losange\n");
    scanf ("%i", &ligneMax);
    nbBlanc= ligneMax/2;
    nbEtoile= 1;
    for(numLigne=1;numLigne<=(ligneMax/2)+1; numLigne++)
    {
        for(i=0; i<=nbBlanc; i++)

            printf(" ");
            for (j=1; j<=nbEtoile; j++)
                printf("*");
        nbEtoile+=2;
        nbBlanc-=1;
        printf("\n");
    }
    nbEtoile=ligneMax-2;
    nbBlanc=2;
    for(numLigne=ligneMax; numLigne>=1; numLigne--)
    {
        for(i=nbBlanc; i>=1; i--)
            printf(" ");
        for (j=nbEtoile; j>=1; j--)
            printf("*");
        nbEtoile-= 2;
        nbBlanc ++;
        printf("\n");
    }
return 0;
}



  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 22:08:56

mais pour la deuxième étape t'as mis (nbBlanc=2;)

normalement tu mets nbBlanc=1; non ?

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 22:09:48

Bah ça m'a intrigué aussi j'ai mis à 1 au début mais c'était décalé et pas aligné donc j'ai mis à deux pour que ça fonctionne. :D
  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 22:11:33

tu peux me montrer le résultat ?

attends,

j'ai découvert une erreur sur ton code, tu es là ?????

tu mets 1 dans la deuxième étape mais tu dois commencer par 1 dans la première étapes dans la boucle des espaces

-
Edité par manoranx 10 octobre 2016 à 22:21:07

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 22:23:49

Ca semble marcher pourtant.

edit: ah ok en fait je faisait un espace de trop à chaque fois du coup ça s'alignait mais décalé d'un à droite par rapport à la normale.

-
Edité par Baroud 11 octobre 2016 à 11:18:09

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 22:26:03

mets nbBlanc = 1 dans la deuxième étape, mais il faut commencer par 1 et non 0 dans la boucle des blancs dans la première étape
  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 22:29:28

(Ah, comme d'habitude des réponses ont été postées pendant que je tapais ce message qui, du coup, est devenu inutile...)

Le programme marche, c'est le principal.

Le coup du nombre de blancs qui est initialisé  à 1, puis à 2, s'explique de la façon suivante :

─ Dans la première boucle, on fait : for(i=0; i<=nbBlanc; i++) . Donc on affiche nbBlanc+1.

─ Dans la deuxième boucle, on fait : for(i=nbBlanc; i>=1; i--). Donc on affiche nbBlanc.

Pour que ce soit symétrique, il aurait fallu mettre dans la deuxième boucle : for(i=nbBlanc; i>=0; i--). Et là on initialiserait nbBlanc à 1.

il faut commencer par 1 et non 0 dans la boucle des blancs dans la première étape

Ah non ! La première boucle fonctionne parfaitement, il ne faut rien changer.


-
Edité par robun 10 octobre 2016 à 22:31:26

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2016 à 22:34:59

robun, il faut commencer par 1 dans la première étape et rénitialiser nbBlancs par 1 dans la deuxième
  • Partager sur Facebook
  • Partager sur Twitter