[ stojce84 @ 27.11.2006. 13:16 ] @
Prvi put vidim program c a profa nam vec na drugom casu dao zadatak da uradimo....
Ja ne znam da ga uradim pa trazim pomoc, mozda neko ima uradjen zadatak koji mi treba....

Zadatak: Napisati c program (kalkulator) celih brojeva sa cetiri osnovne operacije (+,-,*,:) i da se pri tome koriste tri promenljive REZULTAT, OPERACIJA, OPERAND.....

Do sada smo radili samo neke osnovne funkcije, printf, scanf i poslednje teoretski for i uslove if, if else

a program je potrebno uraditi sto jednostavnije sa osnovnim naredbama.....

pomozite mi bar sa dve operacije pa cu pokusati ostale uraditi sam


hvala....
[ toxi_programer @ 27.11.2006. 14:47 ] @
Code:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int br1, br2; //operandi
    int rez;    //rezultat
    char op;    //operator

    //uzimanje brojeva i operatora
    printf("Unesi izraz za racunanje-> ");
    scanf("%d%c%d", &br1, &op, &br2);


    /*izvrsi racunanje na osnovu operatora( trebalo bi da se koristi SWITCH jer je lakse,
    al' izgleda da to niste ucili, pa cu preko IFa...) */
    if( op == '+')
        rez = br1 + br2;
    else if( op == '-')
        rez = br1 - br2;
    else if( op == '/')
        if( br2 == 0) { printf("Nemoze se deliti nulom!"); getch(); exit(1); }
        else rez = br1 / br2;
    else if( op == '*')
        rez = br1 * br2;
    else { printf("Operator mora biti + - * ili /..."); getch(); exit(1); }

    //prikazi rezultat
    printf("Rezultat od %d %c %d je %d.\n", br1, op, br2, rez);

    return 0;
}


Pozz
[ stojce84 @ 27.11.2006. 21:15 ] @
program dobro izracunava vrednosti ali nakon racunanja ih ne prikazuje vec izlazi zi programa, u pitanju je kalkulator
napisacu ovde kod da bi znali o cemu se radi
probajte pokrenuti program da bi shvatili sta mi pravi problem.......

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
int br1, br2; //operandi
int rez; //rezultat
char op; //operator

//uzimanje brojeva i operatora
printf("Unesi izraz za racunanje-> ");
scanf("%d%c%d", &br1, &op, &br2);


/*izvrsi racunanje na osnovu operatora( trebalo bi da se koristi SWITCH jer je lakse,
al' izgleda da to niste ucili, pa cu preko IFa...) */
if( op == '+')
rez = br1 + br2;
else if( op == '-')
rez = br1 - br2;
else if( op == '/')
if( br2 == 0) { printf("ne moze se deliti nulom!"); getch(); exit(1); }
else rez = br1 / br2;
else if( op == '*')
rez = br1 * br2;
else { printf("Operator mora biti + - * ili /..."); getch(); exit(1); }

//prikazi rezultat
printf("Rezultat od %d %c %d je %d.\n", br1, op, br2, rez);

system("pause");
return 0;
}




[ sarizatatus @ 27.11.2006. 21:41 ] @
1) Nemoj otvarati novu temu za svaki detalj jednog problema vec sve u istoj temi, pravis problem moderatorima
2)Program radi lepo.

[ stojce84 @ 27.11.2006. 21:58 ] @
pa ne znam zasto, mozda je zbog verzije programa, ja imam neki borland c++ 3.1

ali svako put sa pritiskom na enter posle unete operacije mi izdje iz programa, posle kada udjem stoji mi rezultat..
dobro to je zato sto nigde nemam clrscr.....

ako ima neka caka recite mi.....
[ toxi_programer @ 29.11.2006. 16:31 ] @
Zašto si stavio "unsigned int"? :-/



Ljudi u ovom promeštanju tema, moja prosla poruka je obrisana
[ wipeout @ 30.11.2006. 15:16 ] @
pokusaj s ovim...moguce da te zeza borland 3.1 ..mozda ne prepoznaje system("pause"); , pa sam stoga stavio getch();
nadam se da sam bio od pomoci
pozz

Code:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
  int br1, br2; //operandi
  int rez; //rezultat
  char op; //operator

  //uzimanje brojeva i operatora
  printf("Unesi izraz za racunanje-> ");
  scanf("%d%c%d", &br1, &op, &br2);


  /*izvrsi racunanje na osnovu operatora( trebalo bi da se koristi SWITCH jer je lakse,
  al' izgleda da to niste ucili, pa cu preko IFa...) */
  if( op == '+')
    rez = br1 + br2;
  else if( op == '-')
    rez = br1 - br2;
  else if( op == '/')
    if( br2 == 0) { printf("ne moze se deliti nulom!"); getch(); exit(1); }
    else rez = br1 / br2;
  else if( op == '*')
    rez = br1 * br2;
  else { printf("Operator mora biti + - * ili /..."); getch(); exit(1); }

  //prikazi rezultat
  printf("Rezultat od %d %c %d je %d.\n", br1, op, br2, rez);

 // system("pause");
  getch();
return 0;
}
[ Geco @ 19.03.2007. 20:54 ] @
Kalkulator.Omoguciti sukcesivno izvrsavanje niza operacija sve dok se ne unese operator =
[ lammas @ 15.04.2007. 20:54 ] @
#include <stdio.h>
int main(void)
{
float a,b;
char operacija;
printf("Upisati prvi broj: ");
scanf(" %f",&a);
printf("Upisati drugi broj: ");
scanf(" %f",&b);
printf("Upisati operaciju: sabiranje(s), oduzimanje(o),\n");
printf(" mnozenje(m),deljenje(d) :");
scanf(" %c",&operacija);
if(operacija=='z')
printf("%f\n",a+b);
else if(operacija=='o')
printf("%f\n",a-b);
else if(operacija=='m')
printf("%f\n",a*b);
else if(operacija=='d')
printf("%f\n",a/b);
else
printf("Nedopustena operacija!\n");
return 0;
}
[ cirra @ 21.08.2007. 20:21 ] @
stavi
getch();
na kraju koda
[ butcher87 @ 28.11.2007. 20:25 ] @
Pozdrav svima! Naam se da nisam promasio temu.

Naime, moj problem je sto mi nikako ne ide da napravim kalkulator sa cetiri osnovne operacije, pojasnicu... Mogu da napravim, ako se unose samo dva broja za koja treba da izracuna rezultat. Ali, ja zelim da napravim kalkulator koji ce raditi i kada se unese vise od dva broja, npr: 2+6+78-56/87+5*9-47 ...

