Manipulation de tableaux en C

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je suis débutant en c et je suis bloqué sur un problème concernant les opérations sur les tableaux. Donc je m’adresse à vous pour avoir votre aide. Voici mon problème: Je veux prendre un tableau et soustraire le dernier élément du tableau de tous les éléments du tableau et ensuite, mettre les 4 premiers éléments du nouveau tableau dans un tableau et les 4 derniers dans un autre tableau puis faire la somme de ces derniers tableaux.

Tout ce passe bien sauf au niveau de la somme des deux derniers tableau. La compilation et l’exécution se passent bien mais la somme est incorrecte et je n’arrive pas à m’en sortir. Je compte sur votre aide et je vous en remercie d’avance.

 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
#include <stdio.h>
#include <stdlib.h>
#define TAILLE 8

    int val_X[TAILLE] = {2000, 1500, 1000, 500, 1000, 1500, 2000, 2500};
    int copie_1[TAILLE] = {0};

/*Soustraire le dernier élément de tous les éléments de val_X et mettre le résultat dans un tableau*/

    for(i=0; i<8; i++)
    {
      copie_1[i] =  val_X[7] - val_X[i] ;
      printf(" %d\n",copie_1[i]);
    }

// Mettre les 4 premiers de copie_1 dans copie_2  

    int copie_2[4] = {0};
    for(i=0; i<4; i++)
    {
      copie_2[i] = copie_1[i];
      printf(" %d\n",copie_2[i]);
    }
// Mettre les 4 derniers éléments de copie_1 dans copie_3    
    int copie_3[4] = {0};

    for(i=4; i<8; i++)
    {
      copie_3[i] = copie_1[i];
      printf(" %d\n",copie_3[i]);
    }

// Faire la somme de copie_2 et copie_3 
//C'est ici mon problème, je retrouve une somme incorrecte !

    int  somme[4] = {0};
    for(i = 0; i<4; i++)
    {
        somme[i]  = copie_2[i] + copie_3[i] ;
        printf(" %d\n",somme[i]);
    }

Édit modération : ajout des balises de code et du l’étiquette « c ».

+0 -0

Il y a des balises de code pour permettre de poster ton code :

1
2
3
```c
#include<stdio.>
```

Ce qui rend :

1
#include<stdio.h>

Quand tu fais :

1
  copie_3[i] = copie_1[i];

i est égale à $4$ ! Or copie_3 fait une taille de $4$ justement. Tu dépasses de ton tableau et du coup le comportement est imprévisible.

Tu dois faire :

1
  copie_3[i-4] = copie_1[i];

Comme ça, copie_3 est correctement affecté. Sa première case contient bien la 5em case de copie_1, … Tu avais écrit sa 5em case contient la 5em case de copie_1. Sauf qu’il n’avait que $4$ cases.

Pareil pour le printf. Et le reste me semble correcte.

+1 -0

Salut,

Je veux prendre un tableau et soustraire le dernier élément du tableau de tous les éléments du tableau […]

loray2017

Il me semble que c’est l’inverse que tu fais avec l’instruction suivante, à savoir : la valeur d’un élément est soustraite à la valeur du dernier.

1
copie_1[i] =  val_X[7] - val_X[i];

Sinon, en plus de ce qu’@che t’a précisé, je te conseil d’employer la fonction memcpy() pour tes copies, tu y verras plus clair. Par exemple, pour copie_3, cela donnerait ceci.

1
memcpy(copie_3, copie_1 + 4, sizeof(int) * 4);  
+1 -0

Salut,
Tu as du mal t’y prendre :/ . Remontre ton code …

De plus, Taurre à raison pour le premier :

1
/*Soustraire le dernier élément de tous les éléments de val_X et mettre le résultat dans un tableau*/

Tu fais l’opposé juste en dessous.

Au final, ça change simplement le signe du résultat (opposé quoi).

@Taurre: "@che" :D
Une vielle habitude ? x’D

+0 -0

Voici le nouveau code:

 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
int main()
{
    int val_X[8] = {2000, 1500, 1000, 500, 1000, 1500, 2000, 2500};
    int copie_1[8] = {0};

    for(i=0; i<8; i++)
    {
      copie_1[i] =  val_X[7] - val_X[i] ;
      printf(" %d\n",copie_1[i]);
    }


    int copie_2[4] = {0};

    for(i=0; i<4; i++)
    {
      copie_2[i] = copie_1[i];
      printf(" %d\n",copie_2[i]);
    }

    int copie_3[4] = {0};

    for(i=4; i<8; i++)
    {
      copie_3[i-4] = copie_1[i];
      printf(" %d\n",copie_3[i-4]);
    }

// Je veux faire: copie_2 + copie_3, Mais j'obtiens copie_2 comme résultat final.
// Avant la modification, j'obtenanis copie_3 comme résultat final.
// Tous les résultats d'en haut sont corrects et c'était pareil avant la modification.

    int  somme[4] = {0};

    for(i = 0; i<4; i++)
    {
        somme[i]  = copie_2[i] + copie_3[i-4] ;
        printf(" %d\n",somme[i]);
    }


    return 0;

    }

Édit modération : ajout des balises de code.

+0 -0

Tu as encore un problème avec les balises de code :/ Je t’invite à éditer ton post pour pouvoir mettre les balises correctement.

1
2
3
4
5
for(i = 0; i<4; i++)
{
    somme[i]  = copie_2[i] + copie_3[i-4] ;
    printf(" %d\n",somme[i]);
}

Ton erreur vient d’ici. Relit bien ce que tu fais.

Dans le premier élément de somme, je mets le premier élément de copie_2 et le $-4$em élément de copie_3 ?

Pourquoi $-4$em élément ?

Pour la dernier boucle, tu n’as pas besoin de mettre $-4$, i est déjà dans le bon interval.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte