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

Lekcja 1

Konsola w C++

  1. konsola
  2. okrąg
  3. zmienne
  4. przypisanie
  5. arytmetyka
  6. typy
  7. formatowanie
  8. zadania
  9. rozwiązania

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");
}


Zadanie – okrąg

Wczytaj z klawiatury promień okręgu. Wylicz jego obwód oraz pole powierzchni.

Uwagi podczas pisania programu

#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).


Instrukcja przypisania
Zapis P = PI * R * R; oznacza, że:

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.


Zadania
wyniki na ekranie, jak na załączonych obrazkach

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");
}