PDA

Afficher la version complète : [Réglé] Débutant en programmation



guigui
31/01/2009, 15h40
Bonjour, je débute en programmation grâce aux cours sur le site du zéro, et même pour être sûr j'ai utilisé un code pour ne pas faire une erreur d'indentation, et voici le code modifié que j'ai fait :


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

int main ( int argc, char** argv )
{

long nombreMystere = 0, nombreEntre = 0, compteur = 0;
const long MAX = 100, MIN = 1;

// Génération du nombre aléatoire

srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

/* La boucle du programme. Elle se répète tant que l'utilisateur
n'a pas trouvé le nombre mystère */

printf("---Bienvenue---");
printf("Combien de chances voulez-vous ? : ");
scanf("%ld", &compteur);


do
{

// On demande le nombre
printf("Quel est le nombre ? ");
scanf("%ld", &nombreEntre);

// On compare le nombre entré avec le nombre mystère

if (nombreMystere > nombreEntre)
{
printf("C'est plus !\n\n");
compteur--;
printf("Il vous reste %ld chance(s)", compteur);
}
else if (nombreMystere < nombreEntre)
{
printf("C'est moins !\n\n");
compteur--;
printf("Il vous reste %ld chance(s)", compteur);
}
else // Si le nombre n'est ni inférieur ni supérieur, c'est qu'il est égal, donc c'est bon !
printf ("Bravo, vous avez trouve le nombre mystere !!!\n\n");
} while (nombreEntre != nombreMystere);

system("PAUSE");
}

et dans un IDE, j'ai découvert que l'erreur vient des incrémentations et décrémentations... quelqu'un sait-il pourquoi ?

Edit : j'ai modifié le code car il y a eu un petit probème au copier/coller ;)

Agemen
31/01/2009, 16h35
ça compile chez moi. Sauf la pause, à la fin. Et ça marche. sauf que quand tu utilises plus de chance que ce que tu entres au départ, tu sort pas de la boucle ;) . Donc à la fin je ferais un

while (nombreEntre != nombreMystere && compteur>0);
Ensuite j'ai du mal avec le

system("PAUSE");
va falloir que tu m'explique ce que ça fait là :P
Pour finir, c'est peut être moi, mais en C, par convention, en fin de main, on fait un petit return 0; pour dire que tout c'est bien passé. Ou return i; avec i un entier initialisé. Ca permet de débugger le programme ;)

Burn2
31/01/2009, 17h15
Bonjour en lisant ton code, il manque déjà une condition:

while (nombreEntre != nombreMystere && compteur>0);
comme l'a dit agemen donc

Ensuite le système("pause") c'est sous windows. :D

guigui
31/01/2009, 20h09
Bonjour, j'ai mis ce code vite fait car je voulais savoir si c'était normal que la compilation plante, mais pour vous ca fonctionne... je me demande bien pourquoi :blink: c'est embêtant d'écrire des programmes si je peut pas le compiler :blink:

Edit : alors la j'ai absolument rien compris, le même code mais cette fois-ci copié/collé depuis alionet et ca compille :blink: je suis obligé de poster mes codes sur alionet et les copié/collé ensuite :blink: c'est assez gênant comme problême :blink:

Edit2: pour remercier alionet de m'avoir aidé, j'ai corrigé le code :

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

int main ( int argc, char** argv )
{

long nombreMystere = 0, nombreEntre = 0, compteur = 0;
const long MAX = 100, MIN = 1;

// Génération du nombre aléatoire

srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

/* La boucle du programme. Elle se répète tant que l'utilisateur
n'a pas trouvé le nombre mystère */

printf("---Bienvenue---");
printf("\n\nCombien de chances voulez-vous ? : ");
scanf("%ld", &compteur);

do
{

// On demande le nombre
printf("Quel est le nombre ? ");
scanf("%ld", &nombreEntre);

// On compare le nombre entré avec le nombre mystère

if (nombreMystere > nombreEntre)
{
printf("C'est plus !\n\n");
compteur--;
printf("Il vous reste %ld chance(s)", compteur);
}
else if (nombreMystere < nombreEntre)
{
printf("C'est moins !\n\n");
compteur--;
printf("Il vous reste %ld chance(s)", compteur);
}
else // Si le nombre n'est ni inférieur ni supérieur, c'est qu'il est égal, donc c'est bon !
printf ("Bravo, vous avez trouve le nombre mystere !!!\n\n");
} while (nombreEntre != nombreMystere && compteur > 0);

return 0;
}

