Smanyx
Messages postés10Date d'inscriptionjeudi 5 février 2009StatutMembreDernière intervention14 avril 2010
-
Modifié le 28 déc. 2020 à 11:13
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDerniè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;
}
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 Modifié le 28 déc. 2020 à 11:15
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(" ");
for (k = 1; k != 0; k += delta)
val = i + k - 1;
if (val >= 10)
val -= 10;
printf("%d", val);
if (k <bold>i) delta</bold> -1;
}
printf("\n");
}
return 0;
}
Smanyx
Messages postés10Date d'inscriptionjeudi 5 février 2009StatutMembreDernière intervention14 avril 2010 Modifié le 28 déc. 2020 à 11:16
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;
}
Smanyx
Messages postés10Date d'inscriptionjeudi 5 février 2009StatutMembreDernière intervention14 avril 2010 22 sept. 2009 à 14:39
>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?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Smanyx
Messages postés10Date d'inscriptionjeudi 5 février 2009StatutMembreDernière intervention14 avril 2010 Modifié le 28 déc. 2020 à 11:24
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?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 23 sept. 2009 à 09:57
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.