1
votes

Comment fusionner deux tableaux en un tableau singulier dans un ordre alterné en C?

Je pense que je suis sur le point de terminer ce programme, mais je ne sais pas trop comment continuer.

En gros, j'ai trois tableaux. Le tableau 3 est vide et le tableau 1 et le tableau 2 ont des valeurs à la discrétion des utilisateurs. Je veux fusionner le tableau 1 et le tableau 2 dans le tableau 3 de telle sorte qu'ils alternent entre les positions paires et impaires dans le tableau 3.

Donc, par exemple:

Tableau 1 = [ 1,2,3,4,5 ]

Tableau 2 = [ 10,20,30,40,50 ]

Et tableau 3 = [0,0,0,0,0,0,0,0,0,0]

Je veux que le résultat final ressemble à ceci:

Tableau 3 = [ 1 , 10 , 2 , 20 , 3 strong >, 30 , 4 , 40 , 5 , 50 ] p >

C'est ce que je veux dire quand je dis que je veux que le tableau 1 remplisse les valeurs impaires et le tableau 2 les valeurs paires .

Voici à quoi ressemble le morceau de code pertinent que j'ai jusqu'à présent:

void EvenOdd(int n, int *ap1, int *ap2, int *ap3) {
  // "n" is set to 5.
  ap1 = arr1;
  ap2 = arr2;
  ap3 = arr3;
  int i;
  int j;
  int k;
  for (i = 0; i < n * 2; i++) {
    for (j = 0; j < n; j++) {
      if ((i + 1) % 2 != 0)
        ap3[i] = ap1[j];
    }
    for (k = 0; k < n; k++) {
      if ((i + 1) % 2 == 0)
        ap3[i] = ap2[k];
    }
  }
}

arr1, arr2 et arr3 sont tous des tableaux globaux.

Chaque fois que j'exécute le programme, il affecte uniquement les dernières valeurs de Array 1 et Array 2 aux positions dans Array 3, comme ceci:

Tableau 1 = [ 1,2,3,4,5 ]

Tableau 2 = [ 6,7,8,9,10 ]

Et tableau 3 = [ 5 , 10 , 5 , 10 , 5 strong>, 10 , 5 , 10 , 5 , 10 ] p>

Tout cela me suggère que les deux boucles for à l'intérieur de la première continuent à fonctionner pendant "i" jusqu'à ce qu'elles atteignent la fin de leur tableau à chaque fois, c'est pourquoi les dernières valeurs sont systématiquement attribuées, mais Je ne sais pas comment résoudre ce problème pour obtenir le résultat escompté.


1 commentaires

Vous avez des boucles imbriquées. Les boucles internes attribuent à a [i] encore et encore, de sorte que seule la dernière valeur "colle". Vous n'avez pas besoin de boucles imbriquées pour résoudre ce problème. Réfléchissez à la façon dont vous pouvez obtenir le i -th impair et le i -th index pair.


4 Réponses :


2
votes

Je choisirais quelque chose comme ça

void EvenOdd(int n, int*ap1, int*ap2, int*ap3){
// "n" is set to 5.
    ap1=arr1;
    ap2=arr2;
    ap3=arr3;
    int i;
    for(int i = 0; i < 2 * n; i++)
    {
        if(i%2)
            {
                *ap3= *ap2;
                ap1++;
            }
        else
            {
                *ap3= *ap1;
                ap2++;
            }
        ap3++;
    }
}


0 commentaires

0
votes

Vous pouvez faire quelque chose comme ceci:

int ap1[5] = {1, 2, 3, 4, 5};
int ap2[5] = {10, 20, 30, 40, 50};
int ap3[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int j = 0;
int k = 0;
for (int i = 0; i < 10; i++) {
    if (i % 2 != 0) { // if i is odd
        ap3[i] = ap2[j++]; // set ap3 to jth value in ap2; j becomes j+1
    } else { // if i is even
        ap3[i] = ap1[k++]; // likewise, but ap1 and k becomes k+1
    }
}

for (int i = 0; i < 10; i++) {
    printf("%d ", ap3[i]);
}

La sortie est 1 10 2 20 3 30 4 40 5 50 .

Votre problème est que les boucles imbriquées sont inutiles et en fait des valeurs de réécriture lorsque vous ne le souhaitez pas.


0 commentaires

1
votes

Une autre méthode serait

1 10 2 20 3 30 4 40 5 50 

Sortie

#include <stdio.h>

void EvenOdd(int n, int *ap1, int *ap2, int *ap3) {
  for (int i = 0; i < 2 * n; i++)
    if(i % 2 == 0)
      ap3[i] = ap1[i / 2];
    else
      ap3[i] = ap2[i / 2];
}

int main() {
  int arr1[5] = {1, 2, 3, 4, 5};
  int arr2[5] = {10, 20, 30, 40, 50};

  int arr[10];

  EvenOdd(5, arr1, arr2, arr);

  for (int i = 0; i < 10; i++)
    printf("%d ", arr[i]);

  return 0;
}


0 commentaires

2
votes

Problème :↑

C'est ce que je veux dire quand je dis que je veux que le tableau 1 remplisse des valeurs impaires, et Tableau 2 pour remplir les valeurs paires

En fait, dans le cas des indices, array1 remplit les indices pairs et array2 remplit les indices impairs. Heureusement, votre code fonctionne à cet égard car vous vérifiez la parité de i + 1 , et non de i.

Chaque fois que je lance le programme, il n'assigne que les dernières valeurs de Array 1 et Array 2 aux positions dans Array 3, comme ceci:

L'i-loop est responsable de remplir le tableau de destination. Mais vous avez deux autres boucles imbriquées à l'intérieur, qui réécrivent ap [i] encore et encore avec la valeur dans les indices pairs et impairs de ap1 et ap2 code>. La dernière valeur qui reste dans ap [i] est lorsque la j-loop et la k-loop se terminent. C'est pourquoi, vous voyez des valeurs répétées remplies dans ap3 à partir de la fin de ap1 et ap2.

Solution:

Vous avez simplement besoin d'une seule boucle i qui remplit le tableau de destination après avoir vérifié la parité de i.

for (int i = 0; i < 2 * n; ++i)
    ap3[i] = i % 2 ? ap2[i / 2] : ap1[i / 2];


0 commentaires