Elementy pliku źródłowego w języku C

Podobne dokumenty
2 Przygotował: mgr inż. Maciej Lasota

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

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

1. Wprowadzanie danych z klawiatury funkcja scanf

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

Zmienne, stałe i operatory

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Język C zajęcia nr 11. Funkcje

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

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

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

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

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

1 Podstawy c++ w pigułce.

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

Wstęp do Programowania, laboratorium 02

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Wstęp do wskaźników w języku ANSI C

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 2. Karol Tarnowski A-1 p.

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Podstawy programowania C. dr. Krystyna Łapin

Programowanie strukturalne i obiektowe

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Język ludzki kod maszynowy

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

#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 ); }

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

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

1 Podstawy c++ w pigułce.

C++ wprowadzanie zmiennych

MATERIAŁY DO ZAJĘĆ II

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

Języki i metody programowania. Omówienie języków C, C++ i Java

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

Wykład 2 Składnia języka C# (cz. 1)

Język C++ zajęcia nr 2

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

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

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

IX. Wskaźniki.(3 godz.)

Język C++ zajęcia nr 1

Struktury, unie, formatowanie, wskaźniki

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wstęp do programowania. Wykład 1

Programowanie strukturalne. dr inż. Tadeusz Jeleniewski

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

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

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

1. Wprowadzenie do C/C++

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

Funkcje printf() i scanf() i operatory

Mikrokontroler ATmega32. Język symboliczny

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

1. Wprowadzenie do C/C++

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

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Proces tworzenia programu:

tablica: dane_liczbowe

( wykł. dr Marek Piasecki )

Stałe i zmienne znakowe. Stała znakowa: znak

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do programowania

Biblioteka standardowa - operacje wejścia/wyjścia

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Język C, tablice i funkcje (laboratorium, EE1-DI)

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Podstawy programowania - 1

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

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

KURS C/C++ WYKŁAD 1. Pierwszy program

Lab 9 Podstawy Programowania

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

1. Brian W. Kernighan, Dennis M. Ritchie, Język ANSI C, WNT, Warszawa 1998.

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Języki programowania obiektowego Nieobiektowe elementy języka C++

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Podstawy programowania w języku C

Język C zajęcia nr 12. Struktury i unie

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

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

Powtórka algorytmów. Wprowadzenie do języka Java.

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Język C i C++. Podstawy. Zagadnienia do opanowania. Przykład 1. (modyfikuj kod, aby zrealizować punkty 5., 7.)

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Podstawy programowania (1)

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

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 w języku C i C++

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

Transkrypt:

Elementy pliku źródłowego w języku C Plik źródłowy ogólnie składa się z: dyrektyw preprocesora, deklaracji, instrukcji, komentarzy. W programie występują deklarowane przez użytkownika nazwy, które mają postać identyfikatorów. Identyfikator jest ciągiem liter i cyfr, przy czym pierwszym znakiem musi być litera. Rozróżniane są wielkie i małe litery alfabetu. Dyrektywy preprocesora. Pierwszym różnym od spacji znakiem linii dyrektywy preprocesora jest znak #. Dyrektywy te służą wstępnej modyfikacji programu źródłowego przed jego kompilacją. Dyrektywa #include <plik_nagłówkowy> włącza wskazany plik w miejsce jej wystąpienia. Plik poszukiwany jest w standardowym katalogu włączanych plików. Zawartość pliku kot.c: linia1; linia2; #include <pies.c> linia3; linia4; Zawartość pliku pies.c linia5; #include <owca.h> linia6; linia7; Kolejność w kompilacji: linia1; linia2; linia5; linia8; linia9; linia6; linia7; linia3; linia4; Zawartość pliku owca.h: linia8; linia9;

