Termin Egzaminu (Język C): ??? >> CZWARTEK, 7 LUTEGO << GODZ

Podobne dokumenty
Podstawy programowania w języku C i C++

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Języki i paradygmaty programowania

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Arytmetyka liczb binarnych

Spis treści JĘZYK C - OPERATORY BITOWE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

Język C zajęcia nr 11. Funkcje

Instrukcje sterujące. Programowanie Proceduralne 1

while(wyrażenie) instrukcja

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Podstawy programowania w języku C

Podstawy i języki programowania

Spis treści JĘZYK C - INSTRUKCJA SWITCH, OPERATORY BITOWE. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF05

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Język ludzki kod maszynowy

1 Podstawy c++ w pigułce.

Podstawy Programowania C++

2 Przygotował: mgr inż. Maciej Lasota

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Podstawy Programowania Podstawowa składnia języka C++

Wstęp do programowania

Informacja w perspektywie obliczeniowej. Informacje, liczby i obliczenia

O LICZBACH NIEOBLICZALNYCH I ICH ZWIĄZKACH Z INFORMATYKĄ

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Język C. Kierunek: Informatyka Stosowana (Wydział FAIS UJ) Wykład: Wtorek, s. A Forma zaliczenia kursu: Egzamin pisemny (test wyboru) * **

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Zmienne, stałe i operatory

Stuck in the loop. Sterowanie. Marcin Makowski. 29 października Zak lad Chemii Teoretycznej UJ

Podstawy programowania C. dr. Krystyna Łapin

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Języki i metodyka programowania. Wprowadzenie do języka C

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 1. Elektrotechnika, semestr II rok akademicki 2008/2009

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

1 Podstawy c++ w pigułce.

4. Funkcje. Przykłady

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Odczyt danych z klawiatury Operatory w Javie

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

( wykł. dr Marek Piasecki )

Materiały pomocnicze do wykładu 3 - Elementy języka Java

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

1. Operacje logiczne A B A OR B

Operatory w C++ Operatory arytmetyczne. Operatory relacyjne (porównania) Operatory logiczne. + dodawanie - odejmowanie * mnożenie / dzielenie % modulo

dr inż. Jarosław Forenc

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Program w C. wer. 10 z drobnymi modyfikacjami! Wojciech Myszka :28:

tablica: dane_liczbowe

Kod U2 Opracował: Andrzej Nowak

Poprawność semantyczna

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Programowanie komputerowe. Zajęcia 1

Wstęp do Programowania, laboratorium 02

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

IX. Wskaźniki.(3 godz.)

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

dr inż. Jarosław Forenc

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Podstawy Informatyki Maszyna Turinga

Elementy Teorii Obliczeń

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

Zestaw 3. - Zapis liczb binarnych ze znakiem 1

Programowanie strukturalne i obiektowe

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Programowanie obiektowe - zadania

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Program w C. wer. 12 z drobnymi modyfikacjami! Wojciech Myszka :59:

Funkcja (podprogram) void

Programowanie w elektronice: Podstawy C

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania skrót z wykładów:

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Spis treści JĘZYK C - INSTRUKCJA SWITCH, OPERATORY BITOWE. Metodyki i techniki programowania. Instrukcja do pracowni specjalistycznej z przedmiotu

Język C zajęcia nr 5

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

Transkrypt:

Termin Egzaminu (Język C): >> CZWARTEK, 7 LUTEGO << GODZ. 11.00??? Forma zaliczenia kursu: Egzamin pisemny (test wyboru) * ** * Warunkiem przystąpienia do egzaminu jest zaliczenie ćwiczeń (w uzasadnionych przypadkach: zgoda prowadzącego ćwiczenia) ** Ocena 5.0 (bdb) z ćwiczeń zwalnia z pisemnej części egzaminu [ OCENA KOŃCOWA: 0.5*ocena z ćwiczeń + 0.5*wynik egzaminu ] Adam Rycerz [ wyklad03.pdf ] Strona 1 z 27

