TI/Włączanie kodu w innych językach

Z Brain-wiki

Spróbujmy tu podystkutować co ma to zawierać, bo w tej tabelce to jest mało miejsca.

  • język skryptowy vs kompilowany? na przykładzie pythona i C, trochę o tym, że jest cPython i inne pythony i wstępniak, że sami możemy coś w C sobie włączyć do pythona i po to będziemy mówić o C.
  • hello world w C ?
  • opis procesu kompilacji, plików, które powstają?
  • instrukcja include i jej uzycie? Gdzie szukać tych plików, które tam są? jak je samemu tworzyć?
  • prosty makefile?
  • sposób korzystania z tablicy w C, sumowanie liczb od 1 do n w C? iloczyn skalarny. I może kilka innych prostych ćwiczeń? metoda korzystania z wejścia/wyjścia podana na pamięć, bez zrozumienia, deklaracje zmiennych, typy zmiennych, i to tyle samodzielnego działania z C, a dalej już korzystanie z cudzych dóbr? Powyższe w 4 h się zmieści?
  • włączenie tego własnego iloczynu skalarnego do pythona
  • tak jak Dobi radził -- w przypadku przykładów z numrical costam nacisk na problemy typu "nie mam biblioteki ktorej ten program wymaga"?
  • swig? boost? "ręczne" włączanie?
  • omówienie proces kompilacji programu w C/C++ (pre-procesor, kompilator, linker)
  • Przy pre-procesorze problem plików nagłówkowych (gdzie szukać jak rozwiązywać problemy z makrami itp) czy co robić się nie kompiluje bo czegoś brakuje :)
  • biblioteki statyczne (*.a) i współdzielone (*so).
  • problemy z linkowanie (brak symboli) bibliotek itp
  • zmienna LD_LIBRARY_PATH
  • "maglowanie" nazw (kod C/C++) problemy z wersjami kompilatorów.
  • współdziałanie kodu napisanego w różnych językach (dlaczego to działa) może nie od razu do Pythona (tylko C/C++/Fortran) - jak mapują się typy i stos.
  • to samo tylko dla Python'a
  • makefile jak najbardziej może warto wspomnieć o automatach do ich generowania (np.tmake)
  • configure (ale od strony użytkownika a nie sposobu jego generowania)

Język C

Język C kochamy z wielu powodów. Przede wszystkim za jego piekno, uniwersalność, prostotę, finezję i szybkość. Jednym z pobocznych powodów jest też łatwo dostępny manual — wystarczy po prostu napisać man nazwafunkcji w terminalu. Czasami trzeba napisać man 3 , jeżeli dostępna jest funkcja systemowa o tej samej nazwie.

Języka C nienawidzimy również z wielu powodów. Wymaga on od nas ogromnej dyscypliny w programowaniu — musimy pamiętać o deklaracji zmiennych, definiowaniu funkcji w odpowiedniej kolejności, a jeżeli nie korzystamy z jakiejś sprytnej biblioteki też o alokowaniu potrzebnej pamięci np. na tablice; nie jest językiem interpretowalnym, więc musimy kompilować nasze programy, co zwykle polega na byciu obrzuconym nie do końca czytelnymi dla nas informacjami o błędach przez kompilator; a do tego jeszcze na końcu każdej instrukcji postawić należy średnik. Oprócz instrukcji, na których końcu nie wolno tego robić — jak na przykład pętle, bo program nie wywoła instrukcji, które są w pętli. Powodów nienawiści jest oczywiście dużo więcej. Tutaj wymieniliśmy jedynie kilka z nich.

Podstawy składni

Bloki instrukcji zawierają się w nawiasach klamrowych {, }. Zwykle zagłębione bloki w pętlach i warunkach zaznacza się również za pomocą wcięć, nie są one jednak kluczowe w poprawnym działaniu programu, przeciwnie do Pythona. Pojedyncze instrukcje kończy średnikk ;.

Polecenie printf

Szczegółowy opis polecenia printf i fprintf znajduje się przetłumaczonym na polski manualu.

Zadanie

Spróbuj napisać program przeprowadzający operacje matematyczne i wypisujący ich wynik na ekran. Do wypisywania użyj polecenia print znajdującego się w pliku stdio.h:

#include <stdio.h>

int main(){
        printf("%i\n",5*6);
        printf("%i\n",1/2);
        printf("%f\n",1./2);
        return 0;
}

Zmienne

W C zmienne muszą zostać zadeklarowane, nie wystarczy ich zadeklarować jak w Pythonie. Zmienne możemy deklarować w każdym miejscu programu. Deklaracja zmiennej składa się z podania jej typu i nazwy — int licznik

Przykładowe typy zmiennych:

  • int — całkowity
  • short int — krótki całkowity
  • long int — długi całkowity
  • double — zmiennoprzecinkowy o podwójnej precyzji
  • float — zmiennoprzecinkowy o pojedynczej precyzji
  • char — znak

Zmienne mogą być signed — całkowite, bądź unsigned — naturalne.

Zmienne można zainicjalizować bezpośrednio przy deklaracji — int licznik = 0; lub w kodzie po deklaracji — licznik = 0;. Jeżeli zmienna nie zostanie zainicjalizowana, przyjmuje wartość pseudolosową.

Staramy się w mniej oczywistych miejscach kodu pisać komentarze. Jeżeli chcemy zapisać komentarz w jednej linijce robimy to po znakach //, jeżeli miałby być dłuższy, rozpoczynamy go znakami /*, a kończymy */.

Zadanie

Napisz program, w którym zmienna licznik zostanie zadeklarowana i zainicjalizowana z wartością 5. Zwiększ ją o jeden używając operatorów: +, +=, oraz operatorem inkrementacji prefiksowanym i suffiksowanym (++licznik; oraz licznik++;). Zmiennym nadajemy nazwy, które umożliwią zrozumienie działania programu (po analizie kodu) po 2,3,…,40,80 tygodniach. Zmienne te powinny umożliwić zrozumienie programu także osobie postronnej, która zmuszona jest czytać kod programu. Po każdym zwiększeniu licznika o jeden wypisz jego wartość.

Wyrażenie warunkowe

W C operator przypisania jest pojedynczym =. == oznacza warunek równości. != oznacza warunek nierówności. Operator iloczyn logiczny przedstawia się &&, a suma logiczna ||. Pojedyncze & i | oznaczają te same operacje bitowe.

Wyrażenie warunkowe jest następującej postaci:

if (warunek){
        
        
}
else{
        
        
}

Pętle

Pętla while

Wróć do poprzedniego zadania. O ile łatwiejsze byłoby, gdyby można było skorzystać z pętli. Pętla while ma następującą konstrukcję:

while(WARUNEK){


}

Przy każdym wykonaniu pętli kompilator sprawdza, czy warunek jest prawdziwy. Jeżeli warunek jest fałszywy przechodzi do następnej po pętli while instrukcji. Jeżeli warunek jest prawdziwy, wykonuje instrukcje wewnątrz pętli jeszcze raz.

Zadanie 1

Zwiększ zmienną licznik o 4, korzystając z pętli while i wypisz wynik końcowy.

Zadanie 2

Napisz program wypisujący pięć kolejnych wyrazów ciągu [math]\frac{1}{i^2}[/math].

Zadanie 3

Napisz program dodający pierwsze dziesięć wyrazów ciągu [math]\frac{1}{i^2}[/math] od początku i od końca.

Pętla for

O ile wygodniej byłoby skorzystać z pętli for. Umożliwia ona wpisanie ustawiania zmiennej, sprawdzania warunku i operacji na zmiennej (zwykle zwiększenia bądź zmniejszenia zmiennej, która jest ustawiana i której warunek jest sprawdzany) w jednej linijce co często zwiększa (lub wręcz przeciwnie) czytelność kodu. Instrukcję for stosuje się w następujący sposób:

 for (ustawienie; warunek; operacja) {
   /* instrukcje do wykonania w pętli */
 }
 /* dalsze instrukcje */

Pętla for jest w języku C szalenie wygodną i elastyczną konstrukcją, mimo że na pierwszy rzut oka nie sprawia takiego wrażenia.

Przyjrzyjmy się raz jeszcze jej konstrukcji:

  • ustawienie — jest to instrukcja, która będzie wykonana przed pierwszym przebiegiem pętli. Zwykle jest to inicjalizacja zmiennej bądź zmiennych, która będzie służyła jako "licznik" przebiegów pętli,
  • warunek — jest warunkiem zakończenia pętli. Pętla wykonuje się tak długo, jak prawdziwy jest ten warunekm
  • operacja — jest to instrukcja, która wykonywana będzie po każdym przejściu pętli. Zamieszczone są tu instrukcje, które zwiększają licznik o odpowiednią wartość.

Poszczególne instrukcje składające się na ustawienie, warunek i operację, oddzielone są od siebie przecinkiem. Samo ustawienie oddzielone jest od warunku średnikiem, tak samo, jak warunek od ustawienia i operacji.

Jeżeli wewnątrz pętli nie ma żadnych instrukcji continue (opisanych niżej) to jest ona równoważna z:

 {
   wyrażenie1;
   while (wyrażenie2) {
     /* instrukcje do wykonania w pętli */
     wyrażenie3;
   }
 }
 /* dalsze instrukcje */
Zadanie

Przepisz rozwiązania zadania na pętlę while tak, żeby korzystały z pętli for.

Zastanów się, czy możesz pętle sformuować tak, żeby wewnątrz niej nie było żadnej instrukcji.

Pętla do...while

Zadania

Wskaźniki i tablice

Problem wejścia/wyjścia

Funkcje