This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dydaktyka:cprog:2016:basic_stdio [2016/10/13 11:02] pkleczek [Odczyt danych] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Interakcja z użytkownikiem ====== | ||
- | |||
- | ===== Cel laboratorium ===== | ||
- | |||
- | * Zapoznanie ze sposobem wypisywania danych na ekran. | ||
- | * Zapoznanie ze sposobem wczytywania danych z klawiatury. | ||
- | |||
- | ===== Tytułem wstępu... ===== | ||
- | |||
- | |||
- | //(dla dociekliwych)// | ||
- | |||
- | We wszystkich systemach komputerowych do przechowywania informacji służą pliki (//file//). Pliki zawierają powiązane ze sobą wzajemnie informacje. Ponieważ w komputerach wszystkie pliki reprezentowane są jako ciągi bitów pogrupowanych w bajty, język C traktuje plik jako ciąg bajtów, czyli strumień (//stream//). Język C traktuje wszystkie strumienie danych (do/z pliku) i wszystkie pliki dokładnie tak samo. | ||
- | Dodatkowo w C są trzy strumienie plikowe (//file stream//), które są standardowo wstępnie otwierane dla nas: | ||
- | * stdin – standardowe wejście (//standard input//) – do odczytu; zazwyczaj powiązany z klawiaturą | ||
- | * stdout – standardowe wyjście (//standard output//) – do zapisu; zazwyczaj powiązany z monitorem terminala | ||
- | * stderr – standardowe wyjście dla komunikatów o błędach (//standard error//) | ||
- | |||
- | Nagłówki funkcji języka C służących do obsługi wejścia/wyjścia znajdują się w pliku nagłówkowym ''stdio.h''. | ||
- | |||
- | ===== Wypisywanie danych ===== | ||
- | |||
- | Główną funkcja służąca do wypisywania danych na standardowe wyjście (zazw. oznaczające wyświetlanie danych na ekranie terminala) jest ''printf()''. | ||
- | |||
- | Prototyp funkcji: ''%%int printf ( const char * format, ... );%%'' | ||
- | |||
- | Przykład: | ||
- | <code c> | ||
- | printf("Stan konta #%d wynosi %f zlotych.\n", 1, saldo); | ||
- | </code> | ||
- | * ''%%"Stan konta wynosi %.2f zlotych.\n"%%'' -- łańcuch sterujący \\ (dla przypomnienia: znak ''\n'' oznacza przejście do nowej linii) | ||
- | * ''%d'', ''%.2f'' -- specyfkatory konwersji | ||
- | * ''1, saldo'' -- lista wyrażeń | ||
- | |||
- | :?: Tekst ograniczony cudzysłowami (''%%"..."%%'') to łańcuch znaków. Na razie pozostanie on dla Ciebie czarną magią, zajmiemy się tym zagadnieniem za parę zajęć... Na chwilę obecną po prostu powiedz sobie //Aha, stosując printf() muszę na początku wpisać tekst w cudzysłowach!// | ||
- | |||
- | Podstawowe specyfikatory konwersji: | ||
- | ^ specyfikator ^ typ wartości ^ | ||
- | | ''%c'' | ''char'' | | ||
- | | ''%d'' | ''int'' | | ||
- | | ''%f'' | ''float'', ''double'' | | ||
- | |||
- | Podstawowe opcje formatowania: | ||
- | * wyrównanie pola wyjściowego (np. ''%8d'') | ||
- | * ilość miejsc po przecinku (np. ''%.3f'') | ||
- | |||
- | W domu zapoznaj się dokładniej z [[http://www.cplusplus.com/reference/cstdio/printf/|dokumentacją funkcji printf()]]. Nie czytaj wszystkiego "od deski do deski", tylko zobacz, jakie inne specyfikatory i opcje formatowania udostępnia ta funkcja -- otrzymywanie czytelnych wyników działania programu to podstawa sukcesu :-) \\ | ||
- | Zobacz też, z jakich sekcji składa się dokumentacja takiej funkcji (np. oczekiwany format argumentów, zwracana wartość, przykłady użycia...) | ||
- | |||
- | Sprawdź, co zostanie wypisane w przypadku użycia nieodpowiednich specyfikatorów konwersji: | ||
- | <code c conversion_errors.c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int num = 300; | ||
- | float nf = 3.0f; | ||
- | |||
- | printf("%d %c\n", num, num); | ||
- | printf("%f %lf\n", num, num); | ||
- | printf("%f %d\n", nf, nf); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | * Jak sądzisz, dlaczego tak się dzieje? | ||
- | * Przejrzyj listę ostrzeżeń zgłoszonych przez kompilator -- na ich podstawie możesz bez trudu odnaleźć źródło problemów. | ||
- | |||
- | :!: Upewnij się, że na końcu łańcucha sterującego znajduje się znak nowej linii ''\n'' (inaczej może się zdarzyć, że tekst do wyświetlenia utknie w buforze). | ||
- | |||
- | ===== Odczyt danych ===== | ||
- | |||
- | Główną funkcja służąca do pobierania danych ze standardowego wejścia (zazw. z klawiatury) jest ''scanf()''. | ||
- | |||
- | Funkcja ta zamienia wpisywany tekst na wartości odpowiednich typów zgodnie z zadanymi przez programistę specyfikatorami konwersji. | ||
- | |||
- | ''scanf()'' pobiera wskaźniki do zmiennych (na chwilę obecną nie musisz nic wiedzieć o wskaźnikach, po prostu dodaj symbol ''&'' przed nazwą zmiennej). | ||
- | |||
- | :!: Podstawowe specyfikatory konwersji są analogiczne do wykorzystywanych w funkcji ''printf()'', z tym że ''scanf()'' dodatkowo posiada ''%lf'' do wczytywania wartości typu ''double''. | ||
- | |||
- | Przykład: | ||
- | <code c scanf.c> | ||
- | #include <stdio.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int a = 0 | ||
- | int b = 0; | ||
- | |||
- | printf("Podaj wspolrzedne punktu: "); | ||
- | scanf("%d %d", &a, &b); | ||
- | a = -a; | ||
- | printf("Po odbiciu symetrycznym wzgledem OX: %d %d\n", a, b); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Zadania podsumowujące ===== | ||
- | |||
- | Zadania bazują na treści tego laboratorium oraz laboratorium [[dydaktyka:cprog:2016:data_types]]. | ||
- | |||
- | :!: W przypadku "dziwnego zachowania" programu podczas odczytu danych zaglądnij najpierw do [[http://home.agh.edu.pl/~pkleczek/dokuwiki/doku.php?id=dydaktyka:cprog:faq#funkcja_scanf_nie_czeka_na_wpisanie_przeze_mnie_danych|FAQ]]. | ||
- | |||
- | ---- | ||
- | |||
- | ==== Zadanie STATS ==== | ||
- | |||
- | ([size=10]poziom trudności:[/size] {{stars>2/4}}) | ||
- | |||
- | Wczytaj trzy liczby zmiennoprzecinkowe przy pomocy funkcji ''scanf()''. Wypisz ich sumę oraz średnią. Dobierz odpowiednie specyfikatory konwersji pod kątem typów użytych zmiennych. | ||
- | |||
- | |||
- | ==== Zadanie CASH ==== | ||
- | |||
- | ([size=10]poziom trudności:[/size] {{stars>2/4}}) | ||
- | |||
- | Napisz program, który zamieni wczytaną wartość w dolarach na waluty: | ||
- | * euro (1 USD = 0,77 EUR) | ||
- | * złotówki (1 USD = 3,04 PLN) | ||
- | |||
- | Wczytana wartość jest typu całkowitego. Obliczone wartości nowych walut mają być tak sformatowane, aby liczba była wyświetlona z dwoma miejscami po przecinku, a cała liczba zajmowała 7 pól. | ||
- | |||
- | ==== Zadanie CHAR ==== | ||
- | |||
- | ([size=10]poziom trudności:[/size] {{stars>3/4}}) | ||
- | |||
- | Napisz program, który wczyta znak z klawiatury, a następnie wyświetli jego wartość w kodzie [[https://pl.wikipedia.org/wiki/ASCII|ASCII]]. | ||