Co to jest algorytm? Algorytm, przepis postępowania prowadzący do rozwiązania ustalonego problemu, określający ciąg czynności elementarnych, które należy w tym celu wykonać. [ http://encyklopedia.pwn.pl/haslo/algorytm;3867807.html ] Algorytm skończony ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań. Sposób postępowania prowadzący do rozwiązania problemu. [ https://pl.m.wikipedia.org/wiki/algorytm ] >> A czy może istnieć algorytm nieskończony? << Adam Rycerz [ wyklad03.pdf ] Strona 2 z 27

Po co stworzono komputery, czyli od Logicyzmu do Maszyny Turinga Komputery służą realizacji algorytmów, zaś algorytmy wymyślono, aby programować komputery Adam Rycerz [ wyklad03.pdf ] Strona 3 z 27

Logicyzm (inaczej: empiryzm logiczny) program redukcji całej matematyki do logiki, sformułowany na przełomie XIX i XX w. W pierwszej fazie: postulował sprowadzenie twierdzeń z tzw. wyższych działów matematyki do twierdzeń dot. arytmetyki liczb naturalnych ( Bertrand Russell, Georg Cantor, Ernest Zermelo ) Następnie (lub równolegle) - planowano wykazać, że twierdzenia arytmetyki wynikają, po odpowiednim zdefiniowaniu pojęć, wprost z praw logiki (tzw. program sformalizowania logiki matematycznej sfrmułowany przez Dawida Hilberta). Twierdzenie Gödela (1931) w ramach każdej teorii matematycznej (zawierającej pojęcie liczb naturalnych) istnieje zdanie, którego nie da się ani udowodnić, ani obalić. [ Umowny koniec programu sformalizowania matematyki ] Adam Rycerz [ wyklad03.pdf ] Strona 4 z 27

Alan Turing (1936) W pracy: On computable numbers, with an application to the Entscheidungsproblem, wprowadza pojęcie abstrakcyjnej maszyny (maszyna Turinga) oraz liczby obliczalnej, tj. liczby będącej wynikiem (na ogół: nieskończonego) ciągu operacji maszyny, wykonywanych wg skończonego zestawu instrukcji (dzisiaj powiedzielibyśmy: programu). Prawie wszystkie l.rzeczywiste to tzw. liczby nieobliczalne Maszyna Turinga w stanie q1 nad zerem na taśmie; zob: pl.wikipedia.org Adam Rycerz [ wyklad03.pdf ] Strona 5 z 27

Formalnie, maszynę Turinga definiuje odwzorowanie jednoznaczne: δ: Γ Q > Q Γ { L, P, } gdzie: Q zbiór możliwych stanów maszyny (skończony!) Γ zbiór dopuszczalnych symboli na taśmie (skończony!) { L, P, } przesunięcie głowicy (lewo, prawo, bez przesunięcia) [ Komputer to maszyna ale nie Turinga! ] => Ograniczenia maszyn Turinga (jak np. tzw. problem stopu ) tym bardziej dotyczą realnych komputerów (!) Adam Rycerz [ wyklad03.pdf ] Strona 6 z 27

Przykładowy algorytm (skończony ) ZADANIE: Oblicz n! dla zadanego n wg wzoru: n! = 1 2 3 n. [ Rozwiązanie - wymnażamy od końca ( n (n-1) 2 ). ] 1. Zapamiętaj n. ( Zakładam: n>1 ) 2. Zmniejsz n o 1. 3. Sprawdź, czy n==1? Jeśli TAK -> Koniec. Jeśli NIE: 4. Pomnóż zapamiętaną liczbę przez n. 5. Idź do kroku 2. Adam Rycerz [ wyklad03.pdf ] Strona 7 z 27

Program obliczający n! (Wersja 1) ( A zarazem przykład, jak nie należy programować ) main() { int w,n; scanf( %d,&n); w=n; krok2: n-=1; /* n=n-1; */ if (n==1) goto koniec; w*=n; /* w=w*n; */ goto krok2; koniec: printf( %d\n,w); } Adam Rycerz [ wyklad03.pdf ] Strona 8 z 27

Program obliczający n! ( Wersja 2: tym razem jak należy! ) int main() { int w,n; scanf( %d,&n); w=n; while (n>2) { n--; /* n=n-1; nieco krócej */ w*=n; /* w=w*n; */ } printf( %d\n,w); return 0; } [ Inny możliwy zapis pętli: while (n>2) w*= --n; ] Adam Rycerz [ wyklad03.pdf ] Strona 9 z 27

Instrukcja goto Instrukcja skoku ( goto etykieta; ) na ogół powoduje zauważalny wzrost długości kodu binarnego; prawie zawsze pogarsza czytelność programu i utrudnia wprowadzanie zmian. Tam, gdzie to możliwe - należy jej unikać! Na przykład, do niestandardowego opuszczenia bloku pętli doskonale nadaje się instrukcja (strukturalna!) break; [ Na ogół poprzedzona: if (warunek) ]. A co jeśli chcę opuścić dwie pętle naraz? Adam Rycerz [ wyklad03.pdf ] Strona 10 z 27

Przykład - opuszczanie 2 pętli z goto: Sprawdamy, czy w tablicach a i b występuje taki sam element: for (i=0; i<n; i++) { for (j=0; j<m; j++) { if (a[i]==b[j]) goto found; /* element znaleziony */ } } /* Instrukcje, gdy nie ma elementu */ found: /* znaleziono a[i]==b[j] */ /* Po etykiecie - zawsze intrukcja! */ Adam Rycerz [ wyklad03.pdf ] Strona 11 z 27

Program zawierający instrukcje skoku ( goto ) ZAWSZE można napisać bez niej, zwykle kosztem kilku dodatkowych instrukcji; w tym przypadku możemy np. zastąpić 2 pętle jedną: found=0; for (ix=0; ix<n*m; ix++) { j = ix%m; i = (ix-j)/m; /* A można też: i = (ix-(j=ix%m))/m; :-) */ if (a[i]==b[j]) { found=1; break; } } if (!found) { /* Instrukcje, gdy nie ma elementu */ } else { /* znaleziono a[i]==b[j] */ } Adam Rycerz [ wyklad03.pdf ] Strona 12 z 27

Program można jeszcze nieco skrócić zapisując pętlę tak: for (found=0,ix=0; ix<n*m &&!found; ix++) { if (a[i]==b[j]) found=1; } (wówczas nie potrzeba break w warunku: if (a[i]==b[j]) ). Kernighan & Ritchie, 1988: Nie jesteśmy w tej sprawie dogmatyczni, wydaje się jednak, że jeśli instrukcja goto ma być w ogóle stosowana, to powinna być stosowana rzadko. [ Na pociesznie w C mamy wskaźniki na funkcje ] Adam Rycerz [ wyklad03.pdf ] Strona 13 z 27

Algorytmy nieskończone Dwa problemy do samodzielnego przemyślenia: (a) Oblicz liczbę π wg wzoru Wallisa (1655) (b) Oblicz liczbę e (tj. podstawę logarytmu naturalnego) W obu przypadkach, możliwe jest stworzenie algorytmu, którego wynik różni się od dokładnego o dowolnie małe ε>0. Po nieskończenie długim czasie otrzymamy zatem wynik dokładny (!) [ nieskończoność potencjalna nieskończoność aktualna ] Adam Rycerz [ wyklad03.pdf ] Strona 14 z 27

Algorytmy probabilistyczne W sytuacji, gdy nie znamy deterministycznego przepisu na obliczenie interesującej nas wielkości ( X ) niekiedy można pokazać, że istnieje proces losowy (np. przebiegający wg schematu prób Bernouliego), dla którego X ( zakładamy, że 0<X<1 ) jest prawdopodobieństwem sukcesu. Wówczas, co prawda nie potrafimy X obliczyć, możemy jednak zaprząc komputer do symulacji, podczas której średnia częstość występowania interesującego nas zdarzenia będzie równa X. [ => Metody Monte-Carlo, generacja liczb pseudolosowych ] Czas obliczeń: T ~ log(1/ε) dla aa. deterministycznych, T ~ 1/ε 2 dla Monte-Carlo. Adam Rycerz [ wyklad03.pdf ] Strona 15 z 27

Przykład: Obliczanie π metodą Monte-Carlo Adam Rycerz [ wyklad03.pdf ] Strona 16 z 27

<latexit sha1_base64="dpbhdbm4r1z48t4tffiyx11sbji=">aaachnicbvdns8mwhe39npor6tfl5xa2zkmzgnoqhl48trbusm2rzukwlqylsyvr+sd48v/rg+jj0f/gdovbbt4ivlz3y8d7bsiovlb9yywtr6yurec28ptb2zu75t7+vqwigymdaxailoskyzqtr1hfscsubpkui013dj36zucija34nrqhpoujaacexuhpqwfwgz27xmux8ktjcytjckxiweiyxakcyw+1jk6lsj9q8q/ok5gxkp5ztkv2bnyigrkpggynnvmqb8krt7jcdenzhnaoujesimjgknwnkireeiqgjj7ks6xjlfutlxb6cwvn1jk55es59l096sm1lpnekv7ntsplnxdjysniey6nd3krs1rgpwvzfsoivmyscckc6h9aeih0a0pxmtfr4xzqreluqhdvehtarf9lhetaitgcjqdbgaidg9aadsdggbybt/blpbkvxrvxmr1dmrizb2agxvcvxuwffa==</latexit> <latexit sha1_base64="dpbhdbm4r1z48t4tffiyx11sbji=">aaachnicbvdns8mwhe39npor6tfl5xa2zkmzgnoqhl48trbusm2rzukwlqylsyvr+sd48v/rg+jj0f/gdovbbt4ivlz3y8d7bsiovlb9yywtr6yurec28ptb2zu75t7+vqwigymdaxailoskyzqtr1hfscsubpkui013dj36zucija34nrqhpoujaacexuhpqwfwgz27xmux8ktjcytjckxiweiyxakcyw+1jk6lsj9q8q/ok5gxkp5ztkv2bnyigrkpggynnvmqb8krt7jcdenzhnaoujesimjgknwnkireeiqgjj7ks6xjlfutlxb6cwvn1jk55es59l096sm1lpnekv7ntsplnxdjysniey6nd3krs1rgpwvzfsoivmyscckc6h9aeih0a0pxmtfr4xzqreluqhdvehtarf9lhetaitgcjqdbgaidg9aadsdggbybt/blpbkvxrvxmr1dmrizb2agxvcvxuwffa==</latexit> <latexit sha1_base64="dpbhdbm4r1z48t4tffiyx11sbji=">aaachnicbvdns8mwhe39npor6tfl5xa2zkmzgnoqhl48trbusm2rzukwlqylsyvr+sd48v/rg+jj0f/gdovbbt4ivlz3y8d7bsiovlb9yywtr6yurec28ptb2zu75t7+vqwigymdaxailoskyzqtr1hfscsubpkui013dj36zucija34nrqhpoujaacexuhpqwfwgz27xmux8ktjcytjckxiweiyxakcyw+1jk6lsj9q8q/ok5gxkp5ztkv2bnyigrkpggynnvmqb8krt7jcdenzhnaoujesimjgknwnkireeiqgjj7ks6xjlfutlxb6cwvn1jk55es59l096sm1lpnekv7ntsplnxdjysniey6nd3krs1rgpwvzfsoivmyscckc6h9aeih0a0pxmtfr4xzqreluqhdvehtarf9lhetaitgcjqdbgaidg9aadsdggbybt/blpbkvxrvxmr1dmrizb2agxvcvxuwffa==</latexit> <latexit sha1_base64="dpbhdbm4r1z48t4tffiyx11sbji=">aaachnicbvdns8mwhe39npor6tfl5xa2zkmzgnoqhl48trbusm2rzukwlqylsyvr+sd48v/rg+jj0f/gdovbbt4ivlz3y8d7bsiovlb9yywtr6yurec28ptb2zu75t7+vqwigymdaxailoskyzqtr1hfscsubpkui013dj36zucija34nrqhpoujaacexuhpqwfwgz27xmux8ktjcytjckxiweiyxakcyw+1jk6lsj9q8q/ok5gxkp5ztkv2bnyigrkpggynnvmqb8krt7jcdenzhnaoujesimjgknwnkireeiqgjj7ks6xjlfutlxb6cwvn1jk55es59l096sm1lpnekv7ntsplnxdjysniey6nd3krs1rgpwvzfsoivmyscckc6h9aeih0a0pxmtfr4xzqreluqhdvehtarf9lhetaitgcjqdbgaidg9aadsdggbybt/blpbkvxrvxmr1dmrizb2agxvcvxuwffa==</latexit> A czy można obliczyć e metodą Monte Carlo? >> MOŻNA! << Permutacje bez punktu stałego ( problem sekretarki ). P-stwo, że losowo wybrana (spośród n! permutacji zbioru n elementów) nie pozostawia żadnego elementu na swoim miejscu: P 0 (n) =1+ 1 1! + ( 1)2 2! + + ( 1)n n! W granicy n > dostajemy: P 0 > e -1 = 1/e 0.3679. Ćwiczenie: Napisz program, który generuje losową, reprezentatywną próbę np. 10 6 spośród 100! permutacji 100 elementów, i sprawdza, jaki jest udział (w tej próbie) permutacji bez punktu stałego. Wskazówka: Każdą permutację można otrzymać dokonując skończonej liczby transpozycji sąsiednich elementów permutacji identycznościowej. Adam Rycerz [ wyklad03.pdf ] Strona 17 z 27

Poprzedni wykład: - Stałe i wyrażenia stałe w języku C - Deklaracje/definicje ( => zasięg zmiennych, zmienne zewnętrzne i zmienne automatyczne ) - Operatory arytmetyczne; relacje i operatory logiczne - Interpretacja logiczna liczb całkowitych - Przekształcenia typów Adam Rycerz [ wyklad03.pdf ] Strona 18 z 27

Przekształcenia typów Jeśli argumenty operatora są różnych typów, dokonuje się przekształcenia typu ciaśniejszego do obszerniejszego. [ Zawsze w ramach jednego wyrażenie składowego!!! => wyrażenie: 1/3*x == 0.0 dla x typu double ] Praktyczny zestaw reguł (nie dotyczy unsigned ): Jeśli którykolwiek z argumentów jest typu long double, drugi zostanie przekształcony do long double. W przeciwnym przypadku, jeśli typem któregokolwiek argumentu jest double, to drugi argument będzie przekształcony do double. Adam Rycerz [ wyklad03.pdf ] Strona 19 z 27

W przeciwnym przypadku, jeśli typem któregokolwiek z argumentów jest float, to drugi argument będzie przekształcony do float. W przeciwnym przypadku, obiekty typu char i short są przekształcane do int. Ostatecznie, jeśli którykolwiek z argumentów ma kwalifikator long, to drugi zostanie przekształcony do long. Reguły przekształceń komplikują się dla argumentów unsigned. Odpowiedź na pytanie, który z dwóch typów (unsigned i coś ze znakiem) jest ciaśniejszy, a który obszerniejszy, może zależeć od maszyny. Jeśli int ma 16 bitów a long 32, wówczas -1L<1U (a jednocześnie -1L>1UL ); jeśli oba mają 32 bity: -1L>1U. Adam Rycerz [ wyklad03.pdf ] Strona 20 z 27

Rzutowanie Aby wymusić przekształcenie typu (w pożądanym kierunku!), używamy operatora rzutowania (ang. cast), np. sqrt((double)n), albo (float)i/n. Podobnie, możliwe jest rzutowanie typu obszerniejszego na ciaśniejszy, np. (int)x dla zmiennej typu float (lub double). W takim przypadku, wynik jest obcinany (do l.całkowitej mniejszej lub równej x) jedynie dla x - nieujemnego; dla ujemnego - obcięcie w górę ; nie jest to zatem matematycznie część całkowita x. [ Istnieją funkcje biblioteczne double floor(double x); double ceil(double x); zdefiniowane w <math.h> ] Ważne: Rzut produkuje wartość argumentu w odpowiednim typie; sam argument pozostaje niezmieniony. Adam Rycerz [ wyklad03.pdf ] Strona 21 z 27

Operatory zwiększania i zmniejszania W C mamy specyficzne dla tego języka, jednoargumentowe operatory zwiększania i zmniejszania wartości zmiennych: Operator ++ dodaje 1 do swojego argumentu; operator -- odejmuje 1. Każdy z nich może występować w wersji przedrostkowej (++n) lub przyrostkowej: n++. [ Podobnie, mamy: --n lub n-- ] [ W pierwszym przypadku, wyrażenie ++n zwiększa wartość n przed jej użyciem; zaś n++ zwiększa n po użyciu poprzedniej wartości. ] Jeśli np. n == 5; instrukcja: x=n++; nadaje x wartość 5, natomiast instrukcja: x=++n; nadaje x wartość 6. Adam Rycerz [ wyklad03.pdf ] Strona 22 z 27

Operatory bitowe W C mamy sześć operatorów pozwalających na manipulacje bitami, 5 dwuargumentowych i 1 jednoargumentowy; można je stosować jedynie do argumentów całkowitych, tj. typów char, short, int, lub long, zarówno w wersjach ze znakiem jak i bez znaku). Są to: & bitowa koniunkcja (AND), bitowa alernatywa (OR), ^ bitowa różnica symetryczna (ang. exclusive-or, XOR), << przesunięcie w lewo, >> przesunięcie w prawo, ~ dopełnienie bitowe (operator 1-argumentowy). Adam Rycerz [ wyklad03.pdf ] Strona 23 z 27

