IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Trouver le min,max et le nombre d'occurence du max dans une suite


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut Trouver le min,max et le nombre d'occurence du max dans une suite
    Bonjour à tous!

    Alors voilà, je dois créer un programme qui comme l'indique le titre, doit me donner le max et le nombre d'occurrences de celui-ci ainsi que le minimum d'une série de nombres.

    Ce que je ne comprend pas trop, c'est que cela fonctionne pour une petite série de nombre (3 ou 4), mais ensuite il ne m'affiche pas du tout ce que je veux

    Voici déjà ce que j'ai fais mais je ne vois pas trop mon (mes) erreur(s).
    Bon là je ne réalise l'affichage que pour le minimum mais bon, pour le maximum c'est pareil, ca ne fonctionne pas comme je le voudrais.

    Merci d'avance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include<stdio.h>
    #include<stdlib.h>
     
    int main()
     
    {
        int tab[30],min,posmin;
    int n,i,maxi,max;
    i=1;
    n=0;
    posmin=0;
     
     
     
        do
        {
               printf("Nombre : ");
               scanf("%d",&tab[i]);
               if (tab[i]>=10 && tab[i]<=100)
               {
               n++;
               i++;
               tab[i]=tab[i];
               }
               else
               {}
        }
        while (tab[i]!=0);
     
       for(i=1;i<=n;i++)
       {
                        min=tab[1];
                        if (tab[i]<=min)
                        {
                                           min=tab[i];
                                           posmin=i;
     
                        }
       }
       for(i=1;i<=n;i++)
       {
                        max=tab[1];
                        if (tab[i]>=max)
                        max=tab[i];
     
       }
       printf("%d\n",min);
       system("pause");
     
     
    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Edit: J'ai réglé une partie de mon problème, à savoir m'afficher le minimum et le maximum, j'ai simplement sorti la ligne min=tab[1] de la boucle for...
    Par contre maintenant nouveau problème :s je ne peux entrer que 7 nombres...et là je ne vois vraiment pas quoi faire

    Merci!

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, bienvenue sur le forum. Je te rappelle qu'en C, les indices d'un tableau vont de 0 à n-1 et non pas de 1 à n. Ceci pourra éviter des plantages

    Citation Envoyé par adri010 Voir le message
    Bonjour à tous!

    Alors voilà, je dois créer un programme qui comme l'indique le titre, doit me donner le max et le nombre d'occurrences de celui-ci ainsi que le minimum d'une série de nombres.
    Voici ce que je te propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void)
    {
    	int tab[] = {1,2,3,4,5,4,9,3,1,9,4,9,3};
    	int n = sizeof tab / sizeof * tab;
    	int i;
    	int min, max; // minimum et maximum du tableau tab
    	int nmax; // nombre d'occurence du maximum du tableau tab
     
    	min = max = tab[0];
    	nmax = 1;
     
    	for(i = 1 ; i < n ; i++)
    	{
    		if(tab[i] < min)
    			min = tab[i];
     
    		if(tab[i] == max)
    			nmax++;
    		else if(tab[i] > max)
    		{
    			max  = tab[i];
    			nmax = 1;
    		}	
    	} /* for(i = 1 ; i < n ; i++) */
     
    	printf("le minimum du tableau est %d\n",min);
    	printf("le maximum du tableau est %d et est atteint %d fois\n",max,nmax);	
     
    	return 0;
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Merci de ta réponse.

    Le seul problème est que l'utilisateur doit entrer lui même ses propres valeurs, d'où ma boucle do au départ, l'entrée des données doit s'arrêter par l'entrée de -1. J'ai essayé avec -1 d'abord je ne pouvais entrer que 3 valeurs, et 7 en mettant 0 pour la fin de l'entrée... le problème doit donc se situer dans cette boucle mais je n'ai vraiment aucune idée pour le régler. Je réfléchis à ça et je posterai mes idées.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Ma consigne de base consistait en fait à créer au minimum 4 fonctions pour gérer les différentes parties du programme. Comme c'était mon 1er programme avec des fonctions et que je n'ai eu que 2h de cours sur les fonctions je m'étais dis que ça serait peut être plus simple de d'abord faire un programme sans fonctions.
    La dernière fonction que je dois créer est celle qui réalise l'affichage mais je m'en occuperai en dernier lieu.
    Pour le moment j'ai quelques petits soucis pour les 2 et 3ème qui ne me donne pas les bonnes valeurs.
    Je suppose que je dois faire intervenir le résultat de ma 1ère fonction dans les deux autres (je me trompe?).
    J'ai essayé ceci mais sans succès.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include<stdio.h>
    #include<stdlib.h>
     
    int affiche(int tableau[])
    {
         int i,n;
         i=1;
         n=0;
         do
         {
               printf("Nombre : ");
               scanf("%d",&tableau[i]);
               if (tableau[i]>=10 && tableau[i]<=100)
               {
               n++;
               i++;
               }
         }
         while (tableau[i]!=0);
         for(i=1;i<=n;i++)
         printf(" %d ", tableau[i]);
         return tableau[i];
    }
     
    int minposmin(int min,int posmin)
    {
        int n,i,tableau[20];
        i=1;
        n=0;
        posmin=0;
       min=tableau[1]; 
       for(i=1;i<=n;i++)
       {
     
                        if (tableau[i]<=min)
                        {
                                           min=tableau[i];
                                           posmin=i;
     
                        }
       }
       printf("Le minimum est %d et sa position est %d\n",min,posmin);
       return 0;
    }
     
    int maxocc(int max,int nmax)
    {
        int tableau[20];
        int i,n;
        i=1;
        n=0;
        nmax=0;
     
        max=tableau[1];
       for(i=1;i<=n;i++)
       {
                        if(tableau[i] == max)
                        nmax++;
                        else if(tableau[i] > max)
                        {
                             max  = tableau[i];
                             nmax = 1;
                        }
     
       }
       printf("le max est %d et il est atteint %d fois",max,nmax);
       return 0;
    }
     
     
    int main()
    {
        int tableau[20];
        int min,posmin;
        int max,nmax;
     
        affiche(tableau);
        minposmin(min,posmin);
        maxocc(max,nmax);
        system("pause");
    }

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour toute fonction, avant de l'écrire, on doit se poser les questions :

    1. Qu'est-ce que je veux qu'elle fasse ?
      (une chose et une seule)
    2. Qu'est-ce que la fonction a besoin de savoir pour faire son travail ?
      Ceci déterminera les informations à lui communiquer et la réponse conduira à établir la liste des paramètres de la fonction.
    3. Qu'est-ce que la fonction doit me donner comme résultat(s) pour que je puisse exploiter son travail ?
      La réponse déterminera la valeur de retour de la fonction (et parfois complètera la liste des paramètres).

    A- Pour ta fonction minposmin():
    1. Qu'est-ce que je veux qu'elle fasse ?
      Rechercher, dans un tableau, la position du minimum et sa valeur
    2. Qu'est-ce que la fonction a besoin de savoir pour faire son travail ?
      Le tableau à explorer. Pour spécifier un tableau, il faut son adresse de départ et le nombre d'éléments.
    3. Qu'est-ce que la fonction doit me donner comme résultat(s) ?
      la position du minimum et sa valeur. Si je connais la position du minimum, je peux obtenir sa valeur. Ce sera donc la valeur retournée par la fonction.
      Si on veut que la fonction retourne les deux valeurs, au moins l'une des deux devra être retournée par la liste des paramètres.

    Conséquence : Dans le premier cas, le prototype de la fonction et son code seront par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int posmin(int * tableau, int nbElements)
    {
        int i;
        int posmin = 0;
        for(i=1;i<nbElements;i++)
          if (tableau[i]<tableau[posmin]) posmin = i;
        return posmin;
    }
    et dans le second cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int minposmin(int * tableau, int nbElements, int * min)
    {
        int i;
        int posmin = 0;
        for(i=1;i<nbElements;i++)
          if (tableau[i]<tableau[posmin]) posmin = i;
        if(min != NULL) *min = tableau[posmin];
        return posmin;
    }
    Le main, pour tester les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int main(void)
    {
        int tableau[]= {10,5,6,8,7,2,9,12,3};
        int pmin;
        int min;
        int dimTableau = sizeof tableau/ sizeof *tableau;
    //....
        pmin = posmin(tableau,dimTableau);
        min = tableau[pmin];
        printf("Le minimum est %d et sa position est %d\n",min,pmin);
     
        pmin = minposmin(tableau,dimTableau, &min);
        printf("Le minimum est %d et sa position est %d\n",min,pmin);
    //....
    return 0;
    }

    B- Pour obtenir le nombre d'occurences du maximum, il faut d'abord connaître le maximum. On ne peut pas rechercher à la fois le maximum et compter le nombre de fois où il apparait (puisqu'on ne le connait pas encore). Ou alors, il faut déterminer pour toutes les valeurs du tableau le nombre de fois où elles apparaissent, ce qui est lourd et délicat.
    Il est préférable de déterminer d'abord le maximum. D'après ce qui précède, son prototype pourrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int posmax(int * tableau, int nbElements); 
    // ou 
    int maxposmax(int * tableau, int nbElements, int * max);
    Puis écrire une fonction :
    • Qu'est-ce que je veux qu'elle fasse ?
      déterminer le nombre de fois où un nombre apparaît dans un tableau:
    • Qu'est-ce que la fonction a besoin de savoir pour faire son travail ?
      Le tableau à explorer et le nombre à chercher. Pour spécifier un tableau, il faut son adresse de départ et le nombre d'éléments.
    • Qu'est-ce que la fonction doit me donner comme résultat(s)
      Le nombre d'occurrences.

    Son prototype sera donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int occurences(int * tableau, int nbElements, int nombre);
    Je laisse le code à ta discrétion.

    L'écriture de maxocc devient par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int maxocc(int * tableau, int nbElements)
    {
      int pmax = posmax(tableau,nbElements);
      return occurences( tableau, nbElements, tableau[pmax]);
    }
    C- Ta fonction affiche() est bancale, elle fait deux choses totalement différentes : elle lit un tableau et elle affiche un tableau. Une fonction est dédiée à UNE tache précise. Si il y a deux taches à réaliser, il faut deux fonctions différentes.
    Si on ne respecte pas ce principe, on ne sait plus qui fait quoi et comment, et on ne peut pratiquement plus réutiliser la fonction à cause de son hyperspécialisation,...
    C'est pourquoi, dans les exemples précédents, j'ai exclu les printf() des fonctions sinon, les fonctions auraient fait deux choses indépendantes : calculer le min ET l'afficher. Cet affichage systématique est pervers : je ne peux plus obtenir le min ou le max sans l'afficher même si cet affichage me gène (comme dans maxocc()).

    Donc fait deux fonctions : l'une lit le tableau, l'autre l'affiche

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 21
    Par défaut
    Bonjour à tous,

    Voilà j'ai modifié mon code, tout fonctionne (bon il me reste à parfaire la disposition de l'affichage), seul bémol, il ne m'affiche pas le nombre d'occurrences du maximum, j'ai lu et relu le code plusieurs fois, pas moyen de trouver la faute

    Si vous pouviez m'aider à la trouver, ça serait sympa^^

    Merci à vous et en particulier à diogene qui m'a permis de mieux comprendre l'utilisation des fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include<stdio.h>
    #include<stdlib.h>
     
    int lecture(int tab[])
    {
        int nb;
        int tabtemp;
        nb=0;
            do
            {
                    printf("Nombre : ");
                    scanf("%d",&tabtemp);
                    if (tabtemp>10)
                    {
                                if(tabtemp<100)
                                {
                                            nb++;
                                            tab[nb]=tabtemp;
                                }
                    }
            }
            while (tabtemp!=-1);
            return nb;
    }
     
    void minposmin(int tab[],int nb,int *min,int *posmin)
    {
         int i;
         for(i=1;i<=nb;i++)
         {
                            if (tab[i]<*min)
                            {
                                            *min=tab[i];
                                            *posmin=i;
                            }
         }
         return;
    }
     
    void maxoccmax(int tab[],int nb,int *max,int *occmax)
    {
         int i;
            for(i=1;i<=nb;i++)
            {
                             if(tab[i] == *max)
                             *occmax++;
                             else if(tab[i] > *max)
                             {
                                  *max  = tab[i];
                             }
            }
            return;
    }
     
    void affichage(int tab[],int nb,int min, int posmin, int max, int occmax)
    {
         int i;
         printf("le vecteur entre est\n:");
     
         for(i=1;i<=nb;i++)
         {
                           printf(" %d ",tab[i]);
         }
         printf("le minimum est %d et sa premiere apparition se trouve en %d position\n",min,posmin);
         printf("le maximum est %d et est atteint %d fois\n",max,occmax);
         return;
    }
     
    int main()
    {
        int i;
        int tab[30];
        int nb;
        int posmin;
        int occmax;
        int min;
        int max;
        for (i=1;i<=29;i++)
        {
            tab[i]=0;
        }
        nb=lecture(tab);
        min=tab[1]; 
        posmin=1;
        minposmin(tab,nb,&min,&posmin);
        max=tab[1];
        occmax=0;
        maxoccmax(tab,nb,&max,&occmax);
        affichage(tab,nb,min,posmin,max,occmax);
        system("pause");
    }

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par adri010 Voir le message
    Merci de ta réponse.

    Le seul problème est que l'utilisateur doit entrer lui même ses propres valeurs, d'où ma boucle do au départ, l'entrée des données doit s'arrêter par l'entrée de -1. J'ai essayé avec -1 d'abord je ne pouvais entrer que 3 valeurs, et 7 en mettant 0 pour la fin de l'entrée... le problème doit donc se situer dans cette boucle mais je n'ai vraiment aucune idée pour le régler. Je réfléchis à ça et je posterai mes idées.
    Salut, voici un bon début de code. Je te laisse le modifier pour que la saisie des nombres s'arrête lorsque tu tapes -1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #define N 30
     
    int main(void)
    {
    	int tab[N];
    	int i;
    	int min, max; // minimum et maximum du tableau tab
    	int nmax; // nombre d'occurence du maximum du tableau tab
    	int val; // valeur saisie par l'utilisateur
    	int ier; // indicateur d'erreur
    	int n = 0;
     
    	// saisie des nombres. On en veut N compris entre 10 et 100.
    	printf("saisie des nombres :\n");
    	do
    	{
    		ier = scanf("%d",&val);
    		if(ier != 1)
    		{
    			printf("Erreur de saisie\n");
    		}
    		else
    		{
    			if( (val >= 10) && (val <= 100) )
    			{
    				tab[n] = val;
    				n++;
    			}
     
    			if(n == N)
    				break;
    		}
    	}
    	while(n != N);
     
    	min = max = tab[0];
    	nmax = 1;
     
    	for(i = 1 ; i < n ; i++)
    	{
    		if(tab[i] < min)
    			min = tab[i];
    		else if(tab[i] == max)
    			nmax++;
    		else if(tab[i] > max)
    		{
    			max  = tab[i];
    			nmax = 1;
    		}	
    	} /* for(i = 1 ; i < n ; i++) */
     
    	printf("le minimum du tableau est %d\n",min);
    	printf("le maximum du tableau est %d et est atteint %d fois\n",max,nmax);	
     
    	return 0;
    }
    Dans ta boucle pour la saisie des nombres, tu commences à l'indice 1. En fait, il faut commencer à l'indice 0

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2012, 11h25
  2. Trouver le nombres d'arrangement des intercalaires dans une suite
    Par bizulk dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 20/02/2012, 11h40
  3. calculer le nombre d'occurence de mot dans une chaine
    Par hadjiphp dans le forum Langage
    Réponses: 8
    Dernier message: 20/04/2009, 11h06
  4. Nombre d options a afficher dans une liste (select)
    Par wwluigi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 16/01/2007, 15h17
  5. [PERL]Nombre d'un caractère présent dans une chaine
    Par LE NEINDRE dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo