Programowanie I C / C++
laboratorium 03 — arytmetyka, operatory
Jarosław Piersa
Wydział Matematyki i Informatyki, Uniwersytet Mikołaja Kopernika
2013-02-19
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Typ znakowy Typ wyliczeniowy
Typ znakowy
# include< s t d i o . h >
int m a i n (){
c h a r a = ’ a ’;
p r i n t f (" % c \ n ", a );
p r i n t f (" % d \ n ", a );
r e t u r n 0;
} // m a i n
Typ znakowy
# include< s t d i o . h >
int m a i n (){
c h a r a = ’ a ’;
for ( a =’ A ’; a <=’ Z ’; a + + ) {
p r i n t f (" % d % c \ n ", a , a );
}
r e t u r n 0;
} // m a i n
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Typ znakowy Typ wyliczeniowy
Typ wyliczeniowy
# include< s t d i o . h >
int m a i n (){
e n u m dni { Pn , Wt , Sr , Cz , Pt , So , Ni };
e n u m dni d z i e n = Sr ; if ( d z i e n == Pn ){
p r i n t f (" M a m y d z i s P o n i e d z i a l e k \ n ");
}
r e t u r n 0;
Arytmetyka
int a , b ; a = 11;
b = 4;
p r i n t f (" % d \ n ", a );
p r i n t f (" % d \ n ", - a );
p r i n t f (" % d \ n ", a + b );
p r i n t f (" % d \ n ", a - b );
p r i n t f (" % d \ n ", a * b );
p r i n t f (" % d \ n ", a / b );
// d z i e l e n i e c a l k o w i t e p r i n t f (" % d \ n ", a % b );
// d z i e l e n i e m o d u l o
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Arytmetyka Przypisania
Zadanie
Jaka jest wartość operacji?
-1 -2 -3 2 + 2 * 2 1 - 4 / 2 * 3 1 / 3
1 / 3.0 1 % 3 1 % 3.0
← błąd kompilacji, drugi argument jest float
Zadanie
Jaka jest wartość operacji?
-1 -2 -3 2 + 2 * 2 1 - 4 / 2 * 3 1 / 3
1 / 3.0 1 % 3
1 % 3.0 ← błąd kompilacji, drugi argument jest float
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Arytmetyka Przypisania
Przesunięcia bitowe
int a , b ; a = 3;
b = 2;
s c a n f (" % d % d ", & a , & b );
p r i n t f (" % d \ n ", a < < b );
// p r z e s u n i e c i e b i t o w e w l e w o p r i n t f (" % d \ n ", a > > b );
// p r z e s u n i e c i e b i t o w e w p r a w o
Zadanie
Jaka jest wartość operacji?
1 << 1 1 << 2 2 << 1 3 << 2 5 << 2 3 >> 1 3 >> 2
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Arytmetyka Przypisania
Operacje bitowe
int a , b ;
s c a n f (" % d % d ", & a , & b );
p r i n t f (" % d \ n ", a | b );
// a l t e r n a t y w a b i t o w a p r i n t f (" % d \ n ", a & b );
// k o n i u n k c j a b i t o w a p r i n t f (" % d \ n ", a ^ b );
// xor b i t o w y
Zadanie
Jaka jest wartość operacji?
2 | 3 2 & 3 2 ^ 3 5 | 8 5 & 8 5 ^ 8
dany jest adres IP = a.b.c.d, a, b, c, d ∈ {0, 255} oraz maska M ∈ {0, 31} oblicz adres sieci i rozgłoszeniowy z wykorzystaniem operacji bitowych
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Arytmetyka Przypisania
Przypisania
int a , b ;
s c a n f (" % d % d ", & a , & b );
a = b ; a += b ; a -= b ; a *= b ; a /= b ; a %= b ; a < <= b ; a > >= b ; a |= b ; a &= b ;
Inkrementacja i dekrementacja
int b , a = b = 3;
p r i n t f (" % d \ n ", ++ a );
p r i n t f (" % d \ n ", b + + ) ; f l o a t c = 30;
p r i n t f (" % e \ n ", - - c );
p r i n t f (" % d % d %.2 e \ n ", a , b , c );
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Arytmetyka Przypisania
Zadanie
Co wypisze program?
int a = 0;
int b = a++;
printf("%d", a++ );
int a = 0;
int b = a++;
a += ++b;
printf("%d", ++b + a++ );
Rzutowanie
f l o a t f = 3 . 1 2 3 4 5 ; int a = 3;
p r i n t f (" % d \ n ", (int)( a + f ) );
l o n g l o n g l = 3 L ;
p r i n t f (" % d \ n ", (int) l );
f l o a t g = . 0 0 0 0 0 0 0 0 1 1 ;
int r = (int) f ^ (int) g ; p r i n t f (" % d \ n ", r );
Zadanie: spróbuj usunąć któreś z rzutowań i skompiluj program z flagą -Wall
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Switch
Switch
int a ; s w i t c h ( a ) {
c a s e 1: p r i n t f (" 1\ n ");
c a s e 2:
c a s e 3: p r i n t f (" 2 lub 3\ n ");
b r e a k; c a s e 4: b r e a k; c a s e 5: {
int b = a +1;
p r i n t f (" 5 % d \ n ", b );
b r e a k;
} // c a se 5
d e f a u l t: p r i n t f (" cos i n n e g o \ n ");
b r e a k;
Tablice
int n = 1 0 ; int a [ n ];
a [0] = 2;
a [1] = 3;
p r i n t f (" % d \ n ", a [ 2 ] ) ;
tablice w C są indeksowane od zera
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Tablice int Tablice char
Tablice - alokacja w miejscu
int a [] = { 9 , 3 , 4 , 8 , 1};
p r i n t f (" % d % d \ n ", a [0] , a [ 4 ] ) ;
odwołanie się do elementu poza tablicą daje się skompilować ale może powodować błędy
pisanie do elementu poza tablicą powoduje segmentation fault
Tablice znaków
c h a r a [] = " Ala ma k o t a ";
p r i n t f (" % c % c % c % c \ n ", a [10] , a [9] , a [8] , a [7] );
p r i n t f (" **% c \ n ** ", a [ 1 1 ] ) ; napis w C jest tablicą znaków
Proste typy zmiennych w C (dok.) Arytmetyka w C Switch Tablice w C (wersja nieinwazyjna)
Tablice int Tablice char
Tablice znaków
c h a r a [ 1 0 ] ;
a [0] = a [2] = ’ a ’; a [1] = ’ l ’;
p r i n t f (" % s \ n ", a );
a [3] = ’ \0 ’;
p r i n t f (" % s \ n ", a );
napis jest terminowany za pomocą znaku'\0'
Jak sprawdzić długość napisu?
# include< s t d i o . h >
# include< s t r i n g . h >
int m a i n (){
c h a r a [ 1 0 ] ; g e t s ( a );
p r i n t f (" % d \ n ", s t r l e n ( a ));
r e t u r n 0;
} // m a i n