czwartek, 15 marca 2012

Rozmawiamy z kompilatorem, polecenie scanf

Wiemy już jak wypisać jakąś wiadomość w konsoli, spróbujmy teraz wpisać w konsoli tak, aby program to zapamiętał. Najpierw jednak poznajmy coś takiego jak komentarze, ponieważ w przyszłych postach zamiast się rozpisywać we wstępie, będę z nich właśnie korzystając w przykładowych programach.

Komentarze służą do zapisywania informacji dla programisty. Kompilator ignoruje to co znajduje się w komentarzach, po prostu to pomija. Istnieją dwa rodzaje komentarzy:

  • Pierwszy poprzez wpisanie komentarza wewnątrz organiczników z lewej /* i prawej */. Komentarz taki może ciągnąć się przez wiele linijek.
  • Drugim sposobem jest wpisanie dwóch ukośników //, po czym kompilator zupełnie zignoruje wszystko co znajduje się po ukośnicach w tej linijce (nie dalej).
Przykładowym użyciem komentarzy jest:

#include <stdio.h>
int main(){

   printf("Hej, jestem Krzysiek\n");
   /*  
   printf("Zrezygnuję z tych ");
   printf(" dwoch linijek, wiec dodam je w komentarz.\n");
   */
   printf("Teraz podam przyklad uzycia komentarza liniowego\n");
   // printf("Bo nie chce by to sie pojawilo");
   printf("Ale to juz sie pojawi");

   system("pause");
   return 0;
}

Skoro już znamy komentarze mogę w końcu przejść do rozmawiania z kompilatorem, musimy jednak przed tym dowiedzieć się co to są zmienne, deklaracje, definicje i typy.

Aby cokolwiek wprowadzić z zewnątrz do naszego programu najpierw w komputerze musimy zarezerwować dla tego miejsce, aby gdzieś to wsadzić, to jest właśnie definicja, ale sama definicja nie wystarcza kompilatorowi, on potrzebuje jeszcze deklaracji. Deklaracja to oznaczenie miejsca jako miejsce dla wybranego typu. I tutaj dochodzimy właśnie do typów. W C rozróżniamy 7 głównych typów, są to:
  • int (od angielskiego integer) - czyli liczba całkowita,
  • long int - większe liczby całkowite,
  • long long int - jeszcze większe liczby całkowite,
  • float - zmiennoprzecinkowa o mniejszej precyzji,
  • double - zmiennoprzecinkowa o większej precyzji,
  • char - znak,
  • void - jako brak typu.
Tak więc wypisanie w kompilatorze int zmienna; spowoduje:
  • Zarezerwowanie miejsca na dysku o rozmiarze wymaganym dla int,
  • Przypisanie tego miejsca dla liczb całkowitych,
  • Oznaczenie tego miejsca jako nazwę zmienna.
Teraz gdy mamy już zarezerwowane miejsce możemy coś tam wpisać. Do zmiennej możemy wpisywać rzeczy na dwa sposoby, z okna kompilatora i z konsoli.

Z kompilatora robimy to przez zwykłe przypisanie (znakiem =) wartości, tak na przykład:
int zmienna;
zmienna = 341; //co czytamy do końca: wartość 341 przypisz zmiennej zmienna

Lub przez okno konsoli, jest to jednak już bardziej skomplikowane. Do odczytywania informacji z konsoli służy polecenie scanf();. To ono będzie oczekiwać na wpisanie w konsoli wartości i zatwierdzenie jej poprzez naciśnięcie klawisza Enter. Aby scanf() odniosło się do naszej zmiennej musimy przypisać je do niej, robimy to przez wpisanie wewnątrz nawiasów w cudzysłowie skrótu naszej zmiennej odpowiednio:
  • int, long int, long long int - %i
  • float,  double - %f
  • char - %s
oraz po zamknięciu cudzysłowu i przecinku nazwę naszej zmiennej poprzedzoną znakiem ampersand (&). Tak dla przykładu:

float zmienna;
scanf("%f", &zmienna); //co mozemy tez przeczytac od konca
//zmiennej zmienna o typie float przypisz wartosc wpisana w konsoli

Zapisaną wewnątrz zmiennej wartość możemy później odczytać, lub też wykonywać na niej różne działania poprzez bezpośrednie odwołanie się do niej, tutaj przykładowy program zamieniający odległość podaną w metrach na centymetry.

#include <stdio.h>

int odleglosc_w_metrach, odleglosc_w_centymetrach;
/* dodałem dwie zmienne rozdzielając je przecinkami. Kompilator sam obie
   zakwalifikuje jako typ int. */
int main(){
    printf("Podaj odleglosc (w metrach): ");
    scanf("%i", &odleglosc_w_metrach); // wczytywanie z konsoli
    printf("\nPodana wartosc %im.", odleglosc_w_metrach); 
    /* Poprzez wpisanie wewnątrz cudzysłowiu skrutu do zmiennej %i 
       kompilator wypisze pierwsza znalezioną zmienna po cudzysłowie */
    printf("\n\n");
    odleglosc_w_centymetrach=odleglosc_w_metrach*100;
    /* Przypisnie do zmiennej odleglosc_w_centymetrach wartoście zmiennej
       odleglosc_w_metrach pomnożonej 100-krotnie */
    printf("%i metrow, to %i centymetrow", odleglosc_w_metrach, odleglosc_w_centymetrach);
    /* Znajdują się tutaj dwa sróty %i, dlatego po zamknięciu cudzysłowiu 
       musimy podać dwie zmienne, odpowiednio w kolejności w jakiej chcemy aby
       się pojawiały */
    printf("\n\n\n");
    system("pause");
    return 0;
}
    
To skoro już tak daleko zaszliśmy to na dzisiaj już koniec, zachęcam do wykonania zadania, a w razie problemów zerknięcia do podsumowania.



__________________________________________
PODSUMOWANIE


/* */ - komentarz wielolinijkowy
// - komentarz jednolinijkowy
int (%i) -  liczba całkowita
long int (%l) - większe liczby całkowite
long long int (%ll) - jeszcze większe liczby całkowite
float (%f) - zmiennoprzecinkowa o mniejszej precyzji
double (%d) - zmiennoprzecinkowa o większej precyzji
char (%c) - znak

void - brak typu
scanf("skrót zmiennej", &nazwa zmiennej) - wczytanie z konsoli
printf("skrót zmiennej", nazwa zmiennej) - wypisanie zmiennej do konsoli

Podstawy

W naszym kursie programowania będziemy się zajmować (na razie) tylko językiem C, dlatego zacznijmy od podstaw i zapoznaniem się z systemem kursu. Przy każdym wpisie zawsze będę wprowadzał krótki wstęp pozwalający na przypomnienie (bądź nauczenie) wiadomości wymaganych do rozwiązania zadania znajdującego się na końcu posta. Zadania znajdują się na platformie Scarky.com. Pozycja na Hall of Fame jest uwarunkowana czasem programu. Kompilator ignoruje sygnały systemowe takie jak np. (system ("pause")) dzięki czemu można ich używać bez problemów.

Każdy kompilator potrzebuje wiedzieć w jakim języku pisze i z jakich zasobów wiedzy musi korzystając, do programu dołączamy potrzebne biblioteki (zasoby wiedzy kompilatora), za pomocą polecenia #include oraz wpisanie w nawiasach ostrokątnych (< >) nazwy biblioteki wraz z rozszerzeniem. My w naszych pierwszych programach będziemy korzystać z biblioteki stdio.h. To dzięki dołączeniu tej biblioteki kompilator będzie wiedział o co chodzi nam przez wpisanie w oknie kompilatora poleceń, inaczej mówiąc nauczy się naszego języka.


Program po dołączeniu biblioteki szuka u nas głównej funkcji programu oznaczonej przez użytkownika poleceniem int main(), w następnych postach wytłumaczę czym jest przedrostek int oraz do czego służą nawiasy znajdujące się po main, tymczasem zajmijmy się tym co powinno znaleźć się w funkcji main aby na naszym ekranie cokolwiek się pojawiło. Zasięg naszej funkcji określamy przez wstawienie nawiasów klamrowych ({}), pomiędzy nimi znajduje się wszystko co będzie należeć do tej funkcji.


Skoro zaczęliśmy już nasz program (dodaliśmy bibliotekę i rozpoczęliśmy główną funkcję), dobrze byłoby też pokazać kompilatorowi gdzie kończy się program. Oznaczamy to poprzez wpisanie polecenia return 0;.  Po tym poleceniu program automatycznie się zamknie i zwróci wartość 0, co dla kompilatora oznacza brak błędu. Średnik znajdujący się po zerze oznacza koniec polecenia, tak jak dla nas kropka oznacza koniec zdania.


W tym momencie twój program powinien wyglądać następująco:


#include <stdio.h>
int main(){
    return 0;
}


No dobrze, skoro mamy już ramy dokumentu, możemy je skompilować i uruchomić. W kompilatorze Dev-C++ kompilujemy poprzez naciśniecie klawisza F9. Po naciśnięciu wybieramy miejsce gdzie chcemy zapisać swój projekt, wybieramy jego nazwę i co ważne zmieniamy typ zapisu na: 



Nasz program tylko mignął nam na ekranie, jest to spowodowane tym, że tylko go uruchomiliśmy i zamknęliśmy, zrobił dokładnie to o co go poprosiliśmy, spróbujmy jednak zatrzymać nasz program, aby zobaczyć jak wygląda, aby to zrobić przed poleceniem return 0; wypiszmy prośbę do systemu o zatrzymanie działania programu aż do naciśnięcia jakiegokolwiek klawisza, wstawmy więc tam polecenie system("pause");



Tak powinien wyglądać twój program po naciśnięciu 'F9'. Program uruchamia się w konsoli (to jest to czarne okno) , a skoro mamy już carne okno to wypiszmy na nim jakaś wiadomość, wypisujemy na nim przez wpisanie polecenia printf();, w nawiasach wpisujemy (w cudzysłowach) tekst jaki chcemy aby pojawił się w oknie konsoli. Tym razem wpiszmy tutaj adres tego bloga. Nasz program powinien teraz wyglądać następująco:


#include <stdio.h>
int main(){
    printf("pgprogramowaine.blogspot.com");
    system("pause");
    return 0;
}

A okno konsoli (po naciśnięciu przycisku 'F9') tak:



Jak widać nie wygląda to za dobrze, dlatego po adresie dodajmy znak przejścia do nowej linie (Enter) w C oznacza się go przez wpisanie \n. Wpisujemy to oczywiście jeszcze wewnątrz cudzysłowów zaraz za com. Konsola powinna zmienić się na taką:


Istnieje parę użytecznych znaków specjalnych, jak ten tutaj użyty znak nowej linii, w podsumowaniu dopiszę jeszcze 2 takie znaki, a tymczasem zapraszam do wykonania zadania, powodzenia.





_____________________________________________
PODSUMOWANIE

#include<> - dołączanie biblioteki
stdio.h - biblioteka główna C
int main(){} - funkcja główna (początek programu)
return 0; - zamknięcie programu
system ("pause"); - zatrzymanie programu
printf(); - wypisanie w oknie konsoli
\n - znak nowej linii
\t - znak tabulatora (poziomego)
\b - usunięcie ostatniego znaku
\\ - wypisanie znaku \
\" - wypisanie znaku "

Kompilator (pobieranie i instalacja)

Jeżeli chcesz się nauczyć programować, to na pewno musisz najpierw posiadać jakiś kompilator do uruchamiania naszych przyszłych programów, ja polecam prosty i bardzo wygodny kompilator DEV-C++ (do pobrania TUTAJ). Pobieramy i instalujemy:



#1


#2


#3


#4


#5


#6

#7

#8

#9

#10