|
[ 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.
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.
|