Język C proceduralny j ę zyk programowania

53
Język C proceduralny język programowania koncepcje i rozwiązania podobne do stosowanych w języku Pascal Denis Richie 1972 dla systemu operacyjnego UNIX „język wewnętrzny” systemu operacyjnego UNIX standard ANSI - 1989, standard C99 - 1999 liczne kompilatory i zintegrowane systemy

description

Język C proceduralny j ę zyk programowania koncepcje i rozw ią zania podobne do stosowanych w j ę zyku Pascal Denis Richie 1972 dla systemu operacyjnego UNIX „j ę zyk wewn ę trzny” systemu operacyjnego UNIX standard ANSI - 1989 , standard C99 - 1999 - PowerPoint PPT Presentation

Transcript of Język C proceduralny j ę zyk programowania

Page 1: Język C proceduralny  j ę zyk programowania

Język C    

proceduralny język programowania

     koncepcje i rozwiązania podobne do stosowanych w języku Pascal

     Denis Richie 1972 dla systemu operacyjnego UNIX

     „język wewnętrzny” systemu operacyjnego UNIX

standard ANSI - 1989, standard C99 - 1999

     liczne kompilatory i zintegrowane systemy programowania   

Page 2: Język C proceduralny  j ę zyk programowania

rozszerzenia obiektowe C++ 1985 - rozszerzono również część nieobiektową

  przedmiotem wykładu będzie podzbiór języka C++ przeznaczony do programowania strukturalnego

  ostateczna definicja języka programowania kompilator

#include "stdio.h"

void main ( )

{

printf ( "Hello World!" );

}gcc.pdf, c99status.html, Arytma.ppt

Page 3: Język C proceduralny  j ę zyk programowania

Alfabet

Wszystkie znaki 8-bitowego kodu ASCII

litery: A B ... Z a b ... z _

cyfry: 0 1 ... 9

pozostałe

Kody 32 ... 126 : program

Kody 0 ... 31 i większe od 126 : dane tekstowe

Na żądanie UNICODE (UTF-8)

Page 4: Język C proceduralny  j ę zyk programowania

Identyfikatory

Ciągi znaków alfabetu zaczynające się od litery, dalej litery lub cyfry.

Standardowo początkowe 32 znaki, odróżniając duże i małe litery.

 

alfa Alfa AlfA ALFA Cena_Mleka KosztTransportu 

Słowa kluczowe - identyfikatory zastrzeżone.

Page 5: Język C proceduralny  j ę zyk programowania

Komentarze

 

/*

......................

bez zagnieżdżania

........................

*/

// .............................

Page 6: Język C proceduralny  j ę zyk programowania

Typy liczb całkowitych

char short int long long long

signed unsigned

typ signed unsigned bajty

char – 128 , + 127 0 , 255 1

short – 32 768 , + 32767 0 , 65535 2

int,

long

– 2 147 483 648 ,

+ 2 147 483 647

0 ,

4 294 967 295

4

long

long

– 9 223 372 036 854 775 808 ,

+ 9 223 372 036 854 775 807

0 ,

18 446 744 073 709 551 615

8

Page 7: Język C proceduralny  j ę zyk programowania

Typy zmiennopozycyjne 

float double long double

  typ zakres cyfry bajty

float 3.4*1038

7 4

double,long double

1.7*1030

8

15

8

IEEE 754

Page 8: Język C proceduralny  j ę zyk programowania

Liczby całkowite

12 154555 // dziesiętnie

012 03777453 // ósemkowo

0xAB 0x5c5d 0xfff45a // heksadecymalnie

 

Typ liczby :

na podstawie wartości (domyślny int)

  12 25467 // signed int

34760548093 // signed long long

Page 9: Język C proceduralny  j ę zyk programowania

wskazany w zapisie liczby

15L 077777l 0xFF4FFFL // signed long

254ll -457LL 0xAB56LL // signed long long

45211u 0xffau // unsigned int

3000000000ul 0xC56AFB44UL // unsigned long

-120ULL 78ull // unsigned long long

Page 10: Język C proceduralny  j ę zyk programowania

Liczby zmiennopozycyjne 

1.25 0.343 .5 2.

35.56E-12 0.34e2 5e3 17.18E+28

 

Typ liczby :   na podstawie wartości (domyślny double) wskazany w zapisie liczby 

12.545f // float

0.2345676543F // float

0.5e-3l // long double

0.9999998899E456L // long double

Page 11: Język C proceduralny  j ę zyk programowania

Znaki 

Liczby całkowite typu: char

 

 

'a' '5' '+' '.'

'A' '\071' '\x41' '\x5F'

'\n' '\t' '\r' '\\' '\”'

Page 12: Język C proceduralny  j ę zyk programowania

Łańcuchy 

"Programowanie w języku C"

"Wynik : "

"\tImię\tNazwisko\tMiejsce zamieszkania\n"

"\x16\x16\x02" // SYN SYN STX

"Spojrzał i powiedział: \"Nie mogę\"."

  

"ABC"

0x41 0x42 0x43 0x00

Page 13: Język C proceduralny  j ę zyk programowania

Zmienne < identyfikator , wartość >

Deklaracje zmiennych

char signed char

int signed signed int

short short int signed short int

long signed long long int signed

long long signed long long

unsigned char

unsigned int unsigned

unsigned short unsigned short int

unsigned long unsigned long int

unsigned long long

float

double

long double

Page 14: Język C proceduralny  j ę zyk programowania

Deklaracje zmiennych

int i;

char a, b, c;

unsigned long duza_odleglosc;

float KursDolara;

double masa, gestosc;

Definicje zmiennych

int licznik = 125, suma = 0;

float dokladnosc = 0.0005,

uchyb = 0.001;

double moc = 15e6, straty = 1500;

//

double alfa = 3.34, beta, jota = 15.15, kappa;

Page 15: Język C proceduralny  j ę zyk programowania

Stałe  

const int dni = 7, tygodnie = 52;

const float pi = 3.14159, e = 2.71828;

const double Avogadro = 6.022E23;

  Operator przypisania 

int i, j, k;

i = 1; //zmienna i przyjmuje wartość 1

j = i; //zmienna j przyjmuje wartość zmiennej i

k = dni; //zmienna k przyjmuje wartość stałej dni

Page 16: Język C proceduralny  j ę zyk programowania

Notacja Węgierska

Przedrostek Typ danych Przykład

b bool bJeszczeRaz

c char cKodPolecenia

l long lDuzyKaliber

n int nLicznikPierwszy

p wskaźnik pAdresNowejCeny

a tablica anDaneTestowe

s łańcuch znaków sStosownyNapis

Page 17: Język C proceduralny  j ę zyk programowania

Wskaźniki

- lokalizacja

- typ  

Zmienne wskaźnikowe : deklaracje

 

int *pt_i, *pt_j;

double *wsk1, *wsk2;

float moc1, moc2, *wsk_mocy;

void *dowolny, *kazdy;

25.7

wsk_mocy moc1

Page 18: Język C proceduralny  j ę zyk programowania

Operator wyznaczania wskaźnika &

int lampy, widelce;

int *wsk_towaru;

wsk_towaru = & lampy;

................

wsk_towaru = & widelce;

float Korzysc = 2.54;

float *wsk_f;

long *wsk_l;

void *wsk_v;

wsk_f = & Korzysc; // poprawnie

wsk_l = & Korzysc; // błąd

wsk_v = & Korzysc; // poprawnie

Page 19: Język C proceduralny  j ę zyk programowania

int cena = 25, *wsk_cena, **wsk_wsk_cena;

wsk_cena = & cena;

wsk_wsk_cena = & wsk_cena;

 

 

25

wsk_wsk_cena wsk_cena cena

Page 20: Język C proceduralny  j ę zyk programowania

Zmienne wskaźnikowe : definicje

 

int i = 5, j = 7;

int *pt = & i, *pk = & j;

double droga, czas = 100, *wsk1, *wsk_param = & droga;

char *poczatek = "Początek obliczeń\n",

*koniec = "Koniec obliczeń\n",

*napis;

napis = poczatek;

/* wyświetlenie napisu i wykonanie obliczeń */

napis = koniec;

/* wyświetlenie napisu i koniec programu */

Page 21: Język C proceduralny  j ę zyk programowania

Operator dostępu pośredniego *

 

int i = 5, j;

int *wsk = & i;

j = *wsk; // równoważne j = i;

wsk 5 i

float x = 1.5, y, *wx = & x, **wwx = & wx;

y = **wwx; // równoważne y = x;

// 

const double dbK7 = 12e5;

double *wk = & dbK7; // błąd

Page 22: Język C proceduralny  j ę zyk programowania

Wskaźnik do stałej

 

const long *ws_st; //wskaźnik do stałej

const long dystans = 5786;

ws_st = & dystans;

long odleglosc = *ws_st; // poprawnie

// odległość == dystans

*ws_st = 1298; // błąd

 

long war = 10, ukrop;

ws_st = & war;

war = 150; // poprawnie

ukrop = *ws_st; // poprawnie, ukrop = 150

*ws_st = 150; // błąd

Page 23: Język C proceduralny  j ę zyk programowania

Stała wskaźnikowa

 

float cena = 12.5, netto;

float *const swx = & cena;

// stała wskaźnikowa, wartość początkowa konieczna

cena = 15.8; // poprawnie

*swx = 15.8; // poprawnie

swx = &netto; // błąd

swx cena

Page 24: Język C proceduralny  j ę zyk programowania

Referencje 

Każda operacja wykonywana na referencji jest identyczna z operacją wykonaną bezpośrednio na reprezentowanej przez tę referencję zmiennej czy strukturze danych.

 

int kwota;

int &ref_k = kwota;

ref_k = 1254; // równoważne kwota = 1254;

// 

long a, b, &ref_a = a;

ref_a = 12; // równoważne a = 12;

b = ref_a; // równoważne b = a;

Page 25: Język C proceduralny  j ę zyk programowania

float moc_x, &ref_x = moc_x, *wsk_x;

wsk_x = & ref_x; // równoważne wsk_x = & moc_x;

wsk_x = ref_x; // błąd, podobnie jak wsk_x = moc_x; 

double &ref_dok = 1.15E-5; // realizacja :

XX = 1.15E-5; // pomocnicza zmienna wewnętrzna

double &ref_dok = XX; 

unsigned int bin = 0xCFCF;

int &ref_b = bin; // realizacja :

int YY = (int) bin; // unsigned int int

int &ref_b = YY;

ref_b = 15; // nie zmienia wartości // zmiennej bin

Page 26: Język C proceduralny  j ę zyk programowania

Typy wyliczeniowe

enum id_typu { lista_stałych } id_zmiennej ;

 enum dni {ni, po, wt, sr, cz, pi, so}; /* ni == 0, po == 1, ... , so == 6 */ enum dni {ni=1, po, wt, sr, cz, pi, so}; /* ni == 1, po == 2, ... , so == 7 */dni Egzamin, Dobry = cz;Egzamin = Dobry;//enum TW1 {t1, t2, t3 = 0, t4, t5, t6 = 1, t7}; /* t4 == 1, t5 == 2, t7 == 2 *///enum {A = 0x41, B, C, X = 0x58} znak;

// zmienna typu wyliczeniowegoznak = C; // poprawnieznak = 0x41; // błąd Enum

Page 27: Język C proceduralny  j ę zyk programowania

Typ logiczny

bool stan, obecnosc = true;

stan = true;

obecnosc = false;

// 

enum BOOL {FALSE, TRUE}; // 0 , 1

BOOL flaga, status = TRUE;

flaga = FALSE;

status = flaga;

Page 28: Język C proceduralny  j ę zyk programowania

Nazywanie typów danych 

typedef typ nowy_identyfikator

 

typedef char* string;

string S1, S2, S3 = "napis";

 

typedef int num;

num k;

int l = 5;

k = l; // typ num jest równoważny z typem int

 

typedef long BIG;

unsigned BIG ww; // błąd

Page 29: Język C proceduralny  j ę zyk programowania

Wprowadzanie danych 

getch

D. int getch ( );

B. conio.h

F. Kolejny opis klawisza z klawiatury ( oczekiwanie ), bez echa

W. Kod ASCII lub 0

P.

char nowy;

nowy = getch();

//

getche

Jak getch + echo

Page 30: Język C proceduralny  j ę zyk programowania

scanf

 

D. int scanf ( const char *format, wskaźnik, wskaźnik, ... );

B. stdio.h

F. Wczytuje kolejne pola (ciągi znaków do SP lub NL)

ze stdin z echem (BS).

Format - tekst będący ciągiem wzorców konwersji.

Wzorzec konwersji: 

% [ * ] [ szerokość ] [ prefiks ] znak_konwersji

 

W. Liczba wczytanych pól znaków

Page 31: Język C proceduralny  j ę zyk programowania

P.

int liczba_sztuk;

scanf ( "%d", &liczba_sztuk );

double szerokosc;

scanf( "%lf", &szerokosc );

scanf( "%lf%d", &szerokosc, &liczba_sztuk );

Page 32: Język C proceduralny  j ę zyk programowania

int lampy, krzesla, *wsk = &krzesla;

float temp;

double cena;

char opcja;

//

scanf( "%d%d%f%lf", &lampy, wsk, &temp, &cena );

// 1 5 SP 3 4 7 Enter - 2 5 . 4 Enter // 3 . 9 9 Enter

// lampy == 15 krzesla == 347

// temp == -25.4 cena == 3.99

Page 33: Język C proceduralny  j ę zyk programowania

// wczytywanie pojedynczych znaków

fflush(stdin); // oczyszczenie bufora klawiatury

scanf( "%c", &opcja );

// A Enter

// opcja == 'A'

// wczytywanie tekstów

char Tekst[16]; // tablica 16 elementowa

scanf ( "%15s", Tekst );

// A l f a Enter

// Tekst == "Alfa"

scanf ( "%15[ -~]", Tekst );

// A l a SP m a SP k o t a . Enter

// Tekst == "Ala ma kota."

Page 34: Język C proceduralny  j ę zyk programowania

In

gets_s

 

D. char* gets_s ( char *tekst, int rozmiar ) ;

B. stdio.h

F. Odczytuje ze stdin ciąg znaków (z SP, HT) z echem do NL,

liczba znaków ograniczona przez rozmiar

W. Tekst lub NULL

P.

gets_s( Tekst );

Page 35: Język C proceduralny  j ę zyk programowania

Wyprowadzanie danychputchar

 

D. int putchar ( int c ) ;

B. stdio.h

F. Znak do stdout

W. Argument c lub EOF

P.

char cc = 'R';

putchar ( cc );

// 'R' na ekran

Page 36: Język C proceduralny  j ę zyk programowania

puts

 

D. int puts ( char *napis );

B. stdio.h

F. Do stdout ciąg znaków + NL

W. !0 lub EOF

P.

 

#include <stdio.h>

void main( )

{

char *nn = "Napis ćwiczebny.";

puts(nn);

}

Page 37: Język C proceduralny  j ę zyk programowania

printf 

D. int printf ( const char *format, wyrażenie, wyrażenie, ... );

B. stdio.h

F. Do stdout ciągi znaków reprezentujących wartości wyrażeń

Format :

  - znaki przesyłane bezpośrednio do stdout

   - wzorce konwersji

Page 38: Język C proceduralny  j ę zyk programowania

P.

int liczba_kolorow = 256;

printf( "%d", liczba_kolorow );

double odjetosc = 15.72;

printf( "%lf", objetosc );

char *Tekst = "Dokumentacja.";

printf ( "%s", Tekst);

Page 39: Język C proceduralny  j ę zyk programowania

Wzorzec konwersji :

% [ opis ] [ szerokość ] [ precyzja ] [ prefiks ] znak_konwersji

opis :

- uzupełnianie znakami spacji z prawej strony

+ wyprowadzanie znaku liczby

SP znak spacji zamiast znaku plus

 

szerokość :

- minimalna liczba znaków dla liczb

- maksymalna liczba znaków dla ciągów znaków

precyzja :

. liczba_miejsc_po_kropce

Page 40: Język C proceduralny  j ę zyk programowania

int Alfa = 5;

float Beta = 12.45;

printf ( "Wynik: \n Alfa = %d,\t Beta = %f\n",

Alfa, Beta + 500);

// Wynik:

// Alfa = 5, Beta = 512.450000

char opcja = 'X';

char *Napis = "Opis programu.";

printf("Wybrano opcję %c : %31s", opcja, Napis );

// Wybrano opcję X : Opis programu.

Page 41: Język C proceduralny  j ę zyk programowania

int koty = 2, *wsk_k = &koty;

float test = 23.345678;

double wynik = -0.01234567;

//

printf("Liczba kotów : %d", *wsk_k );

printf("\nWynik testu = %12.3f\n"

"Razem = %.5lf\n", test + 5, wynik );

// Liczba kotów : 2

// Wynik testu = 28.345

// Razem = -0.01234

Out

Page 42: Język C proceduralny  j ę zyk programowania

Wyrażenia 

Wyrażenia elementarne : liczby, znaki, zmienne, stałe, wywołania funkcji

Operatory : jedno- dwu- lub trójargumentowe o ustalonych priorytetach

Nawiasy okrągłe dla ustalenia kolejności obliczeń.

operator przypisania =

operator dostępu pośredniego *

operator wyznaczania wskaźnika &

 

Page 43: Język C proceduralny  j ę zyk programowania

Konwersja wartości

lewy Ø prawy typ ( lewy ) == typ ( prawy )

 

Konwersja rozszerzająca zwiększenie liczby bajtów

Konwersja zawężająca zmniejszenie liczby bajtów

int li32 = 21212345;

long long li64 = li32; // konwersja rozszerzająca

short li16 = li32; // konwersja zawężająca

// strata danych li16 == -21319

Dla operatora = konwersja na typ lewej strony ( możliwa strata informacji )

char c;

c = 258; // c == ?

Page 44: Język C proceduralny  j ę zyk programowania

Konwersja typu na życzenie programisty rzutowanie 

typ ( wyrażenie )( typ ) wyrażenie

 int ile = 27;float tyle = 1.4; ile = ile + tyle;

/* konwersja 27 na 27.0, dodawanie zmiennopozycyjne,

konwersja 28.4 na 28, przypisanie */ ile = ile + (int) tyle;

/* konwersja 1.4 na 1, dodawanie całkowitoliczbowe,

przypisanie */

int i, *wsk_i = & i;float *wsk_f;wsk_f = ( float* ) & i;wsk_f = ( float* ) wsk_i;

Page 45: Język C proceduralny  j ę zyk programowania

Operatory arytmetyczne 

* / + – % 

int liczba, nieparzystosc;

nieparzystosc = liczba % 2; // 0 - p, 1 - np

 

(3 * x * x + 5 * x - 1) /

(7 * x * ((2 * x + 3) * (1 - x) + 5) + 3)

int a = 1700000000, b = 1900000000, suma;

suma = a + b; // nadmiar stałopozycyjny

float x = 0.5e35, y = 0.2e5, z;z = x * y; // nadmiar zmiennopozycyjny 