Każdy obiekt programu musi mieć zdefiniowany typ (czyli dopuszczalne wartości obiektu i możliwe do wykonania na nim operacje). Typ danej dokładnie charakteryzuje zbiór wartości, do którego należy stała, lub które może przyjmować zmienna. Typy zmiennych i stałych są podawane w deklaracjach lub definicjach, które w pliku źródłowym muszą występować przed użyciem tych zmiennych i stałych w instrukcjach. Typ określa też wewnętrzną reprezentację danej w pamięci komputera (zapis stałopozycyjny lub zmiennopozycyjny). Stałe posiadają stałą wartość, np. 5.122 Stałe można definiować na dwa sposoby: za pomocą dyrektywy preprocesora #define, np.: #define pi 3.14159 (typ stałej wynika ze sposobu zapisu tej stałej) z użyciem słowa kluczowego const, np. const double pi=3.14159265 (typ stałej wynika z podanej po słowie const nazwy typu) Stała może mieć nadaną wartość tylko raz, nie może ona ulec zmianie w trakcie wykonania programu. Przykładowe stałe: 100-257 stałe typu całkowitego (stosowany jest zapis stałopozycyjny) 0 2.572-1. stałe typu rzeczywistego (stosowany jest zapis zmiennopozycyjny) 7.1E5 Zmienne mogą przyjmować wartości z określonego zbioru, wynikającego z jej typu; każda zmienna posiada nazwę (identyfikator); w trakcie realizacji programu zmienna może przyjmować różne wartości. Deklaracja (definicja) typu zmiennej jest wykorzystywana przez kompilator, który rezerwuje odpowiednią wielkość pamięci dla danej zmiennej, stosownie do zakresu wartości, które może ona przyjmować i wyznacza odpowiednią maszynową reprezentację tej zmiennej (w postaci binarnej). Przykłady: int alfa, beta; float j23; (zmienne typu całkowitego zapis stałopozycyjny) (zmienna typu rzeczywistego zapis zmiennopozycyjny)

Informacja o typach danych pozwala kompilatorowi na sprawdzenie poprawności wielu różnych konstrukcji użytych w zapisie algorytmu w języku programowania i na wykrycie wielu błędów w programie już na etapie kompilacji. Np. wykryta może być próba przypisania wartości logicznej zmiennej typu rzeczywistego. Stąd też określanie typów dla wszystkich danych uważane jest za zaletę języków programowania wysokiego poziomu. Instrukcje programu przetwarzają dane. Dostęp w instrukcjach do obiektów danych jest realizowany przez: nazwę obiektu (nazwy stałych i zmiennych), wskaźnik na obiekt (wskaźniki na stałe i zmienne), literał (bezpośrednie, dosłowne podanie wartości). Moduł źródłowy zawiera instrukcje pogrupowane w bloki funkcyjne. W bloku funkcyjnym instrukcje wykonywane są sekwencyjnie w kolejności ich zapisania w module źródłowym. Komentarz. Jest to dowolny fragment tekstu zawarty pomiędzy parami znaków /* oraz */ lub występujący po parze znaków // i rozciągający się do końca danej linii. Komentarze nie są analizowane przez kompilator. Główną funkcją komentarzy jest wyjaśnianie i uzupełnianie tekstu programu uwagami pomocnymi przy poźniejszej modyfikacji tego programu. Komentarz powinien być sensowny, zwarty i aktualny. #include <stdio.h> main() { int x/*to jest komentarz*/=17,y=19; printf("%d %d",x,y); //To też jest komentarz }

Typy danych języka C Typy proste. Arytmetyczne typy, w które wyposażony jest język: char, int, float, double. Typy pochodne. Tworzone przy pomocy operatorów: [ ] tablica obiektów * wskaźnik na obiekt ( ) funkcja o pewnych argumentach zwracająca obiekt Typy arytmetyczne char (1 bajt) małe liczby całkowite, znaki ASCII. int (2 bajty) liczby całkowite. long int (4 bajty) długie liczby całkowite. float (4 bajty) liczby rzeczywiste. double (8 bajtów) liczby rzeczywiste zwiększonej precyzji. long double (10 bajtów) liczby rzeczywiste zwiększonej precyzji. Typ całkowity może być dodatkowo poprzedzony modyfikatorem signed lub unsigned.

Zakresy wartości danych różnych typów arytmetycznych: char -128... 127 signed char -128... 127 unsigned char 0... 255 int -32768... 32767 signed int -32768... 32767 unsigned 0... 65535 unsigned int 0... 65535 long -2147483648... 2147483647 long int -2147483648... 2147483647 signed long int -2147483648... 2147483647 unsigned long 0... 4294967295 unsigned long int 0... 4294967295 float +/- (3.4*10-38... 3.4*10 38 ) double +/- (1.7*10-308... 1.7*10 308 ) long double +/- (1.7*10-4932... 1.7*10 4932 ) Typy pochodne zostaną omówione w dalszych częściach kursu.

Literały Literały znakowe. Reprezentują jeden znak kodu ASCII. Zapisywany znak ujęty jest w apostrofy. 'a' mała litera a '8' cyfra 8 '\n' '\f' '\b' znak sterujący: nowa linia (w kodzie ASCII dwa znaki CR i LF) znak sterujący: nowa strona znak sterujący: backspace '\0' NULL, znak o kodzie 0 '\\' '\'' '\"' znak backslash znak apostrof znak cudzysłów Literały całkowite. 13 zapis dziesiętny, wartość 13 013 zapis ósemkowy, wartość 11 0x13 zapis szesnastkowy, wartość 19 Literały zmiennoprzecinkowe. 13.7 zapis normalny 24.9e7 notacja naukowa liczby 249000000 7.1e-5 notacja naukowa liczby 0.000071

Literały łańcuchowe. Ciąg znaków ujęty w cudzysłowy. Na końcu podanego ciągu znaków kompilator dodatkowo umieszcza znak NULL. "Pierwsze spotkanie z jezykiem C" Literał łańcuchowy może zawierać znaki sterujące. "Ten string\nzostanie wypisany\nw trzech liniach" Ten string zostanie wypisany w trzech liniach Deklaracje i definicje obiektów Każdy obiekt (zmienna) występujący w programie musi być zadeklarowany, a jego wykorzystanie musi poprzedzać definicja. Definicja często jest równocześnie deklaracją obiektu. Na końcu deklaracji i definicji obiektu występuje średnik. Deklaracja obiektu. Ustala jedynie typ obiektu. Nie przydziela pamięci. extern int x; // Obiekt x typu całkowitego już gdzieś // istnieje poza plikiem źródłowym Definicja obiektu. Ustala typ obiektu i dodatkowo przydziela dla niego pamięć. int a, b; //ustalenie typu całkowitego dla dwóch //obiektów a, b oraz przydzielenie im //pamięci Uwaga: Obiekt w programie może być wielokrotnie deklarowany oraz musi być tylko jednokrotnie zdefiniowany.

Inicjalizacja Przy definiowaniu obiektu można nadać mu wartość początkową. Inicjalizator ma formę wyrażenia. Ogólna postać definicji wraz z inicjalizacją jest następująca: typ deklarator = inicjalizator; int a=3,b=7,c=a+b; // c=10 int x=2*a+b,y=c; // x=13, y=10 Stałe Obiekt zadeklarowany z modyfikatorem const ma tę własność, że wartość tego obiektu nie może być później modyfikowana. Wartość obiektu stałego można ustalić jedynie w momencie definiowania stosując inicjalizację. const int a=18; const float x=3.7; a++; x=14.65; // Błąd, stałej nie można modyfikować // Błąd, stałej nie można modyfikować

Wejście - wyjście Standardowe wprowadzanie i wyprowadzanie danych realizowane jest w języku C poprzez strumienie. Strumień jest ciągiem bajtów skojarzonym z pewnym urządzeniem zewnętrznym komputera (np. klawiaturą, monitorem, plikiem dyskowym). Dla każdego strumienia określona jest jego bieżąca pozycja wskazująca, który znak tego strumienia będzie w najbliższej kolejności przetwarzany. W bibliotece kompilatora są zdefiniowane strumienie standardowe obsługiwane przez ustalone funkcje biblioteczne. Tradycyjnie wykorzystywane strumienie standardowe to: stdin stdout stderr - standardowe wejście (zwykle klawiatura) - standardowe wyjście (zwykle monitor) - standardowe wyjście dla komunikatów o błędach (zwykle monitor) Definicje strumieni stdin, stdout, stderr umieszczone są w pliku nagłówkowym stdio.h. Funkcje biblioteczne obsługujące strumienie standardowe getchar() definicja w pliku stdio.h Funkcja wprowadza kolejny bajt ze strumienia stdin i zwraca jako wynik typu int kod ASCII wprowadzonego znaku (od 0 do 255) lub wartość EOF (zdefiniowaną zwykle jako -1) w przypadku rozpoznania końca strumienia. Wprowadzane z klawiatury znaki są kopiowane na ekranie (tzw. echo) i kolejno umieszczane w buforze aż do naciśnięcia Enter. Dopiero potem funkcja getchar pobiera kolejny znak z bufora. Dodatkowo następuje zamiana znaków CR i LF (w języku C znak '\n') generowanych przez klawisz Enter na znak LF.

