Switch case u C-u

poruka: 17
|
čitano: 7.141
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
neaktivan
offline
Switch case u C-u
pitanje

Imam problem sa switch kontrolnom strukturom u C-u, početnik sam s C-om, do sad sam radio u Pascalu/Delphiju. Evo o čemu je spika:

Kako ću napraviti switch case grananje da poziva funkcije umjesto pojedinačnih naredbi, ono što sam do sad radio nije mi uspjelo, jer očito nije isti princip kao u Pascalu. Evo primera u kojemu mi je samo očitalo glavni program, ali nije htjelo pokrenuti funkcije unosom varijable:

 

#include <stdio.h>

void zbroj ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za zbrajanje: \n");
      scanf ("%f,%f", a, b);
      c = a + b;
      printf ("%0.2f + %0.2f = %0.4f", a, b, c);
    }

void razlika ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za oduzimanje: \n");
      scanf ("%f,%f", a, b);
      c = a - b;
      printf ("%0.2f - %0.2f = %0.4f", a, b, c);
    }

void umnozak ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za mnozenje: \n");
      scanf ("%f,%f", a, b);
      c = a * b;
      printf ("%0.2f x %0.2f = %0.4f", a, b, c);
    }

void kolicnik ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za dijeljenje: \n");
      scanf ("%f,%f", a, b);
      c = a / b;
      printf ("%0.2f / %0.2f = %0.4f", a, b, c);
    }

int main ()
    {
      char odgovor;

      printf ("\n\t  K A L K U L A T O R");

      printf ("\n\t Izaberi radnju unosom broja: ");
      printf ("\n\t 1: Zbrajanje");
      printf ("\n\t 2: Oduzimanje");
      printf ("\n\t 3: Mnozenje");
      printf ("\n\t 4: Dijeljenje\n\n");

      odgovor = getchar ();

      switch (odgovor)
             {
               case 1: zbroj ();
               case 2: razlika ();
               case 3: umnozak ();
               case 4: kolicnik ();
             }

      return 0;

    }

Ako umjesto getchar () uporabim scanf ("%c", odgovor); program se sruši nakon unosa odgovora; nisam još ni u jednoj knjizi našao primjer pozivanja funkcija switch uvjetnim grananjem, pa ne znam što je pogrešno u ovom programu... Koliko znam, switch kontrola prihvaća Integer i Char kao valjane unose, stoga mislim da nisam pogriješio s tipom podatka (isto mi se dogadjalo i s intom), ne znam u čemu drugom sam mogao pogriješit... U čemu je problem... pomoć?

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Switch case u C-u
prihvaćeno rješenje
 

Evo ovako kad koristiš scanf on ti mora ovako izgledati ako pamti neku vrijednost scanf ("%c", &odgovor) znači prije varijable u koju smiještaš neku vrijednost treba ti biti znak &...
Evo ja sam to prepravio na brzinu i koliko sam provjerio radi....
E da i kad upisuješ vrijednosti za npr. zbrajanje moraš razdjeliti brojeve zarezom... npr. 2,3.. a kad pišeš decimalne pišeš ih sa točkom.....

#include <stdio.h>
#include <conio.h> //includa se radi getch();//

void zbroj ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za zbrajanje: \n");
      scanf ("%f,%f", &a, &b);
      c = a + b;
      printf ("%0.2f + %0.2f = %0.4f", a, b, c);
    }

void razlika ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za oduzimanje: \n");
      scanf ("%f,%f", &a, &b);
      c = a - b;
      printf ("%0.2f - %0.2f = %0.4f", a, b, c);
    }

void umnozak ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za mnozenje: \n");
      scanf ("%f,%f", &a, &b);
      c = a * b;
      printf ("%0.2f x %0.2f = %0.4f", a, b, c);
    }

void kolicnik ()
    {
      float a, b, c;
      printf ("\f\n Unesi vrijednosti za dijeljenje: \n");
      scanf ("%f,%f", &a, &b);
      c = a / b;
      printf ("%0.2f / %0.2f = %0.4f", a, b, c);
    }

int main ()
    {
      int odgovor;

      printf ("\n\t  K A L K U L A T O R");

      printf ("\n\t Izaberi radnju unosom broja: ");
      printf ("\n\t 1: Zbrajanje");
      printf ("\n\t 2: Oduzimanje");
      printf ("\n\t 3: Mnozenje");
      printf ("\n\t 4: Dijeljenje\n\n");
      scanf("%d", &odgovor);

      switch (odgovor)
             {
               case 1: zbroj ();
                      break;
               case 2: razlika ();
                       break;
               case 3: umnozak ();
                       break;
               case 4: kolicnik ();
                       break;
             }

      getch(); //zadržava prozor otvorenim nakon završene operacije//

    }

