Boucle imbriquée et pyramide de nombres [Résolu]

Messages postés
10
Date d'inscription
jeudi 5 février 2009
Dernière intervention
14 avril 2010
- - Dernière réponse : cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
- 23 sept. 2009 à 09:57
Salut!

Je voudrais arriver à écrire un programme en C qui affiche la pyramide ci-dessous:
----------1
---------232
--------34543
-------4567654
------567898765
-----67890109876
----7890123210987
---890123454321098
--90123456765432109
-0123456789876543210

Après plusieurs tentatives, je n' y arrive toujours pas. Je joins le code que j'ai pu écrire à ce point:

#include<stdio.h>
#include<stdlib.h>



int main()

{ int i,j,k;
for(i=1; i<=10; i++)
{
for (j=1; j<=10-i; j++)
printf(" ");
for (k=1; k<=2*i-1; k++)
printf("%d", k);
printf("\n");
}
system("pause");
return 0;


}
Merci de votre aide.


Smanyx
Afficher la suite 

Votre réponse

7 réponses

Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
Salut,

Déjà, un détail :
system("pause");
C'est le mal. Un point d'arrêt sur le "return" c'est beaucoup plus classe. Parce qu'une application console qui fait une pause à la fin, c'est une application console chiante à utiliser.

Ensuite pour ton problème, bin suffit de réfléchir un peu !

Faire une boucle qui monte puis qui descend...
Je te mets la solution en blanc. Mais tu devrais trouver tout seul.

int main()
{
__int i, j, k, delta, val;
__for(i = 1; i <= 10; i++)
__{
____for (j = 0; j <= 10 - i; j++)
______printf(" ");

____delta = 1;
____for (k = 1; k != 0; k += delta)
____{
______val = i + k - 1;
______if (val >= 10)
________val -= 10;
______printf("%d", val);

______if (k i) delta -1;
____}

____printf("\n");
__}

__return 0;
}
Commenter la réponse de cs_rt15
Messages postés
10
Date d'inscription
jeudi 5 février 2009
Dernière intervention
14 avril 2010
0
Merci
rt15,

Merci de votre intervention.
A ce stade, le programme que j'ai écrit ne marche que partiellement. La partie gauche de la pyramide est parfaite. C'est la partie droite qui me fait tourner la tête...
Pourriez-vous me pointer sur la bonne direction? Quelle doit être la condition pour la boucle de droite?

for (s=k-1; s>= 2*i-1; s--) ??????

Je me perds dans ma reflection...

#include<stdio.h>
#include<stdlib.h>

int main()

{ int i,j,k,s;

for(i=0; i<10; i++) //gère le passage à la ligne suivante
{
for (j = 1; j < 10-i;j++) //gère les espaces vides sur chaque ligne
{
printf(" ");

}
for (k=i+1; k<= 2*i+1;k++) //partie ascendante (gauche)
{

printf("%d", k % 10);

}

for (s=k-1; s>= 2*i-1; s--) //partie descendante (droite)
{

printf("%d", s % 10 );

}
printf("\n");
}

//system("pause");
return 0;

}


No worries, i'll get there...
Commenter la réponse de Smanyx
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
Ah vi j'aurais dû utiliser un modulo, pas bête.

Comme je te l'ai dit je t'ai donné un exemple de solution.

Tu ne trouve pas que le site à réservé beaucoup de place pour mon dernier message ?

En fait, j'ai écrit la solution en blanc. Blanc sur blanc ça ne ce voit pas ! Pour le voir, suffit de sélectionner le texte.

Mais continue, tu y es presque ! Ce serait quand même mieux de trouver tout seul.
Commenter la réponse de cs_rt15
Messages postés
10
Date d'inscription
jeudi 5 février 2009
Dernière intervention
14 avril 2010
0
Merci
>En fait, j'ai écrit la solution en blanc. Blanc >sur blanc ça ne ce voit pas ! Pour le voir, >suffit de sélectionner le texte.

Merci d'avoir clarifié cela pour moi puisque là, je n'y voyais que du bleu...

Cela dit, j'ai pu dévoiler votre code. Et lorsque je le tourne, déjà j'ai pu noter que vous avez omis un printf juste après le if (k1) delta-1;
sans lequel le pgm n'affiche que 0...
donc j'ai ajouté printf("%d", val);

Cependant, l'affiche se présente comme suit:
---------1
--------2
-------3
------4
-----5
----6
---7
--8
-9
00

Ce qui,déjà pointe sur la bonne direction mais n'est pas encore tout à fait l'affichage désiré.

Qu'en pensez-vous?
Commenter la réponse de Smanyx
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
Gné ?
Bin non je n'ai pas oublié de printf...
Le code marche tel quel.

Ma boucle for (k = 1; k != 0; k += delta) part de 1 et finit à 1. k est tout d'abord incrémenté (Jusqu'à ce que k == i), puis k est décrémenté.

Ci-dessous modifié pour avoir le modulo :
#include <stdio.h>

int main()
{
  int i, j, k, delta;
  for(i = 1; i <= 10; i++)
  {
    for (j = 0; j <= 10 - i; j++)
      printf(" ");

    delta = 1;
    for (k = 1; k != 0; k += delta)
    {
      printf("%d", (i + k - 1) % 10);

      if (k i) delta -1;
    }

    printf("\n");
  }

  return 0;
}

}
Commenter la réponse de cs_rt15
Messages postés
10
Date d'inscription
jeudi 5 février 2009
Dernière intervention
14 avril 2010
0
Merci
Merci beaucoup rt15,

Je suis désolé d'avoir mentionné une omission qui n'en était pas une.
J'ai pu tourner votre code, l'affichage est celui désiré.
Au même moment, j'ai aussi pu, suivant ma logique (voir le code posté précedemment arriver au même résultat), trouver la condition de la boucle de droite (partie descendante de la pyramide).

for (k=2*i; k>= i+1; k--)

Voici mon code complet:

#include<stdio.h>
#include<stdlib.h>

int main()
{ int i,j,k;

for(i=0; i<10; i++) //gère le passage à la ligne suivante
{
for (j = 1; j < 10-i; j++) //gère les espaces vides sur chaque ligne
{
printf(" ");

}
for (k=i+1; k<= 2*i+1; k++) //partie ascendante (gauche)
{

printf("%d", k % 10);

}

for (k=2*i; k>= i+1; k--) //partie descendante (droite)
{

printf("%d", k % 10 );

}
printf("\n");
}
printf("\n\n\n\n\n");
system("pause");
return 0;

}

Deux approches différentes, même résultats. Cela m'enrichit en plus...

Cependant, j'ai une petite question concernant votre remarque sur
> system("pause");
généralement je l'utilise pour voir l'affichage de mon programme à l'écran, parfois j'utilise scanf("%*c");
J'avoue que j'ai pas bien saisie votre remarque. Je suis encore en pleine formation, et à voir votre code vous n'utilisez aucune de ces deux instructions. Qu'utilisez-vous pour voir l'affichage à l'écran?

Une fois de plus, merci.
Commenter la réponse de Smanyx
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
0
Merci
Si tu essaies les commandes de l'invite de commande DOS, est ce qu'il font des pauses après leurs exécutions ?
Est ce que ping te demande d'appuyer sur une touche pour reprendre la main ?
Est ce que dir te demande d'appuyer sur une touche pour reprendre la main ?
...
Bah non.
Il n'y a que "pause" qui fait une pause.

Les programmes console sont faits pour être exécutés dans une invite de commande.
Si on les lances directement, ils s'exécutent tellement vite que l'on ne voit pas le résultat (Ce qui est un comportement normal).

Et soit dit en passant, faire une belle pause, ce n'est pas évident.

En effet, system("pause"); est très peu pratique.
D'une part la commande C "system" est une usine à gaz : elle lance une nouvelle instance de cmd.exe pour lui faire exécuter la commande passée en argument.
D'autre part ce n'est pas portable car la commande "pause" n'existe pas sous linux.

Faire un scanf est chiant à l'usage car il faut appuyer sur "Entrée".

Il n'y a pas de solution portable...
Par exemple, pour windows, une solution un peu propre est la suivante :
void __stdcall Console_Pause()
{
  HANDLE hInput;    /* Handle de l'entrée standard                            */
  DWORD nRead;      /* Nombre d'octets lus                                    */
  TCHAR buffer;     /* Réception du caractère                                 */
  DWORD nOldMode;   /* Sauvegarde le mode précédent pour le restituer         */

  hInput = GetStdHandle(STD_INPUT_HANDLE);
  GetConsoleMode(hInput, &nOldMode);
  SetConsoleMode(hInput, 0);
  ReadConsole(hInput, &buffer, 1, &nRead, NULL);
  SetConsoleMode(hInput, nOldMode);
}


Mais ça ne fonctionnera pas sous linux.
On peut aussi passer par getch de conio.h.
Mais conio.h n'est pas un header standard : aucune garantit qu'il soit disponible.

Bilan, pour faire une pause portable, il faudrait utiliser le code windows ci-dessus, trouver un code linux, et faire un ifdef pour utiliser l'un ou l'autre.

Conclusion, une pause c'est lourd à coder, et en plus ça gène l'utilisateur lorsqu'il utilise ton application.

Mais revenons à nos moutons...
Ton problème est que tu travailles dans un environement de dev, par exemple Visual Studio.

Cet environement démarre directement l'application console sans mettre de pause à la fin.
(Si tu compilais en invite de commande, tu n'aurais pas ce problème).

Déjà, Visual ou un autre permet de lancer le .exe tout en ajoutant une pause à la fin.
Sous VC6, par défaut, c'est ctrl+F5 (Execute Xxxx.exe).

Et si on est en debug, suffit de se mettre sur la dernière instruction (Le return du main en général) et placer un point d'arrêt (F9 sou VC6).
Ensuite F5 pour lancer le débogage.
Commenter la réponse de cs_rt15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.