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 :

Modifier une valeur d'un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Par défaut Modifier une valeur d'un tableau
    Bonjour à tous,

    Tout d'abord félicitations pour ce forum, j'y ai trouvé pas mal de petites astuces afin de pouvoir progresser dans mon projet (je fais une base de donnée en C dans le cadre de mes études).

    Seulement, je coince: dans mon cas précis, je cherche à remplacer la valeur attribuée dans un de mes tableau, en l'occurence ici le nombre d'entités en stock.

    Ce que j'aimerai faire, c'est que lors de ma saisie du numero d'identification, le programme puisse directement attribuer le bon rang (i) du tableau, afin de faire la modification pour le bon composant, dans mon cas.

    Exemple: si dans mon fichier sauvegarde j'ai un identifiant qui est 1234, et que je tape 1234 lors de la saisie , je voudrais qu'il puisse identifier directement le bon rang du tableau.

    Avec le code actuel, il remplace bien la valeur des stocks, mais pas au bon endroit!

    Voici le code que j'ai actuellement:


    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
    char stock_composant (void)
    {
    char SAISIE;
    int i = 0;
    int Nstock;
    printf("***************************************\n");
    printf("* MODULE DE GESTION DES COMPOSANTS PC *\n");
    printf("*        mise a jour du stock         *\n");
    printf("***************************************\n");
    fflush( stdin );
    printf("Identifiant du composant :\n");
    fflush( stdin );
    scanf("%d", &(BaseComposant[i].REFERENCE));
    printf("Niveau de stock actuel:  %d \n", BaseComposant[i].STOCK);
    fflush(stdin);
    printf("Nouvelle valeur de stock :");
    scanf("%d", &Nstock);
    BaseComposant[i].STOCK = Nstock;
    printf("[V]alider ou [A]nnuler : [A] ou [V] suivi de [ENTREE] ?\n");
    fflush( stdin );
    scanf("%c",&SAISIE);
    return (SAISIE);

    Je sais que le probleme se situe lors de l'initialisation de mon i (que je mets à 0), mais je ne sais pas comment corriger l'erreur.

    Merci d'avance de votre aide.

    Si je n'ai pas été assez clair et que vous voulez plus de précisions, n'hésitez pas à me le faire savoir!

    Cordialement.

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Pourquoi initialiser le i à 0 et ne jamais modifier sa valeur?

  3. #3
    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
    Bienvenue sur les forums de DVP

    1- fflush() ne doit pas être utilisé pour des flux entrants comme stdin : le comportement dépend de l'implémentation (voir la FAQ)

    2- Y a t-il une bonne raison pour utiliser des variables globales ? Probablement non, alors supprime les et passe les informations aux fonctions par la liste des paramètres.

    3- Tu ne fournis pas toutes les informations : notamment, on ne peut pas deviner le type de BaseComposant.

    4-
    Ce que j'aimerai faire, c'est que lors de ma saisie du numero d'identification, le programme puisse directement attribuer le bon rang (i) du tableau, afin de faire la modification pour le bon composant, dans mon cas.
    Tu ne dis pas comment relier la saisie et l'indice i. Doit-on chercher dans le tableau si il existe déjà un tel identifiant et si oui à quelle position (et si non que faire) ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Par défaut
    Tout d'abord merci de vos réponse.

    Citation Envoyé par Astraya Voir le message
    Pourquoi initialiser le i à 0 et ne jamais modifier sa valeur?
    Que veux-tu dire? Ne pas initialiser i? Le soucis c'est que si j'inilialise pas i, un message d'erreur apparaît. Mon idée était donc à l'origine, que le programme identifie le bon "i", en faisant une identification avec ma saisie et la valeur dans mon fichier de sauvegarde (représentée par BaseComposant. STOCK dans mon exemple). Je vous demande pour ce cas ci car c'est ce qui bloque le reste de mon exercice (après je vais devoir faire des suppressions de valeurs en tapant le numero d'identification, puis effectuer des nomenclatures, le tout à partir de mon fichier de sauvegarde.

    Il est vrai que je n'ai peut-être pas été très clair: en fait j'ai créé une structure, comme précisé dans le code ci-dessous:




    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	REFERENCE;
    char	DESCRIPTION[256];
    int		STOCK; 
    struct InfoComposants
    {
    	int REFERENCE;
    	char DESCRIPTION[256];
    	int STOCK;
    };
    typedef struct InfoComposants
    InfoComposants;
    /* base de donnees = tableau de structures composant*/
    InfoComposants BaseComposant[256];
    int			BaseIndex = 0;
    /* ->designe le premier emplacement libre dans le tableau des composants */
    Ensuite pour créer mes composants:

    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
     
    char creer_composant(void)
    {
    char SAISIE;
    int i = BaseIndex;
    printf("***************************************\n");
    printf("* MODULE DE GESTION DES COMPOSANTS PC *\n");
    printf("*  creation de nouvelles references   *\n");
    printf("***************************************\n");
    printf("Identifiant du composant : \n");
    fflush( stdin );
    scanf("%d", &(BaseComposant[i].REFERENCE));
    printf("Description du composant : \n");
    fflush( stdin );
    scanf("%s", BaseComposant[i].DESCRIPTION );
    printf("[V]alider ou [A]nnuler : [A] ou [V] suivi de [ENTREE] ?\n");
    fflush( stdin );
    scanf("%c",&SAISIE);
    SAISIE = toupper(SAISIE);
    if ( SAISIE == 'V' ) 
    {
    		i++;
    	BaseIndex++;
    };
    return (SAISIE);
    }
    Ensuite voici ma fonction sauvegarde-chargement

    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
    92
    93
    94
    95
    96
    97
    98
    99
     
    char sauvegarder (void)
    {
    char	SAISIE;
    char	SAUVEGARDE[80];
    FILE    *fOut; /* ->flux de sortie */
    int j;
    printf("*****************************************\n");
    printf("*  MODULE DE GESTION DES COMPOSANTS PC  *\n");
    printf("*         sauvegarde de la base         *\n");
    printf("*****************************************\n");
    printf("Nom du fichier de sauvegarde : \n");
    fflush( stdin );
    scanf("%s", SAUVEGARDE);
    printf("[V]alider ou [A]nnuler : [A] ou [V] suivi de [ENTREE] ? \n");
    fflush( stdin );
    scanf("%c",&SAISIE);
    do
    {
     
    	if (SAISIE='V')
    	{
     
    	/* on re-ecrit toute les infos sur le fichier */
    	fOut = fopen(SAUVEGARDE,"w");
    	if( fOut == NULL )
    	{
    		printf("erreur: impossible d'ouvrir le fichier %s...\n", SAUVEGARDE );
    		return( 0x00 );
    	};
    	/* on ecrit d'abord le nombre d'elements presents */
    	fprintf(fOut,"%d\n", BaseIndex );
    	/* a la suite, les donnees relatives a chaque composant, pris dans */
    	/* l'ordre du tableau :                                            */
    	for(j=0; j < BaseIndex; j++ )
    	{
    		fprintf(fOut,"%d\n", BaseComposant[j].REFERENCE );
    		fprintf(fOut,"%s\n", BaseComposant[j].DESCRIPTION );
    		fprintf(fOut,"%d\n", BaseComposant[j].STOCK );
    	};
    	/* fermeture du fichier */
    	fclose( fOut );
    	}
     
    	else
    	{
    		sauvegarder();
    	};
    }
    while (SAISIE!='V' && SAISIE!='A');
    return (SAISIE);
     
     
    }
     
    /*=====================================================================================*/
     
    char charger (void)
    {
    	int	i;			/* ->boucle */
    char	SAISIE;
    char	CHARGER[80];
    FILE    *fIn;
    printf("*****************************************\n");
    printf("*  MODULE DE GESTION DES COMPOSANTS PC  *\n");
    printf("*         chargement de la base         *\n");
    printf("*****************************************\n");                                  
    printf("Nom du fichier a charger : \n");
    fflush( stdin );
    scanf("%s",&CHARGER);
    printf("[V]alider ou [A]nnuler : [A] ou [V] suivi de [ENTREE] ?\n");
    fflush( stdin );
    scanf("%c",&SAISIE);
     if (SAISIE = 'V')
     {
     
    	fIn = fopen(CHARGER,"r");
    	if( fIn == NULL )
    	{
    		printf("erreur : impossible d'ouvrir %s...\n", CHARGER );
    		return 0;
    	};
    	fflush( stdin );
    	fscanf(fIn,"%d", &BaseIndex );
    	for(i=0; i< BaseIndex; i++ )
    	{
    		fscanf(fIn,"%d", &(BaseComposant[i].REFERENCE));
    		fscanf(fIn,"%s", BaseComposant[i].DESCRIPTION);
    		fscanf(fIn,"%d", &(BaseComposant[i].STOCK) );
    	};
    	fclose( fIn );
     }
     else
     {
    	 charger ();
     }
     while (SAISIE!='V' && SAISIE!='A');
    	return (SAISIE);
    }

    Si vous voulez plus de précisions n'hésitez pas!
    Merci de votre aide.

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Ce que je veux dire c'est que ta fonction stock_composant traitera toujours le premier élément de ton tableau d'InfoComposants. Est-ce normal? Il n'est jamais modifié quand je vois ton code.
    Si ton STOCK signifie combien de composant tu as dans ta base, il vaudrais mieux la mettre static.
    OU
    Faire une structure base_donnees avec le STOCK et un tableau de InfoComposant. Je viens du C++ mais existe pas une façon d'avoir des listes chainées (simplement ou doublement) en C? un pointeur sur le composant suivant par exemple? et le dernier est a NULL? tu aura ainsi la possibilité de rajoutée ou d'enlevé dynamiquement les composants

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Ce que je veux dire c'est que ta fonction stock_composant traitera toujours le premier élément de ton tableau d'InfoComposants. Est-ce normal? Il n'est jamais modifié quand je vois ton code.
    Si ton STOCK signifie combien de composant tu as dans ta base, il vaudrais mieux la mettre static.
    OU
    Faire une structure base_donnees avec le STOCK et un tableau de InfoComposant. Je viens du C++ mais existe pas une façon d'avoir des listes chainées (simplement ou doublement) en C? un pointeur sur le composant suivant par exemple? et le dernier est a NULL? tu aura ainsi la possibilité de rajoutée ou d'enlevé dynamiquement les composants
    En fait j'ai fait une structure avec les informations du composant (identifiant, descriptif et stock).

    Ce que je n'arrive pas à faire, c'est taper le numero de série, et modifier le stock en relation avec le numero de série. Je sais que le problème est lié au "i=0", mais je ne vois pas quoi mettre d'autre (visual studio me demande d'initialiser i)... j'avais tenté de passer par une variable intermédiaire, mais sûrement à cause de maladresses, ça n'a pas abouti.

  7. #7
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut.

    N'oublis pas les remarques de diogene, notamment à propos du fflush (stdin); ... utilises une procédure comme celle de la FAQ pour vider le buffer.

    Cordialement.

  8. #8
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Citation Envoyé par slifferstorm Voir le message
    En fait j'ai fait une structure avec les informations du composant (identifiant, descriptif et stock).

    Ce que je n'arrive pas à faire, c'est taper le numero de série, et modifier le stock en relation avec le numero de série. Je sais que le problème est lié au "i=0", mais je ne vois pas quoi mettre d'autre (visual studio me demande d'initialiser i)... j'avais tenté de passer par une variable intermédiaire, mais sûrement à cause de maladresses, ça n'a pas abouti.
    Et une fonction de recherche qui te retourne une référence sur le composant qui correspond à cet identifiant?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Par défaut
    Bonjour à tous, et bonne année.

    Juste pour vous signaler que j'ai réussi à faire ce que je voulais, voici le code:

    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
     
    char stock_composant (void)
    {
    char SAISIE;
    int i= 0;
    int Nstock;
    int IDENTIFIANT;
    printf("***************************************\n");
    printf("* MODULE DE GESTION DES COMPOSANTS PC *\n");
    printf("*        mise a jour du stock         *\n");
    printf("***************************************\n");
    fflush( stdin );
    printf("Identifiant du composant :\n");
    fflush( stdin );
    scanf("%d", &IDENTIFIANT);
    do
    {
    	 /* while(i<=BaseIndex)
    	{ */
    	i++;
     
    	if (i > BaseIndex)
    	{
    		printf("erreur \n");
    		return(0x00);
    	};
    }
    while(IDENTIFIANT != BaseComposant[i].REFERENCE)
    ;
    printf("Niveau de stock actuel:  %d \n", BaseComposant[i].STOCK);
    fflush(stdin);
    printf("Nouvelle valeur de stock :");
    scanf("%d", &Nstock);
    BaseComposant[i].STOCK = Nstock;
    printf("[V]alider ou [A]nnuler : [A] ou [V] suivi de [ENTREE] ?\n");
    fflush( stdin );
    scanf("%c",&SAISIE);
    return (SAISIE);
    }
    MErci à vous de m'avoir donné l'idée
    Il ne me reste plus qu'à modifier les fflush maintenant .

    Bonne journée à vous.

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

Discussions similaires

  1. Modifier et sauvegarder une valeur dans un tableau
    Par pixi777 dans le forum jQuery
    Réponses: 8
    Dernier message: 06/08/2013, 09h50
  2. modifier une valeur dans un tableau
    Par kanwulf62 dans le forum MATLAB
    Réponses: 1
    Dernier message: 24/05/2013, 09h31
  3. pouvoir modifier une valeur dans un tableau
    Par adri_99 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/10/2007, 19h32
  4. Réponses: 3
    Dernier message: 12/06/2006, 12h04
  5. [C#] Modifier une valeur dans une DataTable
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/05/2005, 10h45

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