Wykład
Transkrypt
Wykład
Temat 2: Operacje wejścia / wyjścia - funkcje scanf i printf. Instrukcja bloku, warunkowa i wyboru. 1. Operacje wejścia / wyjścia - funkcje scanf i printf. a) Funkcja printf wysyła sformatowane dane (liczby znaki, napisy) na ekran tekstowy printf ( łańcuch_formatujący , argument_1 , argument_2 , . . . ) ; łańcuch formatujący jest to napis zawierający: − znaki drukowane na ekranie tekstowym, − kody formatujące kolejnych argumentów: kody formatujące %c %s %d %f − − − − %e %g − − %u − %x − %o − l − l − L − pojedynczy znak napis liczba całkowita ze znakiem liczba rzeczywista (notacja dziesiętna), standardowo 6 miejsc po kropce liczba rzeczywista (notacja wykładnicza) liczba rzeczywista (krótszy z formatów %f %e), nie są drukowane nieznaczące zera liczba całkowita bez znaku liczba w kodzie szesnastkowym (bez znaku) liczba w kodzie ósemkowym (bez znaku) przedrostek (long) stosowany przed: d u x o przedrostek stosowany przed: f e (double) przedrostek stosowany przed: f e (long double) Przykład 1 #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 ); 1 return 0; } Ekran: Wynik obliczen 10 + 20 = 30.000000 Aby określić liczbę drukowanych cyfr do kodu formatującego należy dodać kody długości: %Xd %X.Xf Przykład 2 %4d − liczba całkowita zajmie 4 pozycje %10f − liczba rzeczywista zajmie 10 pozycji %10.2f − liczba rzeczywista zajmie 10 pozycji i zostanie wydrukowana z 2 cyframi po kropce %.3f − liczba rzeczywista z dokladnoscią do 3 cyfr po kropce Jeżeli ilość znaczących cyfr po kropce jest większa niż ilość cyfr po kropce w kodzie formatującym, to liczba jest drukowana z zaokrągleniem do ilości cyfr określone w kodzie. Jeżeli ilość pozcji, na której jest drukowana liczba jest większa od ilości pozycji w kodzie formatującym, to przed pierwszą cyfrą drukowane są uzupełniające spacje. float x=12.456; printf(“%15.2f”,x); Ekran: 12.46 a) Funkcja scanf odczytuje znaki ze standardowego strumienia wejściowego (klawiatury), do pierwszego wystąpienia białego znaku, zamienia wczytany ciąg znaków na dane zgodnie z łańcuchem formatującym i zapamiętuje je pod zadanymi adresami pamięci scanf ( łańcuch_formatujący , adres_1 , adres_2 , . . . ) ; łańuch formatujący - jest to napis określający sposób zamiany wczytanego ciągu znaków na dane okreslonego formatu kody formatujące: %c %s %d %f lub %e %u − − − − − pojedynczy znak łańcuch znaków liczba całkowita ze znakiem liczba rzeczywista liczba całkowita bez znaku 2 %x %o l l L − − − − − liczba w kodzie szesnastkowym (bez znaku) liczba w kodzie ósemkowym (bez znaku) przedrostek stosowany przed: d u x o (long int) przedrostek stosowany przed: f e (double) przedrostek stosowany przed: f e (long double) & − operator adresowania (zwraca adres zmiennej podanej po operatorze) Przykład 3 #include <stdio.h> int main( ) { int x; double y; char znak; printf( ”Podaj jedna liczbe calkowita: ” ); scanf ( ”%d” , &x ); printf( ”Podaj jedna liczbe rzeczywista i jeden znak: ”); scanf ( ”%lf %c” , &y , &znak ); return 0; } Ekran: Podaj jedna liczbe calkowita: 123 ↵ Podaj jedna liczbe rzeczywista i jeden znak: 456.789 a ↵ ( x = 123, y = 456.789, znak == ’a’ ) 3 2. Instrukcja bloku • Nawiasy klamrowe są używane do grupowania wielu deklaracji i instrukcji w jedną instrukcję złożoną (jeden blok). • Jeżeli zmienne programu są deklarowane w zakresie instrukcji bloku (w nawiasach klamrowych), to „przesłaniają” one zmienne o tej samej nazwie zadeklarowane na zewnątrz bloku. Do takich lokalnych zmiennych można się odwoływać wyłącznie w zakresie bloku, w którym są zadeklarowane. Przykład 4 #include <stdio.h> int main( ) { int a = 10, b = 20 ; { int a = 30 ; // „przesłonięcie”’ poprzedniej definicji a printf( ”A = %d, B = %d \n” , a , b ); // Ekran: A=30, B=20 } printf( ”A = %d, B = %d \n” , a , b ); // Ekran: A=10, B=20 return 0; } 4 3. Instrukcja warunkowa a) wariant bez „else” if ( wyrażenie ) instrukcja ; Jeżeli wyrażenie ma wartość różną od zera, to wykona się instrukcja (blok instrukcji). Jeżeli wyrażenie ma wartość równą zero, to instrukcja (blok instrukcji) nie wykona się. 0 warunek ≠0 instrukcja Przykład 5 #include <stdio.h> int main( ) { int a; printf( ”Podaj liczbe dodatnia: ” ); scanf( ”%d” , &a ); if ( a > 0 ) printf(“Liczba jest rzeczywiscie dodatnia”) ; 5 if ( a = = 0 ) printf( ”Podales zero !!! ” ); if ( a < 0 ) printf( ”Podales liczbe ujemna !!! ” ); return 0; } b) wariant z „else” if ( wyrażenie ) instrukcja_1 ; else instrukcja_2; Jeżeli wyrażenie ma wartość różną od zera, to wykona się instrukcja _1 (blok instrukcji). Jeżeli wyrażenie ma wartość równą zero, to wykona się instrukcja_2 (blok instrukcji). 0 warunek ≠0 instrukcja1 instrukcja2 Przykład 6 #include <stdio.h> int main( ) { int a; printf( ”Podaj liczbe dodatnia: ” ); scanf( ”%d” , &a ); if ( a > 0 ) printf(“Liczba jest rzeczywiscie dodatnia”) ; else printf(“Ta liczba wcale nie jest dodatnia”) return 0; 6 } 7 • c) Konstrukcja “else-if”: if ( wyrażenie_1 ) instrukcja_1; else if ( wyrażenie_2 ) instrukcja_2; else if ( wyrażenie_3 ) instrukcja_3; else instrukcja_4; Przykład 7 #include <stdio.h> int main( ) { int a; printf( ”Podaj liczbe dodatnia: ” ); scanf( ”%d” , &a ); if ( a > 0 ) printf(“Liczba jest rzeczywiscie dodatnia”) ; else if ( a = = 0 ) printf( ”Podales zero !!! ” ); else printf( ”Podales liczbe ujemna !!! ” ); return 0; } Przykład 8 Rozwiązanie równania Ax+B=C #include <stdio.h> #include <conio.h> int main( ) { double a, b, c, x; printf( "Podaj pierwsza liczbe A= " ); scanf( "%lf" , &a ); printf( "Podaj druga liczbe B= " ); scanf( "%lf" , &b ); printf( "Podaj trzecia liczbe C= " ); scanf( "%lf" , &c ); if( a!=0) { x=(c-b)/a; printf("Rownanie ma dokladnie jedno rozwiazanie:%.2lf",x); 8 } else if (b==c)printf("Kazda liczba spelnia rownanie"); else printf("Brak rozwiazan"); getch(); return 0; } 4. Instrukcja wyboru switch ( wyrażenie_całkowite) { case wartość_1 : instrukcja_1;[break;] case wartość_2 : instrukcja_2; [break;] case wartość_3 : instrukcja_3; [break;] case wartość_4 : instrukcja_4; [break;] [break;] .............................................................. [default : instrukcja_domyslna; break;] }; Przykład 9 #include <stdio.h> int main( ) { int liczba; printf( "Podaj liczbe calkowita: " ); scanf( "%d" , &liczba ); switch( liczba ) { case 0 : printf( ”Podales zero” ); break; case -5 :printf( ”Podales minus piec” ); break; case 7 : printf( ”Podales liczbe siedem” ); break; case 9 : printf( ”Podales liczbe dziewiec” ); break; default: printf( "Podales inna liczbe niz: 0, -5, 7, 9 " ); break; } return 0; } 9 Przykład 10 Program „Kalkulator” #include <stdio.h> #include <conio.h> int main( ) { char znak; double a, b, wynik; short byla=1; printf( "Podaj pierwsza liczbe =" ); scanf( "%lf" , &a ); printf( "Podaj druga liczbe =" ); scanf( "%lf" , &b ); printf( "\n\nWybor operacji:" ); printf( "\n + dodawanie" ); printf( "\n - odejmowanie" ); printf( "\n * mnozenie" ); printf( "\n / dzielenie" ); printf( "\nWybierz znak operacji:\n " ); znak = getch( ); // wczytanie znaku do zmiennej znak switch( znak ) { case '+' : wynik = a + b; break; case '-' : wynik = a - b; break; case '*' : wynik = a * b; break; case '/' : if (b!=0) wynik = a / b; else { printf("Dzielenie przez zero"); byla=0; }; break; default: byla=0; printf( "\n Zly znak operacji" ); break; } if (byla==1) printf("\nWynik obliczen: %.1f %c %.1f =%.2f ",a,znak,b,wynik); getch( ); return 0; } 10