Bitowy operator koniukcji (&) służy do zasłaniania (zerowania) wybranego zbioru bitów; z kolei operator alternatywy ( ) służy do ustawiania (zastępowania jedynkami) wybranych bitów. Przykładowo, instrukcja x = x & ~077; /* lub: x &= ~077; */ spowoduje wyzerowanie sześciu ostatnich bitów x [ A wynik zupełnie nie zależy od tego, ile bitów ma x! ]. Np, dla 8 bitów ( unsigned char ) stała 077 ( dziesiątkowo: 63 ) reprezentowana jest przez ciąg: 00111111 zaś ~077 to 11000000; w przypadku obszerniejszych typów przybywa jedynek z przodu. Spostrzeżenie: Instrukcja x ^= MASKA; jest odwracalna, tzn. jeśli wykonać ją powtórnie zmienna x odzyska początkową wartość. Adam Rycerz [ wyklad03.pdf ] Strona 24 z 27

Operatory i wyrażenia przypisania Wyrażania podobne do: i = i + 2 można zastępować krótszymi: i += 2 [ Np. x *= y + 1 jest odpowiednikiem: x = x * (y + 1) ] W C istnieją zatem tzw. operatory przypisania: += -= *= /= %= <<= >>= &= ^= = Funkcja zliczająca bitowe jedynki argumentu x: int bitcount(unsigned x) /* NIE MA bitu znaku! */ { int b; for (b = 0; x!= 0; x >>= 1) if (x & 01) b++; return b; } Adam Rycerz [ wyklad03.pdf ] Strona 25 z 27

