|
[ vbvlada @ 12.06.2005. 14:07 ] @
| Ovaj kod bi trebalo da ukloni iz niza sve elemente koji su jednaki najmanjem ili najvecem elementu(valjda ukljucujuci i ta
dva elementa)Zanima me da li to moze ovako.Testirao sam ovo u .NET-u i prijavljuje mi neki fatal error pri linkovanju,pa me
zanima da li je kod los ili ne valja .NET.Ako moze neko da ga testira pa da vidi sta nije u redu...Treba mi odgovor sto ranije!
Evo koda>
main(){
int *a,n,i,k,min,max;
while(1){
printf("Velicina niza?\n\t");
scanf("%d",&n);
if(n<0)break;
a=malloc(n*sizeof(int));
printf("Unesite niz\n\t");
for(i=0;i<n;scanf("%d",a[i++]));
min=max=a[0];
for(i=1;i<n;i++){
if(a<min)min=a;
if(a>max)max=a;
}
for(k=i=0;i<n;i++)
if((a!=min)||(a!=max))a[k++]=a;
a=realloc(a,k*sizeof(int));
printf("Novi niz je\n\t");
for(i=0;i<k;i++)printf("%d ",a);
free(a);
}} |
[ flx @ 12.06.2005. 17:52 ] @
Mrzi me sada bas da analiziram tvoj program ali ovako na prvi pogled imas greske u pisanju tj na vise mesta ti fali a[od necega].Ispravi prvo to pa vidi sta se desava.
[ Burgos @ 12.06.2005. 18:11 ] @
Kod mene (MinGW) kompajlira se i linkuje, ali pukne posle upisivanja niza.
Gcc kompajira i linkuje, ali nece da se pokrene
[ vbvlada @ 12.06.2005. 22:26 ] @
Ok,ali kao algoritam,da li on radi posao,tj. da izbaci iz niza sve elemente koji su jednaki najmanjem i najvecem....
[ z@re @ 13.06.2005. 14:24 ] @
kod za micanje elementa iz polja ti je iduci
for(i = 0; i < n; i++)
{
if(a[ i ] == value)
{
for(j = i; j < n; j++) a[j] = a[j + 1];
a = (int *)realloc(a, sizeof(int) * --n);
i--;
}
}
u ovom primjeru "a" ti je polje, koje mora bit dinamicki alocirano (dakle pomocu pointera na tip i malloca, kao u tvom kodu), value ti je vrijednost koju trazis, "n" je broj elemenata u polju, "i" i "j" su pomocne varijable tipa int (brojaci).
prva for petlja se vrti od pocetka do kraja polja, i testira jeli trenutacni element ima vrijednost koja se trazi. ako ima, druga petlja napravi left-shift sa svim iducim elementima. znaci svi elementi koji su iza elementa koji se trazi ce se maknuti ulijevo, tako da ce prebrisat element koji se trazi. to nam ostavlja na zadnjem elementu polja mjesto koje nam ne treba jer smo ipak izbacili jedan element, pa polje treba reallocirat na n - 1 elemenata. kasnije se jos i smanji brojac glavne petlje za 1, jer mozda novi element koji je dosao na mjesto starog elementa ima vrijednost koja je isto jednaka onoj koju trazimo, pa da se taj element nebi preskocio.
znaci, ti trebas nac vrijednost najveceg i najmanjeg elementa u polju, pa samo liniju 3 iz gornjeg koda promjeni u if (a == max || a == min)
[ itf @ 13.06.2005. 14:30 ] @
Ja mislim da bi tu prvo trebalo napraviti realokaciju prije nego spremas vrijednost u element polja 'a'? Ovako se moze desiti da se indeksiras na nepostojeci element.
[ z@re @ 13.06.2005. 23:56 ] @
ja jedino vidim manu ako je trazeni element na zadnjem mjestu u polju. tada bi se iduci element probao prekopirati preko njega, a taj element je van granica polja. dakle kod bi trebalo prepraviti da izgleda ovako :
Code:
for(i = 0; i < n; i++)
{
if(a[ i ] == value)
if(i == (n - 1))
{
a = (int *)realloc(a, sizeof(int) * --n);
}
else
{
for(j = i; j < n; j++) a[j] = a[j + 1];
a = (int *)realloc(a, sizeof(int) * --n);
i--;
}
}
dakle ako je zadnji element taj koji se trazi, samo se smanji blok za jedan element, pa ce on ostat izvan granica polja.
[ vbvlada @ 14.06.2005. 11:14 ] @
Z@re,mozda mozes da stavis da brojac j(u onom prethodnom kodu) ide do n-1 pa tako nece ici preko granice polja,tj. kada poslednji put bude bilo j+1,taman ce da dodje do kraja.
[ vbvlada @ 14.06.2005. 11:24 ] @
Da i zaboravih da pitam zasto ovo izgleda ovako:
a = (int *)realloc(a, sizeof(int) * --n);
tj. mi u skoli ucimo bez int*,uglavnom bez zvezdica....
[ Burgos @ 14.06.2005. 12:22 ] @
Code: void* realloc(void *ptr, size_t size);
Kao sto vidis realloc vraca pokazivac na void (tj. pokazivac na bilo koje mesto u memoriji)
U C jeziku moguce je direktno dodeljivati vrednosti bez castinga (jako opasno!)
Code: #include <stdio.h>
int main()
{
void* vp;
int* ip;
ip = vp;
}
u C++ je to nemoguce uraditi bez castinga (tj. prvo se vp mora pretvoriti u int*, i dalje opasno, ali se pretpostavlja da programer zna sta radi)
Code: #include <cstdio>
int main()
{
void* vp;
int* ip;
ip = (int*)vp;
}
[ vbvlada @ 14.06.2005. 23:24 ] @
Vidim da jos treba malo da citam...
Ok,ljudi hvala vam na savetima,u sredu imam kolokvijum kod mr. Lasla Krausa,treba mi preko 90 poena za 10,valjda ce biti nesto lakse...
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|