Zadanie: uruchom następujący program: #include <stdio.h> main() { int x; while((x=getchar())!=eof) printf("%d\n",x); return 0; } ABC KLAWIATURA ABC 65 66 67 10 getch() definicja w pliku conio.h Funkcja ta podobnie jak getchar wprowadza kolejny bajt ze strumienia stdio i zwraca jako wynik typu int kod ASCII naciśniętego znaku lub EOF. Znaki wprowadzane z klawiatury nie są kopiowane na ekranie (brak echa). Funkcja zwraca kod ASCII znaku natychmiast po jego naciśnięciu (bez umieszczania tego znaku w buforze). Zadanie: uruchom następujący program: #include <stdio.h> #include <conio.h> main() { } int x; while((x=getch())!=eof) printf("%d\n",x); return 0;

KLAWIATURA ABC 65 66 67 13 putchar(znak) definicja w pliku stdio.h Funkcja wyprowadza podany znak do standardowego strumienia stdout i zwraca jako wynik typu int kod ASCII wyprowadzanego znaku. Zadanie: uruchom następujący program: #include <stdio.h> #include <conio.h> main() { int c; while((c=getch())!='k')putchar(c+1); return 0; } bcd KLAWIATURA abc

scanf(format wejściowy, lista wejściowa) definicja w pliku stdio.h Funkcja wprowadza kolejne znaki ze standardowego strumienia stdin, poddaje je interpretacji zgodnie z formatem wejściowym i uzyskane wartości umieszcza w obszarach pamięci wskazanych na liście wejściowej. Format wejściowy jest łańcuchem znakowym, który może zawierać: odstępy (spacje, znaki tabulacji, nowe linie), specyfikatory formatu wejściowego, zwykłe znaki (różne od odstępów i znaku %). Zgodnie z podanym formatem znaki strumienia stdin tworzą kolejne pola wejściowe. Pole wejściowe stanowi: ciąg znaków do następnego odstępu (bez wliczania go), ciąg znaków, którego zakończenie spowodowane zostało wystąpieniem w strumieniu znaku niedopuszczalnego przez typ konwersji podany w specyfikatorze formatu, ciąg znaków o długości równej szerokości pola podanej w specyfikatorze formatu Składniki formatu wejściowego sterują przetwarzaniem pól wejściowych: Odstęp powoduje pominięcie na wejściu sekwencji sąsiadujących znaków odstępu. Znak % rozpoczyna specyfikator formatu określający sposób przekształcenia odpowiadającego mu pola wejściowego na wartość, która zostaje umieszczona w obszarze pamięci, którego adres podaje kolejny argument funkcji scanf. Lista wejściowa tej funkcji zawiera oddzielone przecinkami wskaźniki na zmienne odpowiednich typów. Zwykły znak (różny od odstępu i nie należący do specyfikatora) powoduje, że taki sam znak jest odczytywany ze strumienia stdin,

ale nie jest umieszczany w pamięci. Jeżeli znak taki nie występuje jako kolejny znak strumienia, to funkcja scanf kończy pracę. Dwa znaki %% obok siebie reprezentują jeden znak % traktowany jako zwykły znak. Każdy specyfikator formatu wejściowego jest ciągiem rozpoczynającym się od znaku % i ma postać (nawiasy [ ] oznaczają opcje): % [*] [szerokość] [modyfikator] typ Gwiazdka * po znaku % w specyfikatorze formatu powoduje, że odpowiednie pole wejściowe jest analizowane w normalny sposób zgodnie z tym specyfikatorem jednak bez zapisywania jego wartości w pamięci. Jedynym wymaganym elementem specyfikatora formatu jest znak określający typ wprowadzanych danych: Dane numeryczne Znak Zawartość pola wejściowego Typ argumentu funkcji scanf d Liczba całkowita dziesiętna int*, wskaźnik na int D Liczba całkowita dziesiętna long*, wskaźnik na long u U Liczba całkowita dziesiętna bez znaku Liczba całkowita dziesiętna bez znaku unsigned int*, wskaźnik na unsigned int unsigned long*, wskaźnik na unsigned long o Liczba całkowita ósemkowa int*, wskaźnik na int O Liczba całkowita ósemkowa long*, wskaźnik na long x Liczba całkowita szesnastkowa int*, wskaźnik na int

X Liczba całkowita szesnastkowa long*, wskaźnik na long i Liczba całkowita dziesiętna, ósemkowa lub szesnastkowa int*, wskaźnik na int I Liczba całkowita dziesiętna, ósemkowa lub szesnastkowa long*, wskaźnik na long e,e Liczba rzeczywista float*, wskaźnik na float f Liczba rzeczywista float*, wskaźnik na float g,g Liczba rzeczywista float*, wskaźnik na float Dane znakowe Znak Zawartość pola wejściowego Typ argumentu funkcji scanf c Znak ASCII char*, wskaźnik na char s Ciąg znaków ASCII char[], wskaźnik na tablicę char Wskaźniki Znak Zawartość pola wejściowego Typ argumentu funkcji scanf p Szesnastkowy adres (offset lub segment:offset) Wskaźnik Przed znakiem określającym typ można umieścić modyfikator zmieniający działanie specyfikatora: l - wprowadza liczby całkowite w ich długich wersjach long, a liczby rzeczywiste jako double, L - wprowadza liczby rzeczywiste jako long double.

Maksymalną szerokość każdego pola wejściowego można określić podając w specyfikatorze formatu liczbę całkowitą szerokość. Kolejne pole wejściowe dla specyfikatora z typem c rozpoczyna się w bieżącej pozycji strumienia, a dla specyfikatorów z innymi typami początek pola ustala się pomijając dodatkowo w strumieniu wejściowym sąsiadujące ze sobą odstępy. Zakończenie przetwarzania danego pola wejściowego i przejście do kolejnego pola następuje w przypadku, gdy: kolejnym znakiem strumienia jest odstęp (co kończy pole wejściowe), przetworzonych zostało tyle znaków strumienia, ile wynosi podana szerokość, znak w bieżącej pozycji strumienia nie może zostać przetworzony zgodnie z podanym specyfikatorem formatu, Znak, który spowodował zakończenie przetwarzania danego pola wejściowego pozostawiany jest w strumieniu i będzie przetwarzany podczas analizowania następnego pola wejściowego lub podczas wywołania innej funkcji wprowadzania danych. Zakończenie działania funkcji scanf następuje, gdy: napotkano koniec strumienia EOF, wyczerpany został format wejściowy, w bieżącej pozycji strumienia nie występuje wymagany przez format wejściowy zwykły znak (nie należący do specyfikatora). Funkcja scanf zwraca jako wynik swojego działania liczbę przetworzonych pól wejściowych.

Zadanie: uruchom następujący program: #include <stdio.h> main() { char k; scanf("%c",&k); printf("wczytano znak o kodzie = %d\n",k); scanf("%c",&k); printf("wczytano znak o kodzie = %d\n",k); return 0; } A KLAWIATURA A Wczytano znak o kodzie = 65 Wczytano znak o kodzie = 10 Zadanie: uruchom następujący program: #include <stdio.h> main() { long int k,i; k=999; printf("\nprzed wczytaniem k = %d\n",k); scanf("kot%d",&k); printf(" Po wczytaniu k = %d",k); return 0; }

