Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices pour débutants en C

Au menu : zSommeChiffres (nombres, algo)

18 février 2009 à 20:49:07

On attend plus que la correction, et un nouvel exercice :p
@+
  • Partager sur Facebook
  • Partager sur Twitter
19 février 2009 à 14:43:50

Salut à tous. J'ai eu un petit problème avec l'exercice zBinary (encore désolé si je reviens un peu en arrière).
J'ai déjà essayé de l'écrire en algorithme et c'était sans fautes.
Par contre lorsque j'utilise Visual C++ 2008 Express, je donne un nombre décimal et j'obtiens un 0 en binaire.

Pour information, je n'utilise ni des tableaux, ni la manipulation de caractères. Dans mon code, je représente le nombre converti en binaire représenté sous forme d'un nombre double (pour un maximum de chiffres) grâce aux puissances de 10. Voilà le code source:


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

double decimalEnBinaire(unsigned long decimal);

int main(int argc, char **argv)
{
	unsigned long nombreDecimal = 0;
	printf("Entrez un nombre en base decimale : ");
	scanf("%ld",&nombreDecimal);
	printf("\n\n%ld (Dec) = %ld (Bin)\n", nombreDecimal , decimalEnBinaire(nombreDecimal));
	system("PAUSE");
	return 0;
}

double decimalEnBinaire(unsigned long decimal)
{
	double somme = 0;
	unsigned long reste = 0, quotient = decimal;
	long i = 0;
	while ((quotient!= 0) && (reste!= 0))
	{
		reste = quotient % 2;
		somme += (reste*pow(10,i));
		quotient /= 2;
		i++;
	}
	return somme;
}



Merci d'avance si quelqu'un sait quel est le problème de mon code :)
  • Partager sur Facebook
  • Partager sur Twitter
19 février 2009 à 16:26:40

Il y a un souci dans la condition de ton while, ligne 22. Tu initialises le reste à 0 et donc tu ne rentres jamais dans ta boucle à cause du deuxième membre de la condition.
  • Partager sur Facebook
  • Partager sur Twitter
19 février 2009 à 23:32:45

ça y est c'est réglé pour le code.
condition (il fallait mettre un || au lieu de &&)
par contre une autre erreur de formatage printf (un %ld pour un double au lieu de %lf)

merci les gars, j'ai testé et ça marche à merveille. On peut même l'adapter l'octal si on échange le 2 par un 8 dans les formules du quotient et du reste. :)
  • Partager sur Facebook
  • Partager sur Twitter
21 février 2009 à 15:47:26

Bonjour , moi aussi j'ai un petit problème avec zBinary ... Je ne sais pas pourquoi il plante et le compilateur ne me donne aucune erreur et aucun warning!
Voici mon code :



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


int main()
{

    /* Déclaration des variables */

    long nombre_decimal = 0;
    long nombre_binaire[100] = {2};
    long i = 0;
    long u = 0;

    /* Mot de bienvenue */

    printf("\n Bienvenue dans zBinary, un petit logitiel qui va vous permettre de \n transformer des nombre decimal en nombre binaire .\n\n");

    /* Demande a l'utilisateur quel nombre décimal il veut convertir */

    printf(" Quel nombre decimal (entier) voulez vous transformer en nombre Binaire ? ");
    scanf("%ld", &nombre_decimal);

    /* Convertion du nombre */

do
{

    if(nombre_decimal % 2 != 0)
    {

    nombre_decimal = nombre_decimal % 2;
    nombre_binaire[i] = 1;
    i++;

    }

    else
    {

    nombre_decimal = nombre_decimal / 2;
    nombre_binaire[i] = 0;
    i++;

    }

}while(nombre_decimal != 0);

    while(nombre_binaire[u] != 2)
    {
    printf("%ld", nombre_binaire[u]);
    u++;
    }

    return 0;
}




Merci d'avance à tout ceux qui prendrons le temps de le lire.
  • Partager sur Facebook
  • Partager sur Twitter
21 février 2009 à 17:00:17

Salut,

À tous ceux qui rencontreraient des difficultés au niveau code avec les exercices que je propose, ouvrez un nouveau topic, dans votre intérêt. ;)
Maintenant que j'y suis, je te donne la solution à ton problème. Déjà cette ligne, dans le premier if :
nombre_decimal = nombre_decimal % 2;

Je pense que c'est une erreur de frappe, c'est '/' qu'il faut utiliser (division).
Ensuite, l'algo est bon. C'est encore mieux si tu fais des fonctions et il me semble que dans ton cas, une boucle for serait plus adaptée qu'une do-while (en effet, dans n'importe quel cas (deux cas ici), tu incrémentes i).
Ensuite, la partie du code qui ne va pas et qui fait planter ton programme, c'est l'affichage :
while(nombre_binaire[u] != 2)
    {
    printf("%ld", nombre_binaire[u]);
    u++;
    }

Je n'ai pas compris la logique du "!=2" mais passons. L'algorithme que tu as choisi te donne en quelques sortes les chiffres binaires un à un mais "à l'envers". Comme tu les mets ainsi dans le tableau, il faut que tu affiches ce dernier à l'envers. Tu sais que i stocke l'emplacement de la première valeur (dans l'ordre logique) plus un. Tu vas donc affecter i-1 à u et décrémenter u tant que u>=0 est vrai tout en affichant nombre_binaire[u] à chaque tour de boucle. Tu fais ça simplement avec une boucle for :
for(u = i-1; u>=0; u--)
    printf("%ld",nombre_binaire[u]);

Une dernière chose : pourquoi créer un tableau de long pour stocker des valeurs binaires (0 ou 1) ? short ou char sont bons aussi.

Je posterai la correction de zGame ce soir ou demain (si demain, sans faute).

Cordialement
crys
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 2:27:38

Salut,

Ce n'est pas le bon endroit pour poser ces questions. :-°

Cordialement,

crys
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 14:56:16

Citation : 012220

après avoir tous compris sur le langage c, c++, java... , je pourrais faire des jeux ou mini jeux sur mon htc touch hd ou l'iphone? comme le petit coréen de 9 ans, déjà réalisé plein de programmes pour l'Iphone, il connait 6 langage de programmation



Déjà, il te faut bien plus que les tuto du site du zéro pour comprendre un langage.
Par exemple : t'as compris le code de ma signature?

Et pour faire ce genre d'applications, il faut avoir des bibliothèques spécialisées et les tutos ne sont pas très présents et donc il va falloir se contenter de la doc en anglais.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
22 février 2009 à 15:09:05

Le code de ta signature Jaloyan1 n'est pas spécialement compliqué car on peut le décomposer en plusieurs lignes (comme je t'avais montré une fois). Il existe des bouts de code tout petits qui même décomposés, indentés, etc. resterons compliqués à comprendre.

Cependant 012220 pas besoin du c++, java, et chepakoi pour pouvoir faire des minis-jeux et bien t'éclater hein ^^
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 15:26:18

Citation : 21

Le code de ta signature Jaloyan1 n'est pas spécialement compliqué car on peut le décomposer en plusieurs lignes (comme je t'avais montré une fois). Il existe des bouts de code tout petits qui même décomposés, indentés, etc. resterons compliqués à comprendre.

Cependant 012220 pas besoin du c++, java, et chepakoi pour pouvoir faire des minis-jeux et bien t'éclater hein ^^




Oui mais par exemple je peux te sortir un truc du genre :

int a = 5;
int b = a++;
printf("%d\t%d\n",a,b);
a = 5
b = ++a;
printf("%d\t%d",a,b);


Si je vous demande de me donner les sorties de ce mini code.
Beaucoup me diront :

5        6
6        6


Alors qu'en fait, le résultat sera :

6        5
6        6



Cela fait partie d'une des choses à maitriser dans le C.
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 15:36:09

Citation : Jaloyan1

Cela fait partie d'une des choses à maitriser dans le C.


Oupas.
Perso, je préfère éviter quand je peut ce genre de chose.
Exemple:
while(str[i] != '\0')
  putchar(str[i++]);


je préfère écrire
while(str[i] != '\0')
{
  putchar(str[i]);
  i++;
}


