Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

jankol-el 26 Paź 2013 19:00 5961 0
  • Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle


    Kurs:
    Część 1.0 - Start w języku C
    Część 1.1 - Typy danych i zmienne
    Część 1.2 - Tablice i wskaźniki
    Część 1.3 - Operatory
    Część 1.4 - Instrukcje i pętle

    Instrukcje
    Wreszcie dochodzimy do instrukcji, czyli do działu który nauczy nas co robić z poprzednio poznanymi rzeczami. Powiedzieliśmy sobie o zmiennych, operatorach, a dzięki instrukcjom które zaraz poznamy, będziemy mogli wykonywać operacje na nich w szerszym tego słowa znaczeniu. Mamy instrukcje proste i złożone.
    Instrukcja prosta składa się z identyfikatorów i operatorów
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nic nowego, prawda? Znamy przecież już to!
    Instrukcja złożona powstaje wtedy, gdy zbiór takich prostych instrukcji umieścimy w klamrowym nawiasie, grupując je tym samym w blok instrukcji - czyli przykładowo: { i }.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ważne jest w instrukcjach to, że na końcu każdej widnieje średnik - ;.
    Każda instrukcja w języku C/C++ kończy się średnikiem.
    Nawet jest tzw. instrukcja pusta, która nie powoduje żadnych zmian

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kompilator ujrzawszy - ; - wie, że ma do wykonania instrukcję.

    Instrukcje warunkowe
    Powoli robi się ciekawiej, teraz dzięki takim narzędziom jak instrukcje warunkowe, będziemy mogli sprawić, że nasz program będzie w wybranym przez nas miejscu, momencie, dokonywał wyboru. Wybór ten będzie możliwy poprzez spełnienie wymaganego warunku. Na pierwsze zetknięcie z takimi instrukcjami weźmiemy sobie instrukcję if (ang. jeżeli, jeśli). Jest to instrukcja która wygląda tak:

    if (WARUNEK)
    {
    INSTRUKCJE_KTÓRE_ZOSTANĄ_WYKONANE_JEŻELI_WARUNEK_ZOSTANIE_SPEŁNIONY




    }

    Warunek to po prostu wyrażenie. Może to być wybór większej, bądź mniejszej liczby. Po "ludzku" najpierw to zróbmy, czyli słownie i w teorii. Wyobraźmy sobie, że dostajemy dwie monety i ktoś kto nam je podarował, prosi, byśmy wzięli sobie bilon o większym nominale. My wiemy, już od wczesnej podstawówki, że np. 5zł jest więcej warte od 2zł ;) Gdyby jednak miał za nas decydować program własnoręcznie napisany to musiałby:
    - mieć stworzone w pamięci owe monety
    - musiałby je porównać
    - po wyznaczeniu większej, zachować ją dla nas
    Więc słownie wyglądałoby to mniej więcej tak:
    To co nazywa się moneta5zl, które ma wartość 5, umieszczamy w pamięci;
    To co nazywa się moneta2zl, które ma wartość 2, umieszczamy w pamięci;

    JEŻELI (moneta5zl jest większej wartości od moneta2zl)
    {
    Schowaj moneta5zl do kieszeni;
    }

    Dobra, chyba jasne jest jak to działa w teorii. Pora na przykład w pełni działający:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Co spowoduje taki efekt:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Teraz powinno być już wszystko jasne. Przykład jednak nie jest do końca wyczerpany, bo przecież tutaj znaliśmy obie wartości i sobie odpowiednio je wpisaliśmy, taki przykład bardziej potwierdza nasze przypuszczenia co do tego która jest większa. Co jeśli drugą wartość użytkownik ma podać, niech by to była cena z jednego marketu, oraz cena z drugiego. Dzięki czemu, mielibyśmy możliwość doboru tańszego dla nas marketu. Do tego przydatną okaże się taka instrukcja warunkowa if - else. Znamy już if, który znaczy tyle co jeżeli, jeśli, natomiast else znaczy tyle co w przeciwnym wypadku. Wyobraźmy sobie, że mamy cenę jakiegoś produktu wynoszącą 39,99zł, ale ten sam produkt ukazał się w innym sklepie i wpisując ją musimy się dowiedzieć z którego marketu cena jest atrakcyjniejsza. Konstrukcja taka miałaby postać:

    JEŻELI - if (WARUNEK_ZOSTANIE_SPEŁNIONY)
    {
    WYKONAJ_INSTRUKCJE_W_TYCH_KLAMRACH;
    }
    W_PRZECIWNYM_WYPADKU - else
    {
    WYKONAJ_TE_INSTRUKCJE;
    }

    Przykład z naszymi marketami:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ja wypróbowałem program jak widać na załączonym poniżej obrazie. Warto pamiętać, że wpisując wartości zmiennoprzecinkowe używamy kropki, nie przecinka. Oto mój przykład:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Dla przypomnienia powiem, że użyte %.2f jest tutaj dlatego, że nasze zmienne CenaWMarkecie1 i CenaWMarkecie2 są typu zmiennoprzecinkowego - float, a .2 jest po to, by ograniczyć wyświetlanie zmiennej do dwóch miejsc po przecinku. Dodam, że w wyrażeniu: (CenaWMarkecie1>CenaWMarkecie2), mamy do czynienia z wyrażeniem. Wyrażenie "daje" nam wartość logiczną 1, lub 0, innymi słowy true (ang. prawda), false (ang. fałsz). Jeśli więc mamy po lewej stronie znaczka > wartość większą, a po prawej stronie mniejszą, nasz warunek zwraca wartość logiczną 1, czyli true (prawdziwa). Tylko wtedy, gdy wartość jest prawdziwa, czyli ma wartość logiczną 1, czyli true instrukcje w najbliższych klamrach będą wykonywane.

    Pewnie każdy kto się pobawił dłużej tym programem, zauważył jak się on zachowa, gdy ceny będą takie same. Jeśli chcemy wyodrębnić takie zjawisko, mamy do dyspozycji (z poprzednich części kursu) wyrażenie logiczne <=, albo >=. Znaczyło to "mniejszy, bądź równy", oraz "większy, bądź równy".
    Wtedy w naszej funkcji wypisującej musimy dodać wzmiankę o tym, że coś jest większe/mniejsze bądź równe. Mamy na szczęście możliwość napisania nieco "mądrzejszy" program, który takie zjawisko wyszczególni. Mianowicie instrukcja warunkowa else if (WARUNEK), nie mylić z if - else. Nasza instrukcja else if (WARUNEK) oznacza w przeciwnym wypadku jeśli (WARUNEK) jest spełniony [...] i wykona instrukcje które umieścimy w klamrze. Żeby zbyt nie komplikować sprawy, po prostu dodam takową instrukcję do naszego programu, modyfikując go:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I sprawa wygląda np. tak:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle


    Klasycznym przykładem z poznanymi instrukcjami warunkowymi jest pytanie użytkownika o wiek. Powiedzmy, że nasz program ma sprawdzić pełnoletność użytkownika. Oto przykład kodu takiego programu, zalecam się pobawić nim.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozwolę sobie wspomnieć nieco o tzw. operatorze warunkowym. Konstrukcja takiego warunku wygląda tak:
    WYRAŻENIE_PIERWSZE?WYRAŻENIE_DRUGIE:WYRAŻENIE_TRZECIE;
    Ciekawy przykładzik:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Gdybym wprowadzić wartość 1, czyli gdyby ktoś był od roku użytkownikiem elektrody, pojawiłoby się w odpowiedzi:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle


    Instrukcja przełączająca
    Instrukcja switch (ang. przełączyć), jest to kolejna ciekawa instrukcja.
    Jej działanie pozwolę sobie od razu bez schematów pokazać na przykładzie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jako, że dziś mamy niedzielę, która jest siódmym dniem tygodnia, postanowiłem podczas działania programu wprowadzić właśnie taką liczbę:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Wyjaśnijmy pewne miejsca w kodzie. Zaznaczyłem je sobie numerkami od 1-6 w komentarzach.
    1. W instrukcji switch musimy także mieć jakieś wyrażenie switch(wyrażenie). Tutaj pojawia się zmienna DzienTygodnia która jak zaraz się okaże jest odpowiedzialna za to gdzie się "przełączymy".
    2. W tym miejscu nadajemy jako użytkownik wartość naszej zmiennej DzienTygodnia.
    3. Teraz nasza zmienna DzienTygodnia jest "upchana" jako wyrażenie do instrukcji switch.
    4. Odtąd zaczyna się zabawa. Po case pojawia się "1". Wygląda to tak case 1:. Ta jedynka to stała, jeśli pokryje się ona z podaną w punkcie 2. wartością to wszystko co jest w naszym case wykona się, aż do momentu...
    5. Wpisana instrukcja break (ang. przerwać), jak sama nazwa nam podpowiada, jest odpowiedzialna za przerwanie naszego switch'a! Nie jest to obowiązkowa instrukcja, nie musimy oczywiście dodawać break. Działanie bez tej instrukcji będzie wyglądało tak, że każdy case od tego konkretnego, będzie się wykonywać. Jeśli w tym przykładowym programie usunęlibyśmy każdy break i podali podczas pracy programu wartość np. 4 to efekt działania byłby taki:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Jak widać, wszystko od "4" się wykonało - wyświetliło.
    6. Dochodzimy do default (ang. domyślnie), czyli do instrukcji, która wykona się, jeżeli podana zmienna nie pasuje do żadnej ze stałych w case. Przecież nie ma 8 dnia tygodnia, więc jeśli takowy zostanie podany, nasz program będzie na to gotowy. Wyświetli stosowny komunikat.

    Instrukcja switch-case może także posłużyć nam jako narzędzie do tworzenia prostego MENU. Przykład:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ważne jest także, że możemy wykorzystać znaki z klawiatury:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Zachęcam do zabaw i kombinowania z tą instrukcją. Bardzo wiele idei można realizować dzięki niej, na różne sposoby. Można także skonstruować taką instrukcję jak switch(wyrażenie)-case używając else if(wyrażenie). Jak? Niech każdy spróbuje sam, programowanie to niestety nie wszystko na tacy, a dochodząc do czegoś samemu uczymy się może nieco wolniej, ale dokładniej.

    Pętle

    Temat pętli pozwolę sobie rozpocząć od krótkiego wstępu.
    Po co nam pętle w programowaniu? Jak sama nazwa podpowiada, jest to związane z zapętleniem, czyli powtarzaniem się pewnych rzeczy, ściślej - instrukcji. Pętle mają odpowiednie sterowanie, które odpowiada za decyzje od kiedy, do kiedy ma być jej wnętrze "zapętlone", czyli powtarzane. Pętla może służyć do zliczania czegoś, albo zwielokrotniania jakichś operacji. Myślę, że można przejść do konkretnych pętli w języku C.
    Zacznijmy więc od pętli while (ang. dopóki/podczas gdy) - to co w ciele, wnętrzu omawianej pętli będzie umieszczone (zbiór instrukcji), będzie powtarzane dopóki... no właśnie, dopóki co? Dopóki warunek umieszczony w nawiasach będzie innej wartości niż zero:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W naszym języku programowania wszystko co nie jest równe zeru ma wartość true, "1" logiczne. Spróbuję to zobrazować na poniższym przykładzie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Oraz jak wygląda to w praktyce:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Zadeklarowaliśmy sobie zmienną jakas_zmienna i zainicjowaliśmy sobie ją wartością "10". Następnie pojawia się pętla while i nawiasy w który jest umieszczony warunek. Wspomniałem, że warunek ma być wyższy od 0! Zgadza się, bo nadana wartość równa "10" jest różna od zera. Odpowiednio wstawiłem w poszczególne miejsca programu możliwość wyświetlania tego, co dzieje się z naszą zmienną w trakcie działania programu. Po wykonaniu instrukcji odpowiedzialnej za wyświetlenie na ekranie naszej zmiennej wewnątrz pętli, następuje dekrementacja zmiennej, czyli pomniejszenie jej o 1. Program wraca na początek pętli i sprawdza wartość zmiennej umieszczonej wewnątrz warunku. Warunek jest nadal różny od zera, więc sytuacja się powtarza. Wreszcie wartość zmiennej jest równa 1 i po dekrementacji pętla się przerywa. Widać to choćby po tym, że wewnątrz pętli nie jest wyświetlone: "Wewnatrz petli wartosc zmiennej: 0.", tylko: "Wartosc zmiennej poza petla: 0".
    Co zatem stanie się po uruchomieniu takiego programu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Stanie się to, że pętla będzie działać "w nieskończoność", bo nigdy wartość "jakas_zmienna" nie będzie równa 0, ale osiągnie wartości ujemne.
    Można warunek odpowiednio skonstruować, by pętla działała jak tylko chcemy, czyli może być podany warunek, że dopóki wartość zmiennej jest większy od 100, wykonuj się pętlo. Oto jak by wyglądał ten przykład w praktyce:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle


    Podobną pętlą do powyższej jest do-while, (ang. rób-dopóki) jest to pętla która różni się nieco od powyższej, bo jej schemat wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jak nietrudno się domyślić zasadniczą różnicą jest to, że warunek jest sprawdzany pod koniec pętli, a nie na początku jak w omawianej przed momentem pętli while. Na bardziej ludzki język wygląda to tak, że program natrafia na do, czyli rozkaz "robienia" tego co w klamrach jest umieszczone. Po czym dochodzi do while i sprawdza, czy ma się powtarzać, czy nie. W "zwykłym" while jest sprawdzany warunek zanim dojdzie do wykonania pętli. Czyli jakby do-while najpierw robi, potem myśli. Oczywiście jest to żart, bo to jest warunek kończący pętle, a poprzednio był warunek pozwalający na wykonanie się pętli.
    To by było na tyle jeśli chodzi o while i jego brata do-while.
    Teraz pora na pętlę for (ang. dla). Jest to pętla którą przedstawię w "ludzki" sposób, by łatwiej było zrozumieć i zapamiętać jej działanie. Skonstruowana w taki sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    To co jest wewnątrz okrągłego nawiasu: "WARTOŚĆ_POCZĄTKOWA ; WARTOŚĆ_KOŃCOWA ; ITERACJA*", jest to nic innego jak warunki, mamy ich tutaj więcej niż w poprzednich pętlach. Ważne jest, by każdy był oddzielony średnikiem ;. Co ciekawe, każdy z nich może być pominięty, dowolnie.
    Pierwszy warunek sprawdza od jakiej wartości danej zmiennej ma się rozpocząć pętla, kolejny warunek sprawdza dokąd się ma wykonywać pętla, a ostatni, czyli iteracja jest to warunek który steruje pętlą. Zmniejsza, bądź zmniejsza wartość zmiennej wewnątrz pętli. Oto prosty przykład:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Działanie:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Zainicjowana jakas_zmienna otrzymała wartość "0" i z taką wartością trafia do pierwszego warunku pętli for. Sprawdzany jest kolejny warunek, czyli jakas_zmienna<10, a skoro nasza jakas_zmienna jest mniejsza od "10" to warunek ostatni, czyli iteracja wchodzi do gry i zwiększa naszą zmienną o "1", po czym jest wykonane ciało pętli.
    Nieco bardziej interaktywny przykład:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I przykład w którym jako początek ustawiłem 15, a koniec na 27:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle
    Po pętli wartość zmiennej i jest większa od 27, bo warunek był do 27 jeszcze prawdziwy, ze względu na użycie "<=", więc warunek iteracji jeszcze się wykonał, po czym przerwał wykonywanie pętli.

    Teraz coś, specjalnie dla fanów tablic, o których była mowa w poprzednich poddziałach. Użyjemy pętli for, aby zapełnić tablicę:
    Code:
    #include <stdio.h>
    
    #include <stdlib.h>
    #include <conio.h>

    int main()
    {
        int i;
        int tab[10];
        printf("Zapelnij tablice liczbami calkowitymi: \n");
        for(i=0;i<=9;i++)
        {
            printf("tab[%d]:",i);
            scanf("%d",&tab[i]);
        }
        printf("Oto tablica po zapelnieniu:\n");
            for(i=0;i<=9;i++)
        {
            printf("Pod indeksem %d tablicy tab, miesci sie wartosc: %d \n",i,tab[i]);
        }
        getch();
        return 0;
    }
    Wstawiłem w code, bo tekst się rozpływał :)

    W moim teście wypadło to tak:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle

    Stworzyliśmy tablicę o nazwie tab, która ma 10 elementów. Przypominam, że indeksujemy elementy w tablicy od "0"! Dlatego w pętli for mamy start od "0" do "9" - włącznie. Częsty błąd to zapominanie o tej żelaznej zasadzie, co niesie w skutkach odczytanie komórki pamięci nie należącej do naszego programu. Odczyt spoza tablicy to jedno, ale gdy zapiszemy coś niechcący pod indeksem który nie istnieje, możemy coś nabroić, więc należy o tym pamiętać.
    Wracając do powyższego programu, mamy w nim możliwość wypełnienia tablicy wartościami liczb całkowitych. Pętla ma tutaj za zadanie przeskakiwać na kolejny indeks i pozwala wypełniać przez nas miejsce w tablicy pod wskazanym indeksem. Kolejna część programu wypisuje nam jeden za drugim, każdy element tablicy.

    Na sam koniec pozostawiłem pewne uzupełnienie wiedzy.
    Warto wspomnieć o instrukcjach break i continue (ang. break - przerwij, oraz continue - kontynuuj).
    We wcześniej wspomnianym "niekończącym się programie" niewiele możemy zrobić, pętla się wykonuje i wykonuje... Możemy się w takiej sytuacji zabezpieczyć instrukcją warunkową if, oraz break.
    Spójrzmy:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Instrukcja warunkowa wychwytuje wartość zmiennej i jeśli tak osiągnie wartość
    mniejszą od "-1024" pozwala na wykonanie dwóch instrukcji w bloku, czyli wypisania komunikatu, oraz przerwania while. Co do instrukcji continue, powoduje ona przerwanie wykonania bieżącego kroku pętli i przejście do następnego kroku, lecz działa tylko w stosunku do pętli w której aktualnie się znajduje.
    Proste zobrazowanie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I oto treść z konsoli:
    Kurs programowania C/C++. Część 1.4 - Instrukcje i pętle



    Zachęcam do wszelkich możliwych eksperymentów ze świeżo poznanymi rzeczami. Zapewniam, że nie ma tu nic trudnego.

    -------------------------




    Literatura:
    -Język ANSI C. Programowanie. Wydanie II
    Autorzy: Brian W. Kernighan, Dennis M. Ritchie
    -Symfonia C++ Standard. Tom 1-2. Wydanie III
    Autor: Jerzy Grębosz
    -Czysty kod. Podręcznik dobrego programisty
    Autor: Robert C. Martin

    Wersja z dnia: 23 listopada 2013 r.


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.