Moj savjet ti je da unos brojeva podjeliš na 2 printf-a... Ovako nekako:


printf("Unesi prvo broj: ");
scanf("%f", &a);
printf("Unesi drugi broj: ");
scanf("%f", &b);


E da i nakon svakog case moraš imati break; jer ako ga nemaš on će ti raditi sve dalje od onog broja kojeg si unesao: npr. ako uneseš 2, izvest će se i case 3 i case 4...

switch (odgovor)
             {
               case 1: zbroj ();
                      break;
               case 2: razlika ();
                       break;
               case 3: umnozak ();
                       break;
               case 4: kolicnik ();
                       break;
             }



 

Poruka je uređivana zadnji put pet 4.7.2008 12:50 (AlterEgo).
17 godina
neaktivan
offline
RE: Switch case u C-u
autorov komentar

Hvala puno, pomoglo je. Sad znam zašto mi se rušio program, jer sam umetao direktno varijablu i njezin memorijski blok u mjesto predvidjeno za unos kopije njezine vrijednosti funkcijom scanf, zato što sam zaboravio staviti marker & (baš sam nepažljiv, u ostalim primjerima stavio sam &...).

 

Mislio sam da je funkcija getch omogućena u stdio.h iz standardne zbirke; pokušao sam prevesti bez #include <conio.h> i jednako mi je radio program kao i s tim pp-redkom... Koja je razlika, za što konkretno služi conio.h u vezi s funkcijom getch ()?

 

Znači, koliko sam skužio, program mi nije radio jer nisam bio stavio na kraju main f-ije ovo:

 

      getch(); //zadržava prozor otvorenim nakon završene operacije//

 

jer sam mislio da to nije potrebno zbog prelazka u novu funkciju (tako je inače u Pascalu)...

 

Medjutim, još uvijek mi ne radi program kad umjesto: scanf("%d", &odgovor);

stavim:

odgovor = getchar ()

 

Sad me zanima kako mogu s jednom naredbom napraviti da mi čeka na unos i automatski prepoznaje prvi ispravan unos (odbacujući neispravne osvježavanjem prozora itsl.), bez pritiskanja ENTER-a, i na osnovi toga pokreće odgovarajuću funkciju (analogno Pascalovoj komandi readkey iz crt.pas modula), postoji li neka gotova komanda u standardnoj zbirci ili ju moram sam izraditi?

 

17 godina
neaktivan
offline
RE: Switch case u C-u
autorov komentar
E da i nakon svakog case moraš imati break; jer ako ga nemaš on će ti raditi sve dalje od onog broja kojeg si unesao: npr. ako uneseš 2, izvest će se i case 3 i case 4...
I ovo sam zaboravio stavit, iako sam znao; anyway, hvala na podsjetniku, printf ("repetitio mater studiorum est"); Cool
17 godina
offline
Switch case u C-u

conio.h ti treba ako koristiš getch(), inače ne, a getchar() se nalazi u stdio.h.

 

Program ti ne radi kad staviš odgovor = getchar () zato što se promenljivoj odgovor tako dodeli ASCII vrednost unesene cifre.

 

EDIT: Nisam radio takve stvari u C-u, ali mislim da bi getch() trebalo da bude sličan pascalovom readkey (mada se ni toga ne sećam dobro, nije mi trebalo jedno 7 godina). Pogledaj dokumentaciju za conio.h, mislim da ćeš naći ono što tražiš.

 

Poruka je uređivana zadnji put pet 4.7.2008 16:45 (Ivan(4)).
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
RE: Switch case u C-u
autorov komentar

Hvala! Cool Pokušat ću da vidim sve mogućnosti od getch (); znam takodjer da postoji i getc (), ali sam zaboravio koja je razlika, budem pogledao...

17 godina
neaktivan
offline
Switch case u C-u

odgovor = getch();

dođe... onda provjeris ko normalna varijabla...

Poruka je uređivana zadnji put sub 5.7.2008 0:58 (fps_gamer).
 
0 0 hvala 0
17 godina
neaktivan
offline
Switch case u C-u
autorov komentar

S kojom funkcijom iz sdtlib (ako je ima) mogu mijenjati boju prikaza karaktera i podloge u terminalu, ako bi mi netko mogao reć?

 
0 0 hvala 0
17 godina
neaktivan
offline
Switch case u C-u
 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Switch case u C-u
autorov komentar

Ne radi ti taj link. Jesi li siguran da sajt uopće postoji?

