[ alexej @ 02.08.2004. 13:06 ] @
ne mogu da shvatim, u cemu je problem odnosno zasto program ne radi ispravno...
#include <stdio.h>
#include <math.h>
main()
{
int n, b=2, p, d;
L0:printf("Koliko prostih brojeva da se ispise? ");
scanf("%d", &n);
if(n<0)
{
printf("Treba prirodan broj, valjda!");
goto L0;
}
while(n)
{
d=3;
p=(((b%2)==1)||(b==2));
while(p&&d<=sqrt((float)b));
{
p=((b%d)!=0);
d+=2;
}
if(p)
{
printf("%d ", b);
n--;
}
b++;
}
getchar();
getchar();
}
[ filmil @ 02.08.2004. 13:09 ] @
Kako se utvrđuje da program radi neispravno? Šta treba da da, a šta daje?

f
[ alexej @ 02.08.2004. 17:39 ] @
treba da ispise prvih n prostih brojeva, a meni ispisuje brojeve koji nisu prosti, i pored toga ne ispise ih onoliko koliko se zada!
usput, ako je bitno, koristim Dev C++ razvojno okruzenje.
[ idb @ 02.08.2004. 21:24 ] @
Evo tvog koda sa jednom izmenom:
Code:

#include <stdio.h>
#include <math.h>
main()
{
    int n, b=2, p, d;
    L0:printf("Koliko prostih brojeva da se ispise? ");
    scanf("%d", &n);
    if(n<0)
    {
        printf("Treba prirodan broj, valjda!");
        goto L0;
    }
    while(n)
    {
        d=3;
        p=(((b%2)==1)||(b==2));
        while(p&&d<=sqrt((float)b))    //; ovo Tacka-Zarez je mislim visak?!
        {
            p=((b%d)!=0);
            d+=2;
        }
        if(p)
        {
            printf("%d ", b);
            n--;
        }
        b++;
    }
    getchar();
    getchar();

Dakle jednan znAk TACKA-ZAREZ mnogo stvari moze da izmeni. Kada ga uklonis trebalo bi da dobijes to sto hoces.
Citat:
usput, ako je bitno, koristim Dev C++ razvojno okruzenje.

Nije bitno ali je lepo jer ga i ja koristim.
BTW ovo je mali primer, ali pokusaj da u nekom vecem programu izbegnes naredbu goto bas mi bode oci.
[ alexej @ 02.08.2004. 22:29 ] @
ne mogu da verujem da sam to napisao, ; posle while...
znam za goto, ali zadatak je bio da se napise program sa iskljucivo while naredbom, inace znam neke osnovne stvari... kao...

sledeci primer:
#include <stdio.h>
main()
{
int n, i, j, b=0;
char x;
L0:printf("Uneti prirodan broj:\n");
scanf("%d", &n);
if(n<1)
{
printf("Budalo to nije prirodan broj!\n'Ajd, molim te, pokusaj ponovo!");
goto L0;
}
i=n;
j=n;
L1:if(i-1)
{
j*=i-1;
i--;
goto L1;
}
printf("%d!=%d\n", n, j);
b++;
printf("Zelite li jos? 1/0\n");
scanf("%s", &x);
if(x=='D')
goto L0;
printf("Faktorijel se ukupno racunao %d puta", b);
getchar();
getchar();
}
inace treba da se koristi samo if petlja, a zadatak je da se racunaju faktorijeli, i da se daje izbor ponovnog racunanja, a na kraju da izpise koliko puta se racunao faktorijel.. ne stima mi if(x=='D') uvek mi zbaci da se racunao faktorijel jednom, pokusao sam sa brojevima 1 za nastavak 0 za prekid, radi .. a sa znakovima nece, zasto?
unapred hvala
[ alexej @ 02.08.2004. 22:31 ] @
u ovoj verziji sa znakovima ustvari treba da bude
printf("Zelite li jos? D/N\n");
[ alexej @ 09.08.2004. 21:03 ] @
ok, moze li neko da mi objasni sta ovde nije u redu. odnosno zasto nece da ispise ucitane nizove...
#include <stdio.h>
#define max 100
void citaj(int *niz, int *n);
void sort(int *niz, int n, int smer);
void pisi(int *niz, int n);
main()
{
int a[max], b[max], i, j;
printf("1. NIZ:\n");
do
{
printf("Koliko ima elemenata: ");
scanf("%d", &i);
}
while((i<1)||(i>max));
citaj(a,&i);
printf("2. NIZ:\n");
do
{
printf("Koliko ima elemenata: ");
scanf("%d", &j);
}
while((j<1)||(j>max));
citaj(b,&j);
sort(a,i,1);
sort(b,j,0);
printf("1. NIZ: ");
pisi(a,i);
printf("2. NIZ: ");
pisi(b,j);
getchar();
getchar();
}
void citaj(int *niz, int *n)
{
int k=0;
printf("Unesite niz: ");
do
{
scanf("%d", *(&niz[k++]));
}
while(k!=*n);
}
void sort(int *niz, int n, int smer)
{
int i, j, rb, pom;
if(smer)
{
for(i=0;i<n;i++)
{
for(rb=i,j=i+1;j<n;j++)
if(*(niz+rb)<*(niz+j))
rb=j;
if(rb-i)
{
pom=*(niz+rb);
*(niz+rb)=*(niz+i);
*(niz+i)=pom;
}
}
}
else
{
for(i=0;i<n;i++)
{
for(rb=i,j=i+1;j<n;j++)
if(*(niz+rb)>*(niz+j))
rb=j;
if(rb-i)
{
pom=*(niz+rb);
*(niz+rb)=*(niz+i);
*(niz+i)=pom;
}
}
}
}
void pisi(int *niz, int n)
{
int i;
for(i=0;i<n;i++)
printf("%d", *(niz+i));
printf("\n");
}
[ alexej @ 18.08.2004. 20:13 ] @
jednostruko povezana linerarna lista...

Napisati proram koji formira jednostruko povezanu lineranu listu od n celobrojnih podataka, a zatim ispisuje m prvih podataka iz te liste.

Bio bih mnogo zahvalan kadd bi mi neko ovo objasnio, , odnosno kako se koriste linerne liste u kombinaciji sa funkcijom malloc?
[ esnaf @ 19.08.2004. 13:59 ] @
Opet si stavio ; posle while petlje.
[ mjolnir @ 20.08.2004. 20:23 ] @
Elem...

1) Kod za 1. primer bez goto (!@#$%):
Code:

    n = -1;
    while (n < 0)
    {
        printf("Koliko prostih brojeva da se ispise? ");
        scanf("%d", &n);
        if(n < 0)
            printf("Treba prirodan broj, valjda!\n");
    }


2) Probaj sa:
Code:
if (x=='D' || x=='d') ...


3) Ovde je bilo do..while, ; ne smeta.
U citanju clanova niza treba:
Code:
scanf("%d", &niz[k++]);
[ leka @ 20.08.2004. 21:02 ] @
Iako non-stop vicu kako je goto los-a komanda, ja mogu da izvucem neke primere gde se goto koristi za veoma jasna i efikasna resenja. Ne treba ga izbegavati bas uvek...
[ mjolnir @ 20.08.2004. 21:35 ] @
Da, Donald Knuth je negde '74-te naveo neke primere.
http://pplab.snu.ac.kr/courses/PL2001/papers/p261-knuth.pdf

Video sam još ponegde neko 'chupanje' iz blokova sa goto, ali to je extreman sluchaj.
[ blaza @ 20.08.2004. 22:16 ] @
Bezuslovno grananje - goto je najkorisnije u odredjenim slucajevima 'cupanja' iz visestruko ugnjezdjenih petlji. Mada, da se cika Bjorne setio, mogao je da uvede break(level), gde bi level oznacio broj petlji koje je potrebno terminirati. Dodatno, break(0) bi mogao da ima funkcionalnost continue, a break(-1) return.
Moglo se ici i na to da broj sukcesivnih break instrukcija oznacava broj petlji koje je potrebno terminirati iz tacke prve break instrukcije, posto po postojecem standardu dve ili vise break instrukcije nema smisla koristiti.
[ alexej @ 21.08.2004. 18:17 ] @
ma znam da treba da izbegavam goto, ali u tom primeru nisam trebao da koristim neke petlje, to je bio sami pocetak
[ Nedeljko @ 22.08.2004. 01:19 ] @
Koliko vidim, Knutovi argumenti iz tog članka se odnose na tadašnje srtukturme jezike. Kod savremenih programskih jezika ima više mogućnosti za kontrolu toka koršćenjem strukturnih naredbi, pa mu argumenti teže prolaze kada se primene na današnje jezike. U jeziku C++ se ikakanje iz nekoliko ugneždenih petlji može postići "nenamenskom" upotrebom naredbi try, throw i cath.

Inače, K&R su u svojoj čuvenoj knjizi "Programski jezik C" napomenuli da postoje takvi stavovi, izneli argumente koji se najčešće navode i predložili čitaocu da zauzme sopstveni kritički stav o tome.
[ Dragi Tata @ 22.08.2004. 02:32 ] @
Citat:
Nedeljko: U jeziku C++ se ikakanje iz nekoliko ugneždenih petlji može postići "nenamenskom" upotrebom naredbi try, throw i cath.


Može, ali je to 100% gore nego goto.
[ alexej @ 22.08.2004. 16:55 ] @
ima li neko ispite zadatke za C jezik, sa tehnickih fakulteta?, a da moze da mi ih posalje?
[ Mr.xXx @ 26.08.2004. 19:35 ] @
pazite ja sam se tek zagrejao za c pa me interesuje sta mi sve treba dabih poceo sa radom i ucenjem
[ u_m @ 26.08.2004. 19:59 ] @
Link do rokova: http://rti7020.etf.bg.ac.yu/~ef2pj/download.php?IdK=4 - Predmet programski jezici na etf-u, 2. godina, rade se C i Paskal.


http://galeb.etf.bg.ac.yu/~kraus/knjige/
[ Mr.xXx @ 28.08.2004. 14:43 ] @
zar nemozes ti/vi jednostavno da mi kazete koji os da instairam i sta jos treba
aaa
[ Nedeljko @ 28.08.2004. 17:19 ] @
Uzmi OS koji hoćeš, i kompajler za željeni jezik koji hoćeš. Ima mnogo mogućnosti. Ne znam koja tebi najviše odgovara. Ako imaš Windows, onda samo nabavi neki kompajler za njega. Imaš besplatan Bloodshed Dev C++ na adresi www.bloodshed.net, ili besplatan (izvanredan) Borlandov kompajler Borland C++ 5.5 freecommandlinetools u kombinaciji sa njihovim Turbo Debugerom 5 koji se skidaju sa Borlandovog sajta, ili komercijani Borlandov C++ Builder ili Majkrosoftov Visual C++. Možeš takodje da koristiš i open source alate iz DJGPP projekta za DOS koji možeš preuzeti sa adrese www.delorie.com/djgpp .