Evo mog neuspesnog koda:
Code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    unsigned int cuva1=0, cuva2=0;
    char brojevi[1000], *ptr, *cuva_vrednosti;
    int i, j, n=0;
    float rez=0.0;
    ptr=brojevi;

    printf("\nUnosite brojeve i cetiri osnovne aritmeticke operacije medju njih:\n\n");
    gets(brojevi);
    fflush(stdin);

    cuva_vrednosti=malloc(sizeof(char));
    if(cuva_vrednosti==NULL)
    {
        printf("\nNema memorije!");
        exit(1);
    }
    for(i=0; i<1000; i++)
    {
        if(*(ptr+i)>='0' && *(ptr+i)<='9')
        {
            n++;
            cuva1=((int)*(ptr+i)-(int)'0');
            cuva_vrednosti[j++]=cuva1;
            cuva_vrednosti=realloc(cuva_vrednosti,(2+n)*sizeof(char));
        }
        else if(*(ptr+i)=='+')
        {
            cuva2=atoi(cuva_vrednosti);
            rez+=(float)cuva2;
            j=0;
            n=0;
            free(cuva_vrednosti);
            cuva_vrednosti=malloc(sizeof(char));
            if(cuva_vrednosti==NULL)
            {
                printf("\nNema memorije!");
                exit(1);
            }
        }
        else if(*(ptr+i)=='-')
        {
            cuva2=atoi(cuva_vrednosti);
            rez-=(float)cuva2;
            j=0;
            n=0;
            free(cuva_vrednosti);
            cuva_vrednosti=malloc(sizeof(char));
            if(cuva_vrednosti==NULL)
            {
                printf("\nNema memorije!");
                exit(1);
            }
        }
        else if(*(ptr+i)=='/')
        {
            cuva2=atoi(cuva_vrednosti);
            rez/=(float)cuva2;
            j=0;
            n=0;
            free(cuva_vrednosti);
            cuva_vrednosti=malloc(sizeof(char));
            if(cuva_vrednosti==NULL)
            {
                printf("\nNema memorije!");
                exit(1);
            }
        }
        else if(*(ptr+i)=='*')
        {
            cuva2=atoi(cuva_vrednosti);
            rez*=(float)cuva2;
            j=0;
            n=0;
            free(cuva_vrednosti);
            cuva_vrednosti=malloc(sizeof(char));
            if(cuva_vrednosti==NULL)
            {
                printf("\nNema memorije!");
                exit(1);
            }
        }
        else if(ptr+i==NULL)
            break;
        else
        {
            printf("\nUneli ste pogresan operator, ili slovo!!");
            exit(1);
        }
    }
    printf("\n\nRezultat:\t%f",rez);
    free(cuva_vrednosti);
    system("PAUSE");
    return 0;
}


Ako neko ima ideju kako, ili zna kako da uradi, bio bih mu veoma zahvalan!

[ Nemanja.Ciric @ 29.11.2007. 02:57 ] @
mnogo komplikovano... pogledaću tvoj kod detaljnije kasnije (sada me mrzi) samo bih dao par brzih komentara:

stojce84, odgovore ne vidis iz prostog razloga što nisi stisnuo taster za gledanje konzole. Tekst je ispisan, samo što se program po ispisu završava. Mislim da se u tvom programu sa F5 gleda konzola. Ovaj kod:

Code:

    //prikazi rezultat
    printf("Rezultat od %d %c %d je %d.\n", br1, op, br2, rez);

    return 0;


sam po sebi apsolutno ne daje šansu da se rezultat pročita ako program nije pokrenut u DOS-u ili ako ne pogledaš konzolu po njegovom završavanju. Što reće cira ne mre to bez getch() ^_^.

butcher-u:
Preporučujem čitanje karakter po karakter u pseudo-realnom vremenu i kontekstna analiza (analiza u odnosu na prethodno uneseno). Tako inače rade kalkulatori. Znači, učitaš karakter, izbrišeš ekran, proveriš jel' sve OK, ispišeš ga na ekran, ako ima problema još ispišeš poruku o grešci i izbrišeš zadnji karakter.

Ako pustiš čoveka da unese šta hoće moraš DEBELO da proveravaš zbog grešaka i meni to deluje krajnje nezgodno. Mada, možda bi neki rekli da je lakše uočiti grešku (to jest naći je, jednostavnija je logika koda) ako imaš celu stvar nego ako imaš samo deo. Ako ništa drugo, bolje grešku naći odmah i omogućiti ispravku na licu mesta, nego posle unošenja kilometarskog izraza izbaciti poruku o grešci i aj ovo nanovo...
[ butcher87 @ 29.11.2007. 10:45 ] @
Hvala na preporuci, znaci mi veoma! E sad, da li bi mogao da mi pojasnis termine "pseudo realno" i "kontekstna analiza"? Pocetnik sam, i zato ne razumem. Hvala!
[ Nemanja.Ciric @ 29.11.2007. 16:41 ] @
Pseudo-realno vreme - nije u realnom vremenu, možda sam pogrešno formulisao termin, ali hteo sam da naznačim da izgleda kao da unos ide u realnom vremenu, ali ne ide, jer se ispravnost svakog karaktera proverava pošto se unese i u zavisnosti od toga odlučuje šta se radi sa njim.

