dane ⇒ ciąg znaków
Transkrypt
dane ⇒ ciąg znaków
Wyjście formatowane – printf Wyjście formatowane – printf int arg = 3; int wyn = silnia(arg); dane ⇒ ciąg znaków printf( "silnia(%d)=%d\n" ,arg,wyn) ; łańcuch sterujący lista wartości 59 60 printf – opis formatu danych ● printf – opis formatu danych Po znaku „%” mogą opcjonalnie wystąpić: ● – jedna lub więcej flag ( np. , +, 0, #) modyfikujących sposób zastosowanej konwersji – specyfikacja minimalnej długości pola, wyrażona w postaci liczby naturalnej, bądź znaku „*” – specyfikacja precyzji pola, wyrażona w postaci znaku „.” oraz opcjonalnej liczby naturalnej (bądź „*”) – – Flaga „” – ● Flaga „0” – specyfikacja rozmiaru: ● h – short ● l – long lub double (dla typu zm. poz.) ● L – long double ● 61 jeśli wartość wyrównywana będzie do prawej to ewentualne „puste miejsce” po lewej stronie pola wypełnione zostanie zerami; użycie ma sens wyłącznie w przypadku jak powyżej Flaga „+” – wymagana operacja konwersji: c, d, e, f, g, o, s, x, u, % (nie jest to pełna lista!) wartość będzie wyrównana do lewej w obrębie pola (domyślnie wyrównanie nastąpi do prawej); użycie ma sens wyłącznie w przypadku podania minimalnej długości pola wartość będzie zawsze poprzedzana znakiem; ma sens jedynie w kontekście wartości liczbowych 62 printf – opis formatu danych ● printf – opis formatu danych Specyfikacja minimalnej długości pola – – – ● Specyfikacja precyzji pozwala kontrolować jeśli po konwersji reprezentacja wartości zajmuje mniej znaków niż podana minimalna długość pola, to zostaje ona uzupełniona odpowiednimi znakami „wypełniającymi” – minimalną liczbę cyfr reprezentacji wartości typu całkowitego (konwersje „d, o, x”) – liczbę cyfr „po przecinku” (konwersje „e, f”) jeśli reprezentacja wartości zajmuje więcej znaków niż podana minimalna długość pola, to długość pola zostaje automatycznie zwiększona – liczbę „cyfr znaczących” (konwersja „g”) – maksymalną liczbę wypisywanych znaków łańcucha (konwersja „s”) jeśli długość pola określona jest znakiem „*”, to jej wartość pobierana jest z argumentu typu int: ● ... width = 5; printf("Wynik: %*d\n", width, value); ... ● Jeśli specyfikacja ma postać znaku „.”, to za wartość precyzji przyjmowane jest 0 Jeśli specyfikacja składa się ze znaków „.*”, to wartość precyzji podaje argument typu całkowitego 63 64 printf – operacje konwersji printf – przykłady ● „d” – dziesiętna liczba całkowita (ze znakiem) int x = 100; printf("dec: %d; oct: %o; hex: %x\n",x,x,x); ● „u” – dziesiętna liczba całkowita bez znaku dec: 100; oct: 144; hex: 64 ● „o” – liczba ósemkowa ● „x” – liczba szesnastkowa ● „c” – pojedynczy znak dec: 100; oct: 0144; hex: 0x64 ● „s” – ciąg znaków ● „f, e, g” – dziesiętna liczba zmiennopozycyjna ● „%” – znak „%” #define MIN 931 printf("*%d*\n", MIN); printf("*%15d*\n", MIN); printf("*%15d*\n", MIN); printf("*%15u*\n", MIN); printf("dec: %d; oct: %#o; hex: %#x\n",x,x,x); *931* * 931* *931 * * 4294966365* 65 66 printf – przykłady c.d. printf – przykłady c.d. double x = 4256.36; printf("*%f*\n", x); printf("*%e*\n", x); printf("*%4.2f*\n", x); printf("*%3.1f*\n", x); printf("*%10.3f*\n", x); printf("*%10.3e*\n", x); printf("*%+4.2f*\n", x); printf("*%010.2f*\n", x); #define TXT "Ala ma Asa" printf("*%2s*\n", TXT); printf("*%24s*\n", TXT); printf("*%24.5s*\n", TXT); printf("*%24.5s*\n", TXT); *Ala ma Asa* * Ala ma Asa* * Ala m* *Ala m * *4256.360000* *4.256360e+03* *4256.36* *4256.4* * 4256.360* * 4.256e+03* *+4256.36* *0004256.36* 67 Wynik zwracany przez printf ● 68 Wejście formatowane – scanf Funkcja printf zwraca liczbę całkowitą, która mówi o liczbie szczęśliwie wypisanych znaków #include <stdio.h> int main() { int res; res=printf("Baardzo, baardzo, " "baardzo, baardzo " "długa linia... "); if (res >= 0) { return 0; } else { puts("Błąd wejścia/wyjścia!\n"); return 1; } } ciąg znaków ⇒ dane 69 70 Wejście formatowane – scanf ● ● ● Wejście formatowane – scanf Wczytuje znaki ze standardowego wejścia #include <stdio.h> Interpretuje je zgodnie ze specyfikacją podaną w pierwszym jej argumencie void main (void) { int dd, mm, rr; Wczytane wartości zapamiętuje w miejscach opisanych przez pozostałe argumenty (wszystkie „miejsca” muszą być określone za pomocą wskaźników!) /* Wczytywanie daty */ printf("Dzisiejsza data: "); scanf("%d/%d/%d", &dd, &mm, &rr); } scanf("specyfikacja",&x1,...,&xn); &x - wskaźnik do zmiennej x 71 72 scanf – opis formatu danych ● Trzy kategorie znaków i ich interpretacja – odstępy (spacje, tabulacje, znaki nowej linii) – pomijane podczas wczytywania danych – – ● scanf – opisy konwersji ● Po znaku „%” mogą opcjonalnie wystąpić: – opisy konwersji – ciągi znaków zaczynające się od znaku „%” (więcej na następnym slajdzie) znak „*” – oznacza, że dany element danych ma wystąpić w strumieniu wejściowym, ale nie zostanie on wykorzystany (do podstawienia) – inne znaki – muszą literalnie wystąpić w strumieniu wejściowym specyfikacja maksymalnej długości danej, wyrażona w postaci liczby naturalnej (bez znaku) – docelowy rozmiar wyniku: Prosty przykład: " arg = %d + %d" " arg =%d +%d" "arg=%d+%d" identyczne opisy! – ← odstępy w danych jedynie przed liczbami! 73 ● h – short ● l – long lub double (dla typu zm. poz.) ● L – long double wymagana operacja konwersji: c, d, e, f, g, o, s, x, % (nie jest to pełna lista!) 74 scanf – operacje konwersji ● „d” – dziesiętna liczba całkowita (ze znakiem) ● „o” – liczba ósemkowa ● „x” – liczba szesnastkowa ● scanf – przykłady int m,n; printf("Podaj trzy liczby: "); scanf("%*d %*d %d",&m); printf("Ostatnia liczba to: %d\n", m); scanf("%d%%,%d", &m, &n); printf("=> #%d,%d#\n", m, n); "123%,45" => #123,45# " 123 %, 45" => #123,45# "123% ,45" => #123,134513705# "123 % , 45" => #123,134513705# „c” – jeden lub więcej znaków (nie są pomijane ewentualne początkowe odstępy!) ● „s” – ciąg znaków ● „f, e, g” – dziesiętna liczba zmiennopozycyjna ● „%” – w danych oczekujemy znaku „%” scanf("%d%% ,%d", &m, &n); printf("=> #%d,%d#\n", m, n); "123%,45" => #123,45# " 123 %, 45" => #123,45# "123% ,45" => #123,45# "123 % , 45" => #123,45# Uwaga! Powyżej, za wyjątkiem operacji konwersji „c”, ewentualne początkowe odstępy są pomijane! 75 Wynik zwracany przez scanf ● Funkcja scanf zwraca liczbę całkowitą, która mówi o liczbie szczęśliwie wczytanych i przypisanych danych wejściowych #include <stdio.h> int main() { int d, m, r, res; printf("Dzisiejsza data: "); res = scanf("%d / %d/ %d",&d,&m,&r); if (res == 3) { return 0; } else { puts("Niepoprawny format daty."); return 1; } } 77 76