Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 31.3.2012, 0:46   #1
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Pomoc oko programa u C-u

Pozdrav!
Treba da ispisem mali programcic u C-u koji radi sledece:

ucitava niz, a zatim trazi duzinu najduzeg podniza koji se sastoji od nula i ispisuje pocetnu i krajnju poziciju tog podniza.

Npr, niz je 1 2 0 0 3 0 4 0 0 0 0 8
dakle, duzina najduzeg podniza 0 jeste 4, a pocetna i krajnja pozicija su 8 i 11.

Ovde imam delic koda
Kod:
duz = 0;
	  d = 0;
		for(j=1;j<db;j++) {
			if (b[j-1]==0) {d++; kraj=j; if(d>duz)duz=d;}
			else if(b[j]!=0)d=0;
		}
Ideja je sledeca:
petlja for prolazi kroz niz, ako je tekuci element jednak nuli, duzina niza se uvecava za 1, a promenljiva kraj oznacava da je taj element poslednji. Ako je tekuca duzina veca od duzine, duzina dobija vr tekuce duzine. Zatim se proverava da li je naredni element razlicit od nule. Ako jeste, dolazimo do toga da tekucu duzinu resetujemo na nulu.

Ovo je kostur, za koji sam svestan da ne radi... Medjutim, kako sam pocetnik, i vec sat i po se mlatim sa ovim, trenutno nisam u stanju da smislim logicne ispravke za kod, te bih molio za pomoc.
absonic je offline   Odgovor sa citatom ove poruke
Stara 31.3.2012, 1:17   #2
EclipsE
Starosedelac
 
Član od: 16.4.2006.
Lokacija: Scary Movie Reputacija: ■■□
Poruke: 1.337
Zahvalnice: 378
Zahvaljeno 279 puta na 196 poruka
Slanje poruke preko Skypea korisniku EclipsE
Određen forumom Re: Pomoc oko programa u C-u

Kod:
// b = niz
int pocetak = 0, kraj = 0, duzina = 0, tmp_pocetak = 0, tmp_kraj = 0, tmp_duzina = 0;

for (int i = 0; i < db; i++)
{
    if (b[i] == 0)
    {
        if (tmp_duzina++ == 0) tmp_pocetak = i;
        tmp_kraj = i;
    }
    else
    {
        if (tmp_duzina > duzina)
        {
            pocetak = tmp_pocetak;
            kraj = tmp_kraj;
        }
        tmp_duzina = 0;
    }
}
Ovo sam napisao na najprimitivniji način na koji sam mogao

Ideja je da čuvaš najveće vrednosti u pocetak, kraj i duzina, i imaš neke pomoćne promenljive koje ćeš da koristiš pri prolasku kroz niz.

for petlja kaže sledeće:

Kod:
ukoliko je trenutni član jednak nuli:
    ukoliko je pomoćna dužina jednaka nuli, znači da je to početak niza nula pa postavljam tmp_pocetak na trenutan broj
    uvećam dužinu za 1
    postavim kraj na trenutan broj

ukoliko nije, ovo je kraj niza ili uopšte nije bio niz:
    ako je dužina niza kog sam trenutno izbrojao veća od dužine nekog prethodnog niza:
        postavi pravi početak na moj pomoćni početak
        postavi pravi kraj na moj pomoćni kraj
    postavi pomoćnu dužinu na 0
EclipsE je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku EclipsE na korisnoj poruci:
absonic (31.3.2012)
Stara 31.3.2012, 10:00   #3
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Određen forumom Re: Pomoc oko programa u C-u

Ne treba ti toliko promenjivih jer možeš i sa manje da uradiš istu stvar.

Samo sam malo izmenio tvoj kod i već lepše izgleda .

Kod:
int kraj = 0, duzina = 0, tmp_duzina = 0;

for (int i = 0; i < db; i++)
{
    if (b[i] == 0)
    {
        tmp_duzina++;
    }
    else
    {
        if (tmp_duzina > duzina)
        {
            duzina = tmp_duzina;
            kraj = i;
        }
        tmp_duzina = 0;
    }
}
Ako ti treba početak to je (kraj - duzina) .
Todors je offline   Odgovor sa citatom ove poruke
Sledećih 2 korisnika se zahvaljuje korisniku Todors na korisnoj poruci:
absonic (31.3.2012), EclipsE (31.3.2012)
Stara 31.3.2012, 13:53   #4
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

Veliko hvala, ljudi!
Ako jos negde zapnem, pitam ovde

EDIT:
Todos, sada sam isprobao ovaj kod, i javlja se mali problem. Kada je niz nula na kraju,
tipa 1 2 3 0 0 2 0 0 0 0, program ga ne konstatuje, tj izbacuje da je najduzi niz nula duzine 2?

EDIT 2:
uspeo sam da resim problem tako sto sam izmenio sledeci deo
Kod:
for (int i = 0; i <= db; i++)

Poslednja ispravka: absonic (31.3.2012 u 17:39)
absonic je offline   Odgovor sa citatom ove poruke
Stara 31.3.2012, 18:19   #5
zokocx
Starosedelac
 
Član od: 8.4.2006.
Lokacija: Beograd
Poruke: 2.568
Zahvalnice: 888
Zahvaljeno 578 puta na 358 poruka
Određen forumom Re: Pomoc oko programa u C-u

Sa tom promenom operatora u uslovu for petlje (< ba <=) pristupas i 12 elementu niza (probijas index), a ako kojim slucajem je to null terminator '\0' onda se i to racuna ako nije takav niz mozes da dobijes neku gresku u toku izvrsenja a i nemoras.

Mozda najsigurnije resenje je da dodas posle bloka for petlje
Kod:
if(tmp_duzina > duzina)
duzina = tmp_duzina
jer tmp_duzina sadrzi duzinu podniza ali ne udje u else da to dodeli prom. duzina.
zokocx je offline   Odgovor sa citatom ove poruke
Sledećih 2 korisnika se zahvaljuje korisniku zokocx na korisnoj poruci:
absonic (31.3.2012), EclipsE (31.3.2012)
Stara 31.3.2012, 18:55   #6
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

Dada, sigurnija varijanta.

Sad, još jedno pitanje:
imam niz 1 2 3 4 5 6 7 8 9 10
pošto jezik c indeksee elemenata niza računa od 0, broj 4 bi mi bio na poziciji 3 ili 4?
absonic je offline   Odgovor sa citatom ove poruke
Stara 31.3.2012, 19:14   #7
EclipsE
Starosedelac
 
Član od: 16.4.2006.
Lokacija: Scary Movie Reputacija: ■■□
Poruke: 1.337
Zahvalnice: 378
Zahvaljeno 279 puta na 196 poruka
Slanje poruke preko Skypea korisniku EclipsE
Određen forumom Re: Pomoc oko programa u C-u

Kod:
niz: 1 2 3 4 5 6 7 8 9 10
poz: 0 1 2 3 4 5 6 7 8 9
Broj 4 je na poziciji 3. Ako je tebi cilj da pozicija bude 4, onda dodaš 1 na index elementa.
EclipsE je offline   Odgovor sa citatom ove poruke
Stara 31.3.2012, 19:16   #8
Todors
Član
 
Član od: 16.4.2010.
Lokacija: Pančevo
Poruke: 462
Zahvalnice: 41
Zahvaljeno 68 puta na 63 poruka
Određen forumom Re: Pomoc oko programa u C-u

Pa i sam si rekao, broj 3 .

Heh nisam video da je eclipse već odgovorio.

Btw.
Todos na španskom znači sve, a ja sam ipak Todors

Poslednja ispravka: Todors (31.3.2012 u 19:19) Razlog: Brži je bio eclipse
Todors je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Todors na korisnoj poruci:
absonic (31.3.2012)
Stara 31.3.2012, 21:25   #9
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

Oprosti, Todors, nenamerna greška

Uglavnom, igrao sam se malo i modifikovao kod
Kod:
			for (j = 0; j < db; j++) // pronalazenje najduzeg niza nula u nizu b.
			{
				if (b[j] == 0)
				{
					d++;
				}

				if((d > duz) && (b[j] == 0)){duz = d; kraj=j;}

				else
				{
					if (d > duz)
					{
						duz = d;
					}
					d = 0;
				}
			}
Varijanta koju je Todors postavio je za mesto poslednje nule izbacivala j+1, a i pošto sam program treba da nađe PRVI NAJDUŽI niz nula, pokušao sam to da sredim na sledeći način

Kod:
if((d > duz) && (b[j] == 0)){duz = d; kraj=j;}
ako je tekuća dužina veća od dužine i ako je tekući element jednak nuli, dužina je tekuća dužina i kraj =j;, ali se sad zbuni i ako ubacim 0 0 1 1 0 0 0 2, prve dve nule racuna kao najduzi niz.

Sta sam sada zeznuo ?
absonic je offline   Odgovor sa citatom ove poruke
Stara 31.3.2012, 22:35   #10
zokocx
Starosedelac
 
Član od: 8.4.2006.
Lokacija: Beograd
Poruke: 2.568
Zahvalnice: 888
Zahvaljeno 578 puta na 358 poruka
Određen forumom Re: Pomoc oko programa u C-u

Sa me mrzi da mnogo razmisljam idem da pijem, sutra cemo.

Ali usput mi je palo jedno "pokvareno" resenje , ako treba PRVI NAJDUZI niz nula (a ima ih recimo ma ili vise), onda ih trazi ali pocni od kraja niza kad pocetku, i u toj situaciji ce poslednji najduzi biti normalno prvi.
Samo promenis for petlju.
zokocx je offline   Odgovor sa citatom ove poruke
Stara 31.3.2012, 23:51   #11
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

Snasao sam se, ovo radi posao, za sada sam ovo probao jedno 20x za razne primere i radi posao

Kod:
			
for (j = 0; j < db; j++) // pronalazenje najduzeg niza nula u nizu b.
{
	if (b[j] == 0)
	{
		d++;;
		if(d > duz){duz=d;kraj=j;}
	}
	else
	{
		d = 0;
	}
}
absonic je offline   Odgovor sa citatom ove poruke
Stara 2.5.2012, 20:54   #12
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

Evo mene opet

Zanima me sledece:
treba da unesem string, ciju duzinu ne znam unapred. Memorija treba da se alocira dinamicki.

ja sam to uradio na sledeci nacin:

dodelio sam jedan bajt memorije (za znak '\0'), a zatim svaki put kada ucitam novi karakter sa getchar() (dok god je getchar()!='\n') uvecam brojac duzine za jedan i alociram (d+1)*sizeof(char) preko realloc. Medjutim, uvek mi izbacuje duzi string nego sto to zapravo jeste. Npr unesem test, kad stavim printf("%s", string), izbaci test=2222 itd.

Ako neko moze da pogleda kod, i pomogne da pronadjem gde je greska
Kod:
void main() {
	char *niz;
	char c;
	int d=1,i=0;

	niz=(char*)malloc(sizeof(char));
	while ( (c=getchar()) != '\n')
	{
		d++;
		niz = (char*)realloc (niz, d);
		niz[i]=c;
		i++;
	}
absonic je offline   Odgovor sa citatom ove poruke
Stara 2.5.2012, 20:59   #13
EclipsE
Starosedelac
 
Član od: 16.4.2006.
Lokacija: Scary Movie Reputacija: ■■□
Poruke: 1.337
Zahvalnice: 378
Zahvaljeno 279 puta na 196 poruka
Slanje poruke preko Skypea korisniku EclipsE
Određen forumom Re: Pomoc oko programa u C-u

Prebrises '\0' i onda nemas null terminated string (tacnije nikad ga i ne dodelis xd).

Kod:
void main() {
    char *niz;
    char c;
    int d = 1;

    niz=(char*)malloc(sizeof(char));
    while ( (c=getchar()) != '\n')
    {
        niz = (char*)realloc(niz, ++d);
        niz[d - 2] = c;
    }

    niz[d - 1] = '\0';
}
EclipsE je offline   Odgovor sa citatom ove poruke
Stara 2.5.2012, 21:42   #14
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

'De je onaj smajli sto se mlati u glavu .

Hvala
absonic je offline   Odgovor sa citatom ove poruke
Stara 2.5.2012, 22:00   #15
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 10.989
Zahvalnice: 1.965
Zahvaljeno 4.818 puta na 2.777 poruka
Određen forumom Re: Pomoc oko programa u C-u

Takođe izbegavaj to realociranje za po jedan bajt više, nije dobro za performanse. Realociraj u koracima od npr 20, 50, 100 itd bajtova (tako što održavaš neki brojač u while petlji pa kad otkuca do određene cifre, tek onda realloc).
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 3.5.2012, 9:34   #16
ivan90BG
Veteran
 
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
Određen forumom Re: Pomoc oko programa u C-u

A najlakše je koristiti funkciju koja ti čita ceo string sa ulaza.

fgets(char* buffer, int legth, FILE* stream);
Kod:
//Alociraš memoriju, recimo 200 bajtova
char* buffer = malloc(200)
//i pozoveš
fgets(buffer, 200, stdin);
Pročitaće najviše 199 char-ova iz stdin-a (jer terminiše string sa nulom), ako naiđe na newline karakter pročitaće do njega i ubaciti ga na kraj stringa.
ivan90BG je offline   Odgovor sa citatom ove poruke
Stara 4.5.2012, 0:59   #17
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

Imam jos jedno pitanje

Da li je moguce u string ubaciti vrednost neke promenljive.
Recimo,

n=5;
string = "Ovo je n. mesec u godini", ali, naravno da umesto n stoji 5. Znam da ovo nece raditi, ali da li postoji neki nacin da se ovo izvede. (po mogucstvu bez upotrebe strcat)?
absonic je offline   Odgovor sa citatom ove poruke
Stara 4.5.2012, 8:52   #18
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom Re: Pomoc oko programa u C-u

sprintf možda?
MG-RAY je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci:
absonic (4.5.2012)
Stara 6.5.2012, 0:13   #19
absonic
Član
 
Član od: 4.11.2005.
Poruke: 285
Zahvalnice: 15
Zahvaljeno 7 puta na 6 poruka
Određen forumom Re: Pomoc oko programa u C-u

Opet pitanje.

Imam jednu komandu
Kod:
akcija=(char*)malloc(3*sizeof(char));
akcija=">=";
ali mi komanda free(akcija) pravi problem iz nekog razloga. Kada pokrenem program, on se zamrzne.

Probao sam rucno da stavim znak za kraj kao a[2]='\0', ali ni to nije pomoglo?

edit:
trebalo je da stavim free(akcija) van while petlje u kojoj dodeljujem vrednost stringu)
absonic je offline   Odgovor sa citatom ove poruke
Stara 8.5.2012, 16:10   #20
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 10.989
Zahvalnice: 1.965
Zahvaljeno 4.818 puta na 2.777 poruka
Određen forumom Re: Pomoc oko programa u C-u

Ne možeš raditi takvo dodeljivanje u čistom C-u, već u string upisuješ sa strcpy

#include <string.h>

...
strcpy(akcija, ">=");

A ti si uradio sledeće: napravio si pokazivač akcija koji si uperio na novoalocirani blok memorije (sa malloc), pa si onda taj pokazivač pomoću znaka jednakosti samo preusmerio na drugi blok memorije (ovo ">=") koji je privremeno stvoren kao literal negde na steku te funkcije, i onda si pokušao da uradiš free tog bloka (koji pripada zaštićenom steku) i zato je puklo. Onaj prvi blok ti je pritom ostao "izgubljen" (nemaš više ništa što pokazuje na njega i zato ne možeš da ga dealociraš osim ubijanjem procesa) čime si dobio curenje memorije.

Znak jednakosti u C-u znači dodelu vrednosti samo za proste tipove, a char* je niz i u tom slučaju (kao i u slučaju bilo kojih drugih nizova) jednakost samo preusmerava pokazivač na neki blok memorije.
voodoo_ je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci:
absonic (9.5.2012)
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Procena računara alien Šta da kupim? 6897 7.5.2022 10:50
PASTE teksta, pomoc hitno potrebna Kobilic Kvarovi 4 31.10.2011 15:48
Virus POMOC Kobilic otpaTci 11 9.5.2011 19:21
Potrebna mi pomoc! Snakebite 2D radovi 4 30.4.2009 1:08
Kako postici anonimnost kod koriscenja P2P programa The Finest Serbian Since '82 Internet tehnologije 31 7.8.2007 1:35


Sva vremena su po Griniču +2 h. Sada je 19:24.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2023, vBulletin Solutions, Inc.
Hosted by Beograd.com