3]5)1)(32[(7

153 2

xxx

xx

OverHole, Wielkanoc

Page 46: Język C proceduralny  j ę zyk programowania

Operatory zmniejszania i zwiększania 

++ –– 

++alfa ––beta // przed obliczeniem wyrażenia

alfa++ beta–– // po obliczeniu wyrażenia

 

float x = 2.5, y;

x ++ ; // równoważne x = x + 1;

++ x ; // równoważne x = x + 1;

x -- ; // równoważne x = x - 1;

-- x ; // równoważne x = x - 1;

y = ++(2 * x); // błąd

 

int i = 3, j = 4, s;

s = j++ + i; // s == 7 j == 5

j = 4;

s = ++j + i; // s == 8 j == 5

Page 47: Język C proceduralny  j ę zyk programowania

Operatory relacyjne0 : false

nie 0 : true 

< <= == != >= > 

bool mniejsze, rowne, nierowne, wiekszerowne;

int i = 5; float x = 12.3;

mniejsze = i < x; // true

rowne = i == x; // false

nierowne = i != x; // true

wiekszerowne = i >= x; // false

 

double x = 1.5E-5, y = x;

double *wsk_x = & x, *wsk_y = & y;

rowne = wsk_x == wsk_y; // false

wsk_x = & y;

rowne = wsk_x == wsk_y; // true

Page 48: Język C proceduralny  j ę zyk programowania

Operatory logiczne 

! && ||

int a, b, c;

bool z;

z = a < b && b < c; // a < b < c 

int rok = 2000;

bool przestepny;

przestepny = !(rok % 4) && rok % 100 ||

!(rok % 400);

( a > b ) && ( k <= f++ ) // optymalizacja

( k > 5 ) || (c < ( b = 7 ) )

Page 49: Język C proceduralny  j ę zyk programowania

Operatory bitowe 

Wi = Ai Bi 

~ & | ^ << >> 

int i = 35, przeciwna, parzystosc, r, s;

przeciwna = ~ i + 1; // równoważne - i;

nieparzystosc = i & 1;

r = i << 2; // równoważne r = i * 4;

s = i >> 3; // równoważne s = i / 8; 

char a = 'r', b = 8;

a = a & 0x5F; // zamiana małych liter ASCII na duże

b = b | 0x30; // zamiana wartości binarnej 0-9 // na kod znaku ASCII

Page 50: Język C proceduralny  j ę zyk programowania

Złożone operatory przypisania 

*= /= %= += –= <<= >>= &= ^= |=

 

double kurs, zwyzka;

kurs += zwyzka; // kurs = kurs + zwyzka;

 

int x = 10;

x -= 5 – 2 ; // ?

 

int i, j, k;

i = (j = 5) + 1; // równ. j = 5; i = j + 1;

i = j = k = 0; // równ. i = 0; j = 0; k = 0;

Page 51: Język C proceduralny  j ę zyk programowania

Operator warunkowy 

wyrażenie_1 ? wyrażenie_2 : wyrażenie_3

  

float x, y, max;

max = x > y ? x : y;

 

Operator rozmiaru

long liczba_1;

dlugosc_1 = sizeof liczba_1; // == 4

dlugosc_1 = sizeof long; // == 4

Page 52: Język C proceduralny  j ę zyk programowania

Operator wyliczenia 

long a1, a2, a3, s;

s = ( a1 = 52700, a2 = 31300, a3 = a1 + a2 );

// a3 == 84000 s == 84000

s = a1 = 52700, a2 = 31300, a3 = a1 + a2;

// s = ?

float x, y ,z;

z = ( x = 5.3, y = 2.5, y++ );

// y == 3.5 z == 2.5

Page 53: Język C proceduralny  j ę zyk programowania

Priorytety i łączność operatorów

// lewostronnie łączny 

// prawostronnie łączny

char a,b,c,d,e;

a + b - c - d + e;

/* lewostronnie łączne czyli

(((a + b) - c) - d) + e; */ 

a ? b : c ? d : e;

/* prawostronnie łączny czyli

a ? b : (c ? d : e); */

A B C (( ) )A B C ( ( ))A B C

P1, P2, P3, P4