Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

banalan problem u C-u

[es] :: C/C++ programiranje :: banalan problem u C-u

[ Pregleda: 4040 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

cucilo
beograd

Član broj: 61006
Poruke: 2
*.dlp17.bih.net.ba.



Profil

icon banalan problem u C-u12.06.2005. u 11:13 - pre 228 meseci
U pitanju je zadatak u kojem imamo dva cjelbrojna niza i potrebno je naci uniju dva niza i razliku niza a u odnosu na niz b,i njihov prijesek.
Sto ovaj kod ne valja u potpunosti,posto ne radi razlika,a unija nije ni napravljena,tj. ne znam koja je instrukcija za nadovezivanje cjelobrojnih nizova,hmm moze li se koristiti strncat(....) i kako???

#include <stdio.h>
#include <string.h>
#include <math.h>
main()
{
int i,j,n,m,a[100],b[100];
printf("Unesite broj elemenata niza A:\n");
scanf("%d",&n);
printf("unesi elemente niza A:\n");
for(i=0;i<n;i++)
{
scanf("%d",&a);
}

printf("Unesite broj elemenata niza B:\n");
scanf("%d",&m);
printf("unesi elemente niza B:\n");
for(j=0;j<m;j++)
{
scanf("%d",&b[j]);
}

printf("Unija dva skupa:\n");
for(i=0;i<n;i++)
printf("%2d",a);
for(j=0;j<m;j++)
printf("%2d",b[j]);
printf("\n");

printf("Prijesek dva skupa:\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if (a==b[j])
printf("%2d",a);
}
printf("\n");

printf("Razlika dva skupa:\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if (a!=b[j])

printf("%2d",a);

}

}
trenutno se javljaju na sajtu problemi,tako da u kodu se ne pojavljuju sve sta treba,tj,na nekoliko mjesta nedostaje a(i) umjesto a.
Ako neko zna da ga uradi na kraci nacin,bio bih mu zahvalan :)
 
Odgovor na temu

Klevetnik
Beograd

Član broj: 38098
Poruke: 8
*.pat-pool.bgd.sbb.co.yu.



Profil

icon Re: banalan problem u C-u12.06.2005. u 17:14 - pre 228 meseci
Koliko ja znam u standardnom c-u ne postoji funkcija za nadovezivanje nizova intova. strcat se koristi za nadovezivanje NULL terminated nizova karaktera.
U programu ti fali provera da ako korisnik unese broj clanova niza > 100 doci ce do sr**ja :).
Evo jednog prostog resenja za uniju. Prvo uniji dodelis sve vrednosti koje su u prvom nizu, a onda iz drugog niza one koje vec nisi iz prvog. (to drugo bi bilo dodavanje razlike B-A)
Pogledaj dinamicku alokaciju memorije, pogledaj malloc(), calloc(), realokacija realloc(). Za brisanje dinamickih nizova pogledaj free().
 
Odgovor na temu

IDE

Član broj: 53403
Poruke: 586
*.crnagora.net.



Profil

icon Re: banalan problem u C-u12.06.2005. u 21:21 - pre 228 meseci
mozda bi pomogla f-ja memcpy(p1,p2,n)?? (kopira do n bajtova iz bloka p2 u p1)
kazem MOZDA, pogledaj...
vodi racuna ako ti neko unese npr iste nizove...sta ce onda unija biti??unija nije samo spajanje dva skupa, vec uniju cine elementi koji se pojavljuju u ta dva niza, ali se ne ponavljaju isti elementi vise puta u uniji!!
tako isto i presjek...sta ako npr u ta dva niza imas da se javlja po 3-4 puta isti broj??onda ces 3-4 puta imati isti broj u novom nizu...znaci moras eliminisati iste elemente u sva tri slucaja (i unija i presjek i razlika...)
nisam mnogo gledao kod, ali CINI mi se da nisi mnogo vodio o tome racuna...
there's something out there
waiting for us,
and it ain't no man...
 
Odgovor na temu

z@re
Zarko Bulatovic
Split

Član broj: 29849
Poruke: 443
*.cmu.carnet.hr.



+25 Profil

icon Re: banalan problem u C-u13.06.2005. u 13:52 - pre 228 meseci
ako zelis nadovezati niz "b" na niz "a" kod ti je sljedeci :

prvo polja bi trebalo dinamicki alocirat pomocu pointera na integer.
dakle ekvivalent

int a[100];

je

int *a = (int *)malloc(sizeof(int) * 100);

i u ovom primjeru mozes direktno radit s clanovima polja kao i s gornjim primjerom statickog alociranja

evo ti primjer :

#include <stdio.h>
#include <stdlib.h>

main()
{
int n_a = 100; //broj elemenata u polju a
int n_b = 80; //broj elemenata u polju b
int i = 0, j = 0;

int *a = (int *)malloc(sizeof(int) * n_a); //alociranje polja a, n_a elemenata
int *b = (int *)malloc(sizeof(int) * n_b); //alociranje polja b, n_b elemenata

//upisivanje elemenata u polja

for(i = 0; i < n_a; i++)
{
printf("upisi element %d polja a ->", (i + 1));
scanf("%d", &a);
}

for(i = 0; i < n_b; i++)
{
printf("upisi element %d polja b ->", (i + 1));
scanf("%d", &b);
}

//realociranje polja a na 180 elemenata
//realloc funkcija ce produziti polje a za jos 80 elemenata

a = (int *)realloc(a, sizeof(int) * (n_a + n_b));

//iskopiraj 80 elemenata polja b od 100 do 180 elementa polja a
//povecaj varijablu elemenata polja a

for(i = n_a, j = 0; i < (n_a + n_b); i++, j++)
a = b[j];

n_a+=n_b;

//ispisi polje a

for(i = 0; i < n_a; i++) printf("%d ", a);
printf("\n");
}


u tvom kodu ti si fiksno alocirao oba polja na 100 elemenata, pa kazes korisniku da upise broj elemenata. taj princip nije nimalo dobar, jer imas limit od 100 elemenata po polju, ako korisnik ide upisat preko 100 elemenata imas gresku, a ako je manje od 100 elemenata imas bespotrebno iskoristenu memoriju.

znaci kod malloc funkcije sintaksa je iduca

tip *var = (tip *)malloc(sizeof(tip) * brojelemenata);

malloc rezervira memoriju na koju neki pokazivac pokazuje. (int *), u gornjem primjeru ti je potreban prije malloc naredbe, da kaze naredbi da se radi o polju integera, jer malloc po defaultu vraca void pokazivac, pa je potreban typecasting radi konverzije tipa. malloc funkcija uzima samo jednu vrijednost, dakle broj byteova koji se alocira. posto je svaki integer na 32-bitnim platformama velik 4 bytea, a ako ima 100 elemenata u polju integera treba alocirati 400 byteova. moguce je i napisati malloc(4 * brojelemenata), ali posto duljine nekih tipova variraju od platforme do platforme ispravnije je napisati malloc(sizeof(int) * brojelemenata), jer ce sizeof operator vratiti duljinu tipa prema platformi na kojoj se program kompajlira.

kod realloca je stvar malo drukcija :

tip *var = (tip *)realloc(var, sizeof(tip) * brojelemenata);

realloc realocira predhodno alociranu memoriju. razlika je sto realloc funkcija prima dvije vrijednosti, prva je memorijska adresa vec alociranog bloka, a druga na koliko se realocira. bitno je primjetit da realloc prima na koliko se realocira, a ne zakoliko se realocira. znaci ako je stari blok velik 400 byteova, a hocemo dodat jos 80 byteova, pisemo realloc(var, 480) a ne realloc(var, 80).

Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.fsb.hr.



+9 Profil

icon Re: banalan problem u C-u13.06.2005. u 14:41 - pre 228 meseci
Inace, OPREZ!

Funkcija realloc ce prekopirati cijelo polje na drugo mjesto ukoliko na trenutnoj lokaciji ne moze naci dovoljno mjesta za sve elemente koje zelis alocirati. Ako si u medjuvremenu napravio pokazivac na neku mem. lokaciju u polju, a poslije napravio realloc moze se desiti greska jer na toj mem. lokaciji na koju je pokazivao onaj pokazivac se ne mora nalaziti prethodno polje tj. njegov element...
 
Odgovor na temu

z@re
Zarko Bulatovic
Split

Član broj: 29849
Poruke: 443
*.cmu.carnet.hr.



+25 Profil

icon Re: banalan problem u C-u13.06.2005. u 22:40 - pre 228 meseci
zapravo, glupo je koristit pointer na dinamicki alocirano polje, kad je to polje vec alocirano preko pointera. ako treba vec pointer koji pokazuje na element tog polja, moze se koristiti i *(ptr + i) metoda. jedino ako se recimo u polju charova zeli micat po cetiri bytea pa alocirat pointer na int, tada bi ga trebalo opet postavit na pocetnu adresu realociranog polja...

Q: HSP56 Micromodem nece da radi kompjuter ga prepozna a kad treba da se konektujem nece ne daje ni znaka zivota. u cemu je problem.

A: Crko mozda od grmljavine mozda od spanaca. Uglavnom baci ga u WC solju jako povuci vodu. Skupi 5e i uzmi drugi i ne postuj temu na pogresno mesto.
 
Odgovor na temu

[es] :: C/C++ programiranje :: banalan problem u C-u

[ Pregleda: 4040 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.