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 :

Manipulation d'un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 139
    Par défaut Manipulation d'un tableau
    Bonjour,
    je veux écrire un programme qui affiche au premier temps un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    10 10 10 10 10 10 10 10 10 10
    ensuite tant que je n'ai pas appuyé sur un bouton valider je peux modifier les cases de ce tableau :
    par exemple je veux modifier la case 3 par la valeur 7 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    10,33 10,33 7 10,33 10,33 10,33 10,33 10,33 10,33 10,33
    (10-7=3 donc je divise 3 par le reste des cases 3/9=0.33)
    et j'ai pas encore validé
    je modifie la case 8 par la valeur 6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    10,83 10,83 7 10,83 10,83 10,83 10,83 6 10,83 10,83
    (10-6=4 donc je divise 4 par le reste des cases sans la case qui a déjà été modifiée 4/8=0.5 )
    je valide terminer
    j'espère que cette explication est bien convenable
    merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 139
    Par défaut mon programme
    j'ai arrivé a ce programme
    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
    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
      // le 1er tableau  : 10 10 10 10 10 10 10 10 10 10 
      // 1er modif  case3: 10,33 10,33 7 10,33 10,33 10,33 10,33 10,33 10,33 10,33
      // 2eme modif case8: 10,83 10,83 7 10,83 10,83 10,83 10,83 6 10,83 10,83   
      // si je clic sur valider, je ne peux pas modifier encore
      int i;
      float Cmoy,Ct;
      float Tp1[10];
      Ct=100;
      Cmoy=Ct/10;
      for(i=0;i<=9;i++)
      {
        Tp1[i]=Cmoy;
        printf("le jour %d     %f\n",i,Tp1[i]); 
      }
      printf("***************************************************\n"); 
    //le 2ème tableau           
      int n,indice1,valide;
      float Tp2[10],Cn;
      for(n=0;n<=9;n++)
         {
               Tp2[n]=Cmoy;
         }
      do 
         {   
            printf("entree la valeur de valide: ");
            scanf("%d", &valide);
            if (valide == 0)
            {
               printf("Quelle case voullez vous modifier: ");
               scanf("%d", &indice1);
               printf("Entrer la valeur de la consommation en litre: ");
               scanf("%f", &Cn);
               if ((indice1>=0)&&(indice1<10))
               {
                Tp2[indice1]=Cn;
                }           
              for(n=0; n<=9; n++)
                {
                       if (n!=indice1)
                       {   
                       Tp2[n]=Tp2[n]-((Cn - Cmoy)/(10 - 1/*nombre de jours sans les jours modifier*/));
                       }                                       
                printf("le jour %d %f\n",n,Tp2[n]);
                }
            }
            else if(valide != 0)
            {
               printf("saye\n");   
            }
         } 
      while(valide == 0); 
      printf("***************************************************\n");               
      system("PAUSE");	
      return 0;
    }

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Déjà, ne mets pas tout dans le main.

    Tu peux te faire une fonction:
    Code C : 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
    #include <stdlib.h>
     
    void modifier_et_repartir_difference(float tableau[], size_t taille, size_t index, float nouvelleValeur)
    {
    	float ancienneValeur = tableau[index];
    	tableau[index] = nouvelleValeur;
     
    	/*On calcule et répartit la différence*/
    	{
    		float differenceTotale = ancienneValeur - nouvelleValeur;
    		float differenceRepartie = differenceTotale / (taille-1);
    		size_t index2;
    		for( index2=0 ; index2 < taille ; index2++)
    		{
    			if(index2 == index)
    				continue;
    			tableau[index2] += differenceRepartie;
    		}
    	}
    }
    Par contre, ceci ne couvre que la première étape, car dans la second étape, tu veux aussi modifier une autre case sans toucher la première.
    Voir mon message suivant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 139
    Par défaut reponse
    Oui moi j'ai le problème avec la 2ème modification
    la 1ère modification marche bien mais quand je modifie une 2ème case, la 1ère change.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Dans ce cas il faut verrouiller les valeurs que tu modifies:
    Code C : 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
    #include <stdlib.h>
     
    void modifier_et_repartir_difference(float tableau[], int verrou[], size_t taille, size_t index, float nouvelleValeur)
    {
    	float ancienneValeur = tableau[index];
    	/*On place la nouvelle valeur et on verrouille*/
    	tableau[index] = nouvelleValeur;
    	verrou[index] = 1;
     
    	/*On calcule et répartit la différence*/
    	{
    		float differenceTotale = ancienneValeur - nouvelleValeur;
    		float differenceRepartie;
    		size_t nbNonVerrouille= 0;
    		size_t index2;
     
    		/*On compte les valeurs non-verrouillées*/
    		for( index2=0 ; index2 < taille ; index2++)
    		{
    			if(verrou[index2] == 0)
    				nbNonVerrouille++;
    		}
     
    		differenceRepartie = differenceTotale / nbNonVerrouille;
    		for( index2=0 ; index2 < taille ; index2++)
    		{
    			if(verrou[index2] != 0)
    				continue;
    			tableau[index2] += differenceRepartie;
    		}
    	}
    }
    Et un petit main() de test:
    Code C : 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
    void afficher_tableau(float tableau[], size_t taille)
    {
    	size_t index;
    	for(index=0 ; index < taille ; index++)
    	{
    		if(index != 0)
    			printf(", ");
    		printf("%5.02f", tableau[index]);
    	}
    	printf("\n");
    }
     
    void TestRepartirTableau(void)
    {
    	float tabValeurs[10] = { 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0 };
    	int tabVerrous[10] = {0};
    	afficher_tableau(tabValeurs, 10);
    	modifier_et_repartir_difference(tabValeurs, tabVerrous, 10, 2, 7.0);
    	afficher_tableau(tabValeurs, 10);
    	modifier_et_repartir_difference(tabValeurs, tabVerrous, 10, 7, 6.0);
    	afficher_tableau(tabValeurs, 10);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut
    C'est la première solution que je te proposais dans ton précédent post sur le même sujet : il suffit par exemple que tu déclares un tableau (qu'il faudrait idéalement placer dans une structure avec les autres) qui indique pour chaque nombre s'il est fixé ou "calculable" ...

    Je te propose ci-après ton code légèrement complété (en respectant ton "style" de codage, même s'il n'est pas le mien) sur le seul point que tu soulèves, à seule fin d'illustrer mon propos, bien que les modifications et séparations du code proposées par Medinoc restent largement valables et même hautement souhaitables pour la lisibilité et la facilité de maintenance :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
      // le 1er tableau  : 10 10 10 10 10 10 10 10 10 10
      // 1er modif  case3: 10,33 10,33 7 10,33 10,33 10,33 10,33 10,33 10,33 10,33
      // 2eme modif case8: 10,83 10,83 7 10,83 10,83 10,83 10,83 6 10,83 10,83
      // si je clic sur valider, je ne peux pas modifier encore
      int i;
      float Cmoy,Ct;
      float Tp1[10];
      char Tp_fixe[10];
      int nb_fixe=0;
      float somme_fixe=0;
      Ct=100;
      Cmoy=Ct/10;
      for(i=0; i<=9; i++)
        {
          Tp1[i]=Cmoy;
          Tp_fixe[i]=0;
          printf("le jour %d     %f\n",i,Tp1[i]);
        }
      printf("***************************************************\n");
    //le 2ème tableau
      int n,indice1,valide;
      float Tp2[10],Cn;
      for(n=0; n<=9; n++)
        {
          Tp2[n]=Cmoy;
        }
      do
        {
          printf("entree la valeur de valide: ");
          scanf("%d", &valide);
          if (valide == 0)
            {
              printf("Quelle case voullez vous modifier: ");
              scanf("%d", &indice1);
              printf("Entrer la valeur de la consommation en litre: ");
              scanf("%f", &Cn);
              if ((indice1>=0)&&(indice1<10))
                {
                  somme_fixe+=Cn;
                  if (Tp_fixe[indice1]==0)
                    {
                      nb_fixe++;
                      Tp_fixe[indice1]=1;
                    }
                  else
                    {
                      somme_fixe-=Tp2[indice1];
                    }
                  Tp2[indice1]=Cn;
                }
              for(n=0; n<=9; n++)
                {
                  if (Tp_fixe[n]==0)
                    {
                      Tp2[n]=(Ct-somme_fixe)/(10 - nb_fixe/*nombre de jours sans les jours modifier*/);
                    }
                  printf("le jour %d %f\n",n,Tp2[n]);
                }
            }
          else if(valide != 0)
            {
              printf("saye\n");
            }
        }
      while(valide == 0);
      printf("***************************************************\n");
      system("PAUSE");
      return 0;
    }
    Par ailleurs, j'ajoute aux conseils de Medinoc celui de commenter sérieusement ton code !
    D'accord, pour l'instant, tu n'as que quelques dizaines de lignes , mais quand ton projet en fera quelques centaines puis quelques milliers, puis qu'il s'écoulera trois mois entre deux modifications, je t'assure que tu seras bien content d'avoir correctement commenté ton code !

    Ensuite, il vaudrait mieux éviter la fonction scanf, et mieux formater la sortie avec printf.
    Enfin, il faudra aérer un peu le code et corriger les fautes d'orthographe ...

    Bref, arriver peu à peu au beau code final proposé par Medinoc !

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2013
    Messages : 139
    Par défaut reponse
    je vous remercie beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. manipuler devise dans tableau
    Par lovedesitaliens dans le forum C#
    Réponses: 7
    Dernier message: 28/08/2010, 17h58
  2. Manipuler correctement un tableau de us casté
    Par wilval dans le forum Débuter
    Réponses: 3
    Dernier message: 15/06/2010, 13h14
  3. Manipulation d'un tableau de pointeurs
    Par Stalko dans le forum Débuter
    Réponses: 4
    Dernier message: 06/09/2009, 12h42
  4. manipulation d'un tableau d'une structure de donnee
    Par questionvb dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/03/2007, 14h02
  5. Manipulation d'un tableau sous Word avec vba
    Par Françoise Sagan dans le forum VBA Word
    Réponses: 1
    Dernier message: 02/12/2006, 13h54

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