Grananje - naredba switch

Sjedište: CARNET - Arhiva 2021 Loomen
E-kolegij: III. Gimnazija Osijek - Informatika 2
Knjiga: Grananje - naredba switch
Otisnuo/la: Gost (anonimni korisnik)
Datum: ponedjeljak, 28. listopada 2024., 10:01

1. Višestruko grananje sa switch

Naredba switch-case koristi se u višestrukom grananju programa ako izraz ili varijabla tijekom programa mogu poprimiti različite, uobičajeno, cjelobrojne vrijednosti i ovisno o tim vrijednostima treba izvršiti različite blokove naredbi. U tim je slučajevima kôd znatno pregledniji od kôda naredbe if. Switch omogućuje izbor jednog od više putova izvođenja programa. Koji će se dio programa izvršiti, ovisi o vrijednosti izraza (ili varijable).

Uobičajeno je da konstante u naredbi switch case budu cijeli brojevi, ali zapravo je važno da je to neki redni tip podataka. Redni tip podataka je onaj kod kojeg svakom elementu možemo odrediti sljedbenik i prethodnik. U C-u su redni tipovi podataka char i int ili char i int u kombinaciji s modifikatorima.  

 

Opći je oblik naredbe ovaj:

switch (izraz)
{   
     case konstanta_1: blok naredbi_1;
                     break;
     case konstanta_2: blok naredbi_2;
                       break;
                      . . .
     case konstanta_n-1:  blok naredbi_n-1;
                           break;
     default:   blok naredbi_n;
                break; //nije obavezno
}

 

Naredba switch-case izvršava se na sljedeći način.

Najprije se izračuna vrijednost izraza, a zatim se uspoređuje s nizom konstanti (1 do n-1). Ako je dobivena vrijednost jednaka jednoj od konstanti, izvršava se blok naredbi pridružen toj konstanti. Ako dobivena vrijednost nije jednaka nijednoj od navedenih konstanti, izvršit će se blok naredbi koji je pridružen opciji default.

Izvršavanje bloka naredbi prekida se naredbom break. Ako blok naredbi u case ne završi s break, nastavlja se izvršavati blok naredbi sljedećeg case.

Opcija default može se i izostaviti. U tom će se slučaju, ako vrijednost izraza nije jednaka nijednoj konstanti, izvršavanje programa nastaviti od prve naredbe koja slijedi nakon switch-case strukture.

Dijagramom se to može prikazati na sljedeći način:



1.1. Primjer 1.

Primjer 1.

Program omogućuje unošenje jednoga cijelog broja i, ovisno o ostatku dijeljenja učitanog broja s brojem 7, ispisuje dan u tjednu. (0 za ponedjeljak, 1 za utorak ... 6 za nedjelju)

Rješenje

#include <stdio.h>
int main()
{
     int x;
     printf("Upisite jedan broj:");
     scanf("%d",&x);
     switch(x%7)
     {
           case 0: printf("\nponedjeljak");
                break;
           case 1: printf("\nutorak");
                break;
           case 2: printf("\nsrijeda");
                break;
           case 3: printf("\ncetvrtak");
                break;
           case 4: printf("\npetak");
                break;
           case 5: printf("\nsubota");
                break;
           default: printf("\nnedjelja");
                break;
     }
     return 0;
}

    


1.2. Primjer 2.

Primjer 2.

Kolika je vrijednost varijable x nakon izvršavanja ovog dijela programa?

int x=4;
switch (x%3)
{
     case 1:x+=5; break;
     case 2:x+=7; break;
     default: x*=2;
}

Rješenje

Obzirom da je inicijalizirana vrijednost x = 4, izraz u switch case poprima vrijednost 1. Zbog toga se izvršava naredba pridružena case 1: x+=5; x= x+5;x = 9


1.3. Primjer 3.

Primjer 2.

Kolika je vrijednost varijable x nakon izvršavanja ovog dijela programa?

int x=4;
switch (x%3==0)
{
     case 1:x+=5; break;
     case 2:x+=7; break;
     default: x*=2;
}

Rješenje

Izraz u zagradi je kombinacija aritmetičkog i relacijskog izraza i izračunavanjem dobijemo 4%3=1, a to nije jednako 0 pa bi rješenje izraza bila laž tj 0.

Dakle izvršava se opcija pod default: i x*=2 → x=x*2=4*2=8


1.4. Primjer 4.

Primjer 3.

Kolika je vrijednost varijabli x, y i z nakon izvršavanja ovog dijela programa?

int x=72, y=8, z=4;
switch ((x-y)%z)
{
     case 0: z+=1;
     case 1: z+=2;
     case 2: z+=3;
     case 3: z+=4;
}

Rješenje

x = 72, y = 8, z = 14   /*Izostavljen je break! Izvršavaju se sve naredbe iza case 0: */

Pojašnjenje:

Izraz u zagradi je (72-8)%4 =64%4=0 pa se izvršava opcija pod case 0: dakle  z+=1 → z=5

Ali izostavljen je break pa se izvršavaju i sve naredbe koje slijede:

z+=2 → z=7;

z+=3 z=10;

z+=4z=14:


1.5. Primjer 5.

Primjer 4.

