Gde je greska??

Gde je greska??

offline
  • Pridružio: 22 Feb 2013
  • Poruke: 30

Napisati program koji omogućava korisniku da unese niz znakova od n elemenata (veličinu niza
unosi korisnik), a zatim sortira niz u nerastućem poretku poboljšanom metodom Bubble sort i
pronalazi, metodom binarne pretrage, znak koji unese korisnik.



#include <stdio.h>
#include <stdbool.h>

int main()
{
int n = 0;

printf("Unesite velicinu niza: ");
scanf("%d",&n);

char Niz[n];
printf("Unesite clanove niza:\n");

int i, j, temp = 0;

for(i = 0; i < n; i++)
scanf("%c",&Niz[i]);

bool zamena = true;
for(i = n - 1; i > 0; i--)
{
for(j = 0; j < i && zamena == true; j++)
{
zamena = false;
if(Niz[j] < Niz[j+1])
{
temp = Niz[j];
Niz[j] = Niz[j+1];
Niz[j+1] = temp;
zamena = true;
}
}
}
char znak;
printf("Unesite znak koji hocete da trazite :");
scanf("%c",&znak);

int poc = 0, sredina, pom = 0;
int kraj = n - 1;

while(poc <= kraj)
{
if(n%2==1) sredina = ((poc + kraj) / 2) +1;
else sredina = (poc + kraj) / 2;

if(Niz[sredina == znak])
{
printf("Znaka %c ima u nizu",znak);
pom = 1;
break;
}

if(Niz[sredina] > znak) poc = sredina +1;
else if(Niz[sredina] < znak) kraj = sredina - 1;
}
if(pom == 0) printf("Znaka %c nema u nizu",znak);

return 0 ;
}
Kada unesem N = 3 , unesem jedan clan niza i for ciklusa se zavrsi ....
ZASTO???



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 05 Maj 2010
  • Poruke: 112

Nije mi jasno kako si uopšte uspeo da pokreneš program kad ti niz nije alociran?
Koristi malloc



offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

@DocNet
Niz je alociran u ovoj liniji:
char Niz[n];

@Kole95
Nisam trenutno pored svog računara, pa ne mogu da proverim gde je tačno greška, ali mi kod deluje u redu. Predlažem ti da staviš breakpoint na početak petlje i da ideš red po red da vidiš zbog čega dolazi do takvog ponašanja.

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

@Srki_82
Nisam neki C poznavalac, da li uopste u C-u moze da se alocira niz na staku na ovaj nacin posto 'n' nije konstanta?

@Kole95
Kad unosis karakter sa scanf stavi jedan space pre %c:
char ch; //scanf("%c", &ch); scanf(" %c", &ch);

Zasto: stackoverflow thread

BTW. Ne valja ti algo za trazenje znaka.

offline
  • Pridružio: 22 Feb 2013
  • Poruke: 30

ovaj red nije uredu
// if(Niz[sredina == znak])
if(Niz[sredina] == znak)

Evo stavio sam razmak kod scanf-a
problem je sada kad unesem neparan N, pri unosu znaka koji korisnik hoce da trazi , ispadne kao da sam scanf stavio u beskonacan ciklus koji nikako nece da se zavrsi , a kada stavim paran N program se izvrsi bez problema GUZ - Glavom U Zid

offline
  • Més que un club
  • Glavni vokal @ Harpun
  • Pridružio: 27 Feb 2009
  • Poruke: 3896
  • Gde živiš: Novi Sad,Klisa

morando ::@Srki_82
Nisam neki C poznavalac, da li uopste u C-u moze da se alocira niz na staku na ovaj nacin posto 'n' nije konstanta?


Da moze, posto se koristi c99 standard, nakon deklaracije neke promenljive, vrednost te neke promenljive mozes koristiti kao maksimalnu velicinu niza. (probao sam vise puta) Smile

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Mislim da ide ovako kad je u "nerastucem poretku" sortirano:
while(poc <= kraj)     {        sredina = (poc + kraj) / 2;        if(Niz[sredina] == znak)        {           printf("Znaka %c ima u nizu",znak);           pom = 1;           break;        }        else if(Niz[sredina] < znak) // > znak        {                                kraj = sredina - 1;           }                                                             else                                                       {                                poc = sredina + 1;             }     }

offline
  • Pridružio: 22 Feb 2013
  • Poruke: 30

Umesto ovoga
if(Niz[sredina] > znak) poc = sredina +1;
else if(Niz[sredina] < znak) kraj = sredina - 1;
stavio sam sredina = (poc + kraj) / 2;
i KONACNO radi Very Happy

Samo ne razumem zasto kod scanf-a moramo praviti razmak??
scanf(" %c",&Niz[i]);

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Kole95 ::
Samo ne razumem zasto kod scanf-a moramo praviti razmak??
scanf(" %c",&Niz[i]);


Imas i ovde zanimljiv text sta se dogadja pa se prosvetli ili posmatraj na to kao crnu magiju i ostavi za neki drugi put. Mr. Green

Ko je trenutno na forumu
 

Ukupno su 747 korisnika na forumu :: 32 registrovanih, 3 sakrivenih i 712 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Aleksandar Tomić, Apok, Bane san, djo97, djordje92sm, dragon986, Drug pukovnik, goxin, ivica976, Jovan Nenad, krlebgd77, kybonacci, L A Z A R, Libertas, ljuba, manda87, MB120mm, mercedesamg, MikeHammer, milenko crazy north, nemkea71, NoOneEver Dreams, ruan, S-lash, Sass Drake, Skywhaler, Srki98, Toni, Vlada78, x9, YU-UKI