Zajęcia pierwsze – printf, scanf, zmienne, operacje na liczbach


Poniżej znajdują się materiały do pierwszych zajęć z programowania w języku C, napisane na potrzeby przedmiotu Informatyka 1 na studiach niestacjonarnych.

s01e01-hello_world.c

Nasz pierwszy program w języku C nie jest zbyt elegancki, czy też poprawny. Wystarcza jednak w zupełności do wypisania na ekranie powitalnego komunikatu „Hello World!„. Program składa się z funkcji głównej „main„, której jedynym działaniem jest wywołanie innej – zewnętrznej – funkcji „printf„.

Na podstawie tego przykładu możemy poznać podstawy składni języka C.

  • Polecenia kończone są znakiem średnika.
  • W nawiasach okrągłych znajdują się argumenty funkcji. Funkcja main nie posiada argumentów, zaś wywołanie printf posiada jeden argument „Hello World!”.
  • Ciągi znaków (tekst) zapisywane są pomiędzy znakami cudzysłowu.
  • Treść definiowanej funkcji znajduje się wewnątrz nawiasów klamrowych.
main(){    printf("Hello World!");}

Plik taki zapisujemy pod przykładową nazwą, np. s01e01-hello_world.c. Rozszerzenie .c oznacza, że dany kod napisany został w języku C. Kod C++ oznaczony jest rozszerzeniem .cpp.

Aby zrobić użytek z naszego kodu trzeba go skompilować, czyli zamienić z postaci zrozumiałej dla nas na postać binarną, zrozumiałą dla maszyny. Aby skompilować tak napisany kod wykonujemy w linii komend polecenie:

gcc ./s01e01-hello_world.cpp

Takie wywołanie polecenia spowoduje wyświetlenie kilku ostrzeżeń i utworzenie pliku a.out. Uruchomienie tego pliku powinno wyświetlić w wierszu poleceń wspomniane powitanie.

s01e02-hello_world_extended.c

Drugi program poprawia nasz poprzedni, dodając kilka nowych elementów. Są to:

  • komentarze „od do” działające od wystąpienia kombinacji ukośnika i gwiazdki do zamknięcia tego znacznika, czyli kombinacji gwiazdki i ukośnika. Treść komentarza jest pomijana przez kompilator;
  • komentarze „do końca linijki” oznaczone podwójnym ukośnikiem obowiązują od miejsca wystąpienia do końca linijki;
  • dołączenie biblioteki stdio.h za pomocą polecenia #include <…>, dzięki czemu pozbędziemy się jednego ostrzeżenia przy kompilacji. Stdio.h odpowiada za podstawowe funkcje wejścia-wyjścia (standard input output), w tym funkcje printfscanf;
  • wartość zwracana przez główną funkcję (main), co realizowane jest przez zwrócenie wartości „zero” poleceniem return 0;, a typ danych zwracanych przez funkcję zdefiniowany jest jako int (integer – liczba całkowita) i podana tuż przed definicją funkcji main. Dodanie owego „inta” powoduje zlikwidowanie drugiego ostrzeżenia pojawiającego się podczas kompilacji.
  • w funkcji printf na końcu argumentu dodany został fragment „n” (n – new line), który oznacza przejście kursora do nowej linijki. Dzięki temu po zakończeniu programu kolejne polecenia linii komend wprowadzać będziemy od nowej linijki, a nie zaraz po „Hello World!”.
/* Program wyświetlający powitanie*/#include <stdio.h>int main(){    printf("Hello World!n"); //Wyświetlanie powitania        //Zwracamy wartość funkcji main    return 0;}

s01e03-hello_name.c

Postanowiliśmy nieco spersonalizować nasz witający program. Do tego celu skorzystamy z tablicy znaków imie[], której wartość ustalimy na „Jan„. Zdefiniowanie zmiennej w postaci tablicy znaków poprzedzamy definicją typu: char.

Aby poprawnie wyświetlić nasze nowe powitanie modyfikujemy nieznacznie nasze wywołanie polecenia printf. Posiada ono teraz dwa argumenty:

  • ciąg znaków „Hello %s!n„, który w miejsce %s (s – string) wstawi drugi argument funkcji
  • drugi argument, będący naszą wcześniej zdefiniowaną zmienną – tablicą znaków

Wykonanie takiego programu spowoduje wyświetlenia spersonalizowanego komunikatu powitalnego „Hello Jan!„.

/* Program wyświetlający powitanie*/#include <stdio.h>int main(){    //deklarujemy tablicę znaków    char imie[] = "Jan";        printf("Hello %s!n", imie); //Wyświetlanie powitania        //Zwracamy wartość funkcji main    return 0;}

s01e04-hello_variables.c

Wiemy już, że możemy łączyć ciągi znaków ze zmiennymi i wyświetlać je na ekranie. Poniższy program przedstawia pozostałe możliwości wyświetlania danych wraz z prezentacją innych typów danych niż dotychczas poznane char (znak), char[] (tablica znaków) i int (liczba całkowita).

Nowe typy zmiennych to:

  • unsigned int (int bez znaku, czyli liczba całkowita dodatnia)
  • signed int (int ze znakiem)
  • float (liczba zmiennoprzecinkowa)
  • double (liczba zmiennoprzecinkowa podwójnej precyzji)

Podczas korzystania z polecenia printf stosujemy wtedy następujące fragmenty:

  • %c – znak (c – char)
  • %s – ciąg znaków (s – string)
  • %d lub %i – liczba całkowita (d – digit, i – integer)
  • %f – liczba zmiennoprzecinkowa (f – float)
#include <stdio.h>int main(){    //deklarujemy zmienne    char imie[] = "Jan";    printf("string: %sn", imie);        char litera = 'q';    printf("char: %cn", litera);        char liczba_char = 113; //całkowita 8 bitów    printf("char_c: %cn", liczba_char); //litera q    printf("char_d: %dn", liczba_char); //liczba 113        int liczba_int = 15; //całkowita 32 bity    printf("int: %dn", liczba_int);    unsigned int liczba_uint = 214; //całkowita bez znaku    printf("unsigned int: %dn", liczba_uint);    signed int liczba_sint = -12; //całkowita ze znakiem    printf("signed int: %dn", liczba_sint);        float zmiennoprzecinkowa_float = 7.3; //4 bajty    printf("float: %fn", zmiennoprzecinkowa_float); //wyświetli 7.300000    double zmiennoprzecinkowa_double = 9.87; //8 bajtów    printf("double: %fn", zmiennoprzecinkowa_double); //wyświetli 9.870000        //Zwracamy wartość funkcji main    return 0;}

Podczas zajęć pojawiło się pytanie o sens stosowania float, kiedy double wydaje się być lepszym rozwiązaniem – ma 8 bajtów, czyli pomieści znacznie więcej informacji o zmiennej. Póki projektujemy proste aplikacje nie ma to większego znaczenia i z powodzeniem możemy stosować oba typy zamiennie, a dla pewności zawsze stosować double. Kiedy jednak nasza aplikacja musi krytycznie podchodzić do zarządzania pamięcią i szybkością działania należy zwrócić uwagę, aby używać „mniejszych” typów danych (np. float zamiast double, czy short int zamiast int) gdzie jest to tylko możliwe. Język C bardzo często używany jest właśnie wtedy, gdy zależy nam i na jednym, i na drugim. Po skompilowaniu naszego programu może się okazać, że proste zsumowanie dwóch wartości zajmie nam niepotrzebnie dwa razy więcej cykli maszynowych. 

s01e05-hello_variables_extended.c

W kolejnym programie dodajemy kolejny klocek do naszego programu. W poleceniu printf pojawił się znacznik t oznaczający znak tabulacji. Dzięki niemu możemy uporządkować wyświetlany tekst w kolumnach.

Na końcu pojawił się również enigmatycznie wyglądający fragment %6.3f. Oznacza on, że daną typu float należy wyświetlić  z dokładnością do trzech miejsc po przecinku i wyświetlić łącznie sześć znaków. Dlatego dla zmiennej definiowanej jako 3.1416 wyświetlone zostanie _3.142, gdzie _ (podkreślenie) oznacza spację.

#include <stdio.h>int main(){    //deklarujemy i wyświetlamy zmienne    char imie[] = "Jan";    printf("string:tt%sn", imie);    double zmienna = 3.1416;    printf("double_z:t%6.3fn",zmienna);        //Zwracamy wartość funkcji main    return 0;}

s01e06-printf.c

Poza użytymi już wcześniej znakami nowej linii (n) i tabulacji (t) używamy również:

  • ” – do wyświetlenia cudzysłowu
  • \ – do wyświetlenia znaku odwróconego ukośnika
#include <stdio.h>int main(){    printf(""Pierwsza linijkandruga linijkan"");    printf(""Tabulacje:t1t2t3n"");    printf(""Cudzysłów ""poprzedzamy znakiem \ (backslash)"" - pamiętaj!n"");        return 0;}

s01e07-printf-liczby.c

W języku C obowiązuje prosta arytmetyka. Poniższy przykład prezentuje podstawowe działania na zmiennych


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *