Pokazywanie postów oznaczonych etykietą else. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą else. Pokaż wszystkie posty

środa, 23 marca 2016

Lekcja 4 - tablice jedno i dwuwymiarowe

Autor: Faradaj

Umiemy już tworzyć  wyprowadzać, wprowadzać dane z/do zmiennych. Czas teraz przemyśleć kwestie następującą: Chcemy stworzyć bardzo dużą ilość zmiennych. Skoro tak chwaliłem cpp to czy nie ma łatwiejszego sposobu niż wymyślanie mnóstwa nazw zmiennych? Owszem, chwaliłem i jest. Do tego właśnie służą tablice.

Wyobraź sobie sytuację, że potrzebujesz dziesięciu zmiennych liczbowych.

Zapewne zadeklarujesz je tak:

int a,b,c,d,e,f,g,h,i,j;

A poźniej wczytasz tak:

cin>>a>>b>>c>>d>>e>>f>>g>>h>>i>>j;

lub co gorsza, tak:

cin>>a;
cin>>b;
cin>>c;
cin>>d;
cin>>e;
cin>>f;
cin>>g;
cin>>h;
cin>>i;
cin>>j;

Cpp jednak oferuje Ci coś takiego jak tablica. Polega to na tym, że deklarujesz nie jedną zmienną o całe pudełko. Robisz to tak:

int nazwa_tablicy[ilość_elementów]; 

W ten sposób utworzyłeś w pamięci twojego programu ilość_elementów zmiennych typu int. 

Każda tablica posiada tyle komórek (miejsc/zmiennych), ile zadeklarowałeś na początku. Ilość miejsc, które ma tablica jest zawsze stała!

Dobra, ale skąd komputer będzie wiedział o którą zmienną z tablicy mi chodzi? Sprawa jest prosta każda z komórek ma swój adres, który przy wpisywaniu wartości do niej lub wypisywaniu wartości z niej należy podać, wpisując go w nawiasach kwadratowych.  Spójrz poniżej:

Komórka:
Komórka 1
Komórka 2
Komórka 3
Komórka 4
Komórka 5
Adres
0
1
2
3
4

Zauważ, że adresy komórki zaczynają się  od 0, a kończą się na ilość_elementów-1. Ma to ważne znaczenie w zastosowaniu. Chcę wpisać do komórki 1 wartość 2, robię to tak:

int tab[5];     //deklaruje tablice o pięciu komórkach
tab[0]=2;    //przypisuje wartość 2 komórce 1

Wartość komórek można podać już przy tworzeniu tablicy w następujący sposób:

int tab[5]={0,0,0,0,0};   //stworzyłem tablice i każdej komórce przypisałem wartość 0

Tablica może być dowolnego typu – zamiast int może być również float, char, string, bool, co żywnie sobie wymarzysz.

Stwórzmy program, który wypisze policzy średnią arytmetyczną z naszych ocen z informatyki. Najpierw poprosi o oceny, a później poda średnią:

int tab[5]; //zakładamy, że mamy 5 ocen
cin>>tab[0]>> tab[0]>> tab[1]>> tab[2]>> tab[3]>> tab[4];
cout<<(tab[0]+ tab[1]+ tab[2]+ tab[3]+ tab[4])/5;

Zaoszczędziliśmy nie wiele, ale to tylko dla tego, że nie wiesz jeszcze, jak działa pętla. To były tablice jednowymiarowe.

W temacie obiecałem, że powiem również o tablicach dwuwymiarowych.

Tablice jednowymiarowe miały tylko jeden wiersz i mnóstwo komórek. Tablice dwuwymiarowe będą posiadały więcej wierszy. Ile? Tyle, ile zadeklarujesz. Robi się to tak:

float tab[ilość kolumn][ilość wierszy];

Działa to identycznie , jak z tablicami jednowymiarowymi. Wyobraź sobie, że masz stworzyć program, który pobierze wiek i wzrost np.3 osób.

float tab[3][2];          /* tworze tablice o trzech kolumnach (każda osoba ma swoją) i 2 wierszach: wiek i wzrost */

Następnie podaje wiek i wzrost pierwszej osoby:

cin>>tab[0][0]>>tab[0][1];  

Jak widzisz tablice to nic trudnego, czy jedno czy dwuwymiarowe – działają tak samo. Zastosowanie tablic docenisz w lekcji o pętlach.

Zadanie:
1.      Napisz program, który najpierw pobierze od ciebie nazwiska 5 osób i ich wiek, a następnie wypisze osobe 1 z  wiekiem osoby 4.
2.      Napisz program, który pobierze 10 zmiennych typu int i jeżeli są większe od 3 lub mniejsze od 1 to je wypisze.

wtorek, 22 marca 2016

LEKCJA 3 - INSTRUKCJE WARUNKOWE

Autor: Faradaj

