[ SAFF @ 21.05.2006. 11:33 ] @
problem sa nizovima u C-u
Kako da posle upisana dva niza A i B, kreiram niz C
sledeceg oblika C:{a1,b1,a2,b2,a3,b3 i ukoliko ima vise elemenata u nizu A
nastavlja se niz C: u sledecem obliku C:{a1,b1,a2,b2,a3,b3,a4,b1,a5,b2...
[ X Files @ 21.05.2006. 12:36 ] @
Prvo moras reci da li je uvek duzina niza A >= B...
Ako je tako kao sto si postavio u zadatku onda mozda moze ovako /NETESTIRANO/

Code:

// obezbedi dvostruku duzinu nizu C, t.j. C=2*A
int c[BROJ_ELEMENATA_NIZA_A*2];

// provera za svaki slucaj da li je A>=B
if ( BROJ_ELEMENATA_NIZA_A >= BROJ_ELEMENATA_NIZA_B )
{
   int i, br=0;

   // "i" je trenutni index u oba niza A i B, "br" je index u novom nizu C
   for ( int i=0; i < BROJ_ELEMENATA_NIZA_A; i++ )
   {
      c[ br ]   = a[ i % BROJ_ELEMENATA_NIZA_A ];
      c[ br+1 ] = b[ i % BROJ_ELEMENATA_NIZA_B ];
      br+=2;
   }
}


Probaj, nisam siguran da nisam nesto prevideo, ali to je to... Uglavnom, modul (%)
ti resava da se krene uzimanje brojeva ispocetka.
[ SAFF @ 21.05.2006. 14:04 ] @
Ja sam to skolski pokusao resiti ovako, ali nesto ne stima u cemu je problem nebitno je koliki je niz ako ako je veci on se ponavlja ako je iti ide paralelno sa b pr u nizu A su brojevi:{1,3,5,7,9} a u nizu B:{2,4,6,8} onda bi niz c izgledao ovako :{1,2,3,4,5,6,7,8,9}, nadam se da sam bio jasan!
Code:

for (i=0;i<n;i++)
   {
      C[i]=A[i%n];
      C[i+1]=B[i%m];
      i+=2;
      for(i=0;i<n;i++)
      printf("%d",C[i]);
   }
[ stargazer @ 21.05.2006. 15:00 ] @
Iz postavke zadatka u tvom prvom postu, iz nizova :
A={1,3,5,7,9}
B={2,4,6,8}
treba da se dobije :
C={1,2,3,4,5,6,7,8,9,2},
a ne :
C={1,2,3,4,5,6,7,8,9}.

U svakom slučaju ovo bi trebalo da ti reši taj problem, pod pretpostavkom da je uvek n >= m:
Code:

for (int i=0; i<n; i++){
C[2*i] = A[i%n];
C[2*i+1] = B[i%m];
}

gde su n i m dužine nizova A i B, redom.
[ SAFF @ 21.05.2006. 23:49 ] @
Uredu je ovo: ostaje problem u sledecem "ako je niz B manji od niza A, upisu se elementi iz niza A u niz C i ne vrsi dalji upis ostalih elemenata niza B u niz C"

josh jednom primer:
A niz {1,3,5,7,9,11,13,15,17,19,21} nebitna duzina nizova
B niz {2,4,6,8} nebitna duzina nizova

novoformirani C niz {1,2,3,4,5,6,7,8,9,2,11,4,13,6,15,8,17,2,19,4,21}
[ Mali Misha @ 22.05.2006. 14:32 ] @
Hmm... a ima li smisla raditi i%n ako je u stvari i uvek manje od n? Evo i kako bi stvari izgledale bez %.

Citat:
ako je niz B manji od niza A, upisu se elementi iz niza A u niz C i ne vrsi dalji upis ostalih elemenata niza B u niz C
Code:
 // ...
    for(i=0,j=0;i<la;i++)
    {
        c[j++] = a[i];
        if(i<lb) c[j++] = b[i];
    }

    // ovde je j duzina c
 // ...


Citat:
josh jednom primer:
A niz {1,3,5,7,9,11,13,15,17,19,21} nebitna duzina nizova
B niz {2,4,6,8} nebitna duzina nizova

novoformirani C niz {1,2,3,4,5,6,7,8,9,2,11,4,13,6,15,8,17,2,19,4,21}
Code:
 // ...
    for(i=0,j=0,k=0;i<la;)
    {
        c[j++] = a[i++];
        if(i!=la) c[j++] = b[k++];

        if(k==lb) k=0;
    }

    // ovde je j duzina c
 // ...
[ stargazer @ 22.05.2006. 22:40 ] @
@Mali Misha : Ne sporim ovaj kod koji si ti dao, samo, ja sam se u onom koji sam ja dao, vodio onim koji je on dao

Citat:

Uredu je ovo: ostaje problem u sledecem "ako je niz B manji od niza A, upisu se elementi iz niza A u niz C i ne vrsi dalji upis ostalih elemenata niza B u niz C"

josh jednom primer:
A niz {1,3,5,7,9,11,13,15,17,19,21} nebitna duzina nizova
B niz {2,4,6,8} nebitna duzina nizova

novoformirani C niz {1,2,3,4,5,6,7,8,9,2,11,4,13,6,15,8,17,2,19,4,21}

Nije mi najjasnije šta si hteo ovime da kažeš.

Formulacija zadatka iz tvog prvog posta je :
Citat:

...
sledeceg oblika C:{a1,b1,a2,b2,a3,b3 i ukoliko ima vise elemenata u nizu A
nastavlja se niz C: u sledecem obliku C:{a1,b1,a2,b2,a3,b3,a4,b1,a5,b2...

Dakle, prema formulaciji zadatka, upisivanje niza B kreće ispočetka, a upisivanje niza A se nastavlja, za m>n, tj. :
Code:

a1 ~ b1
a2 ~ b2
a3 ~ b3
// pa onda, ako je već n > m
a4 ~ b1
a5 ~ b2
...

Da li sam pogrešno razumeo zadatak ili možda kod koji sam dao ne vrši posao?

[Ovu poruku je menjao stargazer dana 22.05.2006. u 23:41 GMT+1]
[ SAFF @ 22.05.2006. 23:59 ] @
Dobro si me razumeo! :]
Ja sam pravio sledece i dobijam uvek za rezultat nesto slicno ali ne i potpuno tacno:] gde gresim....
Code:

if(n>m){
        for(i=0;i<n;i++)
        {
        C[2*i]=A[i%n];
        C[2*i+1]=B[i%m];
        }
        for(i=0;i<n;i++)
        printf("%d",C[i]);
       }
   else    {
        for(i=0;i<m;i++)
        {
        C[2*i]=A[i%n];
        C[2*i+1]=B[i%m];
        }
        for(i=0;i<m;i++)
        printf("%d",C[i]);
       }
[ Mali Misha @ 23.05.2006. 07:29 ] @
Jedino u proceni duzine izlaznog niza. U Prvom slucaju bi bila 2*n a u drugom 2*m.
Znaci izlaz za

{1,3,5,7,9,11,13,15,17,19,21}
{2,4,6,8}

bi bio u stvari {1,2,3,4,5,6,7,8,9,2,11,4,13,6,15,8,17,2,19,4,21,6} ?
[ milanvla @ 23.05.2006. 07:35 ] @
zasto ne uzmes pokazivace?

while (*a && *b) { //ici ce do kraja jednog niza, kad stane ostali su samo elementi drugog
*c = *a;
c++;
*c = *b;
c++;
a++;
b++;
}

while (*a ++) { //ako je ostao samo niz a
*c = *a;
c++;
}

while (*b ++) { //ako je ostao samo niz b
*c = *b;
c++;
}

ovo nije provereno onako iz glave sam ispisao jer nemam kompajelr pri ruci ali trebalo bi da radi uz male popravke
[ stargazer @ 23.05.2006. 22:50 ] @
E, evo kod koji sam kompajlirao i radi prema zahtevima zadatka.

Code:

#include <stdio.h>

int main(){
  const int A[] = {1,3,5,7,9,11};
  const int B[] = {2,4,6,8,10};
  
  int C[12];
  
  for (int i=0; i<6; i++){
    C[2*i] = A[i%6];
    C[2*i+1] = B[i%5];
  }
  
  for (int i=0; i<12; i++){
    printf("%d ", C[i]);
  }
  
  getchar();

  return 0;
}


Pozdrav