Pokazywanie postów oznaczonych etykietą cin. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą cin. 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. 

Lekcja 2 - zmienne tekstowe i liczbowe oraz podstawowe operacje na zmiennych


Nauczyliśmy się już wyrażać swoje myśli i uczucia poprzez białe literki na konsoli. Wiemy, jak powinien wyglądać program i co do czego służy, pozwolę sobie przypomnieć to w krótkiej tabelce:

Element programu
Cel
#include
#include
Pozwala na używanie podstawowych funkcji z dwóch standardowych bibliotek cpp: iostream oraz cstdio
using namespace std;
Pozwala nam na opuszczanie wskazywania przestrzeni nazw przy wywoływaniu funkcji
int main()
{
getchar();
return 0;
}
Jest to ciało programu. Co znajdzie się między klamrami – to wykonuje program
//
Komentarz jednolinijkowy
/*
*/
Komentarz wielolinijkowy
cout<<”tekst”;
Służy do wypisania informacji na ekran.

Dobra umiemy, by komputer coś za nas wyrażał – warto, więc zacząć pracę nad tym, by mógł wczytywać nasze sygnały na bierząco.

Do tego służą właśnie zmienne. Zmienne są to dane, które interpretuje program. Brzmi to zapewne tępo, ale postaram się to wyjaśnić poniżej. Spójrz najpierw na tabelkę:
  
Typ zmiennej
Co przedstawia
Sposób tworzenia zmiennej danego typu o danej wartości w programie
int
Zmienna typu int (czyt. Intidżer :D) przedstawia liczbę całkowitą.
int nazwa=5;
/*zmienna nazwa ma wartość  5, więc jeśli napiszę: cout<
Wyświetli się 5*/

float
Zmienna typu float przedstawia liczby zmiennoprzecinkowe np. 2,32 lub 9,10101
float nazwa=3.14;
/* zmienna nazwa ma wartość 3.14 */
char
Zmienna typu char (czyt. Czar ^^) przedstawia pojedynczy znak np. ‘a’ lub ‘2’ lub ‘.’
char nazwa=’A’;
/* zmienna nazwa ma wartość A, zauważ, że w przypadku charów używam apostrofów, jest to bardzo ważne */
string
Zmienna typu string przedstawia łańcuch znaków, czyli np. „Kot” lub nawet „Ala nie ma kota”
string nazwa=”Faradaj”;
/* zauważ, że używam cudzysłowów, trzeba to robić przy każdym takim podawaniu wartości, aby móc użyć zmiennych typu string należy wcześniej dodać bibliotekę cstring */
Bool
Zmienna typu bool(ból) przyjmuje tylko dwie wartości prawda lub fałsz
bool nazwa=false;
bool nazwa2=true;

Spróbujmy to zobaczyć na programie – to najlepszy sposób, aby to zrozumieć.
Napiszmy sobie program, który będzie zawierał zmienne prawie każdego typu:

Tym razem nie wkleję wersji dla leniwych
Program wyświetla zamiast nazw zmiennych ich wartości.
Co trzeba z tego wiedzieć:
- Aby utworzyć zmienną podajemy najpierw jej typ, a później nazwę
- aby wywołać wartość zmiennej na ekran używamy cout<
- wartości zmiennych możemy ustalić na początku trzymając się zasady, że wartość charów wpisujemy w apostrofach, a wartości łańcuchów (stringów) w cudzysłowach
- Nie trzeba od razu deklarować wartości zmiennych można poprosić o ich wpisanie!
Skupmy się na ostatnim myślniku. Mówiliśmy dużo o ścieżce wyjścia (cout) , a teraz czas najwyższy powiedzieć coś sobie o ścieżce wejścia (cin).
Działa ona w sposób analogiczny do ścieżki wyjścia z drobną różnicą. Używamy jej tak:
cin>>nazwa_zmiennej;
Zobaczmy jak to działa, tworząc program, który najpierw poprosi o wpisanie imienia, a następnie wyświetli komunikat witaj podane imie.
Dobra, zacznijmy więc go pisać.
Na pewno będzie wyglądać jak każdy program. Musimy zadeklarować następnie zmienną typu string (imię to łańcuch znaków).
string imie; /*nie przypisuje żadnej wartości początkowej, jeśli jednak przypisałbym, a następnie użył ścieżki wejścia – to pozostałaby tylko wartość podana w ścieżce*/

Aby zadeklarować zmienną typu string musimy pamiętać , aby wśród dyrektyw pojawiło się:
#include
Musimy poprosic o podanie imienia za pomocą komunikatu z ścieżki wyjścia:
cout<<”podaj imie”;
A następnie pobrać imie z klawiatury:
cin>>imie;
Po czym wyświetlić komunikat witaj z wprowadzonym imieniem:
cout<<”Witaj ”<



Tu nie za wiele można się rozgadywać, ale pokażę jeszcze możliwości naszych zmiennych liczbowych:

Możemy wykonywać na nich wszystkie działania charakterystyczne dla zbioru liczb rzeczywistych, np. mnożyć, dzielić, dodawać czy odejmować, liczyć resztę z dzielenia, podnosić do potęgi. Np.:
int i=2;
int a;       //tworze zmienną a
a=i+1,      /*przypisuje jej wartość i +1 czyli 2 +1 , czyli 3, widzimy przy okazji, że wartość można przypisać nie tylko przez jej wpisanie lub podanie przy tworzeniu zmiennej*/
int b=a*i;        // tworzę zmienną b o wartości a*i = 3*2=6
int c=i-1;      // tworze zmienną c o wartości i-1 =2-1=1
int d=i%3;   // tworze zmienną d o wartości reszty z dzielenia i przez 3, czyli 2
int e=i/2;    // tworze mienną e o wartości i podzielone przez 2 czyli 1
Aby podnosić liczby do potęgi należy dodać bibliotekę math.h, wtedy możemy skorzystać z funkcji pow(podstawa,wykładnik), np.:
int f=pow(i,3);     //tworze zmienną f o wartości i podniesione do 3 potęgi czyli 2^3=8

Takie podstawy powinny Wam starczyć, aby móc przejść do dalszej nauki.


Zadanie:
1.Napisz program, który pobierze od Ciebie dwie liczby całkowite, a następnie podniesie pierwszą z nich do potęgi o wartości drugiej z nich i wyświetli wynik.
2. Napisz program, który pobierze od Ciebie imię, nr telefonu i wyświetli komunikat: „Witam, czy dodzwonilem sie pod numer  (miejsce na nr Tel)  to ja (miejsce na imie) chcialem nauczyc się programowac”
3. Napisz program który, będzie rozwiązywał równanie liniowe o wzorze ogólnym (ax+b=c, gdzie a,b,c to dowolne liczby, o które komputer ma cie poprosić przy założeniu, że a jest różne od zera) .
4. Napisz program, który będzie rozwiązywał układ równań z dwiema niewiadomymi przy założeniu, że układ jest oznaczony.

5. Napisz program, który policzy deltę dla danych współczynników równania kwadratowego z jedną niewiadomą.