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 :

Petit probleme d'algorithmique


Sujet :

C

  1. #1
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut Petit probleme d'algorithmique
    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
    #include <stdio.h>
    #define KMIN 1 /* taille de la suite des éléments consécutif à trouver*/
    #define KMAX 100
    #define VMIN 0  /* valeur d'un élément de la liste */
    #define VMAX 100000
    #define NMAX 10000
     
    /* nombre de valeurs à entrer dans le tableau */
    int nb_de_valeur(void) {
        int N=0;
        while ( N<KMIN || N>NMAX) {
            scanf("%d",&N);
        }
     
    	return N;
    }
     
    /* nombre d'entiers consécutifs à lire dans le tableau */
    int nb_entier_consecutif(void) {
        int K=0;
        while ( K<KMIN || K>KMAX) {
            scanf("%d",&K);
        }
     
    	return K;
    }
     
    /* remplissage du tableau */
    void le_tableau(int N,int tab[]) {
    	int i;
    	int val;
     
    	for (i=0;i<N;i++) {
    	    val = -1;
            while ( val < VMIN || val > VMAX ) {
                scanf("%d",&val);
            }
            tab[i] = val;
    	}
    }
     
    /* lecture du tableau et recherche de la plus grande somme de K éléments consécutifs */
    void la_somme(int K,int N, int tab[]){
    	int somme = 0;
    	int valeur_max = 0;
    	int i, j;
    	for (i=0; i<K; i++){
    		for (j=0; j<N; j++){
    			somme += tab[j];
    				if( somme >= valeur_max)
    				valeur_max = somme;
    		}
    	}
    	printf("%d\n", valeur_max);
    }
     
     
    /* fonction main */
    int main(void){
    	int N, K;
    	int tab[NMAX];
    	N = nb_de_valeur();
    	K = nb_entier_consecutif();
    	le_tableau(N,tab);
    	la_somme(K, N, tab);
    	return 0;
    }
    Je voudrais que le fonction la_somme additionne K elements du tableau qu'elle compare le resultat a une valeur max et affiche enfin la valeur max. mais je ne trouve pas la solution.
    peut on m'aider.

  2. #2
    Membre averti Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Points : 441
    Points
    441
    Par défaut
    Je ferais comme ça.

    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
    /* lecture du tableau et recherche de la plus grande somme de K éléments consécutifs */
    void la_somme(int K,int N, int tab[]){
    	int somme = 0;
    	int valeur_max = 0;
    	int i, j;
    	for (i=0; i<=N-K; i++) {
    		somme = 0;
    		for (j=0; j<K; j++) {
    			somme += tab[i+j];
    		}
    		if( somme >= valeur_max)
    			valeur_max = somme;
    	}
    	printf("%d\n", valeur_max);
    }

  3. #3
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Le resultat en retour est le bon. Merci beaucoup je vais comparer ta fonction à la mienne.( Y refléchir).
    merci encore.

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Il n'y a pas besoin d'imbriquer deux boucles:
    Si Sn est la somme des K éléments aux indices n, n+1, ... n+K-1
    et Sn+1 est la somme des K éléments aux indices n+1, n+2, ... n+K
    alors Sn+1 = Sn + Tab[n+k]-Tab[n]

    Autrement dit, il suffit d'un indice sur le début du segment de K valeurs et un indice sur sa fin et les décaler en synchronisme.

    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 maxi(int * tab, int N, int K)
    {
     int som;
     int max;
     int i,j;
     if(K > N) K = N; // par sécurité
     som = 0;
     for(i=0; i<K; i++) som += tab[i]; // Somme pour les segments [0,K-1]
     max = som;                        // et i == K . 
     for(j=0; i<N;i++,j++)
     {
       som += tab[i]-tab[j];           // Nouvelle somme pour les segments [1,K] ; [2,K+1] ....
       if(som > max) max= som;
     }
     return max;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Merci diogene je vais étudier ta fonction.
    Et tenter de la refaire.

Discussions similaires

  1. Petit problème de fork
    Par osmose22 dans le forum Linux
    Réponses: 7
    Dernier message: 18/03/2007, 21h10
  2. [TP]petit probleme avec solution
    Par pompompolom dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 02/12/2004, 19h48
  3. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19
  4. petit probleme de requete
    Par nico33307 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/08/2004, 11h36
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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