Besoin d'aide pour comprendre un programme
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Besoin d'aide pour comprendre un programme



  1. #1
    invite0f796cb2

    Besoin d'aide pour comprendre un programme


    ------

    Bonjour,
    J’essaie de réaliser un programme en langage C à l'aide du logiciel codeblocks qui permettrait de calculer la masse molaire d'une molécule et étant débutant j'ai cherché sur internet un programme similaire mais je ne le comprend pas.
    Quelqu'un pourrait-il me l'expliquer svp? En particulié la partie en rouge.
    Merci

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    char S[]=" \
    H 1,008 \
    He 4,003 \
    Li 6,941 \
    Be 9,012\
    B 10,811\
    C 12,011\
    N 14,007\
    O 15,999 \
    F 18,998\
    Ne 20,180\
    Na 22,990\
    Mg 24,305\
    Al 26,982\
    Si 28,086\
    P 30,974\
    S 32,066\
    Cl 35,453\
    Ar 39,948\
    K 39,098\
    Ca 40,078\
    Sc 44,956\
    Ti 47,880\
    V 50,942\
    Cr 51,996\
    Mn 54,938\
    Fe 55,847\
    Co 58,933\
    Ni 58,690\
    Cu 63,546\
    Zn 65,390\
    Ga 69,723\
    Ge 72,610\
    As 74,922\
    Se 78,960\
    Br 79,904\
    Kr 83,800\
    Rb 85,468\
    Sr 87,620\
    Y 88,906\
    Z 91,224\
    Nb 92,906\
    Mo 95,940\
    Tc 98,906\
    Ru 101,070\
    Rh 102,906\
    Pd 106,420\
    Ag 107,868\
    Cd 112,411\
    In 114,820\
    Sn 118,710\
    Sb 121,750\
    Te 127,600\
    I 126,904\
    Xe 131,290\
    Cs 132,905\
    Ba 137,327\
    La 138,906\
    Ce 140,115\
    Pr 140,908\
    Nd 144,240\
    Pm 146,915\
    Sm 150,360\
    Eu 151,965\
    Gd 157,250\
    Tb 158,925\
    Dy 162,500\
    Ho 164,930\
    Er 167,260\
    Tm 168,934\
    Yb 173,040\
    Lu 174,967\
    Hf 178,490\
    Ta 180,948\
    W 183,850\
    Re 186,207\
    Os 190,200\
    Ir 192,220\
    Pt 195,080\
    Au 196,967\
    Hg 200,590\
    Tl 204,383\
    Pb 207,200\
    Bi 208,980\
    Po 208,982\
    At 209,987\
    Rn  222,018\
    Fr 223,020\
    Ra 226,025\
    Ac 227,028\
    Th 232,038\
    Pa 231,036\
    U 238,029\
    Np 237,048\
    Pu 244,064\
    Am 243,061\
    Cm 247,070\
    Bk 247,070\
    Cf 251,080\
    Es 252,083\
    Fm 257,095\
    Md 258,099\
    No 259,101\
    Lr 260,105\
    Rf 261,109\
    Db 262,114\
    Sg 263,118\
    Bh 262,123\
    Hs 265,000\
    Mt 266,000\
    Ds 269,000\
    Rg 272,000\
    Cn 277,000\
    ";
    
    float chercheMasse(char *s) {
        float masse;
        char *p=strstr(S, s);
        if(p==NULL) {
            fprintf(stderr,"Symbole %s inconnu !\n", s);
            exit(1);
        }
    
        if((sscanf(p,"%*s %f", &masse))!=1) {
            fprintf(stderr,"Masse invalide pour %s !\n", p);
            exit(1);
        }
    
        return masse;
    }
    
    void cumuler(float* somme, char *s, int o) {
        float masse;
        char t[10];
    
        strcpy(t, s); strcat(t, " ");
        masse=chercheMasse(t);
        *somme=*somme+o*masse;
    }
    
    [COLOR="#FF0000"][COLOR="#FF0000"]void decode(float *masse, char *f) {
    
        // Pointeur dans le symbole
        int ps=0;
        char symbole[4];
    
        int occurences=0;
    
        int cont=1;
    
        char c;
    
        while(cont) {
            c=*f;
            if (c=='\0' || (c>='A' && c<='Z')) {
    
                // 1 er cas : premier couple : rien à faire
                // 2 ème cas : un couple à été lu avant : cumuler le couple précédent
    
                if(ps!=0) {
                    if (occurences==0) occurences=1;
                    symbole[ps]=0;
                    cumuler(masse, symbole, occurences);
                    ps=0; occurences=0;
                }
    
                ps=0;
                symbole[ps]=c; ps++;
    
                if(c=='\0') cont=0;
            }
            else if (c>='a' && c<='z') {
                symbole[ps]=c; ps++;
            }
    
            else if (c>='0' && c<='9') {
                occurences=occurences*10+c-'0';
            }
            f++;
        }
    }
    
    int main(void) {
        float mm;
        char formule[100];
    
    printf("\n Bienvenue dans le programme automatique de calcul de masse molaire \n Attention le programme est sensible au minuscule et au MAJUSCULE \n\n                     Presser ENTRER pour commencer\n   \n");
    getchar();
        printf("Entrez votre formule (ex : H2O) : ");
        while(fgets(formule, 100, stdin) != NULL) {
            formule[strlen(formule)-1]=0;
            mm=0.0;
            decode(&mm, formule);
            printf("La masse molaire de %s vaut %f g/mol\n", formule, mm);
            printf("\n");
            printf("Entrez votre formule (ex : BeH2) : ");
        }
    
        return 0;
    }

    -----
    Dernière modification par JPL ; 10/01/2015 à 14h53. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    invite2d7144a7

    Re : Besoin d'aide pour comprendre un programme

    Bonjour,

    Puisque tu es débutant, le meilleur moyen est d'apprendre, et de faire toi-même un programme résolvant ton problème.

Discussions similaires

  1. Besoin d'aide pour comprendre
    Par inviteaa43b243 dans le forum Électronique
    Réponses: 7
    Dernier message: 05/08/2013, 00h10
  2. Besoin D'aide pour comprendre un schéma
    Par invitec6848975 dans le forum Électronique
    Réponses: 6
    Dernier message: 23/06/2011, 20h51
  3. Besoin d'aide pour comprendre le cerveau
    Par invite7753e15a dans le forum Santé et médecine générale
    Réponses: 2
    Dernier message: 01/03/2009, 14h15
  4. Besoin d'aide pour comprendre schema
    Par invited38c5375 dans le forum Électronique
    Réponses: 33
    Dernier message: 30/01/2009, 10h48
  5. Besoin d'aide pour comprendre ce schema
    Par invite8671019b dans le forum Électronique
    Réponses: 19
    Dernier message: 04/02/2008, 11h09