Wiemy już, co to są zmienne, więc czas się wziąć za sposoby za pomocą, których komputer będzie reagował na wprowadzane przez nas dane zamiast tylko powtarzać je lub edytować wg jednej reguły.
Do tego właśnie służą instrukcje warunkowe.  Są to jedne z najbardziej intuicyjnych spraw w cpp.
Zacznijmy od krótkiego przykładu prostego programu:
Program prosi nas o padanie liczby, a następnie odpowiada, czy liczba jest 1 czy nie.
I właśnie tu widzimy, czym jest instrukcja warunkowa.
Instrukcje warunkowe w cpp przybierają następującą formę:
if(warunek)
{
//polecenia jeśli warunek jest spełniony
}
else
{
// polecenia w przeciwnym wypadku
}
Więc w naszym przypadku program będzie wyglądał tak:

Zapewne, wiele osób zwróci uwagę, czemu są dwa znaki równa się ;) Już tłumaczę. W języku cpp pojedynczy znak równa się jest zarezerwowany dla operacji przypisania (np. int i=0; Tworzę zmienną i, której przypisuję wartość 0), podczas gdy dwa znaki równa się znaczą ma równą wartość. Operatory porównania w C++:
Operator
Znaczenie
==
Jest sobie równe
> 
Jest większe niż
< 
Jest mniejsze niż
!=
Jest różne od

Zrobiliśmy –więc- program, który ma jeden warunek. Nasuwa się teraz pytanie, jak dodać więcej warunków. Logicznie rzecz ujmując, skoro if znaczy jeżeli a else w przeciwnym razie, można stworzyć operator else if() i rzeczywiście można.  Poniżej można zobaczyć, standardowy szablon, jak korzystać z wielu instrukcji warunkowych:

Warto pamiętać, że cpp jest bardzo przyjaznym językiem i zawsze stara się zrozumieć nadawcę poleceń, dlatego wychodzi do nas z bardzo kuszącą ofertą:
W przypadku, gdy warunek jest spełniony i chcemy wykonać tylko jedno polecenie np. coutować jedynkę ;), możemy opuścić klamry, tzn. napisać:
if(liczba==1)
cout<<”jeden”;
Udogodnienie działa również dla else, else if i wielu innych poleceń, których wkrótce się nauczymy. To:
else if(liczba==2)
cout<<”dwojka”;
else
cout<<”nie jeden nie dwa”;
Znaczy to samo co to:
else if(liczba==2)
{
cout<<”dwojka”;
}
else
{
cout<<”nie jeden nie dwa”;
}

Warto jednak wiedzieć jeszcze jedną rzecz. Co jeśli mamy więcej niż jeden warunek do umieszczenia w ifie? Nic trudniejszego możemy to zrobić za pomocą specjalnych operatorów:

Operator
Użycie
Znaczenie
&&
if(a>2&&a<7 o:p="">
Jeżeli a większe od dwóch ORAZ mniejsze od 7. Tylko gdy oba warunki są spełnione.
||
if(a>7||a<4 o:p="">
Jeżeli a większe od siedmiu LUB mniejsze od 4. Jeśli spełniony choć jeden warunek.

Ogarniamy już ify i elsy, więc przejdźmy do kolejnych poleceń warunkowych, których możliwość użycia daje na cpp – a mianowicie do instrukcji switch(wybór). Jego składnia wygląda następująco:

W wykorzystaniu zamiast wybor wstawia się nazwę wcześniej utworzonej i podanej zmiennej dowolnego typu. A więc nasz poprzedni program mógłby wyglądać tak:

Widzimy przy okazji wadę tego rozwiązania. Możemy utworzyć mnóstwo wyborów, ale nie ma przeciwnego wypadku. Tak samo można wykorzystywać zamiast liczb: znaki czy wyrazy. Np. mini kalkulator na caseach:
#include
#include

using namespace std;

int main()
{
    int liczba,liczba2;
    float wynik=0;
    char znak;
    cin>>liczba;
    cin>>znak;
    cin>>liczba2;
    switch(znak)
    {
    case '+':
        wynik=liczba+liczba2;
    break;
    case '-':
        wynik=liczba-liczba2;
    break;
    case 'x':
        wynik=liczba*liczba2;
    break;
    case '*':
        wynik=liczba*liczba2;
    break;
    case '/':
        wynik=liczba/liczba2;
    break;
    case ':':
        wynik=liczba/liczba2;
    break;
    }
    cout<<" = "<

    getchar();
    return 0;
}

Zwracajmy zawsze uwagę czy po case daliśmy apostrofy, cudzysłowy czy nic w zależności od typu zmiennej. Przypomnienie: zmienne liczbowe – nic , łańcuchy znaków –cudzysłowy, pojedyncze znaki apostrofy. Uczniowie często zapominają o tym, a następnie doszukują się błędów. Unikajmy tego.

Zadanie:
1.       Napisz kalkulator, w którym znak mnożenia jest zastąpiony wyrazem: razy, znak dzielenia: przez, znak dodawania: plus, znak odejmowania: minus, znak potęgowania do.
2.       Napisz program, który sprawdzi: czy dana liczba jest parzysta, nieparzysta, podzielna przez 3 i większa od 21.

3.       Napisz program, w którym sprawdzisz która liczba jest większa i podasz odpowiedź: pierwsza lub druga.