je sais, y avait pas grand chose à corriger :lol: mais je compte bien poster de nouveau code de logiciel que j'aurai crée ;)

Edit : voici un code entierement réalisé par moi cette fois :


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

int main(int argc, char **argv)
{
long chiffreun = 0, chiffredeux = 0, resultat = 0, choixutil = 0;

printf("--- Bienvenue dans ma calculette :D ---");
printf("\nChoisissez l'opération que vous voullez faire :\n");
printf("\n--- 1. Addition ---\n");
printf("--- 2. Multiplication ---\n");
printf("--- 3. Soustraction ---");
printf("\n--- 4. Division ---");
printf("\n\nQuelle opération voulez-vous faire ? : ");
scanf("%ld", &choixutil);

if (choixutil == 1)
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &chiffreun);
printf("\nTapez le deuxieme nombre : ");
scanf("%ld", &chiffredeux);
resultat = chiffreun + chiffredeux;
printf("\nVoici le résultat : %ld", resultat);
}
else if (choixutil == 2)
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &chiffreun);
printf("\nTapez le deuxieme nombre : ");
scanf("%ld", &chiffredeux);
resultat = chiffreun * chiffredeux;
printf("\nVoici le résultat : %ld", resultat);
}
else if (choixutil == 3)
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &chiffreun);
printf("\nTapez le deuxieme nombre : ");
scanf("%ld", &chiffredeux);
resultat = chiffreun - chiffredeux;
printf("\nVoici le résultat : %ld", resultat);
}
else
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &chiffreun);
printf("\nTapez le deuxieme nombre : ");
scanf("%ld", &chiffredeux);
resultat = chiffreun / chiffredeux;
printf("\nVoici le résultat : %ld", resultat);
}

printf("\n\nMerci d'avoir utilisé ma calculette :)\n");

return 0;
}

Agemen
01/02/2009, 00h32
Euh, une question en passant. Si je rentre une lettre à la place d'un entier, il se passe quoi? Tu gères les exceptions?

guigui
01/02/2009, 10h20
si tu rentre une lettre à la place d'un chiffre, le calcul se termine avec pour résultat 0 si c'est dans le premier nombre, et pour résultat le premier nombre si c'est dans le deuxieme, étant donné que les variables sont initialisés à 0 ;) j'ai essayé ;)

Burn2
01/02/2009, 11h57
Je ne sais pas si en C ça existe (en C++ en tout cas c'est le cas), plutôt que de mettre X if else if else etc, regarde du côté du
"switch + case".
Et je te conseille aussi de basculer progressivement en C++ et pas C. Mais de faire ça progressivement. Tu peux mixer les deux sans problème, et ne mettre que du C en compilant en C++. Mais un switch c'est plus adapté.

Le C n'est plus trop utilisé, et le C++ me semble plus facile à apprendre que le C tout cours. enfin pour moi. ;)

Avec une petite remarque:
Si on rentre n'importe quoi dans le premier menu on va se retrouver dans la dernière partie.

guigui
01/02/2009, 13h35
en effet le switch existe aussi en C, mais sur le site du zéro, il est dit que pour apprendre le C++, il fallait d'abord apprendre le C :rolleyes:

j'ai aussi amélioré ma calculette, voici le code :


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

int main(int argc, char **argv)
{
long choixutil = 0, nombreun = 0, nombredeux = 0, resultatcalculette = 0, continueounoncalculette = 1;

printf("--- Bienvenue dans ma calculette ---");
printf("\n\n Voici les différents choix :\n\n");

do
{
printf("1. Addition\n");
printf("2. Multiplication\n");
printf("3. Division\n");
printf("4. Soustraction");
printf("\n\nAlors, que choisissez-vous ? : ");
scanf("%ld", &choixutil);

if (choixutil == 1)
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &nombreun);
printf("\nTapez le deuxième nombre : ");
scanf("%ld", &nombredeux);
resultatcalculette = nombreun + nombredeux;
printf("\n\n Voici le résultat : %ld", resultatcalculette);
}
else if (choixutil == 2)
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &nombreun);
printf("\nTapez le deuxième nombre : ");
scanf("%ld", &nombredeux);
resultatcalculette = nombreun * nombredeux;
printf("\n\n Voici le résultat : %ld", resultatcalculette);
}
else if (choixutil == 3)
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &nombreun);
printf("\nTapez le deuxième nombre : ");
scanf("%ld", &nombredeux);
resultatcalculette = nombreun / nombredeux;
printf("\n\n Voici le résultat : %ld", resultatcalculette);
}
else if (choixutil == 4)
{
printf("\n\nTapez le premier nombre : ");
scanf("%ld", &nombreun);
printf("\nTapez le deuxième nombre : ");
scanf("%ld", &nombredeux);
resultatcalculette = nombreun - nombredeux;
printf("\nVoici le résultat : %ld", resultatcalculette);
}
else
{
printf("Cette opération n'est pas valide");
}

printf("\n\nVoulez-vous continuer à utiliser la calculette ? si oui, tapez 1, si non, tapez 2 : ");
scanf("%ld", &continueounoncalculette);

} while (continueounoncalculette == 1);

return 0;
}

Burn2
01/02/2009, 13h53
Bah tu sais les on dit. :D

Dans ma formation j'ai commencé directement par le C++ et je n'en suis pas mort, je jongle avec le C et le C++ sans pb, mais quand on connait la puissance du C++ on a du mal à rester cloisonné en C c'est pour ça. :D
Si le switch existe aussi en C alors je te conseille d'essayer de l'utiliser alors. :) ça sera plus propre et te permet de gérer l'exception de si on entre un mauvais choix (avec "default:"...)

Agemen
01/02/2009, 14h35
Euh, je rejoindrai pas burn2 pour dire que le C n'est plus utilisé... et le kernel, il est codé en quoi?
En plus, a chacun son compilateur. Pour de l'impératif, fait du C. Pour de l'objet, fait du C++. De l'impératif pur sera plus rapide en C, compilateur gcc, qu'en C compilateur g++... après, c'est infime...
Ensuite faut voir que si tu as besoin de coder sur des processeurs spéciaux, c'est bien de connaitre le C assez précisément. Et aussi d'être capable de s'adapter à plusieurs compilateurs. Le C n'est PAS portable ;) ...
Je surenchéris sur le switch. C'est un peu plus lent parfois, mais en général ça roule.
Ensuite, si tu rentres une lettre, ça s'arrête. Pas bien :P ce serait peut être mieux que tu dises "eyh, mon pote, fais pas n'importe quoi, rentre un entier"...
Ensuite, je maintiens que tu gères pas les exceptions. Sur l'avant dernière version, le programme s'arrête avec un bon "exception de pointeur d'entier". Avec la dernière, on reste dans une boucle infinie. Reste le ctrl+C pour en sortir. Il va falloir faire une petite amélioration ;)

Pour finir, je te conseille de sortir la partie texte (entrez le premier entier) des tests... apèrs faut voir si c'est utile. Ca pourrait raccourcir le code ;)

Burn2
01/02/2009, 15h57
Pour le C je parlais de manière générale. :D Déjà que le C++ n'est pas non plus trop utilisé. :/
Mais quitte à apprendre ce langage je pense que c'est mieux de foncer vers le C++ vu toutes les possibilités offertes. (en rajoutant le QT après miam!)

guigui
01/02/2009, 16h55
entre le C et le C++, je compte y passer surement des que j'aurai fini les 2 premières parties du C, car les cours sur le C++ ne reprennent pas depuis le début et on arrive vite avec QT. Pour ce qui est des exeptions, je suis en train d'essayer de les gérer, mais je crois qu'il faudra peut-être que j'utilise le switch ;)

Edit : j'ai réalisé un installateur de ma calculette pour tester, et qui fonctionne avec wine, évidemment, la version installé était celle de Linux :P pratique pour quand je saurai créer de plus grands programme ( pour l'instant ce n'est que de la console ) et en natif sous linux = instaljammer