Besoin d'aide pour quelques exercices - C - Programmation
Marsh Posté le 28-10-2012 à 14:42:18
Bonjour, pour le 1, je vous donne un code écrit avec Ada qui permet de manipuler des dates gregorienne.
Code :
|
L'implementation
Code :
|
Le deux et le trois sont trop facile.
Si t'as jamais programmé, t'as du suivre des cours qui te permettent de le faire.
Je travaille avec Emacs.
Marsh Posté le 28-10-2012 à 14:50:19
Merci pour la solution mais je n'ai jamais utiliser Ada pour programmer ...
Comme je l'ai préciser je travail exclusivement avec CodeBlocks .Sinon j'ai suivis des cours mais ce genre d'exercices (le 2 et 3 surtout) on n'en n'a pas fais en cours de ce style.
Marsh Posté le 28-10-2012 à 16:27:40
Comme toujours dans ces cas-là, présentez-nous votre avancement sur chacun des exercices, pour que nous puissions vous donner des indications vous permettant d'aller plus loin, le but n'étant pas que nous fassions les exercices à votre place
Par exemple, bloquez-vous sur l'algorithme ou sur l'implémentation en C ? En fonction de vos réponses, nous pourrons vous aider à avancer
Bon courage !
Marsh Posté le 28-10-2012 à 18:10:19
Bonsoir,
Ben pour le 1er après avoir déclaré les 3 variables quand je rentre dans le If j'ai du mal a voir qu'elle condition je dois posé en premier.
Est-ce celle-la ? If(année>=1583 && année<=2483)
Marsh Posté le 28-10-2012 à 18:16:10
Par exemple, c'est un bon début !
De fait, l'ordre est assez peu important ! L'important est de n'oublier aucun test de validité, de bien penser à toutes les conditions à vérifier pour qu'une date soit valide.
Une fois tous vos tests imaginés "sur papier", vous pourrez passer à la phase suivante, qui consiste à coder l'algorithme que vous avez défini.
Marsh Posté le 28-10-2012 à 18:53:45
Farian a écrit : Par exemple, c'est un bon début ! |
L'ordre n'est pas important dans ce cas précis, mais il y a quand même une différence. Si le test échoue dans la partie gauche du "&&" , la partie droite ne sera même pas évaluée. Cela permet de faire des optimisations ou bien des choses de ce genre :
Code :
|
Marsh Posté le 28-10-2012 à 19:05:44
Je ne parle pour l'instant que d'algorithme, les détails d'implémentation seront vus plus tard !
Marsh Posté le 28-10-2012 à 21:15:18
Bonsoir,
Finallement je suis arrivé un résultat pas mauvais je trouve
#include <stdio.h>
#include <stdlib.h>
main()
{
int jours, mois, annee,jmax;
printf("\n entrez une date (jj/mm/aaaa)" );
scanf("%d/%d/%d/", &jours, &mois, &annee);
if(annee<1583||annee>2483)
{
printf("\n annee non valide" );
}
if(mois<1|| mois>12)
{
printf("\n mois non valide" );
}
switch(mois)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
jmax=31;
break;
case 4:
case 6:
case 9:
case 11:
jmax=30;
break;
case 2:
if((annee%4==0)&&(annee%100!=0)||(annee%400==0))
{
jmax=29;
printf("\n annee bissextile" );
}
else
{
jmax=28;
printf("\n annee non bissextile" );
}
break;
}
return 0;
}
Mais j'ai toujours un problème car quand je rentre une date il ne m'affiche pas si l'année est bissextile si je rentre par exemple le 28/10/2010 il ne m'affiche rien tandis que si je rentre le 28/02/2012 la il m'affiche bien annee bissextile ?
Marsh Posté le 28-10-2012 à 21:41:48
L'affichage "annee bissextile" / "annee non bissextile" n'est effectué que si le mois saisi est février. Dans le premier exemple que vous avez donné, il est donc normal que rien ne soit affiché.
En revanche, vous ne faites pas le test pour vérifier que le jour saisi est correct (vous ne faites que positionner jmax sans l'utiliser )
Edit : Vous devriez aussi tester le retour de la fonction "scanf".
Marsh Posté le 28-10-2012 à 22:23:17
Voila pour tester le jour :
if(jours>jmax)
{
printf("\n Date non valide" );
}
else
{
printf("\n Date valide" );
C'est bon la il me semble car quand je le compile et l’exécute et que je rentre une date il m'affiche bien date valide ?
Marsh Posté le 28-10-2012 à 22:42:57
Salut :
Voilà ma solution, elle fonctionne.
Tu es de l'inpress?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int jour,mois,annee;
char slash1, slash2;
printf("\n Saisir un jour, un mois et une annee sous le format JJ/MM/AAAA : " );
scanf("%d%c%d%c%d",&jour,&slash1,&mois,&slash2,&annee); /* L'instruction acceptera les données après le / */
if (annee <1583 && annee >2483)
printf ("La date saisie est invalide" ); /* Si la condition n'est pas valide, indique date saisie invalide */
if (mois <1 && mois >12)
printf ("La date saisie est invalide" ); /* Si la condition n'est pas valide, indique date saisie invalide */
if (jour <1 && jour >31)
printf ("La date saisie est invalide" ); /* Si la condition n'est pas valide, indique date saisie invalide */
switch (mois)
{
case 02: if (annee %400 ==0 || (annee%100!=0 && annee%4==0)) /* Voici les conditions a respecté pour le mois de février */
printf (" Ce mois contient 29 jours", mois); /* D'après les calculs, affiche si le mois contient 29 jours */
else /* sinon */
printf (" Ce mois contient 28 jours", mois); /* D'après les calculs, affiche si le mois contient 28 jours */
break;
case 4:
case 6:
case 9:
case 11: printf(" Ce mois contient 30 jours \n", mois); /* D'après les calculs, affiche si le mois contient 30 jours */
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf(" Ce mois contient 31 jours \n", mois); /* D'après les calculs, affiche si le mois contient 31jours */
break;
default : printf("\n La date saisie est invalide" ); /* Sinon, indique date invalide */
}
return 0;
}
Marsh Posté le 28-10-2012 à 22:50:09
Vous devriez aussi tester que "jours" est supérieur à zéro, sinon, cela paraît correct, en effet.
Marsh Posté le 28-10-2012 à 22:52:31
J'ai indique jour <1 && >31 Donc, le jour doit est au dessus de 1 et en dessous de 31.
Quelqu'un aurait une idée pour les exercices 2 et 3?
Marsh Posté le 28-10-2012 à 23:38:29
Désolé.
Mais est-ce que vous sauriez m'aidez pour les 2 autres exercices?
Je suis très novice
Marsh Posté le 28-10-2012 à 23:43:15
Comme indiqué plus haut, montrez-nous ce que vous avez déjà fait ou sur quel point précis vous bloquez et nous pourrons vous donner des indices pour avancer dans la résolution des problèmes.
Marsh Posté le 28-10-2012 à 23:44:07
Pour le trois, je partirais de la fin de la chaîne si je trouve une parenthèse ouvrante avant une parenthèse fermante, je lève une erreur.
Marsh Posté le 28-10-2012 à 23:47:39
Pour le Deux : #include <stdio.h>
#include <stdlib.h>
int main()
{
int ph, Fin, Ouvertes, Fermes;
printf("Saisir une phrase entre parenthese et finir la phrase par un point: " );
fflush (stdin);
while(ph != '.' && ph != 1)
{
Fin = '.';
if (getchar() ==40)
{
Ouvertes=Ouvertes+1;
}
else
{
Fermes=Fermes+1;
}
}
Fin ='.';
fflush (stdin);
return 0;
}
Il ne tourne pas
Marsh Posté le 29-10-2012 à 00:09:01
Plusieurs remarques ...
* Vous ne comparez le caractère lu (retour de "getchar()" ) qu'au code 40, pas aux autres caractères intéressants (parenthèse fermante et point). Par ailleurs, autant tester "if (x == '(')" au lieu de "if (x == 40)", c'est beaucoup plus lisible.
* La variable "ph" que vous utilisez pour rester dans le "while" n'est pas initialisée, il y a donc de grandes chances que vous n'entriez jamais dans ce while.
* Vous ne faites que compter le nombre de parenthèses ouvrantes et de fermantes, mais l'égalité de ces deux nombres n'est pas suffisante pour valider le fait que la phrase saisie soit "correcte" de ce point de vue-là.
Je vous propose d'organiser le programme d'une autre façon (aux erreurs de syntaxe près, je n'ai pas de compilateur sous la main pour tester ) :
|
Il ne vous reste plus qu'à remplir les trois parties contenant les traitements
Marsh Posté le 29-10-2012 à 00:14:12
Bonsoir.
Merci pour votre rapidité et votre efficacité.
Je vais le compiler et remplir les autres traitements nécessaire.
Grand Merci.
Par contre, pour le dernier exercices, je ne vois pas par ou commence.
Marsh Posté le 29-10-2012 à 00:17:14
Tout simplement en créant le squelette du programme :
* tirer un nombre au hasard
* faire une boucle qui demande alternativement à chacun des joueurs de saisir un chiffre et décrémenter le nombre initial de la valeur saisie jusqu'à ce que l'on atteigne 0
L'important est de bien vérifier les valeurs saisies et de gérer l'alternance des joueurs, puis d'afficher le nom du gagnant.
Marsh Posté le 29-10-2012 à 00:19:50
J'essaie de changer les traitements pour l'exercices et m'attaquent 'enfin' a l'exercice 3.
Merci Farian
Marsh Posté le 29-10-2012 à 00:21:52
Bon courage !
Je lirai vos éventuels progrès après une bonne nuit de sommeil (mon patron ne me paye pas pour passer la nuit sur HFR à aider les gens )
Marsh Posté le 29-10-2012 à 00:25:34
Malheureusement, ça m'aurait bien aidé.
Grand merci à toi et je m'arrangerai pour l'exercice 3.
Je dois le rendre demain matin..
Bonne nuit et bonne soirée
Marsh Posté le 29-10-2012 à 15:10:28
Voilà, j'ai rendu mon exercice a mon prof.
voilà ce que j'ai trouve pendant la nuit. (Elle à porte conseil)
EX : 1
#include <stdio.h>
#include <stdlib.h>
int main()
{
int jour,mois,annee;
do{
system("cls" );
printf("\n Saisir un jour, un mois et une annee sous le format JJ/MM/AAAA : " );
scanf("%d/%d/%d",&jour,&mois,&annee); /* L'instruction acceptera les données après le / */
}while(annee<1583 || annee>2483 || mois<1 || mois>12 || jour<1 || jour>31);
// Autre possibilité" //
//if (annee <1583 || annee >2483)
//printf ("La date saisie est invalide" ); /* Si la condition n'est pas valide, indique date saisie invalide */
//if (mois <1 || mois >12)
//printf ("La date saisie est invalide" ); /* Si la condition n'est pas valide, indique date saisie invalide */
//if (jour <1 || jour >31)
//printf ("La date saisie est invalide" ); /* Si la condition n'est pas valide, indique date saisie invalide */
switch (mois)
{
case 02: if (annee %400 ==0 || (annee%100!=0 && annee%4==0)) /* Voici les conditions a respecté pour le mois de février */
printf (" Ce mois contient 29 jours", mois); /* D'après les calculs, affiche si le mois contient 29 jours */
else /* sinon */
printf (" Ce mois contient 28 jours", mois); /* D'après les calculs, affiche si le mois contient 28 jours */
break;
case 4:
case 6:
case 9:
case 11: printf(" Ce mois contient 30 jours \n", mois); /* D'après les calculs, affiche si le mois contient 30 jours */
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf(" Ce mois contient 31 jours \n", mois); /* D'après les calculs, affiche si le mois contient 31jours */
break;
default : printf("\n La date saisie est invalide" ); /* Sinon, indique date invalide */
}
return 0;
}
EX 2 :
#include <stdio.h>
#include <stdlib.h>
int main()
{
int saisie,D,G,A,total; //D => Parenthèses D, G => Parenthèses G, A=> Autres polices. //
D=0, G=0, A<=1; // Les compteurs sont à 0 pour G et D. Mais inférieur ou égale à 1 pour A (Caractère) //
printf("Saisir une phrase entre parenthese et finir la phrase par un point: \n" );
fflush (stdin); //Vider le buffer//
do
{
saisie = getchar();
switch (saisie)
{
case '(':D++; //Compteur D//
break;
case ')':G++; //Compteur G//
break;
default:A++; //Police//
break;
}
} while (saisie != '.'); //Si la phrase est finie par un . Sortir du programme//
total=D-G; //Ma phrase (total) est correct si il y a une parenthèse ( et une parenthèses ) avec un .
if(total!=0 || A<=1)
{
printf("\n La phrase est incorrecte" );
}
else
{
printf("\n Bravo, la phrase est correcte" );
}
return 0;
}
EX 3 :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
/* Déclaration des variables */
int Nombre, SubNombre, a, b, Joueur;
fflush(stdin);
/* mettre les valeurs des variables */
a = 40;
b = 76;
Joueur = 1; // 1 = premier joueur, 2 = second joueur */
/* Générer un nombre aléatoire */
srand(time(NULL));
Nombre = rand() % (b - a) + a; // entre 40 et 75 //
/* Les règles et le nombre aléatoire choisi : */
printf("\nLe nombre est %d", Nombre);
printf("\n\nIl faut soustraire un nombre compris entre 1 et 9.\nLe premier joueur a atteindre 0 a perdu." );
printf("\n\n-------------------------------------------------------------------------------" );
/* Que le jeu commence */
while(Nombre > 0)
{
if(Joueur == 1)
{
/* Demander au joueur 1 */
printf("\n\n\n- C'est au tour du joueur 1.\n\n Entrer votre nombre a soustraire : " );
scanf("%d", &SubNombre);
Joueur = 2;
}
else
{
/* Demander au joueur 2 */
printf("\n\n\n- C'est au tour du joueur 2.\n\n Entrer votre nombre a soustraire : " );
scanf("%d", &SubNombre);
Joueur = 1;
}
if(SubNombre >=1 && SubNombre <= 9)
{
/* Soustraire le nombre choisi */
Nombre = Nombre - SubNombre;
if(Nombre > 0)
{
printf("\n>>> Reste : %d", Nombre);
}
else
{
printf("\n>>> Reste : 0" );
}
}
else
{
/* Dire qu'il y a une erreur si le nombre est plus petit que 1 et plus grand que 9 */
printf("\n /!\\ Entrez un nombre compris entre 1 ET 9 !!" );
/* Demander au meme joueur de rejouer */
if(Joueur == 2)
{
Joueur = 1;
}
else
{
Joueur = 2;
}
}
}
/* Dire qui a perdu */
if(Joueur == 2)
{
printf("\n\n\n>>>>> Dommage, Joueur 1, vous avez perdu !!\n\n\n\n" );
}
else
{
printf("\n\n\n>>>>> Dommage, Joueur 2, vous avez perdu !!\n\n\n\n" );
}
return 0;
}
Marsh Posté le 29-10-2012 à 15:26:59
Y a moyen d'avoir une info sur l'algo adapté à la résolution automatique de ce jeu, je suis intéressé.
Marsh Posté le 29-10-2012 à 15:33:07
Pour l'algo, aucune idée.
Désole.
Mais tous les programmes ci-dessus fonctionnent
Marsh Posté le 29-10-2012 à 16:31:10
Tout d'abord, bravo !
Le code aurait pu être plus simple (notamment en évitant de dupliquer le code de demande du nombre et en ne changeant de joueur actif qu'une fois un nombre valide saisi ).
Jovalise, pouvez-vous préciser votre question ? Cherchez-vous une stratégie gagnante ?
Marsh Posté le 29-10-2012 à 16:52:29
Farian a écrit : Tout d'abord, bravo ! |
Oui, voir le % de partie gagné par joueur 1 et joueur 2 en fonction du tirage. Je comprend à peine le jeu, elle est compliquée votre question.
Marsh Posté le 29-10-2012 à 16:54:13
Arf, non, c'est pas ça que je cherche, je veux que le jeu joue contre lui même.
Je me retrouve... Merci.
Marsh Posté le 29-10-2012 à 19:02:29
Bonsoir Farian,
voila pour le 1er j'ai un problème car il ne m'affiche pas toujours date invalide exemple si je met 32/10/2010 ?
Si tu sais prendre un peu de ton temps pour m'aider Merci
#include <stdio.h>
#include <stdlib.h>
main()
{
int jour, mois, annee, jmax;
printf("\n entrez une date (jj/mm/aaaa): " );
scanf("%d/%d/%d/", &jour, &mois, &annee);
if(annee<1583 && annee>2483)
{
printf("\n annee non valide" );
}
if(mois<1 && mois>12)
{
printf("\n date non valide" );
}
if(jour<1 && jour>31)
{
printf("\n date non valide" );
}
if(jour>jmax)
{
printf("\n date non valide" );
}
else
{
printf("\n date valide" );
}
switch(mois)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
jmax=31;
break;
case 4:
case 6:
case 9:
case 11:
jmax=30;
break;
case 2:
if((annee%4==0)&&(annee%100!=0)||(annee%400==0))
{
jmax=29;
}
else
{
jmax=28;
}
break;
default: printf("\n la date n'est pas valide" );
}
return 0;
}
Marsh Posté le 29-10-2012 à 19:27:08
Bonsoir !
2 fautes, à première vue :
* Les tests de validité sont mal faits : if(annee<1583 && annee>2483) vaut toujours faux, car l'année ne peut pas être à la fois inférieure à 1583 et supérieure à 2483 Il faut remplacer les && par des || ! (idem pour le mois et le jour)
* Vous ne testez pas à la fin que jours <= jmax ! Vous le faites avant d'avoir positionné la valeur de jmax, il faut le faire APRES le switch.
Marsh Posté le 29-10-2012 à 19:58:22
Merci au fait les tests de validité j'ai remarqué l'erreur assez bête
Et pour tester que jours<= jmax je le place donc quand je sort du switch ?
Edit:
main()
{
int jour, mois, annee, jmax;
printf("\n entrez une date (jj/mm/aaaa): " );
scanf("%d/%d/%d/", &jour, &mois, &annee);
if(annee<1583 || annee>2483)
{
printf("\n annee non valide" );
}
if(mois<1 || mois>12)
{
printf("\n date non valide" );
}
if(jour<1 || jour>31)
{
printf("\n date non valide" );
}
switch(mois)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
jmax=31;
break;
case 4:
case 6:
case 9:
case 11:
jmax=30;
break;
case 2:
if((annee%4==0)&&(annee%100!=0)||(annee%400==0))
{
jmax=29;
}
else
{
jmax=28;
}
break;
}
if(jour>jmax)
{
printf("\n date non valide" );
}
else
{
printf("\n date valide" );
}
return 0;
}
La il ne me semble pas mauvais qu'en pensez-vous ? (Il me reste que cette exercice un peu casse tete a cause de ce probleme d'affichage)
Marsh Posté le 29-10-2012 à 22:15:33
Plutôt que de passer par un case compliqué, faire d'entrée un tableau des jmax, et n'y modifier que l'entrée de février quand l'année n'est pas bissextile me semble plus simple comme approche.
Code :
|
A+,
Marsh Posté le 29-10-2012 à 23:01:19
Je n'avais pas fait gaffe tout à l'heure, mais il y a une erreur dans le code de l'exercice 2, comme je vous le suggérais hier :
Citation : * Vous ne faites que compter le nombre de parenthèses ouvrantes et de fermantes, mais l'égalité de ces deux nombres n'est pas suffisante pour valider le fait que la phrase saisie soit "correcte" de ce point de vue-là. |
Vous ne faites que compter les parenthèses ouvrantes et fermantes, et vérifier à la fin qu'il y en a autant de chaque type, ce qui a pour effet que la "phrase" suivante sera vue comme correcte :
abc)))def(((ghi |
Il n'est pas suffisant de vérifier à la fin que G = D, il faut aussi s'assurer à tout instant que G >= D (on pourrait aussi s'assurer qu'il y a toujours au moins un caractère "autre" entre une parenthèse ouvrante et une parenthèse fermante, mais je pense que c'est en dehors de la complexité de l'exercice, on ne va pas non plus écrire une grammaire !!!! )
(je pense que c'est un des pièges dans lequel votre examinateur attend que vous tombiez )
Marsh Posté le 29-10-2012 à 23:55:23
Bref un truc dans ce goût:
Code :
|
Je n'ai pas trop compris ce comptage des caractères autres que les parenthèses, il n'est pas demandé dans l'exercice. A priori, rien dans l'énoncé ne me semble exclure la vérification comme correcte de (()).
A+,
Marsh Posté le 30-10-2012 à 06:05:05
Tout à fait d'accord, c'était juste une remarque sur le fait que "()" n'apporte rien dans une "phrase" et pourrait être supprimé sans rien changer. Mais je vous accorde qu'il s'agit là de pinaillage sans rapport direct avec l'énoncé de l'exercice (je vais mettre ça sur le compte d'un petit moment de faiblesse de ma part ).
Marsh Posté le 30-10-2012 à 07:42:15
Bonjour.
Merci a tous pour vos réponses rapide efficace.
J'ai fais ce genre de solution () pour vérifie si j'indique (coucou(())). Était correct.
La phrase )(coucou. Est "correcte car les parenthèses sont ouvertes et fermes. Pas dans le sens traditionnel ().
Ayant déjà rendu mon travail, j'avais mal compris l'exercice et pensait que si je pouvais faire )( . Était correct car le . Mettais fin au programme et me disait si oui ou non la phrase était ok.
Encore grand merci, je vous tiens au courant et j'espère que ce devoir suffira.
Aanthoo dit Anthony
Marsh Posté le 28-10-2012 à 13:59:45
Bonjour a tous ,
J'ai des exercices a faire pour Mardi et il y a 3 exercices qui me posent problèmes et sur lesquels je sèche :
1) Ecrire un programme qui lit une date (jour, mois, année) et qui vérifie qu'elle est valide dans le calendrier grégorien.(année comprise entre 1583 et 2483)
-Remarques:1)Il faut saisir la date au format(jj/mm/aaaa) en une fois.
2)L'année, le mois et le jour doivent être contrôlés(une 1ere fois ) à la saisie.
2) Entrez une phrase contenant des parenthèses droites '(' et gauches ')', l'entrée se terminera par un point. Le programme vérifiera si la phrase à une structure de parenthèses correcte, c'est à dire qu'à chaque parenthèse ouverte correspond une et une seule parenthèse fermée située à sa droite.Utiliser getchar() pour les entrées.
3) Ecrire un programme proposant le jeu suivant: l'ordinateur tire au hasard un nombre compris entre 40 et 75 l'affiche; le joueur 1 et le joueur 2 doivent alternativement soustraire de ce nombre un nombre compris entre 1 et 9; après chaque soustraction le total restant est affiché. La fin du jeu est atteinte quand un joueur atteint 0 et à de ce fais perdu; le programme indique quel à perdu. Les entrées doivent être contrôlées.
Voilà les énoncés, je remercie ceux qui prendront un peu de leurs temps pour m'aider et m'expliquer car je débute en progra je n'en ai donc jamais fais auparavant.
PS: Je travail sous CodeBlocks Svn 4066.