Wstęp do informatyki

Semestr zimowy
Materiały archiwalne

Część zajęć będzie się odbywać w laboratorium komputerowym, pozostałe będą prowadzone w trybie "tablicowym".

W laboratorium będziemy pracowali w systemie Linux. Programy będziemy pisać w języku C. Ze względu na prawie stuprocentową przenośność kodu w języku C, można będzie testować tworzone w LABie programy w innych środowiskach programistycznych, takich, jak popularne w systemie Windows środowiska Microsoft Visual Studio lub Clang.

Aktualności

W tym tygodniu będzie dodatkowe kolokwium dla osoby, która ma usprawiedliwioną nieobecność na grudniowym "kolokwium dla wszystkich". Będzie to także kolokwium ostatniej szansy na zaliczenie ćwiczeń dla osób, którym (choć przykładali się do nauki w trakcie semestru) grozi sytuacja przeciwna. Termin tego kolokwium ustalimy na najbliższych zajęciach.

Najbliższe zajęcia odbędą się nie w laboratorium komputerowym, tylko w sali.

Pisząc programy, zachowujcie Państwo ich czytelną strukturę i dodawajcie wyraziste komentarze - co prawda kompilatorowi jest obojętne, jak zapisujecie program (byleby tylko syntax był poprawny) - ale za to Wam będzie znacznie wygodniej je czytać, sprawdzać, analizować...

Polecana lektura na jesienne weekendy: B.Kernighan, D.Ritchie Język ANSI C, WNT. (dzieło popularnie zwane krótko "K&R").

Treści omawiane na zajęciach

21.01.09., SALA

Arytmetyka zmiennoprzecinkowa.

  1. ?

Praca domowa

To jeszcze nie jest ostateczna wersja pracy domowej.

14.01.09., SALA

QuickSort i jego koszt w niektórych przypadkach skrajnych. Procedura Partition. Stabilizacja sortowania.

Praca domowa

To jeszcze nie jest ostateczna wersja pracy domowej.

  1. Jak wyszukiwać lidera kosztem liniowym?
  2. Zapisz kolejne etapy sortowania ciągów:
    • 1,2,3,4,5 (tak, tak, on już jest uporządkowany rosnąco!) oraz
    • 5,4,3,2,1.
    Do sortowania użyj
    • HeapSorta
    • QuickSorta
    w wersjach takich, jak zdefiniowano na wykładzie.
07.01.09., SALA

MergeSort. Implementacja i koszt. Zastosowania sortowania w innych zadaniach. Wyszukiwanie lidera kosztem O(n log(n)).

17.12.08., SALA

HeapSort i jego implementacja

  1. Tworzenie kopca, procedura DownHeap w wersji rekurencyjnej (implementacja).
  2. HeapSort, implementacja.

Praca domowa

Zastanawiałem się, czy pod choinkę nie podarować Państwu większej liczby zadań ;-) ale ostatecznie zostałem przy typowym zestawie.

Rozwiązania zadań 2 i 3 (kody źródłowe i pliki textowe z wynikami) należy przesłać mailem w/g standardowych reguł (przypominam o dobrych komentarzach!) do środy, 07.01.09. do godz. 9:00. Zadanie 1 nie będzie osobno oceniane (jest elementem rozwiązania zadania 2.)

  1. Popraw naszą rekurencyjną implementację DownHeap tak, by procedura wskazywania elementu do zamiany była mniej skomplikowana.
  2. Zaimplementuj funkcję HeapSort sortowania tablicy n liczb rzeczywistych. Wynikiem funkcji ma być liczba wszystkich wykonanych porównań elementów tablicy, jakie wystąpiły w trakcie procesu sortowania. Następnie opracuj program, który dla n=2k, gdzie k=2..12, wyznacza stosunek liczby wszystkich wykonanych porównań (zwracanej przez funkcję HeapSort) do n log(n), w 3 przypadkach, gdy dane w tablicy:
    1. są posortowane rosnąco,
    2. są posortowane malejąco,
    3. są liczbami losowymi.

    Wynikiem działania programu powinna być tabelka o 3 kolumnach i 11 wierszach. Uwaga: wszystko wymaga testowania, także Twoja implementacja HeapSorta. Aby więc Twój program (przy okazji głównego zadania) dodatkowo testował poprawność implementacji, zmuś go, by po każdym wywołaniu HeapSort sprawdzał, czy tablica faktycznie została posortowana. To znaczy, że musisz opracować jeszcze jedną dodatkową funkcję IsSorted, która sprawdza, czy dana tablica jest faktycznie posortowana rosnąco, czy nie.

  3. Zrób zadanie poprzednie, z HeapSort zamienionym na QuickSort. W implementacji postępuj według idei z wykładu. Pamiętaj, aby nie przepisywać wprost kodu ze skryptu, Twój QuickSort ma po prostu posortować rosnąco elementy tablicy.
10.12.08., SALA

Kopce i ich własności.

  1. Liczba elementów a liczba poziomów.
  2. Reprezentacja tablicowa i funkcje dostępu.
  3. Własność kopca w przykładach.

Zadanie o fladze polskiej (wersja z dodatkową tablicą i wersja bez dodatkowej tablicy (in situ), ta druga nieoptymalna).

Porównanie wersji z buforem tablicowym (w istocie korzystaliście Państwo z niego jak ze stosu) i wersji rekurencyjnej (a więc w istocie: ze stosem) programu wypisującego liczbę w systemie o zadanej podstawie.

Praca domowa

  1. Przygotuj się bardzo dobrze do kolokwium, które odbędzie się na najbliższym wykładzie!
  2. Napisz funkcję, której parametrami są: nazwa tablicy z "kulami" i rozmiar tej tablicy. Funkcja ma rozwiązywać in situ zadanie flagi polskiej bez zbędnych przestawień (a więc mądrzej, niż w algorytmie opracowanym przez nas na ćwiczeniach). Zadanie oddajemy na kartkach.
  3. Nieobowiązkowe (jako nawiązka za brak pracy domowej w poprzednim tygodniu).
    1. Napisz samodzielnie własne funkcje strcmp oraz strcpy.
    2. Zbadaj, co robią strncmp oraz strncpy i dodaj taką funkcjonalność do poprzednio opracowanych funkcji.
03.12.08., SALA

O stringach i funkcjach na nich działających.

  1. strcpy (kopiowanie), strcmp (porównywanie), strlen (długość), sprintf (formatowana konwersja do stringa), itd...
  2. Własna implementacja jednej z tych funkcji.

Analiza algorytmu potęgowania z wykładnikiem naturalnym (poprawność, koszt, operacja dominująca).

Praca domowa

Nie ma pracy domowej.

26.11.08., SALA

Przekierowanie stdin i stdout: ./program < wejscie.txt > wyjscie.txt

Pierwsza dygresja o wskaźnikach: co, jak i po co. Pliki tekstowe w C:

  1. fopen, fclose
  2. fprintf, fscanf
  3. getc, putc, EOF, do samodzielnego przyswojenia: getchar, putchar.

    Uwaga: funkcja getc zwraca wynik typu int, tzn. jej prototyp to: int getc(FILE *fp) (na zajęciach błędnie podałem Państwu, że wyniki getc są typu char)

  4. Program kopiujący zadany plik na stdout.

Praca domowa

Pierwsze zadanie oddajemy na kartkach, dwa ostatnie - wysyłamy kod źródłowy e-mailem. Zasady te same, co zwykle.

  1. W programie wyznaczającym maksymalną podsumę wskaż instrukcję dominującą (zgodnie z definicją z wykładu). Wyznacz optymistyczny i pesymistyczny rząd kosztu tego algorytmu, uwzględniając jedynie działania: dodawania, odejmowania, mnożenia, dzielenia i porównywania. Odpowiedź oczywiście uzasadnij.
  2. Napisz program, który wypisuje na ekran zawartość wskazanego przez użytkownika pliku tekstowego, zastępując znaki tabulacji dwuznakiem '* ' (gwiazdką i spacją). Testuj np. na kodzie swojego programu. Pamiętaj, że użytkownik może podać nazwę pliku, który nie istnieje!
  3. Napisz program, wypisujący na ekran podaną przez użytkownika liczbę całkowitą w systemie dwójkowym, lub w systemie o dowolnej innej bazie nie większej od 10 (dla chętnych: nie większej od 16), np.
    
    Podaj bazę do konwersji:
    2
    Podaj liczbę do konwersji:
    12
    (12)_10 = (1100)_2
    
    
    Podaj bazę do konwersji:
    3
    Podaj liczbę do konwersji:
    12
    (12)_10 = (110)_3
    
    
19.11.08., SALA

Twierdzenie o rekurencji uniwersalnej dla T(n) = a T(n/b) + f(n).

  1. Przykłady konkretne.
  2. Dowód tw. o r.u. dla przypadków, gdy n jest potęgą b (niedokończony, dokończenie na następnych ćwiczeniach).

Praca domowa

Rozwiązania zadań należy zapisać na kartkach i oddać na następnych ćwiczeniach.

  1. Znajdź i popraw błędy w programie c8-przeglad-tablicy-blad.c. Rozwiązaniem jest opis (objaśnienie) błędów i poprawienie ich przez wskazanie poprawionych linii kodu. Zadanie oddajemy na kartkach.
  2. W tym zadaniu n/2 oznacza podłogę z n/2. Przeprowadź przez indukcję (nie korzystając z tw. o r.u.) dowód, że każda z rekurencji
    • T(n) = 2 T(n/2) + n
    • T(n) = 2 T(n/2 + 4) + n
    ma rząd asymptotycznie równy n log2n (od podobnego - lecz prostszego - zadania rozpoczęliśmy ćwiczenia).
  3. Korzystając (lub nie, jak kto woli) z podanego na ćwiczeniach tw. o r.u. oblicz rzędy (oszacowanie górne i dolne) kosztów T(n), jeśli
    1. T(n) = T(n/2) + 2
    2. T(n) = 2 T(n/2) + log2n
    3. T(n) = 2 T(n/2) + n2
12.11.08., SALA

Rekurencja, cd. Koszty różnych algorytmów cd.

  1. Permutacje tablicy in situ.
  2. Zadanie skoczka szachowego przez metodę rekurencyjnego próbowania ruchów (tzw. algorytm z powrotami).
  3. Pesymistyczny i optymistyczny koszt FFT.
  4. Wariacje na temat obliczania wartości wielomianu w punkcie. Idea algorytmu Hornera.

Praca domowa

Pierwsze zadanie - do oddania na kartkach. Rozwiązania dwóch ostatnich zadań należy przesłać na mój adres email, piotr.krzyzanowski@mimuw.edu.pl, do najbliższej środy, do godz. 9:00 (decyduje chwila dotarcia wiadomości do mojej skrzynki pocztowej). Uwagi wstępne:

  • Proszę koniecznie podpisywać swoje e-maile!
  • Rozwiązania proszę opatrzyć komentarzami, niedostatek komentarzy obniża punktację.

A oto właściwa praca domowa.

  1. Niech Fn oznacza koszt algorytmu FFT, o którym była mowa na ćwiczeniach. Udowodnij (lub obal) tezę, że przy używanych przez nas oznaczeniach, 2 c n log2n <= Fn <= c n2 dla każdego n.
  2. Dla zadania skoczka szachowego, zaimplementuj algorytm z powrotami. Program ma wczytywać z klawiatury rozmiar szachownicy N oraz początkowe współrzędne skoczka (x,y). Wynikiem działania programu ma być szachownica z numerami kolejnych ruchów skoczka. Na przykład, dla N=5 oraz (x,y)=(1,1) wynikiem mogłaby być tablica:
    
     1 10 15 20 25 
    16 19 24  9 14 
    11  2 17  6 21 
    18 23  4 13  8 
     3 12  7 22  5 
    
    
    Warianty dla chętnych (poza konkursem):
    • skoczek na ostatnim polu ma szachować pole wyjściowe
    • program ma generować wszystkie możliwe drogi skoczka
  3. Zapisz w postaci funkcji w C (bez użycia rekurencji) algorytm Hornera wyznaczania w zadanym punkcie x wartości wielomianu

    w(x)\,=\,a_0+a_1x+\cdots+ a_nx^n

    o współczynnikach rzeczywistych, oparty na idei, że

    w(x)\,=\,(\cdots(a_nx+a_{n-1})x+a_{n-2})x+\cdots+a_1)x+a_0

    Argumentami tej funkcji mają być: tablica współczynników wielomianu, stopień wielomianu n oraz wartość x. Wynikiem działania funkcji ma być oczywiście wartość wf(x) wielomianu w punkcie x.

    Porównaj koszt tego algorytmu z kosztem algorytmu opracowanego na ćwiczeniach (uwzględniając tylko operacje arytmetyczne na zmiennych typu "rzeczywistego") - wynik porównania zamieść w komentarzu w pliku źródłowym.

    Dobrze napisanej funkcji powinien towarzyszyć mały program testujący, zatem zamieść taki program testujący w swoim rozwiązaniu zadania o algorytmie Hornera. Robimy to tak: powiedzmy, że chcemy w pliku c7-silnia.c zapisać funkcję unsigned int silnia(unsigned int n). Jej implementacja mogłaby wyglądać następująco:

    
    unsigned int silnia(unsigned int n)
    {
    	int s = 1; /* zwracana wartość silni */
    	int i;
    	
    	/* implementacja nierekurencyjna */
    	for(i = 2; i < n; i++) 
    		s *= i;
    	return(s);
    }
    
    

    Ponieważ nie wiemy z góry, czy nie popełniliśmy jakiegoś drobnego błędu w implementacji (akurat powyżej popełniliśmy błąd! - wykonanie testu od razu go wychwyci!), warto mieć możliwość uruchomienia prostego programu, któryby testował działanie naszej funkcji- na przykład, wypisując pierwszych kilka wartości. W tym celu do pliku źródłowego dołąćczymy warunkowo małą funkcję main(), która zostanie skompilowana tylko wtedy, gdy będzie zdefiniowana stała DEBUG:

    
    unsigned int silnia(unsigned int n)
    {
    	int s = 1; /* zwracana wartość silni */
    	int i;
    	
    	/* implementacja nierekurencyjna */
    	for(i = 2; i < n; i++) 
    		s *= i;
    	return(s);
    }
    
    #ifdef DEBUG
    /* 
    skompiluj 
    	gcc -DDEBUG -o c7-silnia c7-silnia.c, 
    aby wygenerować program testujący funkcję silnia() 
    */
    
    	#include <stdio.h>
    
    	int main(void)
    	{
    		int k;
    
    		printf("Test funkcji silnia():\n");
    		for(k=0; k <= 10; k++)
    			printf("\t%2d! = %d\n",k,silnia(k));
    
    		return(0);
    	}
    #endif
    
    

    Teraz, mogę skompilować tylko samą funkcję:

    
    gcc -c c7-silnia.c
     
    

    (wynik kompilacji znjadzie się w pliku c7-silnia.o), ale mogę też skompilować i funkcję, i towarzyszący jej program testujący, a następnie uruchomić go:

    
    gcc -DDEBUG -o c7-silnia c7-silnia.c
    ./c7-silnia
     
    
05.11.08., SALA

Rekurencja.

  1. Ciąg Fibonacciego, wersja rekurencyjna i nierekurencyjna. Wzór na koszt.
  2. Wieże Hanoi. Rozwiązanie rekurencyjne i jego koszt.
  3. Zadanie konika szachowego (niedokończone).

Praca domowa

Zadana na ćwiczeniach.

Programy proszę przysłać wg standardowych zasad, zadanie tekstowe oddajemy na kartkach na początku zajęć.

29.10.08., LAB

Dalsze programy w języku C.

  1. Dla zadanej tablicy liczb całkowitych A rozmiaru N wyznaczyć indeksy m oraz M takie, że m < M oraz suma s(m,M) = A_m + A_{m+1} + ... + A_{M-1} jest największa możliwa. Wypisać m, M oraz s(m,M). [Źródło: Kolokwium WdI, 2006]
    1. Utwórz funkcję int fibonacci(int n) i wykorzystaj ją w programie do wypisania pierwszych K wyrazów ciągu Fibonacciego.
    2. Sprawdź jej działanie dla K = 0, 1, 2, 3, 10, 30, 60, 1000.
    3. Aby uniknąć problemu dla większych K, musimy użyć typu bogatszego od int. Listę dostępnych typów całkowitych można przejrzeć na Wikipedii. Najszerszym dostępnym dla nas typem będzie unsigned long long int.
    4. Zmierz czas działania programu stosującego wersję rekurencyjną i porównaj z czasem działania wersji nierekurencyjnej, np. dla K=40. Czas działania programu o nazwie test sprawdzamy poleceniem time ./test. Aby dowiedzieć się więcej o poleceniu time, wystarczy wpisać w terminalu: man time.
  2. Zaimplementuj rekurencyjną i nierekurencyjną wersję funkcji int silnia(int n). Porównaj ich działanie w sposób podobny jak dla liczb Fibonacciego.
  3. Wykonaj te same czynności co w poprzednim zadaniu, definiując funkcję double wyrazexp(double x, int n), obliczającą tym razem n-ty wyraz ciągu (xn/n!).
  4. W jaki sposób rozwiązywać zadanie wież Hanoi? Powstrzymaj się od czytania artykułu z Wikipedii i samodzielnie spróbuj znaleźć rozwiązanie!

Praca domowa

Rozwiązania, dwóch pierwszych zadań - zestaw liczb, o których w nich mowa - należy przesłać na mój adres email, piotr.krzyzanowski@mimuw.edu.pl, do najbliższej środy, do godz. 9:00 (decyduje chwila dotarcia wiadomości do mojej skrzynki pocztowej). Uwagi wstępne:

  • Proszę koniecznie podpisywać swoje e-maile!
  • Proszę opatrzyć wyniki oznaczeniami (która liczba co znaczy).
  • Proszę wykonać pozostałe zadania przewidziane na bieżące zajęcia. W razie wątpliwości, służę konsultacjami.

A oto właściwa praca domowa. Z pewnych powodów, które zbyt długo by tutaj omawiać, pracę domową należy wykonywać wyłącznie na komputerach w studenckim labie!

  1. Zmierz (w sekundach) czas potrzebny dla obliczenia 45. wyrazu ciągu Fibonacciego algorytmem rekurencyjnym i nierekurencyjnym (obie wersje były omawiane na ćwiczeniach). Rozwiązaniem zadania są trzy liczby: zaokrąglone do pełnych sekund czasy dla wersji rekurencyjnej i nierekurencyjnej oraz wyznaczona wartość 45. wyrazu ciągu Fibonacciego.
  2. Korzystając z funkcji double wyrazexp(double x, int n) opisanej w zestawie zadań ćwiczeniowych, oblicz jej wartość dla x=200, n=1000 (tzn. policz, ile to jest xn/n! dla zadanych wartości parametrów). Ponadto sprawdź, dla jakiego n, wartość tej funkcji jest mniejsza od 1/2 (przy ustalonym x=200). Rozwiązaniem są dwie liczby szukane w zadaniu.

    Aby drukować liczbę x typu double, użyj polecenia w stylu

    printf("Liczba x = %e \n", x);

    (formatka, której używaliśmy dla typu float, tzn: printf("Liczba x = %f \n", x); będzie dawała błędne wyniki dla zmiennych typu double.

22.10.08., LAB

Dalsze programy w języku C.

  1. Napisz program, który wyznacza najmniejszy element w zadanej tablicy liczb całkowitych. Opracuj jego wariant, wyznaczający najmniejszy co do modułu element takiej tablicy. Co trzeba zmienić w tym programie, by akceptował liczby typu float?
  2. Napisz program, który liczy średnie: arytmetyczną, kwadratową i harmoniczną z zadanej tablicy liczb rzeczywistych typu float. Następnie dodatkowo zrób jego wersję dla tablicy liczb typu całkowitego. Przydatne funkcje: sqrt, znajduje się ona w bibliotece matematycznej. Prototyp sqrt znajduje się w pliku nagłówkowym: #include <math.h>. Kompilacja: gcc -o srednie srednie.c -lm (dyrektywa -lm dołącza z biblioteki matematycznej funkcje niezbędne w tym programie)
  3. Napisz program, który wypisuje kolejne całkowite potęgi zadanej liczby rzeczywistej, od zerowej, do dwunastej.
  4. Napisz program, który wyznacza n! dla zadanego całkowitego n. Uwzględnij także przypadki patologiczne.
  5. Ciąg Fibonacciego określony jest wzorem rekurencyjnym: Fn+2=Fn+1 + Fn. Napisz program, znajdujący k-ty wyraz ciągu Fibonacciego, gdy F0=0 oraz F1=1. Dodatkowe: zmodyfikuj program tak, by można było zadawać dowolne wartości F0 oraz F1.
  6. Nadprogramowe, jak na razie, a więc - tylko dla chętnych: Napisz procedurę, która wypełnia zadaną tablicę (pseudo)losowymi liczbami całkowitymi. Napisz analogiczną procedurę, wypełniającą tablicę (pseudo)losowymi liczbami rzeczywistymi z przedziału [0,1]. Przydatne funkcje: rand, znajduje się ona w bibliotece standardowej. Dodatkowo stała RAND_MAX. Prototyp rand oraz definicja RAND_MAX znajdują się w pliku nagłówkowym #include <math.h>. Zastosuj tę procedurę w programie liczącym średnie! Pamiętaj o utworzeniu i wykorzystaniu stosownego pliku nagłówkowego. Kompilacja: gcc -o srednie srednie.c tablicelosowe.c -lm.

Praca domowa

Programy, o których mowa w dwóch pierwszych zadaniach - ich kody źródłowe w języku C, a nie pliki wykonywalne - należy przesłać na mój adres email, piotr.krzyzanowski@mimuw.edu.pl, do najbliższej środy, do godz. 9:00 (decyduje chwila dotarcia wiadomości do mojej skrzynki pocztowej). Uwagi wstępne:

  • Proszę koniecznie podpisywać swoje e-maile!
  • Proszę opatrzyć kody komentarzami. Przykładowe dobrze skomentowane kody możecie Państwo znaleźć na blogu, np. program o minimum tablicy, czy program o średnich z tablicy.
  • Proszę wykonać pozostałe zadania przewidziane na dzisiejsze zajęcia. W razie wątpliwości, służę konsultacjami.

A oto właściwa praca domowa:

  1. Napisz program, który dla zadanej szachownicy N x N (przy czym N < 10) wczytuje pozycję Wieży (np. 3 2 oznacza, ze Wieza jest w 3. wierszu i 2. kolumnie szachownicy) i następnie drukuje "szachownicę" z zaznaczonymi polami szachowanymi przez tę Wieżę.

    Przykład dla N=4:

    *******************************************************************
    * Program wskazuje pola szachowane przez Wieżę na szachownicy 4x4 *
    *******************************************************************
    Podaj wiersz i kolumnę, w której ma być Wieża:
    3 2
    Oto pola szachowane:
    	  1 2 3 4
    	1   +     1
    	2   +     2
    	3 + + + + 3
    	4   +     4
    	  1 2 3 4 
    

    W przypadku podania pozycji poza szachownicą (np. "0 20") program ma drukować pustą szachownicę i komunikat o błędzie.

    W programie trzeba będzie sprawdzać spełnienie kilku warunków. Do tego mamy operatory && (logiczne "AND") oraz || (logiczne "OR"). Jak ich używać, widzieliśmy w programie o latach przestępnych, dobrze też sprawdzić w K&R.

    Część nieobowiązkowa. Choć nie będzie to dodatkowo punktowane, osoby chętne mogą następująco upiększyć swój program:

    • zamiast podawać pozycje w postaci "numer_wiersza numer_kolumny", umożliwić podawanie pozycji w notacji szachowej, tzn. zamiast "3 2" pisalibyśmy "c2".
    • dopuścić szachownice wymiaru N < 16.
  2. Napisz program, zliczający w zadanej tablicy typu float rozmiaru N, liczby dodatnie, ujemne i równe zero. Testuj tak, jak robiliśmy to dla średnich, zadając gotową tablicę wprost w kodzie źródłowym.
  3. Sprawdź, korzystając z programu opracowanego na ćwiczeniach, ile wynosi średnia harmoniczna liczb -1, 0, 1. Czy nic Cię nie zdziwiło?
15.10.08., LAB

Dalsze programy w języku C.

  1. Napisz program, który sumuje kolejne _zadane_ potęgi p liczb naturalnych z _zadanego_ zakresu (od k do m), np. k^p + (k+1)^p + ... + (m-1)^p + m^p. Tam, gdzie znasz szybszy sposób obliczenia takiej sumy, wykorzystaj go.
  2. Napisz program, który sprawdza, czy podany rok jest przestępny.
  3. Napisz program, który sprawdza, czy podany napis jest palindromem.

Parę dodatkowych komend Unixa.

  • cp readme.txt kopia.txt (kopiuje plik readme.txt do kopia.txt, ang. copy),
  • mv readme.txt czytajto.txt (zmienia nazwę pliku readme.txt na czytajto.txt, czyli przenosi plik, ang. move),
  • mv WDI WstepDoInformatyki (zmienia nazwę katalogu WDI na WstepDoInformatyki),

Praca domowa

Programy, o których mowa w dwóch pierwszych zadaniach - ich kody źródłowe w języku C, a nie pliki wykonywalne - należy przesłać na mój adres email, piotr.krzyzanowski@mimuw.edu.pl, do najbliższej środy, do godz. 9:00 (decyduje chwila dotarcia wiadomości do mojej skrzynki pocztowej).

  1. Napisać program, wczytujący podaną przez użytkownika liczbę całkowitą i obliczający sumę jej cyfr. Wykorzystać operator %.
  2. Napisać program, który wczytuje trzy liczby całkowite i wypisuje je na ekran w kolejności od największej do najmniejszej, np. gdy użytkownik poda:
    43 120 1
    
    komputer ma wypisać:
    Podane liczby uporzadkowane malejaco: 120, 43, 1.
    
    Zobacz przykładowe rozwiązanie!
  3. Trenować, modyfikując dotychczasowe programy tak, by "lepiej" działały!
08.10.08., LAB

Pierwsze programy w języku C: wypisywanie tekstów i liczb na ekran, wczytywanie liczb, pętle, sumowanie. Zobacz: teksty programów.

Kompilacja programu.

  • gcc -o pierwszy pierwszy.c (kompiluje kod źródłowy znajdujący się w pliku pierwszy.c do programu o nazwie pierwszy),
  • ./pierwszy (uruchamia program o nazwie pierwszy, znajdujący się w bieżącym katalogu)

Reakcja na błędy kompilatora.

Parę dodatkowych komend Unixa.

  • kate & (dodanie znaku & po nazwie polecenia, uruchamia to polecenie (tutaj: kate) w tle, nie blokując w ten sposób terminala),
  • ps (lista uruchomionych procesów),
  • kill -9 8790 (niszczy proces o numerze 8790 - numer znamy dzięki poleceniu ps),

Praca domowa

  1. Zrobić zadania 1-3 z Wykładu 1 (str.1.10) ze skryptu P.Kiciaka. Zadanie 2 należy zaprogramować i przetestować!
  2. Trenować, modyfikując dotychczasowe programy tak, by "lepiej" działały!
01.10.08., LAB

Wprowadzenie do systemu Linux. Logowanie i wylogowywanie się (System -> Wyloguj...). System okienkowy, podstawowe aplikacje, niektóre możliwości zmiany ustawień.

Edytory plików tekstowych: Gedit, Kate, Nedit (okienkowe, wygodne, dla każdego); joe, vi, emacs (pracujące w trybie tekstowym, zwykle trudniejsze w użyciu dla nieoswojonych - ale szalenie elastyczne i "szybkie" dla tych, którzy się przyzwyczają). Edycja i zapis pliku tekstowego.

Terminal. Podstawowe komendy Unixa (wydawane w terminalu), w tym:

  • mkdir WDI (utworzenie katalogu WDI w katalogu bieżącym, ang. make directory),
  • ls WDI (wyświetla zawartość katalogu WDI: pliki i podkatalogi, ang. list),
  • ls -l WDI (wyświetla okraszoną szczegółowymi informacjami zawartość katalogu WDI: pliki i podkatalogi),
  • ls -halt WDI (wyświetla posortowaną względem czasu utworzenia (opcja -t, ang. time), a także okraszoną innymi szczegółami (opcja -l, ang. long) pełną (opcja -a, ang. all) zawartość katalogu WDI: pliki (także "ukryte") i podkatalogi; opcja -h , ang. human, wyświetla "przyjazne człowiekowi" rozmiary plików: w zależności od potrzeby w kilo-, mega- i gigabajtach; jak widać opcje można łączyć ze sobą),
  • cd WDI (przejście do katalogu WDI, ang. change directory),
  • man ls (wyświetla strony manuala dotyczące polecenia (tutaj: ls); wyświetlanie przerywamy klawiszem q, ang. manual),
  • pwd (sprawdzenie, w jakim katalogu jesteśmy - podaje pełną ścieżkę do katalogu bieżącego, ang. print working directory),
  • cd .. (przejście do katalogu "piętro wyżej"),
  • more readme.txt (wyświetla zawartość pliku tekstowego readme.txt; wyświetlanie przerywamy klawiszem q),
  • ls *.txt (wypisuje wszystkie pliki kończące się na .txt),
  • rm readme.txt (usuwa nieodwracalnie plik readme.txt, ang. remove),
  • rmdir WDI (usunięcie katalogu WDI, o ile jest pusty),
  • rm * (usuwa nieodwracalnie wszystkie pliki z bieżącego katalogu),
  • rm -rf * (usuwa nieodwracalnie wszystkie pliki i podkatalogi z bieżącego katalogu),

Polecana literatura dotycząca środowiska, którego będziemy używać: wykład Środowisko programisty (pierwsze dwa moduły: Wprowadzenie do Basha oraz (zwłaszcza!) Bash - podstawowe komendy). Dodatkowa literatura dotycząca systemu Unix: Silvester, Unix, WNT (nieco trąci myszką). Ponadto, całkiem sensowne omówienia na Wikipedii: Unix, polecenia Unixa. Warto także pamiętać o poleceniu man, które wyświetla kompletny (chociaż trochę techniczny) opis działania każdego polecenia Unixa, np. man rm poda szczegółowy opis działania polecenia rm. Osoby żądne mocniejszych wrażeń mogą spróbować pinfo coreutils.

Dalsze techniczne informacje o tym, jak korzystać z dobrodziejstw tutejszego LABu, można uzyskać w serwsie internetowym lk.mimuw.edu.pl, lub od (starszych?) koleżanek/kolegów, lub od osoby z "akwarium" przy wejściu.

Praca domowa

  1. Zmienić tło pulpitu zgodnie z upodobaniami, wykorzystując inne tło niż standardowo dostępne (np. ściągnąć coś z Internetu, lub skorzystać z własnych zdjęć).
  2. Oswoić się z poleceniami Unixa, tworząc, listując, podglądając, edytując i kasując różne pliki i katalogi. Najbezpieczniej całą zabawę prowadzić w podkatalogu Test, aby nie zepsuć sobie niechcący ważnych rzeczy.

Zasady zaliczenia

Podstawy zostały sformułowane na pierwszym wykładzie. Na ocenę z ćwiczeń składają się:

Kartkówki będą mini-zadaniami na tematy różne. Może to być jakieś zadanie do rozwiązania na kartce, sprawdzenie znajomości zagadnień z wykładu, czy też zaprogramowanie czegoś małego przy komputerze.

Prace domowe będą zadawane z tygodnia na tydzień. Po terminie prace nie będą sprawdzane.

Za każde zadanie z pracy domowej można otrzymać maksymalnie 3 punkty. Za każde zadanie z kartkówki można dostać maksymalnie 1 punkt. Program zaliczeniowy będzie oceniany w skali 10-punktowej. Suma uzyskanych punktów z prac domowych i kartkówek zostanie na koniec semestru znormalizowana tak, by 100% punktów było równe maksimum punktów do uzyskania z kolokwium; tak samo zostanie znormalizowana ocena z programu zaliczeniowego.

Ostateczna liczba punktów uzyskanych z ćwiczeń będzie wyliczona według wzoru P = 0.3*D + 0.3*Z + 0.4*K, gdzie D - znormalizowana suma punktów z prac domowych i kartkówek, Z - znormalizowana suma punktów z programu zaliczeniowego, K - znormalizowana suma punktów z kolokwium.

Zapoznaj się z programem zaliczeniowym.

Ciekawe linki

Wykładowca, P. Kiciak, udostępnia na swojej stronie WWW notatki do wykładu. Warto na bieżąco je śledzić!

Systemy operacyjne, języki programowania

Linux - wybrane dystrybucje
(dostępne są także wersje "Live", działające bez instalacji na dysku - wprost z wypalonej przez nas płyty CD, DVD lub z pamięci USB pendrive. W ten sposób możemy wypróbować Linuxa nie zainstalując go na komputerze)
Kompilator C pod Linuxa
GCC (darmowy, dostępny w każdej dystrybucji!)
Intel C++ Compiler (darmowy, pod warunkiem niekomercyjnego wykorzystania - szczegóły w licencji)
Kompilatory C pod Windows
Microsoft Visual Studio - dostępny za darmo dla naszych studentów.
Ciekawostki
Pascal to inny popularny język programowania. Przeczytaj, co współautor książki o języku C, B. Kernighan, sądził w 1981r. o Pascalu? Warto zaznaczyć, że współczesne implementacje języków pascalopodobnych zawierają już w sobie sporo tego, co kiedyś było dobre tylko w C.