Au moins, je suis sûr du résultat...
Il faut se méfier quand même de ce genre de chose.
Quand à ton code de signature, je le trouve immonde. Simplement parce qu'il est totalement incompréhensible. (oui, j'ai compris que ça calcule le minimum de 4 nombre, mais ça fait peut à voir quand même).
int mini;
mini = a < b ? a : b;
mini = mini < c ? mini : c;
mini = mini < d ? mini : d;

Ça a au moins le mérite d'être intelligible. Si ta variable ne s'appelle pas mini (qui est un nom plus qu'explicite) mais qu'elle s'appelle foo, je suis sûr qu'on comprend mieux mon code que le tiens. Alors bien sûr, c'est amusant de jouer avec l'opérateur ternaire, mais faut pas en abuser non plus ;)
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 15:51:23

Citation : IATGOF

Citation : Jaloyan1

Cela fait partie d'une des choses à maitriser dans le C.


Oupas.
Perso, je préfère éviter quand je peut ce genre de chose.
Exemple:

while(str[i] != '\0')
  putchar(str[i++]);



je préfère écrire

while(str[i] != '\0')
{
  putchar(str[i]);
  i++;
}


Je préfère ce genre de truc.

size_t i = 0;
    while(putchar(str[i++]));


Citation : IATGOF


Au moins, je suis sûr du résultat...
Il faut se méfier quand même de ce genre de chose.
Quand à ton code de signature, je le trouve immonde.


Merci c'est gentil.

Citation : IATGOF

Simplement parce qu'il est totalement incompréhensible.


C'est le but.
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 16:05:55

Citation : Jaloyan1

Je préfère ce genre de truc.

size_t i = 0;
    while(putchar(str[i++]));

J'ai encore des choses à apprendre sur la fonction putchar()...

Citation : Jaloyan1

Citation : IATGOF

Quand à ton code de signature, je le trouve immonde.


Merci c'est gentil.


De rien, ça me fait plaisir ;)

Maintenant ça serait bien d'arrêter de pourrir ce topic...
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 18:25:23

Il serais pas en retard par hasard notre crys?? :)
  • Partager sur Facebook
  • Partager sur Twitter
22 février 2009 à 23:16:52

Oui, j'ai pris un petit retard (ceci étant dû à mon entrée dans l'équipe du site). :) J'étais donc occupé tout l'après-midi. Je posterai la correction de zGame demain.
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 8:30:44

crys' est valido maintenant (il va avoir des piles de tutos sur les bras ...).
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 14:22:55

lol crys valido!

<humour>(eh : on est toujours copain? J'aurais 2 ou 3 tutos à faire valider en douce)</humour>
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 15:41:07

Correction de zGame



Envois des résultats à réponse : 12

Voilà enfin la correction de zGame. L'exercice était relativement plus simple que les précédents, comme vous m'avez conseillé de faire. Effectivement, cela semble avoir un peu plus de succès. ^^ La correction ne sera pas si longue car assez simple.

Pour ce qui est des inclusions nécessaires, si vous ne vouliez pas que votre compilateur vous tire à coup de warning ou d'error, il fallait penser aux choses suivantes :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


Le programme étant simple et court, je me suis permis de n'utiliser qu'une seule et unique fonction : le main. Nous allons donc commencer à le construire, ce main. Voici la structure globale :
int main()
{
    printf("\n Appuyez sur entrer pour quitter...");
    while(getchar() != '\n');
    getchar();
    return 0;
}

La boucle while sert à faire en sorte que le programme ne se ferme pas instantanément après avoir répondu au dernier calcul (elle vide le buffer).

À quoi fallait-il penser avant toute chose ? Déjà, n'oublions pas qu'il faudra tirer des nombres de manière pseudo-aléatoire et pour cela, nous utiliserons rand(). Il faut donc initialiser le générateur en appelant srand() (une fois, au début du programme). Nous allons aussi en profiter pour déclarer les variables qui nous seront nécessaires. De quoi aurons-nous besoin ? C'est assez simple :
  • Pour les calculs : deux variables int pour stocker les facteurs des multiplications et une autre variable int pour stocker le résultat.
  • Une variable int pour stocker le nombre d'erreur(s).
  • Encore une variable de type int pour récupérer la saisie de l'utilisateur.
  • Une dernière variable de type int pour boucler.
  • Deux variables de type clock_t, une pour marquer le début du chrono, l'autre pour marquer la fin. Cela va nous permettre de calculer le temps total qu'a mis le joueur pour effectuer les multiplications.

Nous avons donc déjà :
int main()
{
    srand(time(NULL));

    int facteur1=0, facteur2=0, resultat=0, i=0, nbrErreur=0, saisie=0;
    clock_t temps1=0, temps2=0;

    printf("\n Appuyez sur entrer pour quitter...");
    while(getchar() != '\n');
    getchar();
    return 0;
}

Ensuite, comme dit dans l'énoncé, nous allons afficher le titre du jeu ainsi qu'un bref descriptif des règles avant de proposer au joueur de commencer.
int main()
{
    srand(time(NULL));

    int facteur1=0, facteur2=0, resultat=0, i=0, nbrErreur=0, saisie=0;
    clock_t temps1=0, temps2=0;

    printf( "\n [[ zGame ]] : Entrainez-vous au calcul mental ! \n"
            "\n Le but du jeu est simple : \n"
            " Le programme va vous soumettre dix calculs sur les tables de multiplication \n"
            " que vous allez devoir resoudre le plus rapidement possible et ... de tete ! \n"
            "\n Vous etes pres ? Appuyez sur entrer pour commencer !" );
    getchar();
    printf("\n C'est parti ! \n");

    // ....

    printf("\n Appuyez sur entrer pour quitter...");
    while(getchar() != '\n');
    getchar();
    return 0;
}

Voilà comment je vais procéder maintenant : avant de coder la boucle principale qui va afficher les différents calculs l'un après l'autre, je vais d'abord préparer le terrain, notamment avec le chrono et l'affichage des performances. Dés que l'utilisateur a choisi de lancer la partie, on prend le temps (temps1). Une fois les calculs effectués, on récupère encore une fois le temps (temps2). On affiche ensuite le temps (en seconde, avec une précision de l'ordre de 10-3) séparant les deux prises (cela ce fait assez simplement) sans oublier le nombre d'erreur(s).

On récupère le temps à l'aide de la fonction clock(). Pour afficher le temps total, on soustrait temps1 à temps2 et on divise le tout par CLOCKS_PER_SEC. Il suffit ensuite de jouer avec le main pour afficher trois chiffres après la virgule. On a donc ceci :
int main()
{
    srand(time(NULL));

    int facteur1=0, facteur2=0, resultat=0, i=0, nbrErreur=0, saisie=0;
    clock_t temps1=0, temps2=0;

    printf( "\n [[ zGame ]] : Entrainez-vous au calcul mental ! \n"
            "\n Le but du jeu est simple : \n"
            " Le programme va vous soumettre dix calculs sur les tables de multiplication \n"
            " que vous allez devoir resoudre le plus rapidement possible et ... de tete ! \n"
            "\n Vous etes pres ? Appuyez sur entrer pour commencer !" );
    getchar();
    printf("\n C'est parti ! \n");

    temps1 = clock();

    // ....

    temps2 = clock();

    printf("\n Vous avez mis %.3lf seconde(s) et vous avez %i erreur(s).\n",
           (double)(temps2-temps1)/CLOCKS_PER_SEC, nbrErreur);

    printf("\n Appuyez sur entrer pour quitter...");
    while(getchar() != '\n');
    getchar();
    return 0;
}

Remarquez, j'ai mis un commentaire. C'est à cet endroit que le jeu va se dérouler. Nous aurons besoin d'une boucle for qui incrémente la variable i jusqu'à 10-1, on aura ainsi fait 10 tours de boucle (correspondant aux dix multiplications).
for(; i<10; i++)
{ /* .... */ }

À l'intérieur de cette boucle, nous allons procéder de manière logique. Nous allons calculer et stocker le premier facteur, suivi du second pour ensuite calculer et stocker le résultat du produit des deux facteurs.
for(; i<10; i++)
{
    facteur1 = rand()%11; // tire un nombre pseudo-aléatoire dans l'intervalle [0;10]
    facteur2 = rand()%11;
    resultat = facteur1*facteur2;
    // ....
}

Ceci étant fait, nous allons afficher le calcul au joueur et demander le résultat. Rien de plus simple, comme toujours :
for(; i<10; i++)
{
    facteur1 = rand()%11;
    facteur2 = rand()%11;
    resultat = facteur1*facteur2;

    printf("\n %i x %i = ", facteur1, facteur2);
    scanf("%i",&saisie);
    // ....
}

On a presque fini ! Il nous reste à incrémenter nbrErreur si resultat est différent de saisie. Hum, c'est amusant que cette précédente phrase peut facilement se traduire en C :
if(saisie != resultat)
    nbrErreur++;

Et voilà ! Il n'en fallait pas plus pour réaliser un jeu amusant (voir utile pour certains :-° ). J'espère que cela vous aura permis de réviser un peu votre cours sur le C. Allez hop, un petit récapitulatif du code :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));

    int facteur1=0, facteur2=0, resultat=0, i=0, nbrErreur=0, saisie=0;
    clock_t temps1=0, temps2=0;

    printf( "\n [[ zGame ]] : Entrainez-vous au calcul mental ! \n"
            "\n Le but du jeu est simple : \n"
            " Le programme va vous soumettre dix calculs sur les tables de multiplication \n"
            " que vous allez devoir resoudre le plus rapidement possible et ... de tete ! \n"
            "\n Vous etes pres ? Appuyez sur entrer pour commencer !" );
    getchar();
    printf("\n C'est parti ! \n");

    temps1 = clock();

    for(; i<10; i++)
    {
        facteur1 = rand()%11;
        facteur2 = rand()%11;
        resultat = facteur1*facteur2;

        printf("\n %i x %i = ", facteur1, facteur2);
        scanf("%i",&saisie);

        if(saisie != resultat)
            nbrErreur++;
    }

    temps2 = clock();

    printf("\n Vous avez mis %.3lf seconde(s) et vous avez %i erreur(s).\n",
           (double)(temps2-temps1)/CLOCKS_PER_SEC, nbrErreur);

    printf("\n Appuyez sur entrer pour quitter...");
    while(getchar() != '\n');
    getchar();
    return 0;
}


Bonne continuation !

Cordialement,
crys

PS :

Citation : ok

crys' est valido maintenant (il va avoir des piles de tutos sur les bras ...).


Tu ne crois pas si bien dire. :-°
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 16:25:07

Allez, maintenant, un méga dur à nous tuer du lama ! :D
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 16:54:15

Tiens, pourquoi sous linux otient-on toujours un temps de 0s ? :$ (je sens que ma question est bête :p)

Vivement le prochain exo ;o)
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 17:11:40

Il n'y a pas de question bête... ;)

J'avais déjà répondu à cette question, regarde ce post.

Au passage, le code de crys' se ferme quasiment instantanément après la dernière opération (compilé par le biais de C::B). Petit souci de purge de buffer... ;)
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 17:38:42

Hum, c'est vrai. Corrigé, merci à toi.
  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 18:22:01

Je poste mon code (pour les personnes intéressées) pour cet exercice en secret :
(je ne gère pas le zéro mais si quelqu'un vois une solution simple pour le gérer je suis près à modifier)


main.c


/*
zGame
Par Lithrein

main.c
----------

Contient la fonction main
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "fonctions.h"

int main() {

    int choix_menu = 0;
    srand(time(NULL)); /* On initialise rand*/

    while (choix_menu == 0 || choix_menu == 2) {
        choix_menu = menu();
        switch(choix_menu) {

            case 1:
            jeu();
            break;

            case 2:
            credits();
            break;

            case 3:
            exit(0);
            /* le cas default est inutile car on ne peut pas avoir autre chose que 1,2 ou 3*/
        }
    }

     printf("Appuyer sur une touche pour quitter ...\n");
     getchar();
     /* Si le programme ne fait pas de pause a la fin decommenter la ligne suivante */
     /*getchar();*/

     return 0;

}

fonctions.h


/*
zGame
Par Lithrein

fonction.h
----------

Prototypes Fonctions Principales du jeu
*/
#ifndef FONCTION8_H
#define FONCTIONS_H

/* Constantes de preprocesseur -- Debut */
#define TAILLE_NOM 100
#define TAILLE_RESULTAT 3
#define MIN 1
#define MAX 10
/* Constantes de preprocesseur -- Fin */

/* Macros -- Debut */
#define xstr(s) str(s)
#define str(s) #s
/* Macros -- Fin */

/* Structures -- Debut */
typedef struct multiplication multiplication;
struct multiplication {

    int facteur1,facteur2,resultat;

};
/* Structures -- Fin */

void intro();
int menu();
void instructions();
void jeu();
void credits();

void tirer_nombre(multiplication *multiplication);
void vider_buffer_clavier();

#endif

fonctions.c


/*
zGame
Par Lithrein

fonction.c
----------

Fonctions Principales du jeu
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#include "fonctions.h"

void intro() {
    printf("..::zGame::..\n");
    printf("Calcul mental avec les tables de multiplication\n\n");
}

int menu() {

    int choix = 0, ok = 0;

    intro();

    printf("* Menu *\n\n");
    printf("1 - Jouer\n");
    printf("2 - Credits\n");
    printf("3 - Quitter\n\n");

    while (!ok || choix >= 4) {

        printf("Utiliser la touche [1], [2] ou [3] pour indiquer votre choix puis appuyer sur entree.\n");
        scanf(" %d*[^\n]", &choix);

        if (!choix) {
            vider_buffer_clavier();
        } else {
            getchar();/* on mangge le \n */
            ok = 1;
        }
    }

    return choix;
}

void instructions() {

    printf("\t* Regle du jeu *\n");
    printf("Le programme vous demande votre nom puis vous tire une serie de dix\
calculs mathematiques sur les tables de multiplication \
(oui, ceux qu'on bosse en primaire  ). Le but du jeu \
est de trouver la bonne reponse a ces calculs le plus \
rapidement possible et en faisant le moins d'erreurs possibles.");

}

void jeu() {

     /* Déclaration des variables -- Début*/
    int i = 0, erreurs = 0;
    long int temps_debut = 0, temps_fin = 0;
    char nom[TAILLE_NOM+1];
     /* Structures */
    multiplication operation;
     /* Déclaration des variables -- Fin*/

     /* On affiche les regles du jeu */
     instructions();
     printf("\nAppuyer sur une touche pour continuer ...");
     getchar();

     /* On demande son nom au Joueur */
    printf("\n\nQuel est ton nom ? (vous disposez de 100 caracteres, vous puvez utiliser des espaces)\n");
    scanf(" %"xstr(TAILLE_NOM)"[^\n]", nom);

     /* On recupere le temps au debut de la serie */
    temps_debut = time(NULL);

    for (i = 0; i < 10; i++) {

     /* Declaration des variables -- Debut */
    int ok = 0, resultat = 0;
     /* Declaration des variables -- Fin */

    tirer_nombre(&operation); /* On tire la multiplicatio a resoudre */

        while (!ok) { /* Tant que la saisie n'est pas un nombre */

            if (operation.facteur1 < 10 && operation.facteur2 < 10) { /* On affiche la multiplication */
                printf("%2d x %2d = ", operation.facteur1, operation.facteur2);
            } else if (operation.facteur1 == 10 && operation.facteur2 < 10) {
                printf("%d x %2d = ", operation.facteur1, operation.facteur2);
            } else if (operation.facteur1 < 10 && operation.facteur2 == 10) {
                printf("%2d x %d = ", operation.facteur1, operation.facteur2);
            } else if (operation.resultat == 100) {
                printf("%d x %d = ", operation.facteur1, operation.facteur2);
            }


            scanf(" %d*[^\n]", &resultat); /* On demande le resultat */
            if (!resultat) { /* On verifie si scanf a fonctionne */
                vider_buffer_clavier();
            } else {
                getchar(); /* on mange le \n */
                ok = 1; /* On indique que c'est bon */
            }
        }

        if (resultat == operation.resultat) { /* On verifie le resultat */
            printf("Juste.\n");
        } else {
            ++erreurs; /* On ajoute une erreur puis on affiche le bon resultat */
            printf("Faux. Le bon resultat etait %d.\n", operation.resultat);
        }
    }

     /* On recupere le temps a la fin de la serie */
    temps_fin = time(NULL);

     /* Phrase de conclusion */
    printf("\nCher %s,\n\
Vous avez mis %ld secondes.\n\
Et Vous avez fait %d erreur(s).\n", nom, temps_fin - temps_debut, erreurs);

}

