Poslao: 22 Feb 2013 17:50
|
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.
|
|
Poslao: 22 Feb 2013 18:03
|
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
|
|
|
|
Poslao: 22 Feb 2013 19:12
|
offline
- Srki_82
- Moderator foruma
- 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.
|
|
|
|
Poslao: 22 Feb 2013 20:08
|
offline
- morando
- Građanin
- 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.
|
|
|
|
Poslao: 22 Feb 2013 20:22
|
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
|
|
|
|
Poslao: 22 Feb 2013 20:29
|
offline
- NIx Car
- Legendarni građanin
- Més que un club
- Glavni vokal @ Harpun
- Pridružio: 27 Feb 2009
- Poruke: 3898
- 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)
|
|
|
|
Poslao: 22 Feb 2013 21:16
|
offline
- morando
- Građanin
- 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;
}
}
|
|
|
|
Poslao: 22 Feb 2013 22:18
|
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
Samo ne razumem zasto kod scanf-a moramo praviti razmak??
scanf(" %c",&Niz[i]);
|
|
|
|
Poslao: 22 Feb 2013 22:42
|
offline
- morando
- Građanin
- 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.
|
|
|
|