Wyrażenia warunkowe (czyli operator?: ) Instrukcja: if (a > b) z = a; else z = b; może zostać zastąpiona przez: z = (a > b)? a : b; /* Nawiasy ( ) można pominąć */ [ Operator?: to JEDYNY operator trójargumentowy w C! ] Po prawej stronie przypisania mamy wyrażenie warunkowe [ TUTAJ: (a > b)? a : b ], które jest pełnoprawnym wyrażeniem, ma zatem swoją wartość i może zostać użyte wszędzie tam, gdzie inne wyrażenia. Przykład: printf( Mamy %d częś%s.\n, n, n==1? ć : ci ); Adam Rycerz [ wyklad03.pdf ] Strona 26 z 27

UWAGI o wyrażeniu warunkowym?: Operator?: wiąże silniej niż przypisanie (=), czy operator przecinkowy (, ) ale słabiej niż np. operatory relacji ( <, >, == ). Przykładowo, w warunku zakończenia pętli: for (x = 0.0; x < (y>1.0? y : 1.0); x += 0.1) nie można pominąć nawiasów ( ), w przeciwnym wypadku wyrażenie ulegnie rozerwaniu przez pierwszy <. Jest to szczególnie istotne w makrodefinicjach zawierających?: #define MAX(a,b) (((a)>(b))?(a):(b)) #define ROUND(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5)) Adam Rycerz [ wyklad03.pdf ] Strona 27 z 27