Przed wczytaniem k = 999 kot47 KLAWIATURA kot47 Po wczytaniu k = 47 Przed wczytaniem k = 999 kot 45kot 17 KLAWIATURA kot 45kot 17 Po wczytaniu k = 45 Przed wczytaniem k = 999 kokot 33 kot 88 KLAWIATURA kokot 33 kot 88 Po wczytaniu k = 999 printf(format wyjściowy, lista wyjściowa) definicja w pliku stdio.h Funkcja wyprowadza do standardowego strumienia stdout wartości wyrażeń będących kolejnymi argumentami funkcji umieszczonymi na liście wyjściowej. Format wyjściowy steruje przekształcaniem wartości wyrażeń do wyprowadzanej postaci znakowej. Do strumienia stdout przekazywane są również wszystkie znaki formatu wyjściowego, które nie należą do specyfikatorów formatu. Liczba wyprowadzanych argumentów musi być zgodna z liczbą specyfikatorów umieszczonych w formacie wyjściowym. Każdy specyfikator formatu wyjściowego jest ciągiem rozpoczynającym się od znaku % i ma postać (nawiasy [ ] oznaczają opcje): % [znacznik] [szerokość] [.precyzja] [modyfikator] typ

Parametr szerokość określa minimalną liczbę znaków wyprowadzanych przy udziale danego specyfikatora formatu: W przypadku konieczności wyprowadzenia mniejszej liczby znaków niż podana szerokość, wyprowadzane pole uzupełniane jest z lewej strony spacjami do podanego rozmiaru. W przypadku wyprowadzania liczby, której zapis wymaga większej liczby znaków niż podana szerokość, wyprowadzane są wszystkie niezbędne znaki bez względu na wartość parametru szerokość. Parametr precyzja ustala: Dla specyfikatorów typu f, e, E liczbę cyfr części ułamkowej. Ostatnia wyprowadzana cyfra jest zaokrąglana. Dla specyfikatorów typu g, G maksymalną liczbę cyfr znaczących. Dla specyfikatorów typu d, i, u, o, x, X minimalną liczbę wyprowadzanych cyfr z ewentualnym uzupełnieniem zerami z lewej strony. Parametry specyfikatora formatu szerokość oraz precyzja mogą mieć postać liczby całkowitej lub znaku gwiazdki *. W przypadku gwiazdki wartością odpowiedniego parametru jest wartość elementu listy wyjściowej poprzedzającego właściwy wyprowadzany element. Jedynym wymaganym elementem specyfikatora formatu jest znak określający typ wprowadzanych danych: Dane numeryczne Znak Element listy wyjściowej Postać danych wyjściowych d Wartość całkowita Dziesiętna liczba całkowita i Wartość całkowita Dziesiętna liczba całkowita u Wartość całkowita Dziesiętna liczba całkowita bez znaku

o Wartość całkowita Ósemkowa liczba całkowita bez znaku x Wartość całkowita Szesnastkowa liczba całkowita bez znaku; cyfry szesnastkowe zawierają: a, b, c, d, e, f X Wartość całkowita Szesnastkowa liczba całkowita bez znaku; cyfry szesnastkowe zawierają: A, B, C, D, E, F f Wartość rzeczywista Dziesiętna liczba rzeczywista w zapisie normalnym e,e Wartość rzeczywista Dziesiętna liczba rzeczywista w notacji naukowej, odpowiednio z literą e lub E g,g Wartość rzeczywista Dziesiętna liczba rzeczywista w zapisie normalnym lub w notacji naukowej z literą e dla g lub E dla G Dane znakowe Znak Element listy wyjściowej Postać danych wyjściowych c s Wartość całkowita, kod znaku ASCII Wskaźnik na łańcuch znakowy Jeden znak ASCII Ciąg znaków o długości szerokość lub do bajtu NULL Wskaźniki Znak Element listy wyjściowej Postać danych wyjściowych p Wskaźnik Szesnastkowy adres (offset lub segment:offset)

Element formatu wyjściowego postaci %% powoduje wyprowadzenie jednego znaku %. Przed znakiem określającym typ można umieścić modyfikator zmieniający działanie specyfikatora: l - wyprowadza liczby całkowite w ich długich wersjach long; uwaga: do wyprowadzenia liczb rzeczywistych double nie zachodzi konieczność stosowania modyfikatora, L - wyprowadza liczby rzeczywiste typu long double. Parametr znacznik dodatkowo precyzuje sposób wyprowadzania danych i przyjmuje wartości: - Wyrównanie wyprowadzanych w danym polu znaków do jego lewej krawędzi. + Wyprowadzenie dodatkowo znaku + dla liczby dadatniej (standardowo wyprowadzany jest jedynie znak - dla liczb ujemnych). # Wyprowadzenie liczby ósemkowej z zerem z lewej strony liczby oraz liczby szesnastkowej z sekwencją 0x lub 0X z lewej strony tej liczby. Funkcja printf zwraca jako wynik liczbę wyprowadzonych znaków do standarowego strumienia stdout.

