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

Podobne dokumenty