C/Pierwszy program

< 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