C/Pierwszy program

Z Wikibooks, biblioteki wolnych podręczników.
< C

Jak napisać pierwszy program ?

Pierwszy program[edytuj]

Pierwszy, minimalny program, który daje się skompilować i uruchomić:

Tworzymy katalog na nasz projekt. W katalogu tworzymy plik z rozszerzeniem ".c". W konsoli systemu Linux można to zrealizować następująco:

touch program_test_1.c

Następnie przechodzimy do edycji pliku przy pomocy edytora tekstowego ("programistycznego"). Można to wykonać np. edytorem Notepad++ (Windows) lub mcedit, vim, (Linux)

Wpisujemy do pliku treść programu

void main(){}

Należy zaznaczyć, że jest to postać skrajnie "skoncentrowana".

Kompilujemy program. W systemie Linux popularny jest kompilator gcc.

gcc program_test_1.c

Kompilator powinien utworzyć plik wykonywalny o domyślnej nazwie "a.out".

Uruchamiamy program. W konsoli systemu Linux piszemy:

./a.out

Co prawda program nic nie robi, ale możemy go traktować jako szkielet do dalszych prób.

W kompilatorze gcc możemy zmienić nazwę wydawanego programy przy pomocy flagi -o. Przykładowo w konsoli systemu Linux:

gcc program_test_1.c -o test_1.run

Możemy zrobić kod bardziej czytelnym

/*
* Każdy program języka C musi zawierać podprogram (funkcję) o nazwie "main". 
* Jest to pierwszy wykonywany fragment algorytmu
*/

/*
* funkcja "main" nie wydaje żadnych wartości, zatem jest typu "void"
* funkcja "main" nie pobiera żadnych parametrów, zatem ma "puste" nawiasy main()
*/
void
main()
{/* początek bloku funkcji "main" */

    /* miejsce na deklaracje zmiennych */
    /* brak */

    /* miejsce na instrukcje */
    /* brak */

}/* koniec bloku funkcji "main" */

Hello world![edytuj]

własne puts[edytuj]

/*

https://www.quora.com/How-can-I-print-%E2%80%9Cwelcome%E2%80%9D-without-using-in-C
Steve Baker

*/ 

/*
* Marcin Kulbaka 2021
*/

/*
* Deklaracja funkcji "puts". 
* Funkcja służy do wypisywania danych na ekranie.
* Została ona już napisana i wchodzi w skład standardowej biblioteki C.
* Deklaracja podaje jednie nagłówek tej funkcji.
* Mówi, że przy "typowej" kompilacji będziemy korzystać z
* funkcji "puts" zawartej w jakiejś bibliotece (domyślnie - standardowej bibliotece C)
*/
int puts(const char *s);
 

/*
* Funkcja główna "main". Tutaj
*/

int 
main ()
{/* main */

    /*** miejsce na zmienne ***/
    /* brak */

    /*** miejsce na instrukcje ***/

    /* wypisz na ekranie napis przy pomocy funkcji "puts" */
    puts ( "Hello world " ) ;

    /* zakończ funkcję zwracając wartość 0 (domyślnie oznacza to poprawne wykonanie zadania) */
    return 0;

}/* main */

puts z biblioteki standardowej[edytuj]

Przyjęło się, że pierwszy program napisany w dowolnym języku programowania powinien wyświetlić tekst "Hello World!" (Witaj Świecie!). Sam język C nie ma żadnych mechanizmów przeznaczonych do wprowadzania i wypisywania danych, możemy jednak skorzystać z dostępnych rozwiązań - w tym przypadku gotowej funkcji puts, która umieszcza podany tekst na "strumieniu wyjściowym programu", co da nam efekt wyświetlenia napisu na ekranie (podobnie jak w Pascalu używa się do tego procedur. Pascalowskim odpowiednikiem funkcji puts jest writeln).

Funkcja ta jest zawarta w zbiorze wielu gotowych funkcji zwanym standardową biblioteką C (ang. C Standard Library). W języku C deklaracje funkcji zawarte są w plikach nagłówkowych[1]. Taki plik dołączymy do naszego programu przy pomocy dyrektywy #include [2]. Interesuje nas plik stdio.h, zawierający niezbędny dla kompilatora opis funkcji puts, który dołączyć do programu możemy w poniższy sposób:

#include <stdio.h>

