wyklady z c, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania


Język programowania C++

( wykł. dr Marek Piasecki )

Literatura:

----------------------------------------------

----------------------------------------------

PROGRAM WYKŁADU

  1. Wstęp, schematy blokowe, struktura programu w języku C++
    Typy, operatory i wyrażenia.

  2. Operacje wejścia i wyjścia (podejście proceduralne i obiektowe)
    Instrukcje if, if-else, switch. Zagnieżdżanie. Operator ? : .

  3. Instrukcje iteracyjne: while, do-while, for.
    Pętle zagnieżdżone. Instrukcje break i continue.

  4. Tablice - deklaracja, inicjacja, operator indeksu.
    Tablice w połączeniu z pętlą for. Tablice wielowymiarowe.

  5. Wskaźniki zmiennych, adresy pamięci, arytmetyka wskaźników.
    Związek pomiędzy wskaźnikami a tablicami.

  6. Funkcje - deklaracja, definicja, parametry.

  7. Funkcje operujące na pamięci: biblioteka <mem.h>
    Łańcuchy znaków. Funkcje łańcuchowe <string.h>

  8. Typ strukturalny - definicja, deklaracja i inicjacja zmiennych.
    Zagnieżdżanie struktur. Rozszerzenie struktury o metody składowe.

  9. Obsługa plików zewnętrznych. Pliki binarne i tekstowe.
    podejście proceduralne - biblioteka <stdio.h>
    podejście obiektowe - klasa fstream

  10. Tablice wskaźników, wskaźniki na tablice.
    Rzutowanie wskaźników. Dostęp do dowolnego obszaru pamięci. Wskaźniki na funkcje.

  11. Przykłady różnych kombinacji wskaźników
    Dynamiczne przydzielanie pamięci.


PODSTAWOWE POJĘCIA

Program notacja opisująca proces przekształcania danych wejścio­wych w dane wyjściowe według pewnego algorytmu.

Dane wejściowe informacje dostarczone do programu przez użytkownika, w celu umożliwienia wykonania algorytmu

Dane wyjściowe są generowane przez program i stanowią wyniki działania programu.

Algorytm określa sposób przekształcania danych wejściowych w dane wyjściowe zgodnie z celem. Algorytm składa się z opisu:

Programowanie polega na zapisywaniu algorytmów w formie programów zrozumiałych dla komputera.

Kod źródłowy − program napisany w języku takim jak Pascal lub C++,
czyli w języku algorytmicznym − czytelny dla programisty,

Kod wynikowy − program zapisany jako ciąg rozkazów i danych w kodzie maszynowym procesora (w postaci czytelnej dla komputera), najczęściej w postaci liczb kodu dwójkowego.

Proces tworzenia ( kodowania? ) programu:

edytor → ( *.cpp ) kod źródłowy

kompilator → ( *.obj ) kod wynikowy

linker → ( *.exe ) kod wynikowy połączony z bibliotekami

Język C++ jest rozszerzeniem języka C :


ZAPIS PROGRAMU ZA POMOCĄ SCHEMATÓW BLOKOWYCH


void main( ) // najprostszy program w języku C / C++

{ }

#include < iostream.h > // wypisanie tekstu na ekranie (C++)

void main( void )

{

cout << ”Czesc ! To ja, twój komputer;

}

#include < iostream.h > // proste obliczenia - iloczyn liczb (C++)

void main( )

{

int liczba_1, liczba_2 ;

float wynik ;

cout << endl << To jest program obliczajacy iloczyn dwóch liczb << endl ;

cout <<Podaj pierwsza liczbe X = ” ;

cin >> liczba_1 ;

cout <<Podaj druga liczbe Y = ” ;

cin >> liczba_2 ;

wynik = liczba_1 liczba_2 ;

cout << endl <<Wynik obliczenia X Y =<< wynik << endl ;

}

#include < iostream.h > // cykliczne wykonywanie programu

void main( )

0x08 graphic
0x08 graphic
{

char znak;

0x08 graphic
do

0x08 graphic
0x08 graphic
{

0x08 graphic
0x08 graphic
instrukcje programu

cout << endl << Czy chcesz zakonczyc program ( T/N ) ? ” ;

cin >> znak ;

0x08 graphic
}

while( znak != ' t ' ) ;

cout << endl << Koniec programu ” ;

0x08 graphic
}


Proceduralna i obiektowa komunikacja z użytkownikiem

/* proceduralnie: C / C++ */

#include <stdio.h>

void main(void)

{

printf(”Dzien ”);

printf(”dobry!\n”);

}

// obiektowo: C++

#include <iostream.h>

void main(void)

{

cout << ”Dzien ” ;

cout << ”dobry” << endl ;

}

#include ← dyrektywa dołączenia tekstu zawartego w pliku

stdio.h ← (StandardInputOutput) plik definicji funkcji Wej/Wyj

iostream.h ← (InputOutputStream) plik definicji strumieni obiektowych

main ← zastrzeżona nazwa głównej funkcji programu

void ← typ danej “pustej”

\n ← przejscie do nowego wiersza

\t ← znak tabulacji

\” ← znak cudzysłowu

\\ ← jeden znak \

endl ← manipulator przejścia do nowej linii


// 2 przyklad proceduralnie

#include <stdio.h>

#include <conio.h>

int x,y,s;

void main(void)

{

clrscr();

printf (”Podaj x = ”);

scanf ( ”%d” , &x );

printf (”Podaj y = ”);

scanf ( ”%d” , &y );

s = x+y;

printf(”Suma x+y = %d\n”, s );

getch();

}

// 2 przyklad obiektowo

#include <iostream.h>

#include <conio.h>

int x,y,s;

void main(void)

{

clrscr();

cout << ”Podaj x = ” ;

cin >> x ;

cout <<”Podaj y = ” ;

cin >> y ;

s = x+y;

cout << ”Suma x+y=” << s << '\n' ;

getch();

}


Definiowanie zmiennych → ustalenie nazwy, typu, rezerwacja pamięci

nazwa_typu nazwa_zmiennej ;

nazwa_typu zmienna_1, zmienna_2, zmienna_3 ;

Podstawowe typy:

Nazwa typu

Zawartość

Przedział wartości

Zajęt. pamięć

char

znak

-128 ÷ 127

1 bajt

int

liczba całkowita

-32768 ÷ 32767

2 bajty

long

liczba całkowita

-2147mln ÷ 2147mln

4 bajty

float

liczba rzeczyw.

10-38 ÷ 1038 (7cyfr)

4 bajty

double

liczba rzeczyw.

10-308 ÷ 10308 (15 cyfr)

8 bajtów

Modyfikatory typu:

signed → ze znakiem (±), int char

unsigned → bez znaku, int char

short krótka (mniejsza), int − −

long długa (większa) intdouble

np. unsigned long int dluga_liczba_bez_znaku ;

Wartości domyślne: long = long int

int = signed int

char = signed char

Type Length Range

unsigned char 8 bits 0 ÷ 255

char 8 bits -128 ÷ 127

enum 16 bits -32,768 ÷ 32,767

unsigned int 16 bits 0 ÷ 65,535

short int 16 bits -32,768 ÷ 32,767

int 16 bits -32,768 ÷ 32,767

unsigned long 32 bits 0 ÷ 4,294,967,295

long 32 bits -2,147,483,648 ÷ 2,147,483,647

float 32 bits 3.4 * (10**-38) ÷ 3.4 * (10**+38)

double 64 bits 1.7 * (10**-308) ÷ 1.7 * (10**+308)

long double 80 bits 3.4 * (10**-4932) ÷ 1.1 * (10**+4932)


OPERATORY

operatory arytmetyczne: + dodawanie

odejmowanie

∗ mnożenie

/ dzielenie

% reszta z dzielenia

operatory przypisania: = zwykłe przypisanie x = 2;

+= przypisanie sumy x+=2; → x = x + 2;

= przypisanie różnicy x−=2; → x = x − 2;

∗= przypisanie iloczynu x∗=2; → x = x ∗ 2;

/= przypisanie ilorazu x /=2; → x = x / 2;

%= przypisanie reszty x%=2; → x = x % 2;

operatory inkrementacji i dekrementacji:

zmienna++ − inkrementacja zmiennej po wyliczeniu wyrażenia

++zmienna − inkrementacja zmiennej przed wyliczeniem wyrażenia

zmienna−− − dekrementacja zmiennej po wyliczeniu wyrażenia

−−zmienna − dekrementacja zmiennej przed wyliczeniem wyrażenia

np. int x, y = 1;

x = ++ y ; / rezultat: x=2, y=2/ x = y ++ ; / rezultat: x=1, y=2/

operatory relacyjne: == równe

!= różne

< mniejsze

> większe

<= mniejsze lub równe

>= większe lub równe

operatory logiczne: && koniunkcja (AND)

|| alternatywa (OR)

! negacja (NOT)

bitowe operatory logiczne: & bitowa koniunkcja (AND)

| bitowa alternatywa (OR)

^ bitowa różnica symetryczna (XOR)

<< przesunięcie bitów w lewo

>> przesunięcie bitów w prawo

Priorytety operatorów w języku C:

Operator Opis Przykład

( ) wywołanie funkcji sin()

[ ] element tablicy tab[10]

. element struktury osoba.nazwisko

−> wskazanie elemenu struktury wsk_osoby−>nazwisko

! negacja logiczna if( ! (x >max) ) kontynuuj;

~ negacja bitowa ~(001101) ≡ (110010)

− zmiana znaku (negacja) x = 10 ∗ (− y)

++ inkrementacja (zwiększenie o 1) x + + + y ≡ (x+ +) + y

− − dekrementacja (zmiejszenie o 1) − − y ≠ − − y ≡ − (− y)

& operator referencji (adres elementu) wsk_x = &x

∗ operator dereferencji ∗wsk_x = 10

(type) zmiana typu (typecast) (double) 10 ≡ 10.0

sizeof rozmiar zmiennej lub typu (w bajtach) sizeof( int ) ≡ 2

∗ mnożenie

/ dzielenie

% operacja modulo (reszta z dzielenia) if( x%2 == 0 ) parzyste;

+ dodawanie

− odejmowanie

<< przesunięcie bitowe w lewo 1 << 2 ≡ (0001) << 2 ≡ (0100)

>> przesuniecie bitowe w prawo x = 4 >>1 ≡ x = 2

< mniejszy niż if( liczba < max ) max = liczba;

<= mniejszy lub równy

> wiekszy niż

>= wiekszy lub równy

== równy

!= nierówny (różny od)

& iloczyn bitowy

^ suma bitowa modulo (różnica symetryczna)

| suma bitowa

&& iloczyn logiczny

|| suma logiczna

? : wyrażenie warunkowe

= przypisanie

∗= /= %= += przypisania arytmetyczne

−= <<= >>=

&= ^= |=

, operator przecinka

Funkcja: printf() biblioteka: <stdio.h>

wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

int printf ( tekst_sterujący , argument_1 , argument_2 , . . . ) ;

tekst sterujący

jest to stała łańcuchowa (w podwójnych cudzysłowach) zawierająca:

− zwykłe znaki (które są po prostu kopiowane na ekran)

− kody formatujące kolejnych argumentów:

%c − pojedynczy znak

%s − łańcuch znaków

%d − liczba dziesiętna ze znakiem

%f − liczba zmiennoprzecinkowa (notacja dziesiętna)

%e − liczba zmiennoprzecinkowa (notacja wykładnicza)

%g − liczba zmiennoprzecinkowa (krótszy z formatów %f %e)

%u − liczba dziesiętna bez znaku

%x − liczba w kodzie szesnastkowym (bez znaku)

%o − liczba w kodzie ósemkowym (bez znaku)

l − przedrostek (long) stosowany przed: d u x o

np. #include <stdio.h>

void main(void)

{

int x = 10;

long y = 20;

double s;

s = x + y;

printf ( ”%s obliczen %d + %ld = %f” , ”Wynik” , x , y , s );

}

efekt na ekranie → Wynik obliczen 10 + 20 = 30.000000

Aby określić ilość drukowanych cyfr do kodu formatującego można dodać kody długości: %Xd %X.Xf

np. %4d − liczba dziesiętna na czterech pozycjach

%10f − liczba rzeczywista na 10 pozycjach

%10.2f − liczba rzeczywista na 10 pozycjach, 2 cyfry po przecinku

%.3f − liczba rzeczywista z dokladnoscią do 3 cyfr po przecinku


Funkcja: scanf() <stdio.h>

odczytuje dane ze standardowego strumienia wejściowego (stdin)
w/g zadanego formatu i zapamiętuje je pod zadanymi adresami pamięci

int scanf ( tekst_sterujący , adres_1 , adres_2 , . . . ) ;

tekst sterujący → jest to stała łańcuchowa (w podwójnych cudzysłowach) zawierająca instrukcję jak traktować kolejne dane wczytywane ze strumienia (jakie typy zmiennych są pod adresami adres_1, adres_2, ... )

Kody formatujące (podobne jak dla printf() ):

%c − pojedynczy znak

%s − łańcuch znaków

%d − liczba dziesiętna ze znakiem

%f lub %e − liczba zmiennoprzecinkowa

%u − liczba dziesiętna bez znaku

%x − liczba w kodzie szesnastkowym (bez znaku)

%o − liczba w kodzie ósemkowym (bez znaku)

l − przedrostek stosowany przed: d u x o (long int)

l − przedrostek stosowany przed: f e (double)

L − przedrostek stosowany przed: f e (long double)

& − operator adresowania (zwraca adres zmiennej podanej po operatorze)

np. #include <stdio.h>

void main(void)

{

int x;

double y;

char znak;

printf( ”Podaj jedna liczbe calkowita: ” );

scanf ( ”%d” , &x );

printf( ”Podaj jedna liczbe rzeczywista i jeden znak: ”);

scanf ( ”%lf %c” , &y , &znak );

}

Wydruk → Podaj jedna liczbe calkowita:

Odczyt ← 123

Wydruk → Podaj jedna liczbe rzeczywista i jeden znak:

Odczyt ← 456.789 a

Wynik wczytywania: x == 123, y == 456.789, znak == 'a'


PODSTAWOWE INSTRUKCJE JĘZYKA C++

przykład:

#include <stdio.h>

void main( void )

0x08 graphic
0x08 graphic
{

int a = 10, b = 20 ;

0x08 graphic
0x08 graphic
{

int a = 30 ; // 'przesłonięcie' poprzedniej definicji a

printf( ”A = %d, B = %d \n” , a , b ); // wydruk: A=30, B=20

0x08 graphic
}

printf( ”A = %d, B = %d \n” , a , b ); // wydruk: A=10, B=20

. . .

if( a > 0 )

0x08 graphic
0x08 graphic
{

printf( ”Podaj nową wartość A =” );

scanf( ”%d” , &a );

0x08 graphic
}

0x08 graphic
}

if ( wyrażenie )
instrukcja_1 ;
else
instrukcja_2 ;

− część od słowa else można pominąć,
− instrukcja sprawdza czy wyrażenie jest różne od zera
tzn. if ( wyrażenie ) jest równoważne if ( wyrażenie != 0 )

#include <stdio.h>

void main( void )

{ int a;

printf( *Podaj wartość dodatnią A = ” ); scanf( ”%d” , &a );

if( a < 0 ) a = −a ;

if( a==0 )
{ printf( *A jest zerowe, podaj nową wartość A = ” ); scanf( ”%d” , &a ); }

}

if ( wyrażenie_1 )
instrukcja_1;
else
if
( wyrażenie_2 )
instrukcja_2;
else
if
( wyrażenie_3 )
instrukcja_3;
else
instrukcja_4;

switch ( wyrażenie_całkowite )

{

case wartość_1 : instrukcja_1;

break;

case wartość_2 :

case wartość_3 :

case wartość_4 : instrukcja_234;

break;

default : instrukcja_domyslna;

break;

}

#include <stdio.h>

void main( void )

{

int liczba;

printf( "Podaj wartość liczby całkowitej A =" );

scanf( "%d" , &liczba );

switch( liczba ) {

case 0 : printf( ”Podałeś liczbę zerową” ); break;

case -5 : printf( ”Podałeś liczbę minus pięć” ); break;

case 7 : printf( ”Podałeś liczbę siedem” );

break;

case 9 : printf( ”Podałeś liczbę dziewięć” ); break;

default: printf( "Podałeś inną liczbę niż: 0, -5, 7, 9 " );

break;

}

}

Dalsze przykłady dla instrukcji warunkowej:

#include <stdio.h> // Wartość maksymalna z trzech wczytanych liczb

void main(void)

{

int A, B, C, max;

printf( *Podaj pierwsza liczbe: ” );

scanf( ”%d” , &A );

printf( *Podaj druga liczbe: ” );

scanf( ”%d” , &B );

printf( *Podaj trzecia liczbe: ” );

scanf( ”%d” , &C );

max = A;

if( max < B ) max = B;

if( max < C ) max = C;

printf( ”\n Maksymalna wartosc = %d” , max );

getchar();

}

#include <stdio.h> // Pierwiastki trójmianu kwadratowego Ax2+Bx+C=0

#include <conio.h>

#include <math.h>

void main( void )

{

double a, b, c, delta, x1, x2;

clrscr();

printf( "Podaj pierwsza liczbe A= " );

scanf( "%lf" , &a ); // Uwaga !!! %lf a nie %f

printf( "Podaj druga liczbe B= " );

scanf( "%lf" , &b );

printf( "Podaj trzecia liczbe C= " );

scanf( "%lf" , &c );

delta = b∗b − 4∗a∗c;

if( delta < 0 )

printf( "\n Brak rozwiazan" );

else

if( delta == 0 )

{

x1 = x2 = −b/(2∗a);

printf( "Jest jedno rozwiazanie x1=x2= %f", x1 );

}

else

{

x1 = (−b − sqrt(delta)) / (2∗a); x2 = (−b + sqrt(delta)) / (2∗a);

printf( "Sa dwa rozwiazania x1= %.2f, x2= %.2f", x1, x2 );

}

}

Przykład dla instrukcji wyboru:

#include <stdio.h> // Program „kalkulator” zawierający proste „menu”

void main( void )

{

char znak;

double a, b, wynik;

printf( "Podaj pierwsza liczbe A =" ); // wczytanie dwóchliczb z klawiatury

scanf( "%lf" , &a );

printf( "Podaj druga liczbe B =" );

scanf( "%lf" , &b );

printf( "\n\nMozliwe operacje:" ); // wyswietlenie „menu”

printf( "\n (+) wynik = A + B" );

printf( "\n () wynik = A B" );

printf( "\n () wynik = A B" );

printf( "\n ( / ) wynik = A / B" );

printf( "\n\nPodaj znak operacji: " );

flushall( ); // wyczyszczenie wszystkich buforów (tutaj->klawiatury)

znak = getchar( ); // wczytanie znaku wybranej operacji

switch( znak ) // instrukcja wyboru jednej z operacji arytmetycznych

{

case '+' : wynik = a + b; break;

case '−' : wynik = a − b; break;

case '∗' : wynik = a ∗ b;

break;

case '/' : wynik = a / b; break;

default: wynik = 0;

printf( "\nBład operatora: podano zły znak operacji" );

break;

}

// wydruk liczb i wyniku z zadana dokladnoscia miejsc po przecinku

printf( "\nWynik obliczen: %.1f %c %.1f = %.2f " , a , znak , b , wynik );

printf( "\n\nKoniec programu. Nacisnij dowolny klawisz" );

fflush( stdin ); // wyczyszczenie bufora strumienia <stdin> tzn. klawiatury

getchar( );

}INSTRUKCJE REPETYCYJNE − PĘTLE