Zadanie: uruchom następujący program: #include <stdio.h> main() { int k; printf("podaj liczbe calkowita: "); scanf("%d",&k); printf("\n Notacja dziesietna = %d",k); printf("\n Notacja osemkowa = %o",k); printf("\nnotacja szesnastkowa = %x",k); printf("\nnotacja szesnastkowa = %X",k); return 0; } Wyrażenia Wyrażenie jest ciągiem operatorów i argumentów (np. stałych lub zmiennych), który określa sekwencję obliczeń prowadzącą do uzyskania wartości wynikowej. W wyrażeniu mogą występować pary nawiasów ( ) wskazujące kolejność wykonywania działań przy obliczaniu wartości tego wyrażenia. Stałe wyrażenie jest wyrażeniem, którego wartość jest znana na etapie kompilacji.

Operatory języka C Operatory arytmetyczne: + dodawanie i jednoargumentowy plus - odejmowanie i jednoargumentowa zmiana znaku * mnożenie / dzielenie (dla typów całkowitych obcięcie części ułamkowej) % modulo Zadanie: uruchom następujący program: #include <stdio.h> #include <conio.h> main() { int x,y; printf("podaj dwie liczby calkowite x,y:\n?"); scanf("%d",&x); putch('?'); scanf("%d",&y); printf("x+y=%d, x-y=%d, x*y=%d, x/y=%d, x%%y=%d", x+y, x-y, x*y, x/y, x%y); return 0; }

Zadanie: uruchom następujący program: #include <stdio.h> #include <conio.h> main() { float x,y; printf("podaj dwie liczby rzeczywiste x,y:\n?"); scanf("%f",&x); putch('?'); scanf("%f",&y); printf("x+y=%.2f, x-y=%.3f, x*y=%.4f, x/y=%.6f", x+y,x-y,x*y,x/y); return 0; } Wartość wyrażenia wyliczana jest poprzez wykonanie operacji określonych przez występujące w wyrażeniu operatory. Istotną rolę odgrywa przy tym priorytet i wiązanie operatora. Priorytet operatorów wyznacza kolejność, w jakiej wykonywane są poszczególne operacje: Operacja o wyższym priorytecie wykonywana jest przed operacją o niższym priorytecie. W przypadku operacji o jednakowych priorytetach o kolejności ich wykonania decyduje wiązanie operatora.

Wiązanie operatora określa kolejność wykonania operacji w przypadku jednakowych priorytetów operacji w wyrażeniu: Wiązanie lewostronne - operacje wykonywane są w wyrażeniu w kierunku od strony lewej do prawej. Wiązanie prawostronne - operacje wykonywane są w wyrażeniu w kierunku od strony prawej do lewej. Nawiasy ( ) wymuszają inną kolejność wykonywania oparacji: Operacje zawarte w parze nawiasów wykonywane są przed operacjami występującymi poza nawiasami. Priorytety i wiązania operatorów arytmetycznych: Priorytet Operator Wiązanie Nazwa operatora * Lewostronne Mnożenie 3 / Lewostronne Dzielenie % Lewostronne Modulo 4 + - Lewostronne Lewostronne Dodawanie Odejmowanie

L-wartość Pojęcie l-wartości dotyczy wyrażenia reprezentującego obszar w pamięci, do którego można wpisać pewną wartość. Typowym przykładem l-wartości jest lewa strona operatora przypisania. int x=3,k; k=x*(x-1); //l-wartosc: zmienna k Operatory inkrementacji i dekrementacji: ++ inkrementacja -- dekrementacja Argumentem operatora inkrementacji i dekrementacji może być wyłącznie wyrażenie stanowiące l-wartość typu arytmetycznego lub wskaźnikowego. W efekcie wykonania operacji inkrementacji następuje zwiększenie o 1 wartości argumentu, a wykonanie operacji dekrementacji powoduje zmniejszenie wartości argumentu o 1. Operatory inkrementacji i dekrementacji występują w formie prefiksowej ++k, --k lub postfiksowej k++, k--. Operator ++ oraz -- wraz ze swoim argumentem przedstawia wyrażenie, którego wartość równa jest: wartości wyrażenia przed modyfikacją dla operacji postfiksowej, wartości wyrażenia po modyfikacji dla operacji prefiksowej. Uwaga: Operacje inkrementacji i dekrementacji wykonywane na wskaźnikach podlegają zasadom arytmetyki wskaźników.

