[ DARK_MESSIAH @ 18.12.2012. 20:59 ] @
Treba mi pomoć da "skontam" ove fazone sa nizovima, tj. npr. kako ubaciti jedan niz u drugi, jedan niz u drugi na određenu poziciju, kako ubaciti jedan element u neki niz na određenu poziciju itd.....
Pa ako možete da mi napišete neki primjer sa objašnjenjem ili da mi preporučite neki link (mada sam ja tražio :( )
Hvala
[ Nedeljko @ 19.12.2012. 13:41 ] @
Ako preciziraš šta ti konkretno nije jasno (neki primer), verovatno će neko odgovoriti.
[ DARK_MESSIAH @ 20.12.2012. 18:35 ] @
Pa evo konkretno: Implementirati funkciju void umetni(int *nizA, int *nizB, int duzinaA, int duzinaB, int pozicija) koja će nizB umetnuti u nizA na zadanoj poziciji (umetnuti ispred prvog elementa ukoliko je pozicija manja od 2, odnosno iza zadnjeg ako je pozicija veća od dužine nizA).
Npr.
nizA: 1 4 7 4 2 8 8 5 3
nizB: 2 6 3 1 8
pozicija: 3

nizA: 1 4 2 6 3 1 8 7 4 2 8 8 5 3

Ja sam pokušavao uraditi, ali ne ispadne mi dobar rezultat. Logika je da prebacim u novi niz brojeve iz nizA do unešene pozicije. Nakon toga kopiram članove nizB i na kraju članove iz nizA, tj. one koji su ostali. I onda ispišem taj novi niz.
Međutim, ono što ne kontam dobro su te pozicije elemenata u nizu i unošenje članova iz jednog niza u drugi... kako postaviti u for petlji one uslove... Šta npr. znači for(int i = 0; i < duzB; i++)
novi[i + pozicija - 1] = nizB

[ Nedeljko @ 20.12.2012. 22:20 ] @
Mislim da bi taj rezultat trebalo da se dobije sa pozicijom 2, a ne 3, jer u C/C++ indeksi idu od nule. Naravno, moguće je uraditi i tako kako si napisao. Takođe, ne vidi se kako se vraća rezultat. Čudno bi bilo da se kopira u niz A, jer u njemu može da ne bude dovoljno mesta. Recimo da rezultat treba da bude novi niz koji se vraća kao rezultat funkcije (tj. da funkcija nije void).

Code (cpp):

int* umetni(int a[], int b[], int duzina_a, int duzina_b, int pozicija)
{
    int *rezultat = new int[duzina_a + duzina_b];
    int pozicija_a = 0, pozicija_b = 0, pozicija_rezultat = 0;

    while (pozicija_a < pozicija) {
        rezultat[pozicija_rezultat] = a[pozicija_a];
        ++pozicija_a;
        ++pozicija_rezultat;
    }

    while (pozicija_b < duzina_b) {
        rezultat[pozicija_rezultat] = b[pozicija_b];
        ++pozicija_b;
        ++pozicija_rezultat;
    }

    while (pozicija_a < duzina_a) {
        rezultat[pozicija_rezultat] = a[pozicija_a];
        ++pozicija_a;
        ++pozicija_rezultat;
    }

    return rezultat;
}
 
[ DARK_MESSIAH @ 20.12.2012. 23:18 ] @
To je i mene bunilo, ali mora ići drugi niz na tačno onu poziciju koja se unese bez obzira što nizovi počinju od 0. I druga stvar je da funkcija mora striktno biti void (jbg, ispitni zadatak :D) A sad kako ovo riješiti da ostane nizA, mislim također da je nemoguće... mora ovako to biti neki treći niz :S
Jest da mi ovo još loše ide, ali mislim da je to to što se tiče ovog zadatka bar :D.
@Nedeljko, u svakom slučaju, hvala ti na pomoći. ;)
Code (cpp):
#include <iostream>
using namespace std;
void umetni(int *nizA, int *nizB, int duzA, int duzB, int pozicija){
    if(pozicija < 2) pozicija = 1;
    else if(pozicija > duzA) pozicija = duzA + 1;
int *nizC = new int[duzA + duzB];
for(int i = 0; i < pozicija - 1; i++)
    nizC[i] = nizA[i];

for(int i = 0; i < duzB; i++)
nizC[pozicija + i - 1] = nizB[i];

for(int i = pozicija - 1; i <duzA ; i++)
nizC[i + duzB] = nizA[i];
 for(int i = 0; i < duzA + duzB; i++)
    cout << nizC[i] <<"  ";
}
int main(){
    int pozicija;
cout <<"Unesite duzinu prvog niza: " << endl;
int duzina1;
cin >> duzina1;
int *nizA = new int[duzina1];
for(int i = 0; i < duzina1; i++){
    cout << "Unesite " << i + 1 << ". element niza: " << endl;
    cin >> nizA[i];}
cout << "Unesite duzinu drugog niza: " << endl;
int duzina2;
cin >> duzina2;
int *nizB = new int[duzina2];



for(int i = 0; i < duzina2; i++){
    cout << "Unesite " << i + 1 << ". element niza: " << endl;
    cin >> nizB[i];
}
cout << "Unesite poziciju na koju zelite ubaciti nizB u nizA: " << endl;
cin >> pozicija;
umetni(nizA, nizB, duzina1, duzina2, pozicija);

return 0;
}
 