Napišite program koji će tražiti upisivanje cijelog broja x. Program treba ispisati vrijednost funkcije f zadane formulom

 Uputa: Iskoristite činjenicu da izostavljanje naredbe break uzrokuje izvršavanje svih naredbi unutar switcha  ili do prve naredbe break.

Rješenje

#include <stdio.h>
#include <math.h>
int main()
{
     int x;
     float fx;
     printf("Upisite jedan broj:");
     scanf("%d",&x);
     switch(x)
     {
           case 1:
           case 3:
           case 5: fx=pow(x,2);break;
           case 2:
           case 4:
           case 6: fx=sqrt(x);break;
           case 7:
           case 8:
           case 9: fx=2*x;break;
           default: fx=0;break;
     }
     printf("Rezultat je %.2f",fx);
     return 0;
}
 

Testni primjeri

Ulaz:      1
Izlaz:     Rezultat je 1.00

Ulaz:      4
Izlaz:     Rezultat je 2.00
 
Ulaz:      9           
Izlaz:     Rezultat je 18.00            

Ulaz:      -8          
Izlaz:     Rezultat je 0.00



1.6. Primjer 6.

Primjer 5.

Promijenimo malo prethodni zadatak. Za učitani x izračunajte vrijednost funkcije f zadane ovako


Napomena: Uglate zagrade označuju zatvoreni interval (segment – niz brojeva između zadanih granica intervala, ali uključujući i rubne brojeve).

Sada imamo previše različitih mogućnosti da bismo mogli zadatak riješiti na prethodni način, ali možemo na sljedeći način.

#include <stdio.h>
#include <math.h>
int main()
{
     int x;
     float fx;
     printf("Upisite jedan broj:");
     scanf("%d",&x);
     switch(x)
     {
           case -50 ... 0:fx=pow(x,2);break;
           case 1 ... 50: fx=sqrt(x);break;
           case 51 ... 100: fx=2*x;break;
           default: fx=0;break;
     }
     printf("Rezultat je %.2f",fx);
     return 0;
}

1.7. Zadaci za vježbu

1. Što će se ispisati na zaslonu monitora ako se nakon pokretanja programa upišu brojevi:

a) a = 3, b = 4, i = 1
b) a = 2, b = 0, i = 3
c) a = 4, b = 5,  i = 4?

 

#include <stdio.h>
int main()
{
     float a,b,x;
     int i;
     printf("Zadajte dva broja a i b: ");
     scanf("%f %f", &a, &b);
     printf("\n IZBOR:\n");
     printf(" \n1: zbroj \n2: umnozak \n3: kolicnik ucitanih brojeva\n");
     printf(" \nIzaberi zeljenu operaciju: ");
     scanf ("%d", &i);
     switch(i)
     {
           case 1: x=a+b; printf("\nx=%.2f+%.2f=%.2f",a,b,x); break;
           case 2: x=a*b; printf("\nx=%.2f*%.2f=%.2f",a,b,x); break;
           case 3: if (b==0)
                           printf("\nDijeljenje s nulom nije dozvoljeno");
                   else
                   {
                           x=a/b;
                           printf ("\nx=%.2f/%.2f=%.2f",a,b,x);
                   }
                   break;
           default: printf("\nOperaciju odabirete brojem izmedju 1 i 3");break;
     }
     return 0;
}

Kako glasi tekst zadatka kojim bi se zadao prethodni program?

2. Napišite program koji će za zadane stranice pravokutnika izračunati opseg, površinu ili duljinu dijagonale zadanog pravokutnika, ovisno o izboru korisnika.

Uputa:

Testni primjeri

Ulaz:      0  1
Izlaz:     Niste upisali stranice pravokutnika.

Ulaz:      1  4
              4           
Izlaz:     Izabrali ste pogresan broj.             

Ulaz:      2  3
              1           
Izlaz:     o=10    


3. Napišite program koji će, ovisno o ostatku pri dijeljenju učitanog broja s brojem 12, na zaslonu ispisati mjesec u godini (0 – siječanj .... 11 – prosinac).

4. Napišite program koji će na zaslonu ispisati izbornik u kojem korisnik odabire geometrijski lik za koji želi izračunati površinu i opseg (kvadrat, pravokutnik, trokut ili krug). Nakon korisnikova odabira, program treba omogućiti upisivanje potrebnih podataka te izračunati i ispisati površinu i opseg zadanog lika.

Testni primjeri

Ulaz:      2
              2 4
Izlaz:     P=8.00
             o=12.00

Ulaz:      3
              1  2  3
Izlaz:     Brojevi koje ste upisali ne mogu biti duljine stranica trokuta!


 

 



2. Dodatni materijali

Video lekcija "Škola za život" od 4:44 minute!




2.1. Rješenja zadataka iz video lekcije

Zadatak 2.

Koje će vrijednosti imati varijable x i y nakon izvršavanja sljedećih naredbi?


   

Rješenje:

x % 3 = 10 % 3 = 1

x *= 8 + y; x = x*(8+y)=10*(8+5)=10*13=130

y--; y= 4

Ispis x=130 y=4


Zadatak 3.

Prikazanu naredbu napišite uporabom switch naredbe.

           

Rješenje:

switch (x%4)
{
    case 0: x+=3; break;
    case 1: x+=2; break;
    case 2: x+=1; break;
    default: x*=2; break;
}