Zadanie: uruchom następujący program: #include <stdio.h> main() { int a=7; int b=7; int c=7; int d=7; printf("\n a=%d, b=%d, c =%d, d =%d",a,b,c,d); printf("\n++a=%d, --b=%d, c++=%d, d--=%d",++a,--b,c++,d--); printf("\n a=%d, b=%d, c =%d, d =%d",a,b,c,d); return 0; } a=7, b=7, c =7, d =7 ++a=8, --b=6, c++=7, d--=7 a=8, b=6, c =8, d =6 Priorytety i wiązania operatorów: Priorytet Operator Wiązanie Nazwa operatora + Prawostronne Jednoargumentowy plus 2 - ++ Prawostronne Prawostronne Jednoargumentowy minus Inkrementacja -- Prawostronne Dekrementacja

Operatory przypisania Lewym argumentem operatora przypisania = musi być l-wartość, a prawym argumentem może być wyrażenie odpowiedniego typu, którego wartość po obliczeniu przypisywana jest lewemu argumentowi. Uwaga: Przypisanie nie jest instrukcją lecz wyrażeniem. Wartością tego wyrażenia jest wartość przypisywana lewemu argumentowi operatora przypisania. Zadanie: uruchom następujący program: #include <stdio.h> main() { int a,b,c,d; a=(b=5+(c=(d=8)+3))*2; printf("\na=%d, b=%d, c=%d, d=%d",a,b,c,d); } a=32, b=16, c=11, d=8 Oprócz standardowego operatora przypisania występują następujące złożone operatory przypisania: += -= *= /= %= &= = <<= >>= ^= Ogólnie wyrażenie z operatorem przypisania:

x opr= y jest równoważne wyrażeniu: x = x opr y gdzie opr oznacza jeden z wymienionych wcześniej złożonych operatorów przypisania. k+=x; n/=y; f*=f*=f; a+=b+=c; //rownowazne k=k+x; //rownowazne n=n/y; //rownowazne f=f*f*f*f; //rownowazne a=a+b+c; b=b+c; Priorytety i wiązania operatorów: Priorytet Operator Wiązanie Nazwa operatora = Prawostronne Przypisania += Prawostronne Złożony przypisania -= Prawostronne Złożony przypisania *= Prawostronne Złożony przypisania /= Prawostronne Złożony przypisania 14 %= Prawostronne Złożony przypisania &= Prawostronne Złożony przypisania = Prawostronne Złożony przypisania <<= Prawostronne Złożony przypisania >>= Prawostronne Złożony przypisania ^= Prawostronne Złożony przypisania

Zadanie: uruchom następujący program: #include <stdio.h> main() { int a=5,b=5; printf("\n%3d%3d",a,b); a-=3; b=-3; printf("\n%3d%3d",a,b); } 5 5 2-3 Pozostałe rodzaje operatorów: - relacji, - równości, - logiczne, - warunku, - bitowe, - sizeof, - adresu, - wyłuskania, - składowej, - indeksowania, - wywołania funkcji - rzutowania, - połączenia zostaną omówione w dalszej części kursu.

Zadania: 1. Określ wartośd zmiennej całkowitej a po wykonaniu sekwencji instrukcji, uzasadnij odpowiedź: a=2; a+=a*=a+=a++; 2. Określ wartośd zmiennej całkowitej a po wykonaniu sekwencji instrukcji, uzasadnij odpowiedź: a=2; a+=a*=a+=++a; 3. Dla jakiej wartości zmiennej całkowitej a wyrażenie a%=++a; wygeneruje błąd? Jaka będzie wartośd wyrażenia w pozostałych przypadkach?