[ Nedeljko @ 20.12.2012. 23:39 ] @
E, onda ovako:

Code (cpp):

void umetni(int *a, int *b, int duzina_a, int duzina_b, int pozicija)
{
    --pozicija;

    for (int i = duzina_a + duzina_b - 1; i >= pozicija + duzina_b; --i) {
        a[i] = a[i - duzina_b];
    }
   
    for (int i = 0; i < duzina_b; ++i) {
        a[i + pozicija] = b[i];
    }
}
 
[ X Files @ 22.12.2012. 20:14 ] @
Kod ovakvih i sličnih zadataka, gde postoji neki izvor i neko odredište, a koji mogu doći u koliziju, dobra praksa je pre samog izvršenja, najbolje u samoj funkciji, ispitati neke preduslove, tipa: if ( (nizA != nizB) && (duzinaB !=0)) { /*...izvršenje...*/ }.
[ DARK_MESSIAH @ 23.12.2012. 23:18 ] @
Šta fali ako je nizA = nizB ? :S... Je li se to podrazumijeva da imaju iste članove?
[ X Files @ 24.12.2012. 07:27 ] @
Ako je "nizA == nizB", to znači da se radi o istoj adresi. Dakle, ne samo da "imaju iste članove", već je to jedan isti blok podataka, a ne dva odvojena.

To znači da se može dogoditi (u zavisnosti od način realizacije funkcije), da "izvor" podataka (za koji se podrazumeva da je read-only) bude uništen premeštanjem bloka podataka "odredišta". Ako se ovo predvidi, može se lako zaobići pravljenjem privremenih buffera.


Možda je ovo trenutak da pročitaš i čemu služi dodavanje ključne reći "const" unutar argumenata funkcije, verovatno si već viđao. U principu, radi se o napomeni kompajleru koji podaci ne smeju da budu promenjeni, ali isto tako je i napomena nekom programeru kako da realizuje funkciju na način kako je predvideo team leader :)
[ DARK_MESSIAH @ 24.12.2012. 21:37 ] @
Zavidim vam obojici na znanju :D.
Ako možete još da mi preporučite šta bih mogao raditi da malo uvježbam dodatno C++. Neki site sa praktičnim projektima ili tako nešto? Ovo na faxu je po meni čista formalnost. Ne vidim neku svrhu od ovih implementacija :/.
[ cikin @ 03.01.2013. 23:37 ] @
Code:
#include<stdio.h>
int novi(int a[],int b[],int na,int nb,int c[])
{
int i =0,j=0,m=0;
for(i,j;i<na;)
{
if(a[i]>b[j])
{
c[m++]=b[j];
j++;}
else
if(a[i]<b[j])
{
c[m++]=a[i];
i++;}
else
c[m++]=a[i];
}
return m;
}
int main()
{
int a[]={1,2,5,40};
int b[]={3,7,12};
int c[20];int i;
int na=sizeof(a)/sizeof(int);
int nb=sizeof(b)/sizeof(int);
int x=novi(a,b,na,nb,c);
for(i=0;i<x;i++)
printf("%d\n",c[i]);
}
zanima me samo sto mi izbaci "Segmentation fault"-ako moze neko tacno da kaze zasto.... inace nema veze za ovo za for(posto je u a veci zadnji broj)... inace zadatak brojevi su poredjani u rastucem sad treba urediti nov niz tako da i on bude u rastucem
[ Nedeljko @ 04.01.2013. 06:59 ] @
Prvo da ispravimo gramatičke i pravopisne greške:
Citat:
Zanima me samo što mi izbaci "Segmentation fault". Ako može neko tačno da kaže zašto. Inace, nema veze za ovo za for (posto je u a veci zadnji broj). Inace, zadatak glasi: spojiti dva rastuća niza brojeva u jedan rastući niz.

Drugo, program je napisan jako neuredno, tj. teško za čitanje. Ako koristiš Code::Blocks okruženje, u Plugins meniju imaš opciju "Source code formatter (AStyle)", pa je koristi.

E, sad, program puca zato što u drugoj else grani ne povećavaš i za jedan, pa onda taj uslov biva stalno ispunjen, zbog čega se m stalno povećava za 1, dok ne pređe opseg niza c.

To nije jedina greška u programu. Program zapravo treba da glasi:
Code (c):

#include <stdio.h>

int novi(int a[], int b[], int na, int nb, int c[])
{
    int i = 0, j = 0, m = 0;

    while (i < na && j < nb) {
        if (a[i] > b[j]) {
            if (m == 0 || b[j] > c[m - 1]) {
                c[m++] = b[j++];
            } else {
                ++j;
            }
        } else {
            if (m == 0 || b[j] > c[m - 1]) {
                c[m++] = a[i++];
            } else {
                ++i;
            }
        }
    }

    while (i < na) {
        if (m == 0 || a[i] > c[m - 1]) {
            c[m++] = a[i++];
        } else {
            ++i;
        }
    }

    while (j < nb) {
        if (m == 0 || b[j] > c[m - 1]) {
            c[m++] = b[j++];
        } else {
            ++j;
        }
    }

    return m;
}

int main()
{
    int a[] = {1, 2, 5, 40};
    int b[] = {3, 7, 12};
    int c[(sizeof(a) + sizeof(b))/sizeof(int)];
    int i;
    int na = sizeof(a)/sizeof(int);
    int nb = sizeof(b)/sizeof(int);
    int x = novi(a, b, na, nb, c);

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

    return 0;
}
 
[ cikin @ 07.01.2013. 00:33 ] @
opet ja i opet nizovi....Data su dva niza, i treba napraviti niz od clanova koji su isti za niz "a" i niz "b"... (ovo sto sam na kraju stavio u petlji da je i manje od x nije vazno),zanima me sto mi stalno izbacuje ove brojeve("adrese"?)...
Code:
#include<stdio.h>
void upor(int a[],int b[],int c[]) 
  {
       int j,i,k=0;
        for(j=0;j<10;j++)
         for(i=0;i<10;i++)
           if(a[j]==b[i])
           {c[k++]=b[i];
             break;
            } 
       c[k++]='\0';
     }
int main()

int i;char e;
int a[10];
int b[10];
int c[20];
  for(i=0;i<10;i++)
  { printf("unesi s[%d]",i);
    scanf("%d",&a[i]);
    scanf("%c",&e); printf("\n");
   }
  for(i=0;i<10;i++) 
  { printf("unesi s[%d]",i);
    scanf("%d",&b[i]);scanf("%c",&e);
    printf("\n");
  } 

upor(a,b,c); 
for(i=0;i<10;i++)
   printf("c [%d] je %d\n",i,&c[i]);
}



[ Nedeljko @ 07.01.2013. 18:03 ] @
Zato što u printf naredbi treba argumente da prenosiš po vrednosti, a ne po adresi. Makni onaj ampersant.