Partage
  • Partager sur Facebook
  • Partager sur Twitter

Appel de void dans un switch

Sujet résolu
    23 novembre 2017 à 14:24:18

    Bonjour, dans le cadre d'un exercice je dois appeler différentes fonction dans les case d'un switch. Lorsque je test les fonctions individuellemetns dans le main, elle fonctionnent toutes. Seulement lorsque elles sont appelées dans le switch, elle ne fonctionnent plus et je ne comprends pas pourquoi pourriez vous m'aider svp ? merci 

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    void voy ()
    {
    	char tab1[100];
    	int i,a=0;
    	printf("Saisir chaine 1\n");
    	fgets(tab1,100,stdin);
    	for (i=0;i<strlen(tab1);i++)
    	{
    		if (tab1[i] == 'a' ||tab1[i] == 'e' ||tab1[i] == 'i' ||tab1[i] == 'o' ||tab1[i] == 'u' ||tab1[i] == 'y' )
    		{
    			a = a+1;
    		}
    	printf("Il y a %d voyelles",a);
    }
    }
    void conversionMaj()
    {
    	int i;
    	char tab[200];
    	fgets(tab,200,stdin);
    	 for (i=0; i<200; i++)
    	 {
    		 if ('a'<= tab[i] && tab [i]<='z')
    		 {
    			 tab[i] = tab[i] - 'a' + 'A';
    		 }
    	}
    printf("%s",tab);
    }	
    	
    void conversionMin()
    {
    	int i;
    	char tab[200];
    	fgets(tab,200,stdin);
    	 for (i=0; i<200; i++)
    	 {
    		 if ('A'<= tab[i] && tab [i]<='Z')
    		 {
    			 tab[i] = tab[i] + 'a' - 'A';
    		 }
    	}
    printf("%s",tab);
    }		
    	
    void comp()
    {
    	char tab1[100];
    	char tab2[100];
    	printf("Saisir chaine 1 et 2\n");
    	fgets(tab1,100,stdin);	
    	fgets(tab2,100,stdin);
    	int i;
    	i = strcmp(tab1,tab2);
    	if (i<0)
    	{
    		printf("Chaine 1 avant chaine 2");
    	}
    	else if (i==0)
    	{
    		printf("Chaine 1 et 2 identiques");
    	}
    	else 
    	printf("Chaine 2 avant chaine 1");
    }
    
    void compLong()
    {
    	char tab1[100];
    	int i;
    	printf("Saisir chaine 1\n");
    	fgets(tab1,100,stdin);	
    	i = strlen(tab1);
    	printf("Votre chaîne fait %d caractères.\n",i);
    }	
    	
    void conc()
    {
    	char tab1[100];
    	char tab2[100];
    	printf("Saisir chaine 1 et 2\n");
    	fgets(tab1,100,stdin);	
    	fgets(tab2,100,stdin);
    	strcat(tab2,tab1);
    	printf("%s",tab2);
    }
    	
    void crypt()
    {
    	int i,dec;
    	char tab[200];
    	printf("Entrez la chaine de caractère à crypter\n");
    	fgets(tab,200,stdin);
    	printf("Entrez le décalage voulu\n");
    	scanf("%d",&dec);
    	for (i=0;i<strlen(tab);i++)
    	{
    		tab[i]= tab[i] - dec;
    	}
    printf("Votre cryptage : %s",tab);
    }
    
    void decrypt()
    {
    	int i,dec;
    	char tab[200];
    	printf("Entrez la chaine de caractère à décrypter\n");
    	fgets(tab,200,stdin);
    	printf("Entrez le décalage voulu\n");
    	scanf("%d",&dec);
    	for (i=0;i<strlen(tab);i++)
    	{
    		tab[i]= tab[i] + dec;
    	}
    printf("Votre décryptage : %s",tab);
    }
    
    void menu ()
    {
    	int a;
    	printf("1-Convertir en majuscules\n");
    	printf("2-convertir en minuscules\n");
    	printf("3-Comparer deux chaines\n4-Compter la longueur de la chaine\n5-Concatener 2 chaines\n6-crypter\n7-decrypter\n8-nombre de voyelles\n");
    	scanf("%d",&a);
    	switch (a)
    	{
    		case 1:		
    				conversionMaj();
    		        break;		
    		case 2: conversionMin();
    		        break;
    		case 3: comp();
    		        break;
    		case 4: compLong();
    		        break;
    		case 5: conc();
    		        break;
    		case 6: crypt();
    		        break;
    		case 7: decrypt();
    		        break;
    		case 8: voy();
    		        break;
    		default : printf("Erreur de saisie");
    	
    	}		
    }
    
    
    int main()
    {
    	
    	menu();
    	
    	return 0;
    }
    

    -
    Edité par VictorQuidet 23 novembre 2017 à 15:09:31

    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2017 à 15:25:04

      Salut,

      Tu dois avoir un '\n' résiduel qui traine. Ajoutes un getchar(); juste après ton scanf() ligne 128 pour voir ...

      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2017 à 15:46:11

        Merci c'était exactement ca !
        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2017 à 16:06:28

          Au passage : les boucles de la forme

           for (i=0;i<strlen(tab);i++)
              {
                  tab[i]= tab[i] + dec;
              }

          posent un problème : l'expression strlen(tab) est réévaluée à chaque tour de boucle, et elle comporte elle même une boucle de parcours de la chaine pour trouve le caractère nul qui en marque la fin.

          Le temps de calcul est donc proportionnel au carré de la longueur, au lieu d'être proportionnel tout court. C'est à dire qu'avec une chaine de 100 caractères, ça ferait dans les 10000 opérations.

          Deux remèdes simples

          1) calculer la longueur de la chaine, puis faire la boucle (stratégie de "variable cache")

          int taille = strlen(tab);
          for (i = 0; i < taille; i++) {
             ...
          }
          

          2) arrêter la boucle quand on tombe sur le caractère nul

          for (i = 0; t[i] != '\0'; i++) {
            ...
          }
          



          -
          Edité par michelbillaud 23 novembre 2017 à 16:37:02

          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2017 à 16:33:41

            VictorQuidet a écrit:

            Merci c'était exactement ca !

            Le conseil que je t'ai donné était simplement un 'dépannage'. Ce n'est pas une solution suffisante ...



            • Partager sur Facebook
            • Partager sur Twitter

            Appel de void dans un switch

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown