Politechnika Wrocławska, Wydział Elektroniki, Kierunek: Elektronika i telekomunikacja
ETE 0224 - INFORMATYKA 1  
Laboratorium i ćwiczenia audytoryjne 
( prow. dr Marek Piasecki

Tematy zajęć:

Lp

LABORATORIUM

ĆWICZENIA AUDYTORYJNE

1

Środowisko BorlandC
(edycja, kompilacja, uruchomienie programu)
Pierwsze programy z użyciem zmiennych prostych
Konsolowe operacje wejścia wyjścia <stdio.h>
Instrukcje:
- przypisania
- warunkowa if , if else
- wyboru switch
Przykładowe zadania do LABORATORIUM nr 1  

Zapis algorytmów za pomocą języka schematów blokowych
Reprezentacja danych różnego typu.
Dobór typu zmiennych, ograniczenia reprezentacji.
Dialog z użytkownikiem z wykorzystaniem printf i scanf
Formatowanie danych (budowa łańcuchów formatujących
zawierających różnorodne sekwencje sterujące % \ )
Zapis wyrażeń matematycznych w języku C
Zapis wyrażeń logicznych (operatory logiczne)
Przykładowe zadania do ĆWICZEŃ nr 1

2

Instrukcje pętlowe while, do while, for
Proste algorytmy iteracyjne
Funkcje bezparametrowe
Zmienne lokalne
Przekazywanie parametrów przez zmienne globalne
Przykładowe zadania do LABORATORIUM nr 2  

Rola i dobór zmiennych sterujących oraz pomocniczych pętli
Budowanie warunków końca pętli
Algorytmy iteracyjne (zliczanie, sumowanie, obliczanie szeregów)
Równoważność pętli
Programowanie proceduralne - podział problemu na podproblemy
i reprezentacja w postaci algorytmów "podrzędnych"
Zakres widoczności i przesłanianie identyfikatorów
Przykładowe zadania do ĆWICZEŃ nr 2

3

Typ tablicowy
Przetwarzanie tablic za pomocą pętli
Funkcje z listą parametrów
Przekazywanie parametrów przez wartość, referencję i adres
Przykładowe zadania do LABORATORIUM nr 3  

Podstawowe algorytmy przetwarzania tablic
(wypełnianie, porównywanie elementów, wyszukiwanie, 
przesuwanie, usuwanie, dodawanie elementów)
Tablica pseudo-dynamiczna
 (statyczna tablica z licznikiem wykorzystywanych elementów)
Parametryzacja algorytmów
Dobór sposobu przekazywania parametrów do/z funkcji
Przykładowe zadania do ĆWICZEŃ nr 3

4 Budowa złożonych programów składających się z wielu funkcji.
Przekazywanie danych pomiędzy funkcjami poprzez listę parametrów
oraz return.
 Przykładowe zadania do LABORATORIUM nr 4

Ćwiczenia z definiowaniem własnych funkcji.
Zależności pomiędzy: definicją, prototypem i wywołaniem funkcji.
Składanie (zagnieżdżanie funkcji).

Omówienie przekazywania parametrów: "przez wartość",
"przez adres" i "przez referencję".

5

c.d. operacji na tablicach jedno i dwu-wymiarowych
Dostęp do zmiennych za pomocą wskaźników
Łańcuchy znaków - przetwarzanie tekstów
Przykładowe zadania do LABORATORIUM nr 5

Arytmetyka wskaźników, konwersja (rzutowanie) wskaźników
Ograniczenia reprezentacji adresu postaci segment/offset
Funkcje przetwarzające teksty
- omówienie standardowych (biblioteka <string.h>)
- tworzenie własnych

6

Typ strukturalny
Złożone reprezentacje danych:
- tablica struktur
- struktura tablic
- struktura tablic struktur
- itp.
Przykładowe zadania do LABORATORIUM nr 6

Strukturalna dekompozycja dużych programów
oraz złożonych reprezentacji danych.
Omówienie i ćwiczenia z reprezentacją problemu
"prostej bazy danych" typu:
   struktura BAZA
           {
            - tablica struktur ELEMENT
                   {
                     - pola reprezentowane typami prostymi
                     - pola tekstowe (tablice znaków)
                     - pod-tablice z licznikiem
                     - pola kodowane za pomocą słownika
                   }
            - licznik wykorzystywanych elementów tablicy
         } 
Kodowanie danych "nienumerycznych" - typ wyliczeniowy.
Kodowanie danych za pomocą słownika.

7

Plikowe operacje wejścia/ wyjścia z wykorzystaniem
standardowej biblioteki <stdio.h>
Archiwizacja i przetwarzanie ciągu elementów zapisywanych w pliku

Tekstowa i binarna reprezentacja danych
Ćwiczenia konwersji bin<>txt
Wykrywanie błędów operacji wej/wyj
Sterowanie położeniem wskaźnika pliku
Proste algorytmy przetwarzania plików

8

KOLOKWIUM ZALICZENIOWE (pisemna praca kontrolna)

 

Przykładowe zadania do realizacji

LABORATORIUM 1:      ( pierwsze programy, instrukcje if else switch )

  1. Napisz program wczytujący kilka liczb z klawiatury
    a następnie obliczający i wyświetlający na ekranie 
    ich sumę, iloczyn, itp. (np. potęgę, pierwiastek, eksponentę) 
     
  2. Napisz program klasyfikujący wzrost osób tzn. pytający się o wzrost w cm
    a następnie wyświetlający jeden z podanych tekstów 
    w zależności od przynalezności do przedziału wartości: 
    niski < 150cm < średni < 180cm < wysoki
     
  3. Napisz program wyznaczający pierwiastki (miejsca zerowe)
    trójmianu kwadratowego Ax2 + Bx + C = 0 
     
  4. Napisz program klasyfikujący klawisze naciskane na klawiaturze
    i wyświetlający jeden z napisów:
    - mała litera 
    - duża litera 
    - cyfra 
    - klawisz ENTER 
    - klawisz ESC 
    - strzałka w lewo 
    - strzałka w prawo 
    - klawisz funkcyjny F1 
    - inny klawisz 
    do pobierania kodu klawisza wykorzystaj funkcję getch() z biblioteki <conio.h>


 

LABORATORIUM 2:        ( pętle )

  1. Napisz program rysujący na ekranie poziomą kreskę (ze znaków minus)
    o długości zadawanej z klawiatury. 
     
  2. Napisz program wczytujący znaki z klawiatury aż do momentu naciśnięcia klawisza 'k'.
    W trakcie wczytywania należy zliczać ilość podanych znaków. 
    Na zakończenie należy wyświetlić informacje:
    - ile było podanych znaków (przed nacisnięciem 'k') 
    - ile z tych znaków było dużymi literami. 
     
  3. Napisz program wczytujący liczby z klawiatury,
    z jednoczesnym zadawaniem pytania "Czy koniec wprowadzania T/N ?"
    Na zakończenie program powinien wyświetlić wartość: 
    średnią, maksymalną, minimalną z podanych liczb. 
     
  4. Napisz program wyznaczający iteracyjnie (numerycznie) sumę szeregu:
    1/x + 1/x 2 + 1/x3 + 1/x4 +  . . .  + 1/xn
     
  5. Napisz program wyświetlający na ekranie "choinkę"
    o wysokości zadawanej z klawiatury

            *
           ***
          *****
         *******
            #


 
 

LABORATORIUM 3:     ( tablice )

  1. Napisz program umozliwiający wczytanie a następnie wyświetlenie
    kilku (np. 10) liczb rzeczywistych przechowywanych w tablicy. 
    Operacje wczytywania i wyświetlania powinny być realizowane za pomocą odrębnych funkcji. 
    Podczas wczytywania i przeglądania proszę wyświetlać teksty pomocnicze 
    informujące o numerze wprowadzanego/wyświetlanego elementu. 
    np.    Tab[1] = 12.0 
             Tab[2] = -1.0 
             Tab[3] =  ....... 
     
  2. Rozbudować program z zadania (a) o zestaw funkcji realizujących
    proste obliczenia statystyczne dla danych zapisanych w tablicy:
    - suma elementów 
    - wartość średnia, błąd średniokwadratowy 
    - wartości ekstremalne (minimum, maksimum) 
    - zliczanie elementów (np. ujemnych, zerowych i dodatnich) 
     
  3. Napisz program zawierający funkcje: WCZYTAJ_TAB(x),
    SUMA_TAB(x,y,z), WYPISZ_TAB(z) umozliwiający: 
    - wczytanie dwóch tablic N-elementowych A i B 
    - wyznaczenie zawartości trzeciej tablicy C jako sumę lub róznicę 
        wczytanych tablic A i B 
    - wydrukowanie wyniku końcowego: tablic A, B i C


 
 

LABORATORIUM 4:     ( programy wielo-funkcyjne, funkcje z parametrami )

  1. Przebuduj programy zrealizowane na dotychczasowych laboratoriach 1-3 na funkcje.
    Jeżeli uznasz to za sensowne, to dodatkowo rozdziel w postaci osobnych funkcji
    operacje komunikacji z użytkownikiem (np. wczytywanie danych / wyświetlanie wyników)
    oraz operacje wykonywania obliczeń (np. szukanie największej z trzech liczb A,B,C;
    policzenie średniej z trzech liczb A,B,C; rozwiązanie trójmnianu o współczynnikach A,B,C)

     
  2. Napisz program łączący w jedną całość wszystkie napisane dotychczas programy.
    W najprostszej wersji, ten nadrzędny program, wywoływał by sekwencyjnie funkcje napisane w zadaniu (a)
    (Uwaga: do połączenia kodu dotychczasowych programów możesz wykorzystać polecenia
    operujące na schowku edytora BorlandC: Cut/Copy/Paste ).
     

  3. Rozbuduj program (b) o „Menu” umożliwiające sterowanie przebiegiem wywoływania funkcji składowych
    i zakończeniem programu. Przykładowe menu może mieć postać: 

       1. Suma liczb 
       2. Iloczyn liczb
       3. Klasyfikacja wzrostu
       4. Koniec programu
       Twoj wybór : ... ?

    Studenci bardziej zaawansowani mogą napisać trudniejszą wersję MENU
    w której wybór opcji będzie dokonywany poprzez przesuwanie podświetlenia
    za pomocą strzałek i naciśniecie klawisza ENTER
    (tak jak opcje w menu środowiska BorlandC).

 


LABORATORIUM 5:     ( wskaźniki, łańcuchy znaków )

  1. Ćwiczenie wykorzystania wskaźników jako alternatywnej metody dostępu
    do zmiennych tworzonych przez kompilator tzn. zmiennych globalnych i lokalnych.
    ( Patrz przykład z wykładu nr 5 strona nr 3 )

    - Utwórz zmienne różnych typu: char, int, long, ...
    - Napisz instrukcje zapisu wartości do jednej zmiennej (np. typu long)
      za pomocą adresu innej zmiennej (tego samego typu lub innego)
    - Kontrolnie wyświetlaj zawartości zmiennych po dokonaniu tych zapisów

    Dodatkowo można napisać fragment programu, który wyświetli
    zawartości poszczególnych bajtów zajmowanych w pamięci
    przez w/w zmienne.

  2. Ćwiczenie w wykorzystaniu zapisu wskaźnikowego jako metody dostępu
    do elementów tablicy.

    Napisz funkcje wykonujące podstawowe operacje na tablicach
    (tzn. wczytywanie, wyświetlanie, liczenie sredniej, max, min)
    ale W ZAPISIE WSKAŹNIKOWYM !

  3. Łańcuchy - Napisz funkcje:
       int moje_strlen( char* );
       char* moje_strupr(char* );
       char* moje_strcpy( char*, char* )

    realizujące te same operacje co standardowe funkcje strlen, strupr, strcpy
    z biblioteki <string.h>.

  4. Napisz funkcję:

    void str_zamien( char* tekst, char* stary_wzorzec, char* nowy_wzorzec);

    realizującą operację zamiany w podanym tekście starego wzorca na nowy np.
    <tekst> == "ala ma kota a ola ma asa"
    <stary_wzorzec> == "ma"
    <nowy_wzorzec> == "miala"
    rezultat zamiany: "ala miala kota a ola miala asa"

    (Osoby mniej wprawne w programowaniu mogą napisać uproszczoną
    wersję tej funkcji, zamieniającą tylko wzorce o tej samej długości.
    Wówczas nie ma potrzeby "rozsuwania" lub "zsuwania" starego tekstu)

     

 

LABORATORIUM 6:     ( typ stukturalny - baza danych wykorzystująca tablice struktur)

  1. Zdefiniuj strukturę pozwalającą przechowywać dane pojedynczego elementu
    wybranej bazy danych np. katalogu książek w bibliotece, spisu samochodów
    w autokomisie,
    zestawienia miesięcznych wydatków studenta, itp.

    Następnie zdefiniuj N-elementową (pseudo-dynamiczną) tablicę w/w struktur
    pozwalającą przechowywać dane wielu elementów (ale nie więcej niż N)
    z dodatkowym licznikiem informującym o ilości wpisanych danych.

    Napisz funkcje pozwalające wczytywać i wyświetlać zawartość bazy.

    Uwaga: w/w tablice lub struktury powinny być przekazywane jako parametry funkcji !

  2. Napisz funkcję pozwalającą wyszukać w bazie elementy o zadanych parametrach
    np. samochód marki FIAT, rocznik nie starszy niż 1990,
         o cenie z zadanego przedziału.

Dodatkowe zadania "dla zaawansowanych":

  1. Napisz funkcję umożliwiającą edycję/poprawianie danych pojedynczych

    elementów bazy. Np zmianę ceny samochodu w autokomisie,
    aktualizację adresu w bazie danych personalnych, itp

  2. Napisz funkcję umożliwiającą interaktywne przeglądanie zawartości bazy.

    Uwzględnij przypadki, gdy dane zapisane w bazie nie zmieszczą się

    na jednym ekranie (np. katalog 1000 tytułów ksiażek i nazwisk autorów).

    - w najprostszym przypadku (przeglądanie bazy od pierwszego do

      ostatniego elementu) wystarczy wprowadzenie tzw. stronicowania,

    - najbardziej uniwersalnym rozwiązaniem jest umożliwienie "sterowania"
      przeglądaniem za pomocą strzałek na klawiaturze tzn:

               klawisz  "<-"  oznacza: wyświetl poprzedni element bazy

               klawisz   "->"  oznacza: wyświetl następny element bazy

               klawisz   "ESC" oznacza: zakończ przeglądanie


 

  ĆWICZENIE 1:

  1. Narysuj schematy blokowe prostych algorytmów przetwarzających sekwencję trzech liczb
    wprowadzanych z klawiatury i wyświetlających na ekranie:
    - największą z tych liczb 
    - medianę 
    - sekwencję tych trzech liczb uporządkowaną rosnąco lub malejąco 
    - informację czy przynajmniej dwie z tych liczb mają identyczną wartość. 
    Uwzględnij przypadki gdy wszystkie liczby są różne oraz że mogą wystąpić powtórzenia. 
     
  2. Napisz łańcuch formatujący dla instrukcji printf wyświetlający na ekranie zmienną rzeczywistą typu double:
    - z dokładnością do trzeciego miejsca po przecinku, 
    - samą część całkowitą, 
    - w zapisie inżynierskim 
     
  3. Napisz program dialogowy wczytujący z klawiatury podstawowe dane dwóch pracowników
    a następnie wyświetlający je "kolumnami" w ten sposób 
    aby zawartość wytłuszczonych pól "nazwisko", "imię", "data" 
    zajmowała zawsze tyle samo miejsca niezależnie od wartośc czy ilości liter: 
    np. 
      Nazwisko: Kowalski         Imię: Jan         Urodzony: 21. 3.1980   Staż:   3 lata  Stawka: 15.50 zł/godz 
      Nazwisko: Sienkiewicz    Imię: Tomasz   Urodzony: 8.11.1985    Staż: 15 lat   Stawka: 123.00 zł/godz 
    Dobierz odpowiednie typy zmiennych do reprezentowania w/w danych. 
     
  4. Napisz wyrażenia matematyczne wyznaczające:
    - pole okręgu i promien okręgu o promieniu r
    - kartezjańską odległość pomiędzy dwoma punktami o współrzędnych (x1,y1 ) oraz (x2,y2)

- wartości wyrażeń: 

  1. Napisz wyrażenie logiczne sprawdzające czy z odcinków a,b,c da się zbudować trójkąt.
     
  2. Napisz wyrażenie logiczne sprawdzające czy data zapisana za pomocą trzech zmiennych
    dzien_1, miesiąc_1, rok_1 jest mniejsza od daty zapisanej za pomocą trzech zmiennych
    dzien_2, miesiac_2, rok_2


 

  ĆWICZENIE 2:

  1. Napisz program wyświetlający na ekranie kolejne 100 liczb parzystych 
     
  2. Napisz program wyświetlający na ekranie kolejne liczby całkowite typu int,
    które są podzielne bez reszty przez n (gdzie n jest zadawane z klawiatury)
     
  3. Napisz program wyświetlający na ekranie sekwencje kolejnych liczb całkowitych
    najpierw od 1 do 10, a następnie od 10 do 1.
    Do spowolnienia operacji wydruku wykorzystaj dodatkową pętlę od 1 do 10000.
    Na zakończenie dodaj jeszcze jedną pętlę, która spowoduje, że cały proces odliczania
    powtórzy się trzy razy.
    Zaznacz na listingu, które pętlę tworzą połączenie sekwencyjne (szeregowe)
    a które z nich są zagnieżdżone (wykonują się równolegle).
     
  4. Napisz pętlę wczytującą kolejne liczby z klawiatury i kończącą się gdy:
    - suma tych liczb przekroczy 100,
    - ilość podanych liczb ujemnych przekroczy 10,
    - dwie kolejne podane liczby będą miały identyczną wartość,
     
  5. Podaj dwa przykłady problemów, które najwygodniej jest zapisać za pomocą pętli while( )
    oraz dwa inne, które najlepiej oprogramować za pomocą pętli do while( ) .
    Uzasadnij które z nich można zastąpić pętlą for( )
     
  6. Podaj możliwie najprostszy sposób spowodowania, że program zawierający pętlę while( )
    zacznie się zachowywać jak program zawierający pętlę do while( ) .
    Tzn. pętla zawsze się wykona przynajmniej jeden raz.

Czy istnieje analogiczna możliwość zamiany rolami pętli do while( ) za pomocą pętli while( ).
Podaj przykład.
 

  1. Na załączonym listingu zaznacz zakres widoczności poszczególnych zmiennych a
    i uzupełnij odpowiadające im łańcuchy formatujące w instrukcjach printf   (zastępując znaki ___ ).
    Wskaż również miejsca w których wartość zmiennych a jest niezdefiniowana (przypadkowa).

#include <stdio.h>
double a;   //pierwsze a

void Funkcja( void ) { 
long a;   //drugie a
a = 20*a;
printf("\nWewnatrz funkcji a = %___", a );
}

void main( ) {
  printf("Na poczatku main a = %___", a );
  a = 111;
    {
     char a;   //trzecie a
     printf("\nWewnatrz main a = %___", a );
    }
  Funkcja();
  printf("\nPo wywolaniu funkcji a = %___", a );
}
 

  1. Naszkicuj diagram ilustrujący strukturalny podział problemu prostej gry komputerowej tzw. Strzelanki
    na pod-zadania (przykładową listę podzadań uzupełnij brakującymi elementami):
    - rysowanie pocisku na pozycji (x,y),
    - rysowanie statku kosmicznego na pozycji (x,y)
    - wyświetlenie początkowej planszy gry (tła)
    - wyświetlenie komunikatu "Koniec gry"
    - rysowanie wybuchu poczynając od pozycji (x,y)
    - odczyt danych z urządzenia sterującego (klawiatury, myszki lub joysticka)
    itd.

  ĆWICZENIE 3:

  1. Napisz program definiujący N-elementową tablicę liczb całkowitych
    a następnie inicjujący jej zawartość losowymi liczbami z przedziału od –30 do 50.
    Odpowiedz: czy rozmiar tablicy N może być wczytywany z klawiatury ?

  2. Napisz program, który wczyta dane z klawiatury do 10-cio elementowej
    tablicy liczb double, a następnie sprawdzi:
    - czy te liczby są uporządkowane rosnąco lub malejąco,
    - czy elementy tablicy mają symetryczną zawartość
       (tzn. pierwszy element równy ostatniemu, drugi równy przedostatniemu, itd. )
    - czy w tablicy występuje chociaż jedno powtórzenie wartości,
     
  3. Zaproponuj i oprogramuj algorytm, który przesunie zawartość N-elementowej tablicy
    cyklicznie o jedną pozycję „w górę”.
    (tzn. pierwszy element na miejsce drugiego, drugi na trzeci, ..., ostatni na pierwszy)

  4. Napisz program, który pozwoli gromadzić w uporządkowanej tablicy liczb
    informacje o najlepszych „czasach” uzyskiwanych przez sprintera podczas treningu.
    Do gromadzenia tych informacji wykorzystaj pseudo-dynamiczną tablicę
    o stałym rozmiarze 100 elementów wykorzystującą dodatkową
    zmienną pomocniczą zliczającą ilość wprowadzonych wyników.
    Nowy wynik powinien być wprowadzany do tablicy w taki sposób
    aby po jego wprowadzeniu zawartość tablicy była nadal uporządkowana malejąco.

  5. Napisz program, który będzie wczytywał i analizował tekst (ciąg liter)
    wprowadzany z klawiatury aż do momentu naciśnięcia klawisza ESC,
    Po zakończeniu wczytywania program powinien wyświetlić na ekranie
    histogram występowania poszczególnych liter alfabetu np.

   A   17 #################
   B    2 ##
   C    1 #
   D    0
   E    5 #####
   . . .
   
Z   3 ###

Do gromadzenia informacji o ilości podanych liter wykorzystaj tablicę 24 „liczników”

 

 


Literatura:

·        Robert Lafore “Programowanie w języku C przy użyciu Turbo C++”

·        Jerzy Grębosz “Symfonia C++”

·        Andrzej Zalewski “Programowanie w językach C i C++ z wykorzystaniem pakietu Borland C++”

·        Bjarne Stroustrup “Język C++ “

·        Robert Sedgewick “Algorytmy w C ++ “