Pamoka 3

Sąlygos ir pasirinkimas

~30 min · 1 žingsnis · 3 / 6 pamokų
Ką pastatysi
Pasirinkimas — antras blokas

Iki šiol programa vykdė visas eilutes paeiliui. Bet tikros programos turi pasirinkti: jei naudotojas pilnametis — leisk įeiti, kitaip — ne. Tai pasirinkimo principas, antras struktūrinio programavimo blokas.


Palyginimo operatoriai

Sąlyga yra teiginys, kuris būna teisingas arba klaidingas:

  • == lygu (atkreipk dėmesį — du lygybės ženklai!)
  • != nelygu
  • < mažiau, > daugiau
  • <= mažiau arba lygu, >= daugiau arba lygu

Dažna klaida. = priskiria reikšmę, o == lygina. if (x = 5) yra klaida; reikia if (x == 5).


if ir else

#include <stdio.h>

int main(void) {
    int amzius;
    printf("Kiek tau metu? ");
    scanf("%d", &amzius);

    if (amzius >= 18) {
        printf("Esi pilnametis.\n");
    } else {
        printf("Dar nepilnametis.\n");
    }
    return 0;
}

Jei sąlyga skliaustuose teisinga — vykdomas pirmas { } blokas; kitaip — else blokas.


Kelios šakos su else if

if (pazymys >= 9) {
    printf("Puiku!\n");
} else if (pazymys >= 7) {
    printf("Gerai.\n");
} else if (pazymys >= 5) {
    printf("Patenkinamai.\n");
} else {
    printf("Reikia pasitempti.\n");
}

Programa tikrina sąlygas iš viršaus į apačią ir įvykdo pirmą tinkamą šaką.


Jungtinės sąlygos

  • &&ir (abi sąlygos turi būti teisingos)
  • ||arba (bent viena teisinga)
  • !ne (apverčia reikšmę)
if (amzius >= 18 && turiBilieta) {
    printf("Praeik.\n");
}

switch — daug variantų

Kai lygini vieną kintamąjį su daug konkrečių reikšmių, switch aiškesnis už ilgą else if grandinę:

int diena = 3;
switch (diena) {
    case 1: printf("Pirmadienis\n"); break;
    case 2: printf("Antradienis\n"); break;
    case 3: printf("Treciadienis\n"); break;
    default: printf("Kita diena\n");
}

Nepamiršk break. Be jo vykdymas „nukrenta" į kitą case ir vykdo jį taip pat. Tai dažna klaida pradedantiesiems.


Trikčių sprendimas

Sąlyga visada teisinga — galbūt parašei = vietoj ==.

switch vykdo kelis case — pamiršai break.

Else nesusieja su tuo if, kuriuo tikiesi — naudok { } skliaustus aplink šakas, kad būtų aišku.


Projektas CLion

Šios pamokos kodą įdėk į savo CLion projektą StructuredC. Žingsnis žemiau rodo pilną main.c turinį po pakeitimo — gali kopijuoti tiesiogiai į CLion ir paspausti žalią ▶ mygtuką.


Apibendrinimas

Išmokai priimti sprendimus su if, else if, else ir switch, jungti sąlygas su && ir ||. Tai pasirinkimo blokas.

Kitoje pamokoje — trečias ir paskutinis blokas: kartojimas su ciklais.

main.c modify

Pakeisk main.c — pažymio vertinimas

#include <stdio.h>

int main(void) {
    int pazymys;
    printf("Ivesk pazymi (1-10): ");
    scanf("%d", &pazymys);

    if (pazymys >= 9) {
        printf("Puiku!\n");
    } else if (pazymys >= 5) {
        printf("Islaikyta.\n");
    } else {
        printf("Reikia pasitempti.\n");
    }
    return 0;
}

Pakeisk visą main.c turinį šiuo kodu. Programa įvertins įvestą pažymį.

Ką šis kodas daro:

  • scanf perskaito pažymį į pazymys.
  • if (pazymys >= 9) — tikrina pirmą sąlygą; jei teisinga, vykdo jos bloką.
  • else if (pazymys >= 5) — tikrinama tik tada, kai pirmoji buvo klaidinga.
  • else — vykdoma, kai nė viena sąlyga netiko.

Svarbu: programa pasirenka pirmą tinkamą šaką ir likusias praleidžia. Naudok >=, ne =.