Kontekstna analiza - analiziraš svaki uneti karakter u KONETKSTU svih prethodnih kada gledaš da li je ispravan, a u KONTEKSTU celog izraza kada računaš njegovu vrednost, a ne samog za sebe.

Dakle ako ja u tvom hipotetičkom programu unesem sledeći niz karaktera sa tastature: '1','*','/'; tvoj program treba da me zaustavi, jer to deljenje, posmatrano samo za sebe ne može da bude ispravano ili neispravano, ali ako je pre njega već bila neka operacija (u ovom slučaju množenje) onda imaš grešku (čemu je jednak izraz "1:/2" ?!). Dakle znak podeljeno se posmatra u konektstu (u celini, u zavisnosti od, u odnosu na) svih ostalih znakova unesenih pre njega.

Dakle morao bi da definišeš pravila na osnovu matematike (jedino plus i minus od operacija mogu da stoje u velikom nizu jedan pored drugog i onda se svi sem prvog (ili zadnjeg, zavisi kako odlučiš da grupišeš) budu tretirani kao unarni operatori znaka (recimo "1+-+-+-+-+-+-+-+-+-+-++++----2" se računa tako što sve pluseve sem prvog zanemariš (posmatraš ih kao operatore koji ne menjaju ništa, pod uslovom da ne uvedeš operator inkrementa (++) i svaka dva minusa izbaciš (tu minus tretiraš kao operaciju koja menja znak operanda desno od nje, tako da ako dva puta promeniš znak, dobiješ isti znak) tako da rezultat ispadne 3 (prvi plus je binarni operator (ima dva operanda) ostali se ne gledaju i ima paran broj minusa koji se potiru) - dakle sve se posmatra u kontekstu svega ostalog :)). Ovo je dosta velik posao, preporučujem ti da ostaneš na četiri osnovne operacije i da ne koristiš zagrade (dakle sve sem broja i znakova +,-,*,/,= smatraš greškom). Eventualno da ubaciš neke tastere da predstavljaju rad sa memorijom (kao na digitronu memory store, memory reset, memory add).
[ butcher87 @ 29.11.2007. 19:15 ] @
HVALA majstore! Ne znam kako da ti se oduzim... RESPECT!
[ g1l3 @ 25.10.2008. 11:25 ] @
E imam problem..isto moram da napravim kalkulator al da unosim npr 5+4-7*7/1 itd...kao sto je prethodni lik postao...ugl eo koda
Code:

#include <stdio.h>


int main()
{
    //definisanje promenjivih
    char operacija;
    double operand1, operand2 , rez, rez1=0;



        printf("\n\t\t Unesite izraz =");


        do{

            scanf("%lf", &operand1);
            scanf("%c", &operacija);



        switch(operacija)
        {
            case '+':   scanf("%lf", &operand2);
                        rez=operand1+operand2;
                        break;
            case '-':   scanf("%lf", &operand2);
                        rez=operand1-operand2;
                        break;
            case '/':   scanf("%lf", &operand2);
                        rez=operand1/operand2;
                        break;
            case '*':   scanf("%lf", &operand2);
                        rez=operand1*operand2;
                        break;
        }
        rez1+=rez;
        rez=0;

        }while(operacija!='q');

        printf("rez je %f", rez1);



}


ne smem da koristim nizove za to..samo if else..switch itd..znaci osnovno ono...ovo sto sam ja napravio mislim da je dobra logika..al mi ne radi...pa sada ako moze neka pomoc da otklonim problem..da popravim nesto itd...svaka sugestija je dobrodosla...hvala vam unapred