Partage
  • Partager sur Facebook
  • Partager sur Twitter

Générez 100 tableaux de taille aléatoire n

Genération_des_tableaux+calcul des somme maximale de sous séquence

    26 novembre 2022 à 11:28:43

    Hello, 

    Svp Je veux résoudre un problème de recherche de sous-séquence maximale en langage « C » , d'abord  le programme doit Générer 100 tableaux de taille aléatoire n entre [300..3000] et pour chaque taille n les éléments du tableau doivent être générés aléatoirement 100 fois càd exécutez le code 100 fois avec différentes valeurs du tableau.

    J'ai fait un programme qui génère n valeurs entre 10 et 30 avec la fonction rand() mais le console n'affiche rien.

    Merci d'avance pour votre aide.

     #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main() {
     int i,j,k,n,low,high;
               float  x[n],maxSum,sumSuquence;
        n=rand() %30  + 10;                                  
         for (i=0 ;i<=100;i++){
         x[i]= rand() %100 + 1;                                  
           }
     maxSum=x[0]; 
    for (i = 0; i<=6; i++ ){
    for (j= i;i<=6;j++){
    sumSuquence=0;
    for (k=i;k<=j+1 ;k++){
    sumSuquence= sumSuquence+x[k];
    if(sumSuquence>maxSum){
    maxSum=sumSuquence;                                              
    low=i;                                                  
    high=j;
    }
    }
    }
    }
    for(i=low;i<=high;i++)
    printf("la sous séquence est %f",x[i]);
    printf("la somme de sous séquence est %f",sumSuquence);
    return 0;
    }



    -
    Edité par ayoub23 26 novembre 2022 à 13:39:38

    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2022 à 12:51:18

      Bonjour ! Manifestement il ne rentre pas dans la boucle finale. Donc affiche les valeurs de 'low' et 'high' juste avant cette boucle (entre les lignes 33 et 34), ça t'aidera à trouver l'erreur. C'est cette méthode qui permet de trouver des erreurs. Les valeurs en question sont peut-être différentes de celles prévues, ce qui t'obligera à afficher celles de 'i' et 'j' juste avant l'affectation de 'low' et 'high' et ainsi de suite jusqu'à ce que tu trouves ce qui cloche.

      -
      Edité par robun 26 novembre 2022 à 14:22:00

      • Partager sur Facebook
      • Partager sur Twitter
        26 novembre 2022 à 13:40:10

        Merci beaucoup pour votre aide je vais essayer d'appliquer vos remarques.

        Oui j'ai changé les valeurs de longueur de du tableau  pour savoir si le programme fonctionne pour des petites valeurs avant de passer aux grandes valeurs. 

        -
        Edité par ayoub23 26 novembre 2022 à 13:57:09

        • Partager sur Facebook
        • Partager sur Twitter
          26 novembre 2022 à 14:29:51

          En ayant regardé vite fait, je pense qu'il y a quelque chose de suspect avec le tableau x[] : tu dis qu'il est de taille 'n', or 'n' n'a aucune valeur définie au moment de la déclaration. J'ai peur que le tableau x[] soit vide, du coup 'maxSum' vaut n'importe quoi, 'sumSuquence' reste égal à zéro, aussi 'low' et 'high' ne sont jamais modifiés et valent n'importe quoi. Je pense qu'il faut que tu affiches les valeurs de tes variables pour corriger toutes ces erreurs une par une.

          -
          Edité par robun 26 novembre 2022 à 14:30:18

          • Partager sur Facebook
          • Partager sur Twitter
            26 novembre 2022 à 18:12:49

            Hello,

            Ton code indenté correctement

            #include <stdio.h>
            #include <stdlib.h>
            #include <time.h>
             
            int main(void) {
            	int i,j,k,n,low,high;
            	float  x[n],maxSum,sumSuquence;
            	n=rand() %30  + 10;                                 
            	for (i=0 ;i<=100;i++) {
            		x[i]= rand() %100 + 1;                                 
            	}
            	maxSum=x[0];
            	for (i = 0; i<=6; i++ ) {
            		for (j= i;i<=6;j++) {
            				sumSuquence=0;
            			for (k=i;k<=j+1 ;k++) {
            				sumSuquence= sumSuquence+x[k];
            				if(sumSuquence>maxSum) {
            					maxSum=sumSuquence;                                             
            					low=i;                                                 
            					high=j;
            				}
            			}
            		}
            	}
            	for(i=low;i<=high;i++)
            		printf("la sous séquence est %f",x[i]);
            	printf("la somme de sous séquence est %f",sumSuquence);
            	return 0;
            }


            Comme l'a écrit @robun, commence par inverser les lignes 7 et 8....

            Edit: si tu avais mis les options de compilation -Wall -Wextra, tu aurais sans doute tout de suite compris où se trouvait le problème

            seq.c: In function 'main':
            seq.c:7:2: warning: 'n' is used uninitialized in this function [-Wuninitialized]
              float  x[n],maxSum,sumSuquence;
              ^~~~~
            

            -
            Edité par edgarjacobs 26 novembre 2022 à 18:16:54

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              26 novembre 2022 à 18:19:40

              Sans compter que srand n'est pas appelé au début ...
              rand() % 30 + 10   va de 10 à 39

              La boucle va jusqu'à 100. Que se passe-t-il si n vaut moins que 100?

              -
              Edité par PierrotLeFou 26 novembre 2022 à 18:22:37

              • Partager sur Facebook
              • Partager sur Twitter

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

                27 novembre 2022 à 21:31:00

                Salut, merci pour votre aide.

                J'ai essayé de modifier le programme en se basant sur vos idées mais toujours  le même message est reçu.

                #include <stdio.h>
                #include <stdlib.h>
                #include <time.h> 
                int main() {
                 int i,j,k,n,low,high;
                           float  x[n],maxSum,sumSuquence;
                    n=rand() %30  + 10;                                 
                     for (i=0 ;i<=100;i++){
                     x[i]= rand() %100 + 1;                           
                 maxSum=x[0];
                for (i = 0; i<=n; i++ ){
                for (j= i;i<=n;j++){
                sumSuquence=0;
                for (k=i;k<=j+1 ;k++){
                sumSuquence= sumSuquence+x[k];
                if(sumSuquence>maxSum){
                maxSum=sumSuquence;                                             
                low=i;                                                 
                high=j;
                }
                }
                }
                }
                printf(" min de sous séquence est %d ",low);
                printf("max de la séquence est %d",high);
                for(i=low;i<=high;i++)
                printf("la sous séquence est %f",x[i]);
                printf("la somme de sous séquence est %f",sumSuquence);
                }
                return 0;
                }
                



                -
                Edité par ayoub23 27 novembre 2022 à 21:59:32

                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2022 à 23:17:44

                  ayoub23 a écrit:

                  Salut, merci pour votre aide.

                  J'ai essayé de modifier le programme en se basant sur vos idées mais toujours  le même message est reçu.

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <time.h> 
                  int main() {
                   int i,j,k,n,low,high;
                             float  x[n],maxSum,sumSuquence;
                      n=rand() %30  + 10;                                 
                       for (i=0 ;i<=100;i++){
                       x[i]= rand() %100 + 1;                           
                   maxSum=x[0];
                  for (i = 0; i<=n; i++ ){
                  for (j= i;i<=n;j++){
                  sumSuquence=0;
                  for (k=i;k<=j+1 ;k++){
                  sumSuquence= sumSuquence+x[k];
                  if(sumSuquence>maxSum){
                  maxSum=sumSuquence;                                             
                  low=i;                                                 
                  high=j;
                  }
                  }
                  }
                  }
                  printf(" min de sous séquence est %d ",low);
                  printf("max de la séquence est %d",high);
                  for(i=low;i<=high;i++)
                  printf("la sous séquence est %f",x[i]);
                  printf("la somme de sous séquence est %f",sumSuquence);
                  }
                  return 0;
                  }
                  

                  edgarjacobs a écrit:

                  Comme l'a écrit @robun, commence par inverser les lignes 7 et 8... 6 et 7 dans ton dernier code

                  Edit: si tu avais mis les options de compilation -Wall -Wextra, tu aurais sans doute tout de suite compris où se trouvait le problème

                  Si les réponses données ne t'intéressent pas, inutile de poster sur le forum. Et ton code est toujours aussi infâme au niveau indentation, malgré la correction que je t'ai proposée.


                  -
                  Edité par edgarjacobs 27 novembre 2022 à 23:36:07

                  • Partager sur Facebook
                  • Partager sur Twitter

                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                    28 novembre 2022 à 1:11:03

                    Salut, je vois que vous essayez de  m'aider et je suis reconnaissant pour vous, j'ai essayé d'inverser les lignes 7 et 8 comme vous avez dit ...,vu que je suis encore débutant en programmation C j'attendais plus de l'aide en tout cas merci pour votre réponse.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 novembre 2022 à 2:03:29

                      Regardes mon message précédent. Tu as un tableau de dimension n et ta boucle va jusqu'à 100.

                      ... appelles srand(...) ici ...

                          n=rand() %30  + 10;                                 

                      ... c'est ici que tu définis le tableau ...

                           for (i=0 ;i<=100;i++){   >--- n et non 100
                           x[i]= rand() %100 + 1;                                 
                             }

                      -
                      Edité par PierrotLeFou 28 novembre 2022 à 3:05:45

                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        28 novembre 2022 à 10:59:45

                        ayoub23 a écrit:

                        J'ai essayé de modifier le programme en se basant sur vos idées

                        Tu n'as pas compris ce que j'écrivais plus haut ? Tu as défini en ligne 6 un tableau 'x' de taille 'n', alors que 'n' n'a pas été initialisé (il le sera en ligne 7) ! Il faut donc inverser les lignes. Mais n'inverse pas les lignes parce qu'on te dit d'inverser : inverse-les parce que tu comprends bien que le tableau 'x' n'est pas défini correctement.

                        Comprends aussi qu'il y a plusieurs erreurs, il faut toutes les corriger pour que le programme marche.

                        On dirait que tu n'as pas compris les interventions ci-dessus. N'hésite pas à demander des précisions !

                        Dernière chose, mon conseil plus haut : « il faut que tu affiches les valeurs de tes variables pour corriger toutes ces erreurs une par une. » Je t'assure que c'est très utile d'afficher les valeurs des variables, car quand un programme ne marche pas, c'est en général parce que les variables n'ont pas les valeurs prévues.

                        -
                        Edité par robun 28 novembre 2022 à 11:04:49

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 novembre 2022 à 11:23:48

                          int main(void)
                          {
                              int n;
                              float x[n];
                              n = rand() %30 + 10;

                          Le compilateur lit le code du haut vers le bas. Donc quand tu créés le tableau x de taille n tu n'as pas encore donné de valeur à n qui a donc une valeur indéfinie. La ligne suivante tu donne une valeur à n, mais c'est trop tard, le tableau est déjà créé. 

                          • Partager sur Facebook
                          • Partager sur Twitter
                          ...

                          Générez 100 tableaux de taille aléatoire n

                          × 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