void credits() {
    printf("\t* Credits *\n\n");
    printf("Initiateur du projet : Crys'\n\
Codeur : Lithrein\n");
printf("Appuyer sur une touche pour continuer ...\n");
getchar();
#ifndef __win32__
system("cls");
#endif
}

void tirer_nombre (multiplication *operation) {

    operation->facteur1 = (rand() % (MAX - MIN + 1)) + MIN;
    operation->facteur2 = (rand() % (MAX - MIN + 1)) + MIN;
    operation->resultat = operation->facteur1 * operation->facteur2;

}

void vider_buffer_clavier() {

    int c;
    while (((c = getchar()) != '\n') && c != EOF);

}

  • Partager sur Facebook
  • Partager sur Twitter
23 février 2009 à 18:48:38

Attention à ne pas confondre projet et exercice...

Ca me fait d'ailleurs penser qu'on utilise plein de chose "plus adapté", plus "pro" dans un simple programme mais qu'on n'ose pas optimiser ceci:
(rand() % (MAX - MIN + 1)) + MIN;

C'est tout de même bizarre vous trouvez pas :-°
  • Partager sur Facebook
  • Partager sur Twitter
26 février 2009 à 8:29:34

Salut,

crys', à quand le prochain exo ? Ce serait dommage de laisser ce topic, bien que j'imagine que tu es débordé... ;)

a++
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
26 février 2009 à 10:19:29

Citation : Gambit2099

Attention à ne pas confondre projet et exercice...

Ca me fait d'ailleurs penser qu'on utilise plein de chose "plus adapté", plus "pro" dans un simple programme mais qu'on n'ose pas optimiser ceci:

(rand() % (MAX - MIN + 1)) + MIN;


C'est tout de même bizarre vous trouvez pas :-°



à vrai dire si on veut un nombre tel que
<math>\(\forall n \in \mathbb{N} et 0 \le n < max\)</math>
alors rand() % max suffit.
Sinon je vois pas trop comment optimiser le code que tu proposes.
  • Partager sur Facebook
  • Partager sur Twitter
26 février 2009 à 11:15:36

Citation : Jaloyan1

Citation : Gambit2099

Attention à ne pas confondre projet et exercice...

Ca me fait d'ailleurs penser qu'on utilise plein de chose "plus adapté", plus "pro" dans un simple programme mais qu'on n'ose pas optimiser ceci:

(rand() % (MAX - MIN + 1)) + MIN;


C'est tout de même bizarre vous trouvez pas :-°



à vrai dire si on veut un nombre tel que
<math>\(\forall n \in \mathbb{N} et 0 \le n < max\)</math>
alors rand() % max suffit.
Sinon je vois pas trop comment optimiser le code que tu proposes.


C'est bien joli de vouloir réutiliser le "pour tout" mais là c'est assez faux.
Tu dit: <math>\(\forall n \in \mathbb{N}\)</math> ce qui signifie que <math>\(n \in[0 ; +\infty[\)</math>
Dans le cas où on a <math>\(n \in[0 ; max[\)</math> alors rand() % max est suffisant, oui.
  • Partager sur Facebook
  • Partager sur Twitter
26 février 2009 à 11:32:15

Ça marche pas?

Bon tant pis...

pour une fois que j'avais appris une balise TeX.

EDIT : au fait crys, on a le droit de proposer nous même un exo(en te l'envoyant par mp bien sûr)?
  • Partager sur Facebook
  • Partager sur Twitter
26 février 2009 à 13:06:27

Hum... Ca n'est pas une balise Tex, c'est un quantificateur mathématique, et il faut savoir qu'un certain nombre d'étudiants l'utilisent mal, donc restes-en à des formulations qui font certes moins "geek" ou matheux mais qui restent juste.

Au passage on ne l'utilise jamais seul mais suivi d'au moins une assertion mathématique (qui peut elle-même contenir des quantificateurs).
  • Partager sur Facebook
  • Partager sur Twitter