W programie definiujemy główną funkcję main, będzie to punkt startu dla naszego programu. Definicja funkcji zawiera jej nazwę, listę przyjmowanych argumentów, typ zwracanej wartości (wyniku) oraz kod funkcji.

int main (void) 
{
   return 0;
}

Nasza funkcja main zawiera tylko jedno polecenie do wykonania: zakończ funkcję z wynikiem 0. Liczba ta będzie zwrócona do systemu operacyjnego jako wynik działania programu. W pierwszej linijce oprócz nazwy funkcji zawarliśmy także informację o typie zwracanej wartości: int (integer), czyli liczba całkowita, a w nawiasach o nie przyjmowaniu żadnych parametrów (słowo void (pustka) w liście argumentów).

Kod funkcji umieszcza się w nawiasach klamrowych { i }, kolejne polecenia rozdzielone są średnikami.

Ostatecznie kod będzie wyglądał jak poniżej:

#include <stdio.h>
int main (void)
{
   puts ("Hello World!");
   return 0;
}

Napisy umieszcza się wewnątrz pary cudzysłowów. Teraz wystarczy program skompilować i uruchomić.

Kompilacja programu[edytuj]

Dotychczas zobaczyliśmy najprostszą kompilację:

gcc plik_z_kodem_programu.c

Przy poprawnej kompilacji (Braku błędów) jest plik wykonywalny "a.out".

Opcja "-o" pozwala zmienić nazwę pliku wyjściowego.

Warto też używać opcji sygnalizujących możliwe błędy, pomimo zgodności z zasadami składni. Typową flagą jest "-Wall". Pozwala ona poznać więcej wątpliwości kompilatora co do naszego programu.

gcc -Wall program_1.c -o program_1.run

Wątpliwości dotyczące kompilacji można poznać nieraz przez poszukiwanie odpowiedzi w Internecie. Przykładem forum z masą pytań jest / było forum Stackoverflow i wyszukiwarki internetowe. Można znaleźć pytania dotyczące typowych problemów z kompilacją.

Nie ukrywam, że język C nie należy do najprostszych i znaczne przerabianie programu prowadzi np. do obecności niewykorzystywanych zmiennych. Stąd ważne jest precyzyjne zdefiniowanie celu kodowania. Jeżeli dobrze wiemy, co mamy zakodować, wówczas praca z językiem C może się zmienić zasadniczo. Problem z praktycznym realizowaniem języka C w swoich projektach jest generalnie znany w świecie.

Uruchomienie programu[edytuj]

Linux[edytuj]

Jeśli nie nadaliśmy innej nazwy przy kompilacji to standardowe wpisujemy w konsoli:

./a.out

Rozwiązywanie problemów[edytuj]

Jeśli nie możesz skompilować powyższego programu, mogłeś popełnić literówkę przy przepisywaniu go. Więcej informacji o kompilacji tutaj.

Jeśli udało Ci się pomyślnie skompilować i uruchomić program, jest możliwe, że jedyne co zaobserwowałeś to mignięcie okienka konsoli. Dzieje się tak, ponieważ nasz program wraz z wykonaniem swojego zadania (wypisanie komunikatu) kończy działanie, nie czekając na reakcję użytkownika. Problem nie występuje, jeśli uruchomimy aplikację z poziomu linii poleceń (np. w oknie konsoli).

Dodajmy do naszego programu polecenie wczytania pojedynczego znaku z wejścia (w zwykłym przypadku oznacza to oczekiwanie, aż użytkownik wciśnie jakiś klawisz na klawiaturze) - zadanie to wykona funkcja getch.

#include <stdio.h>
int main (void)
{
   puts ("Hello World!");
   getch();
   return 0;
}

Tym razem program nie może zakończyć działania, póki nie wczyta znaku - dopiero po naciśnięciu dowolnego klawisza zamknie się okno konsoli (w przypadku zwykłego uruchomienia programu). Nasz pierwszy program gotowy!

Zobacz również[edytuj]


Przypisy

  1. pliki te posiadają najczęściej rozszerzenie .h (lub .hpp, które zwykło się stosować w języku C++). Rozszerzenie nie ma swych "technicznych" korzeni - jest to tylko pewna konwencja.
  2. Przed procesem kompilacji, w miejsce tej dyrektywy wstawiana jest treść podanego pliku nagłówkowego, dostarczając deklaracji funkcji