Poruka je uređivana zadnji put sub 5.7.2008 16:55 (ppcRiff_x256).
17 godina
neaktivan
offline
Switch case u C-u

prije je otvorio sad nece...

google -> color text in c++

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: Switch case u C-u
fps_gamer kaže
 
Problem je kaj on neradi u c++ nego u c-u....

iskreno da ti kažem nemam pojma, čak sumnjam da se u c-u to može napraviti........
17 godina
neaktivan
offline
RE: Switch case u C-u
moze se napraviti... onda neka umjesto C++ stavi C...
17 godina
offline
Switch case u C-u

Mislim da ovde imaš sve u vezi sa čime si se raspitivao (pristup tekstualnoj memoriji, kreiranje menija, sistem prekida, grafika u tekstualnom režimu...). Kvalitet nije sjajan pošto imam 64kbps aploud, ali rekao bih da može da se čita. Inače, bilo bi zgodno da nabaviš bilo kakvu knjigu (ovo je iz moje stare srednjoškolske).

Poruka je uređivana zadnji put ned 6.7.2008 1:54 (Ivan(4)).
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
RE: Switch case u C-u
autorov komentar

Super, baš ti hvala druže, kralj si što si se toliko potrudio... Odprilike ovakva neka knjiga mi treba s objašnjenjima za primjenu u izradi TUI aplikacija, imam samo "Ullman/Liyanage - Osnove C programiranja" u papirnoj formi, i veći broj pdf-ova o ISO C-u, No ISO C je ISO C, a primjena i API druga je stvar...

 

Kako se točno zove ta knjiga o Turbo C-u i tko je autor, da ju probam kako nabavit? Jedini problem je, ako je to srednjoškolski učbenik, a koristi se u Srbiji, teško da ću ga naći igdje drugdje nego tamo, ili čak ni tamo ako se više ne rabi...

 

Što se tiče C-a, najviše me zanima za izradu TUI aplikacija za DOS i Unix, a tutorijala o izradi GUI-ja za Windows, MacOSX itd. sigurno mogu naći mnogo na internetu... Je, malo sam na tragu osamdesetih, ali ionako programiram za svoj gušt, pa mi nije toliko bitno što se DOS & Turbo C danas ne koriste... Turbo C i Turbo C++ već imam, i instalirane.

 

 

 

 

Sad, najveći problem na koji nailazim programiranjem u C-u i tekstualnom modu, jest taj što primjeri napisani u ISO C-u ili za DOS ne će dobro raditi u Unixu, jer konzole današnjih Linuxa koriste UTF-8 kodiranje, dok DOS ima CP-437, tako da svi oni "line-drawing" karakteri koji mi služe da u DOS-u ispišem okvire, izbornike itd, ne će biti tako prikazani u Linuxu. Znam da se može podesiti Terminal u Linuxu da koristi i codepage, pa i CP-437, ali očekivati da će svi programi na svim Linux-računalima biti tako podešeni da bi programi koje napravim ispravno radili, suludo je... Zbog toga sam shvatio da moram svaki program za Unix izprogramirati tako da prije početka izvodjenja kreira drukčije okruženje u Konzoli (IBM CP-437, crna podloga, sivi tekst, 80x25...), koje će se nakon gašenja programa, naravno, opet se vratiti na defaultne postavke... Sad, pošto sam s rješenjem toga problema u Linux API-ju još uvijek na "Vi", ne znam odakle da krenem... A poseban je problem kako omogućiti istovremeno i Line-drawing i naša slova š đ č ć ž, to stvarno ne znam, to mi je i u DOS-u problem, a znam da se može riještiti, vidio sam već neke programe. Kreiranje okruženja za konzolu trebalo bi mi i čak i za DOS programe, zbog Windows i DOSbox emulacije.

17 godina
offline
Switch case u C-u

U pitanju je knjiga Milana Čabarkape "C - Osnovi programiranja" i rekao bih da se mogla naći i u običnim knjižarama, mada nisam siguran (vidim i da je tiraž izdanja bio 1000 primeraka, nije mnogo, ali ni tako malo s obzirom na to da se jedino u mojoj srednjoj i par specijalnih odeljenja u Srbiji predavao C, dakle ne više od 200 učenika godišnje). Trebalo bi da može da se pronađe nešto slično i kod vas, pogledaj šta se i odakle uči (ili se do skora učilo) na fakultetima i višim školama koje predaju programiranje (mada u mojoj knjizi sa prve godine fakulteta, Laslo Kraus "Programski jezik C sa rešenim zadacima", ovih stvari nema). U krajnjem slučaju, možeš da nabaviš neki C izvornik. Iz tog tipa knjige je teško učiti jezik od nule, ali možeš naći bilo šta što ti trenutno zatreba, kao što je sada slučaj. Svakako će ti tako nešto biti bolje od ISO C-a, koji je najkorisniji ako želiš da napraviš svoju implementaciju jezika, a inače baš i nije toliko zgodan.

Što se tiče problema sa kojima se susrećeš, na žalost, nemam baš nikakvog iskustva sa programiranjem za linux i ne mogu ti pomoći. U svakom slučaju, svaka ti čast za entizujazam i želim ti mnogo sreće. Osmijeh

Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
Switch case u C-u

/* PROTOTIP PROZORA - program koji kreira jednostavan prozor */

#include <windows.h>


/* Prototip funkcije s Windows procedurama */
#define IDC_GUMB         21


LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM) ;

/* Ime kalse prozora */

static char gszClassName[]  = "MojaKlasaProzora";

HINSTANCE hInst = NULL;
/* Funkcija WinMain */

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)  {
      WNDCLASSEX WndClass;
      HWND hwnd;
      MSG Msg;
     
      /* Registriranje klase prozora */
      hInst = hInstance;
     
      WndClass.cbSize        = sizeof(WNDCLASSEX);
      WndClass.style         = NULL;
      WndClass.lpfnWndProc   = WindowProcedure;
      WndClass.cbClsExtra    = 0;
      WndClass.cbWndExtra    = 0;
      WndClass.hInstance     = hInstance;
      WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
      WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
      WndClass.hbrBackground =  (HBRUSH) (COLOR_WINDOW);
      WndClass.lpszMenuName  = NULL;
      WndClass.lpszClassName = gszClassName;
      WndClass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION);
     
      /* Provjera je li klasa prozora registrirana */
     
      if(!RegisterClassEx(&WndClass)) {
                                      MessageBox(0, "Registriranje prozora nije uspjelo!",
                                      "Greška!", MB_ICONSTOP | MB_OK);
                                      return 0;
      }
                                     
      /* Kreiranje prozora */
     
      hwnd = CreateWindowEx(
                   WS_EX_STATICEDGE,
                   gszClassName,
                   "Naslov",
                   WS_OVERLAPPEDWINDOW,
                   CW_USEDEFAULT, CW_USEDEFAULT,
                   500, 400,
                   NULL, NULL,
                   hInstance,
                   NULL);
                  
      /* Provjera je li prozor uspješno kreiran */
     
      if(hwnd == NULL) {
              MessageBox(0, "Kreiranje prozora nije uspjelo!",
              "Greška!", MB_ICONSTOP | MB_OK);
              return 0;
             
      }
                      
      /* Prikazivanje prozora na ekranu */
     
      ShowWindow(hwnd, nCmdShow);
      UpdateWindow(hwnd);
     
      /* Petlja koja obrađuje poruke */
     
      while(GetMessage(&Msg, NULL, 0, 0)) {
                             TranslateMessage(&Msg);
                             DispatchMessage(&Msg);
      }
                                         
      /* Odjava klase prozora */
     
      UnregisterClass("MojaKlasaProzora",hInstance);
      return Msg.wParam;
     
}

/* Funkcija s Windows procedurama */

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam ) {
        switch(Message) {
                        HWND hGumb;
          
           case WM_CREATE :
               
                /* Kreiranje gumba */
               
           hGumb = CreateWindowEx(0,
                           "Button",
                           "About...",
                           WS_CHILD  |  WS_VISIBLE,
                           400,
                           330,
                           80,
                           30,
                           hwnd,
                            (HMENU)  IDC_GUMB,
                            hInst,
                            NULL);
                           
           /* Provjera je li kontrola uspješno kreirana */
          
           if(!hGumb)   {
                          MessageBox(0, "Kreiranje gumba nije uspjelo", "Greška",  MB_ICONSTOP  |  MB_OK);
                          return 0;
                          }
                         
                case WM_COMMAND:         
                          switch(wParam)
                 {
                      case IDC_GUMB:
                         MessageBox(0, "...,World", "Hello...", MB_OK);
                          return 0;
                         }
                         
                         
                        break;
                                                   
                        case WM_CLOSE:
                             DestroyWindow(hwnd);
                             break;
                        case WM_DESTROY:
                             PostQuitMessage(0);
                             break;
                        default:
                                return DefWindowProc(hwnd, Message, wParam,
                                lParam);
                               
        }
                       
        return 0;
                       
}

 

kod za kreiranje novog prozora u C i gumba koji kad se klikne na njega ispise u messageboxu Hello, World... lol

 

 
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice