Partage
  • Partager sur Facebook
  • Partager sur Twitter

Echec sur tests

Lettre la plus fréquente - France ioi

Sujet résolu
    27 décembre 2021 à 11:52:09

    Bonjour à toustes,

    j'ai cet exercice à réaliser :

    J'ai pondu un code qui passe pour la moitié des tests. Pour l'autre moitié, ça ne passe pas. Pourquoi je ne sais pas. Je ne sais pas non plus ce qui est injecté dans les tests. Avec les miens ça passe. Voici mon code :

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    int main()
    {
        char stringToRead[10001];
        int count[26][2] = {0};
        fgets(stringToRead, sizeof(stringToRead), stdin);
        int lenOfReading = strlen(stringToRead);
        int maxCount = 0, maxLetter = 0;
        
        for (int i = 0; i < lenOfReading; i++)
        {
            if(isalpha(stringToRead[i]))
            {
                int thisChar = tolower(stringToRead[i]);
                count[thisChar][0] = thisChar;
                count[thisChar][1] += 1;
                
                if (count[thisChar][1] > maxCount)
                {
                    maxCount = count[thisChar][1];
                    maxLetter = count[thisChar][0];
                }
            }
        }
        
        printf("%c", toupper(maxLetter));
    }

    Merci d'avance pour vos réponses ^_^

    • Partager sur Facebook
    • Partager sur Twitter
      27 décembre 2021 à 13:28:24

      Bonjour,

      Tu écris des données en dehors de ton tableau (thisChar varie de 'a' à 'z', pas de 0 à 25). Il faudrait plutôt:

              if ( isalpha( (unsigned char)stringToRead[i] ) )
              {
                  int  thisChar = tolower( (unsigned char)stringToRead[i] );
                  int  char_index = thisChar - 'a';
                  ++count[char_index][1];
                   
                  if ( count[char_index][1] > maxCount )
                  {
                      maxCount = count[char_index][1];
                      maxLetter = thisChar;
                  }
              }

      Et ton code n'est pas optimal, on peut l'optimiser en en faisant le moins possible dans le parcours, puis en cherchant la lettre la plus représentée.

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        27 décembre 2021 à 16:01:39

        Cool merci j'ai compris le principe. Par contre pourquoi des unsigned char ?
        • Partager sur Facebook
        • Partager sur Twitter
          27 décembre 2021 à 16:32:01

          SebJ2 a écrit:

          Cool merci j'ai compris le principe. Par contre pourquoi des unsigned char ?


          isalpha() reçoit un int, il faut forcer le paramètre en unsigned char sinon dans le cas où les char seraient signés les caractères -128 à -1 posent un problème. Explications ici.
          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            27 décembre 2021 à 16:44:55

            Il est dit dans l’énoncé qu'il n'y a pas de lettre accentuées !

            SebJ2 Tu peux donner le lien, je n'arrive pas à le trouver ?

            • Partager sur Facebook
            • Partager sur Twitter
              27 décembre 2021 à 23:18:51

              Salut,

              Il est également inutile de stocker count[x][0], seul count[x][1] compte, donc on peut directement créer un count[26];

              La position dans le tableau est implicitement le code de la lettre.

              Une fois que tu as tout compté, la lettre à afficher est 'A' + l'index de la plus grande valeur.

              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                28 décembre 2021 à 0:18:03

                Hello,

                Et pour rendre cela plus propre, avec la proposition de Fvirtman, tu supprimes la ligne 11 et les lignes 21 à 25, et tu ajoutes avant l'accolade finale

                	int p=0;
                	for(int i=1;i<26;i++)
                		if(count[i]>count[p])
                			p=i;
                	printf("La lettre la plus présente est %c (%d x)",p+'a',count[p]);

                -
                Edité par edgarjacobs 28 décembre 2021 à 0:22:28

                • Partager sur Facebook
                • Partager sur Twitter

                Il y a ceux qui font des sauvegardes, et ceux qui n'ont pas encore eu d'incident....

                  28 décembre 2021 à 5:21:58

                  Si on n'est pas avare de mémoire, on peut faire plus rapide:
                  -
                  #include <stdio.h>
                  #include <ctype.h>
                  int main(void) {
                      unsigned char stringToRead[10001];
                      fgets(stringToRead, 10001, stdin);
                      int count[256] = { 0 };
                      for(unsigned char *c = stringToRead; *c; c++)
                          count[tolower(*c)]++;
                      int p = 'a';
                      for(int i='a'+1; i<='z'; i++)
                          if(count[i] > count[p]) p = i;
                      printf("Le caractère '%c' est le plus fréquent (%d)\n", p, count[p]);
                      return 0;
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    5 janvier 2022 à 16:44:13

                    Bon au final j'ai fait un mélange de tout ça et ça marche XD merci à vous

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Echec sur tests

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    • Editeur
                    • Markdown