mgr inż. Wacław Libront * Bobowa 2019
ZSO Bobowa, ul. Długoszowskich 1, 38-350 Bobowa, tel: 0183514009, fax: 0183530221, email: sekretariat@zsobobowa.eu, www: zsobobowa.eu
Konsola - PRINTF i SCANF oraz COUT i CIN
W języku C mamy dwa mechanizmy do obsługi konsoli:
W dalszej części będziemy posługiwać się wyłącznie poleceniami cout i cin z powodu bardziej "edukacyjnego" wyglądu.
Przykładowy prosty program konsolowy wykorzystujący te dwa mechanizmy
#include <cstdio> #include <stdlib.h> #include <iomanip> using namespace std; int main(){ setlocale(LC_ALL, ""); int liczba; printf("wczytaj całkowitą:"); scanf("%i",&liczba); printf("wczytano: "); printf("%i\n",liczba); const float PI=3.1415926536; printf("%20.2f\n",PI); system("pause"); } |
#include <stdlib.h> #include <iostream> #include <iomanip> using namespace std; int main(){ setlocale(LC_ALL, ""); int liczba; cout << "wczytaj całkowitą:"; cin >> liczba; cout << "wczytano: " << liczba << endl; const float PI=3.1415926536; cout << fixed << setprecision(2); cout.width(20); cout << PI << endl; system("pause"); } |
printf cout - wypisuje na ekranie teksty lub liczby
scanf cin - wczytujemy z klawiatury teksty lub liczby
za pomocą scanf wczytujemy do wskaźnika! zmiennej - o wskaźnikach w
kolejnych lekcjach
formatowanie polega na wpisaniu odpowiednich parametrów do printf lub scanf
lub skorzystaniu z poleceń width, fixed i setprecision
wszystkie parametry w printf i scanf zapisane są zaczynają się od znaku "%"
przejście do nowego wiersza "\n" lub endl
Wczytaj z klawiatury promień okręgu. Wylicz jego obwód oraz pole powierzchni.
Uwagi podczas pisania programu
Program został specjalnie rozbudowany o obszerne komentarze – w przyszłości można je zupełnie pomijać.
Wpisuj po jednym wierszu i kompiluj – będziesz mógł od razu wyszukać i usunąć błędy.
Szczególną uwagę zwracaj na cudzysłów przy tekstach, średniki na końcach instrukcji.
#include <stdlib.h> #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main(){ // polskie znaki na ekranie setlocale(LC_ALL, ""); // deklarowanie stałej PI typu rzeczywistego const double PI = 3.1415; // deklarowanie trzech zmiennych typu rzeczywistego // nie zawierają żadnych konkretnych wartości double R,P,O; // komunikat na ekranie i przejście do nowego wiersza cout << "POLE i POWIERZCHNIA koła" << endl; // komunikat na ekranie – kursor na końcu tekstu cout << "Podaj promień: "; // do zmiennej R wczytujemy z klawiatury liczbę cin >> R; // W zmienej P zostanie obliczone pole powierzchni // można też P=PI*pow(R,2); P = PI * R * R; // w zmiennej O obwód okręgu O = 2 * PI * R; // komunikaty z wynikami obliczeń cout << "POLE=" << P << endl; cout << "OBWÓD=" << O << endl; // komunikat i oczekiwanie na klawisz ENTER system("pause"); } |
Co program robi?
Stałe i zmienne
Stałe i zmienne, to „pojemniki” (miejsca w pamięci komputera), w których przechowywane są liczby, teksty i inne dane, w trakcie działania programu. Jak sama nazwa wskazuje, stałe nie mogą się zmieniać, a do zmiennych możemy wstawiać różne wartości – jednak zawsze takiego samego typu. Stałe i zmienne muszą być zawsze zadeklarowane przed ich użyciem (choć nie wszystkie języki programowania wymagają takiej deklaracji).
Podstawowe operacje arytmetyczne
Kilka słów o dzieleniu
Instrukcja
cout << 1+1/3 wyświetli na ekranie konsoli 1 (jeden), ale już
instrukcja cout << 1.0+1.0/3.0
wyświetli 1.333333. W pierwszym przypadku używamy do
dzielenia liczb całkowitych i kompilator języka C++ "myli" że wynik też ma być w
tym samym typie. W drugim przykładzie informujemy kompilator, że dzielimy
liczby rzeczywiste i kompilator podaje wynik rzeczywisty. W identyczny sposób kompilator reaguje na działania, gdy mamy
do czynienia ze zmiennymi (lub stałymi). Instrukcje int J, D; cout << J+J/D Jeśli w zmiennych J i D znajdą się liczby 1 i 3 (na przykład
wczytane z klawiatury), to wynik na ekranie konsoli 1 (jeden), Ale jeśli
zadeklarujemy zmienne rzeczywiste i z klawiatury wpiszemy 1.0 i 3.0,
double J, D; cout << J+J/D;
wynik będzie też rzeczywisty 1.3333333.
cout << 1+1/3 // 1 cout << 1.0+1.0/3.0 // 1.333333 int J=1; int D=3; cout << J+J/D // 1 double J=1; double D=3; cout << J+J/D // 1 double J=1.0; double D=3.0; cout << J+J/D // 1.33333 |
Podstawowe typy zmiennych i stałych
Aby
przeprowadzić jakiekolwiek obliczenia potrzebne są zmienne (i ewentualnie
stałe). W zmiennych przechowywane są liczby teksty, daty, znaki, teksty i inne,
bardziej złożone struktury. Po co? Upraszczamy obliczenia, przechowujemy wynik
obliczeń dla kolejnych obliczeń, itp. Informacja przechowywana w zmiennej może
się zmieniać (jak sama nazwa wskazuje. W jednym miejscu programu w zmiennej X
może być przechowywana liczba 5, a zaraz potem liczba 7. Tej zmiany dokonujemy
za pomocą instrukcji przypisania.
Ważne jest to, że w konkretnej zmiennej, przechowywane są informacje tylko określonego typu, tzn. jeśli zadeklarowaliśmy zmienną typu int, to mogą w niej być przechowywane liczby całkowite. Po co to wszystko? Wyjaśnienie jest krótkie - aby programista popełniał mniej błędów i program był bardziej spójny. Oczywiście istnieją takie języki programowania, w których do tej samej zmiennej można przypisywać różne informacje (różne typy) i kompilator sobie doskonale z tym radzi.
Ze stałymi jest podobnie, ale, jak sama nazwa wskazuje, definiujemy typ i wartość stałej jeden raz (z reguły na początku programu) i nie możemy jej zmieniać. Na przykład, taką rolę pełni liczba PI.
I jeszcze jedna ważna informacja. Stałe i zmienne muszą być deklarowane w kodzie źródłowym zawsze przed ich użyciem. Najpierw kompilator "zapoznaje się", a potem może ich używać.
Istnieje jeszcze wiele innych typów podstawowych, z reguły
rozszerzających te opisane wyżej. Dla naszych potrzeb wystarczy te 6
elementarnych. Podstawowa różnica dotyczy ilości bajtów pamięci, który zajmuje
zmienna w pamięci. W obecnych czasach nie ma to praktycznie żadnego znaczenia,
ale kiedy komputery posiadały na przykład 64 kB (64 000 B) pamięci i wszystkie
skomplikowane obliczenia musiały się tym zadowolić.
Formatowanie wyników obliczeń
W języku C++ dość nieprecyzyjnie (w dodatku kilkoma sposobami) opisano możliwości formatowania wypisywanych wyników na ekranie monitora.
Instrukcje printf i scanf posiadają całą listę parametrów. Instrukcje
cout i cin swój własny zestaw poleceń. Aby nie komplikować, będziemy posługiwać się biblioteką
iomanip i instrukcjami fixed, setprecision i setw. W różnych opracowaniach książkowych i internetowych możesz spotkać się z wieloma innymi – pomocy szukaj w internecie!
Zadanie
PI
Zadeklaruj stałą PI o wartości 4,1415629536 i wypisz ją na ekranie z dwoma miejscami po przecinku, przesuniętą o 10 pół od poprzedniego napisu (lewego brzegu ekranu).
Wynik na ekranie konsoli
#include <iomanip> ... const double PI = 3.1415926536; cout << fixed << setprecision(2); cout << "PI="; cout << setw(10) << PI << endl; |
Ogólne uwagi do pisanych programów
Więcej o typowych błędach, jakie zdarzają się w programach przeczytasz w części Błędy. Odpluskwianie.
1) Oblicz pole powierzchni i obwód kwadratu dla zadanego boku.
2) Oblicz pole powierzchni i obwód prostokąta dla zadanych boków.
Walec V=PI*R2*H P=2*PI*R2+2*PI*R*H
3) Prostokątny arkusz blachy o wymiarach 20 cm x 40 cm można zwinąć w dwojaki sposób, otrzymując powierzchnię boczną walca. W którym przypadku walec będzie miał większą objętość? Zmień zadanie wpisując wymiary blachy z klawiatury.
Stożek V=1/3*PI*R2*H P=PI*R2+PI*R*H
4) Trójkąt prostokątny o przyprostokątnych 3 cm i 4 cm obraca się raz dookoła przyprostokątnej 4 cm, a drugi raz dookoła przyprostokątnej 3 cm. Czy objętości powstałych stożków będą równe? Czy pola powierzchni bocznych będą równe?
Zmień zadanie wpisując wymiary trójkąta z klawiatury.
Kula V=4/3*PI*R3 P=4*PI*R2
5) Przekrój osiowy kuli jest kołem, którego obwód wynosi 18π cm. Oblicz pole powierzchni i objętość tej kuli. Zmień zadanie wpisując obwód z klawiatury.
6) Kocioł o średnicy 6 dm i wysokości 4 dm cały wypełniony jest zupą. Chochla ma kształt półkuli o promieniu 6 cm. Harcerze dostają po 2 chochle zupy. Czy zupy wystarczy dla 100 harcerzy?
7) Do garnka o promieniu 9 cm, wypełnionego wodą wpadła brzoskwinia o średnicy 6 cm. O ile cm podniesie się poziom wody w garnku?
Przykładowe rozwiązania zadań
Jedynie ciężka umysłowa praca i zrozumienie działania
programu może nauczyć programowania!
//zadanie 1 double BOK; cout << "POLE i OBWÓD kwadratu" << endl; cout << "BOK= " ; cin >> BOK; double P = BOK*BOK; double O = 4*BOK; cout << fixed << setprecision(2); cout << "POLE=" << setw(15) << P << endl; cout << "OBWÓD=" << setw(14) << O << endl; |
//zadanie 2 double A,B; cout << "POLE i OBWÓD prostokąta" << endl; cout << "BOK A= "; cin >> A; cout << "BOK B= "; cin >> B; double Pp = A*B; double Op = 2*A+2*B; cout << fixed << setprecision(1); cout << "POLE= " << Pp << endl; cout << "OBWÓD= " << Op << endl; |
//zadanie 3 const double H31=20; const double H32=40; const double PI = 3.1415926536; cout << "OBJĘTOŚĆ WALCA" << endl; cout << fixed << setprecision(2) ; //obwód hest jednym bokiem blachy i stąd wyliczamy promień double R31=H31/(2*PI); double R32=H32/(2*PI); double V31=PI*R31*R31*H32; double V32=PI*R32*R32*H31; cout << "BLACHA 20x40 V=" << V31 << endl; cout << "BLACHA 40x20 V=" << V32 << endl; |
//zadanie 4 const double P41=3; const double P42=4; const double PI = 3.1415926536; //przeciwprostokątną L wyliczamy z pitagorasa - do pola powierzchni //pow i sqrt muszą mieś takie same typy danych i wyników double L4=sqrt(pow(double(P42),2)-pow(double(P41),2)); double V41=PI*pow(double(P42),2)*P41 /3; double V42=PI*pow(double(P41),2)*P42 /3; double PO41=PI*L4*P41; double PO42=PI*L4*P42; cout << fixed << setprecision(3) ; cout << "STOŻEK" << endl; cout << "trójkąt 3x4 V=" << V41 << " P=" << PO41 << endl; cout << "trójkąt 4x3 V=" << V42 << " P=" << PO42 << endl; |
//zadanie 5 const double O5=18*PI; double R5=O5/(2.0*PI); double P5=4.0*PI*R5*R5; double V5=PI*R5*R5*R5 *4.0/3.0; double P51=(O5*O5)/PI; double V51=(O5*O5*O5)/(6*PI*PI); cout << fixed << setprecision(2) ; cout << "KULA" << endl; cout << "P=" << P5 << endl; cout << "V=" << V5 << endl; |
//zadanie 6 const double d6=60; const double h6=40; const double r6=6; double Vch=PI*r6*r6*r6 *4/3; double Vko=PI*(d6/2.0)*(d6/2.0)*h6; double har=Vko/Vch; cout << fixed << setprecision(2) ; cout << "KOCIOŁ i CHOCHLA" << endl; cout << "Vko=" << Vko << " Vch=" << Vch << endl; cout << fixed << setprecision(0) ; cout << "Ilu harcerzy=" << har << endl; |
//zadanie 7 const double r7=9; const double d7=6; double Vbrz=PI*(d7/2.0)*(d7/2.0)*(d7/2.0) *4.0/3.0; double poziom=Vbrz/(PI*r7*r7); cout << fixed << setprecision(2) ; cout << "BRZOSKWINIA w GARNKU" << endl; cout << "Poziom wody podniesie się o " << poziom << " cm" << endl; |
//SZABLON #include <stdlib.h> //system #include <iostream> //cout #include <iomanip> //fixed #include <cmath> //pow using namespace std; int main(){ setlocale(LC_ALL, ""); system("pause"); } |