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 éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    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 chevronné 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
    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 éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    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 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
    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;
    }

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

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    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