begin process at 2012 05 28 14:27:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

boucle imbriquée et pyramide de nombres


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

boucle imbriquée et pyramide de nombres

dimanche 20 septembre 2009 à 14:19:58 | boucle imbriquée et pyramide de nombres

Smanyx




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

dimanche 20 septembre 2009 à 18:52:58 | Re : boucle imbriquée et pyramide de nombres

rt15

Membre Club Administrateur CodeS-SourceS

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;
}

lundi 21 septembre 2009 à 14:53:55 | Re : boucle imbriquée et pyramide de nombres

Smanyx



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...

lundi 21 septembre 2009 à 17:50:40 | Re : boucle imbriquée et pyramide de nombres

rt15

Membre Club Administrateur CodeS-SourceS



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.

mardi 22 septembre 2009 à 14:39:39 | Re : boucle imbriquée et pyramide de nombres

Smanyx


>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 (k== 1) 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?

mercredi 23 septembre 2009 à 08:09:44 | Re : boucle imbriquée et pyramide de nombres

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !

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 :

Code C/C++ :
#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;
}

}

mercredi 23 septembre 2009 à 08:56:57 | Re : boucle imbriquée et pyramide de nombres

Smanyx

Réponse acceptée !


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.

mercredi 23 septembre 2009 à 09:57:06 | Re : boucle imbriquée et pyramide de nombres

rt15

Membre Club Administrateur CodeS-SourceS

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 :

Code C/C++ :
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.



Cette discussion est classée dans : boucle, printf, for, imbriquée, pyramide


Répondre à ce message

Sujets en rapport avec ce message

boucle qui ne fonctionne pas [ par florian1121 ] Bonjour!!J'ai un probleme au niveau de mon programme, lorsque je le lance la boucle for dans les case ,ca empeche la boucle de switch de recommencer, Probleme de boucle infinie [ par darkwhite ] Salut à tous, abcrésultat000000100 pyramides [ par zell61 ] bonjour j ai un petit probleme j ai reussi a faire un code pour faire une pyramide en visual c++ que voici #include void main() { int n,j,i; printf(" incrimentation dans un boucle for en C [ par liondes ] Salut tout le monde SVP comment peut on incrimenter un poiteur i par 0.001 sachant que i de type float CAD [color=blue]step 0.001[/color] Problème générateur de grille de sudoku en C [ par Dovah ] Bonjour, je suis débutant en programmation, et pour m'entraîner j'ai décidé de créer un programme qui génère aléatoirement une grille de sudoku en C besoin d'aide dans programme en c [ par houda986 ] salut; je suis un débutante en programmation et j'ai besoin d'aide pour la résolution d'un programme en C,c'est un programme de tri par base ... j'ai Problème de transport primal dual [ par mouradmaster ] Bonjour tous, Je cherche un code source (en C, C++, java ou C#) concernant le problème de transport par primal dual (optimisation des coûts !). En ef la methode d'echange [ par cleopatre1988 ] salut   bon j'essai de faire un programme qui correspond au methode d'echanged'une matrice,voila le script e


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,232 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales