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é.
4 Réponses :
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++;
}
}
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.
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;
}
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];
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 lei-th impair et lei-th index pair.