Laboratorijas darbs 3.1. Datu tipi, to reprezentācija un nomaiņa (C++)
Izdruka uz ekrāna:
F
50
0.123
1 0
Hallo, World!
Ievērot, ka, ja norādītajā vietā (ko nosaka komandas width vai setw) pietrūkst vietas, informācija netiek apgriezta, bet gan platuma nosacījums tiek ignorēts (sk. Hallo, World!).
Ievērot, ka true un false izdrukājas attiecīgi kā 1 un 0.
123e-3 nozīmē 123*10-3.
2. Pirms izdrukas rindiņām ievietot:
c2 = i1;
i2 = c1;
3. No 5 izdrukas rindiņām atstāt tikai 2, kuras izdrukā attiecīgi c2 un i2.
Galvenā programma izskatās šādi:
char c1 = 'F', c2;
int i1 = 50, i2;
double d1 = 123e-3, d2;
bool b1 = true, b2 = false;
char *s1 = "Hallo, World!";
c2 = i1;
i2 = c1;
cout << setw(10) << c2 << endl;
cout << setw(10) << i2 << endl;
return 0;
4. Kompilēt un darbināt programmu, iegūstot šādu rezultātu.
2
70
Pēc izdrukas var secināt, ka (1) cipars 2 kā simbols tiek kodēts ar 50, bet lielais burts F ar 70. Ievērojiet, ka cipara vērtība un cipara kods, uztverot to kā simbolu, ir divas dažādas lietas.
5. Nomainīt abas izdrukas rindiņas ar:
cout << c1 << " " << sizeof(c1) << endl;
cout << i2 << " " << sizeof(i2) << endl;
6. Kompilēt un darbināt programmu, iegūstot šādu rezultātu.
F 1
70 4
Atceroties programmas rindiņu c2 = i1: no šīs izdrukas var redzēt, ka simbols F (jeb tā kods 70) ne tikai savādāk izdrukājas atkarībā no vērtībai piesaistītā tipa, bet arī aizņem atmiņā atšķirīgu izmēru vietas.
7. Izdzēst rindiņas
c2 = i1;
i2 = c1;
cout << c1 << " " << sizeof(c1) << endl;
cout << i2 << " " << sizeof(i2) << endl;
8. To vietā ierakstīt šādas rindiņas:
d2 = d1 * 100;
cout << d1 << " " << d2 << endl;
b1 = (d1 < d2);
b2 = !b1;
cout << d1 << " less than " << d2 << ": " << b1 << endl;
cout << d1 << " greater or equal than " << d2 << ": " << b2 << endl;
Tagad galvenā programma izskatās šādi:
char c1 = 'F', c2;
int i1 = 50, i2;
double d1 = 123e-3, d2;
bool b1 = true, b2 = false;
char *s1 = "Hallo, World!";
d2 = d1 * 100;
cout << d1 << " " << d2 << endl;
b1 = (d1 < d2);
b2 = !b1;
cout << d1 << " less than " << d2 << ": " << b1 << endl;
cout << d1 << " greater or equal than " << d2 << ": " << b2 << endl;
return 0;
9. Kompilēt un darbināt programmu, iegūstot šādu rezultātu.
0.123 12.3
0.123 less than 12.3: 1
0.123 greater or equal than 12.3: 0
Mainīgais b1 glabāta vērtību par to vai taisnība, ka d1 mazāks par d2;
b2 glabā pretējo vērtību, pateicoties rindiņai b2 = !b1; (jo izsaukuma zīme ! nozīmē loģisko nē (NOT), tātad pārveidošanu par pretējo loģisko vērtību)
Kā redzams, loģiskās vērtības true un false, kā iepriekš, izdrukājas kā 1 un 0.
10. Izdzēst rindiņas
cout << d1 << " less than " << d2 << ": " << b1 << endl;
cout << d1 << " greater or equal than " << d2 << ": " << b2 << endl;
11. To vietā ierakstīt šādas rindiņas:
cout << "d1<d2 " << b1 << " " << (b1 ? "true" : "false") << endl;
cout << "d1>=d2 " << (d1>=d2) << " " << (d1>=d2 ? "true" : "false") << endl;
12. Kompilēt un darbināt programmu, iegūstot šādu rezultātu.
0.123 12.3
d1<d2 1 true
d1>=d2 0 false
Te var redzēt veidu, kā no loģiskās vērtības, kas patiesībā ir 1 vai 0, izdrukā iegūt true vai false, vai jebkuru citu tekstu. To palīdz izdarīt nosacījuma operators ?:
Gan izdrukājot loģiskās vērtības, gan izmantojot tās citur, tās var gan ievietot atsevišķā loģiskajā mainīgajā, kā b1 pirmajā gadījumā, vai rakstīt tiešā veidā salīdzināšanas operāciju kā otrā gadījumā.
Programmas šobrīdējais izskats ir šāds:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
char c1 = 'F', c2;
int i1 = 50, i2;
double d1 = 123e-3, d2;
bool b1 = true, b2 = false;
char *s1 = "Hallo, World!";
d2 = d1 * 100;
cout << d1 << " " << d2 << endl;
b1 = (d1 < d2);
b2 = !b1;
cout << "d1<d2 " << b1 << " " << (b1 ? "true" : "false") << endl;
cout << "d1>=d2 " << (d1>=d2) << " " << (d1>=d2 ? "true" : "false") << endl;
return 0;
}
13. Izdzēst no programmas visas rindiņas no d2 = d1 * 100; līdz abām rindiņām, kas izdrukā uz ekrāna ieskaitot.
14. To vietā ierakstīt;
d2 = i1;
cout << d2 << endl;
15. Kompilēt un darbināt programmu, iegūstot šādu rezultātu:
50
Tātad, int vērtību var bez problēmām piešķirt double mainīgajam. double tipa mainīgajā šai vērtībai tiks piemērots tips double, kas potenciāli var ietekmēt darbības ar šo vērtību, piemēram, dalīšanu.
16. Pirms rindiņas return 0; ievietojam šādas rindiņas:
i2 = d1;
cout << i2 << endl;
17. Kompilēt programmu.
Kompilācija uzrāda brīdinājumu (warning), ka mainīgajam int piešķirta double vērtība, kas nokontrolētā gadījumā var izsaukt negaidītus programmas efektus, jo int tipa mainīgajos nevar saglabāt skaitļa daļu aiz komata.
C:/Darbi/prg/lab3.1b.cpp:14: warning: assignment to `int' from `double'
C:/Darbi/prg/lab3.1b.cpp:14: warning: argument to `int' from `double'
Execution terminated
Compilation successful
Tomēr kompilācija ir veiksmīga.
18. Darbināt programmu, iegūstot rezultātu:
50
0
Tātad, 0.123 ticis pārveidots par 0 vienkārši nometot mantisu (daļu aiz decimālās zīmes).
Kontrolētais noapaļošanai C++ tiek lietotas funkcijas floor (noapaļot uzleju, angliski grīda), ceil (noapaļot uz augšu, angliski ceiling griesti) un round (noapaļot matemātiski).
19. Rindiņas i2 = d1; vietā ievietojam rindiņu:
i2 = ceil (d1);
20. Bez tam augšā pievienojam papildus bibliotēkas iekļāvumu:
#include <math.h>
21. Kompilēt programmu.
Joprojām brīdinājums kompilējot, kas ir tādēļ, ka skaitlī double var teorētiski saglabāt lielāku vesela skaitļa vērtību nekā spēj int.
22. Darbināt programmu, iegūstot rezultātu:
50
1
0.123 noapaļots uz augšu ir 1
23. Nomainīt rindiņu i2 = ceil (d1); ar
i2 = (int)ceil (d1);
pievienojot papildus (int)
24. Darbināt programmu.
Programma darbojas tāpat kā bez int, bet kompilējas bez brīdinājumiem.
Brīdinājumu (warning) būtība ir pievērst programmētāja uzmanību vietām, kas teorētiski ir bez kļūdām, bet praktiski var novērst pie nevēlamiem blakusefektiem, piemēram, nekontrolēta informācijas zuduma.
Programmas teksts beigās:
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
int main()
{
char c1 = 'F', c2;
int i1 = 50, i2;
double d1 = 123e-3, d2;
bool b1 = true, b2 = false;
char *s1 = "Hallo, World!";
d2 = i1;
cout << d2 << endl;
i2 = (int)ceil (d1);
cout << i2 << endl;
return 0;
}
Laboratorijas darbs 3.2. Skaitliskas izteiksmes (C++, Python)
1. Atvērt failu lab3.2.cpp (lab3.2.py), darbināt.
Izdruka uz ekrāna:
14
Jo 14 = 2 + (3 * 4);
2. Nomainīt rindiņu d = a + b * c ar d = (a + b) * c
Iegūtais rezultāts ir 20.
3. Uzrakstīt rindiņas d = (a + b) * c vietā zemāk norādīto izteiksmi:
Piezīme. Dalīšanai izmantot operatoru /, sinusa iegūšanai funkciju sin(x) (C++) vai math.sin(x) (Python), kosinusa iegūšanai funkciju cos(x) (C++) vai math.cos(x) (Python), bet pakāpēs iegūšanai funkciju pow(x,y) (C++) vai x**y (Python). C++ gadījumā sākumā jāiekļauj bibliotēka math: #include <math.h>, bet Python gadījumā math: import math.
Iegūtais rezultāts, darbinot programmu:
729.913 (vai precīzāk: 729.9125297534076, Python gadījumā)
Pareizo variantu skat. failā lab3.2b.cpp (lab3.2b.py)
Laboratorijas darbs 3.3. Datu tipi, to reprezentācija un nomaiņa (Python)
1. Atvērt failu lab3.1.py un darbināt:
c1 = 'F'
i1 = 50
d1 = 123e-3
b1 = True
b2 = False
s1 = "Hallo, World!"
print("{0:10s}".format(c1))
print("{0:10d}".format(i1))
print("{0:10.3f}".format(d1))
print("{0:10}{1:10}".format(b1,b2))
print("{0:10s}".format(s1))
Izdruka uz ekrāna:
F
50
0.123
1 0
Hallo, World!
Ievērot, ka teksts ir automātiski pielīdzināts kreisajai malai, skaitļi labajai (:10 nozīmē izdrukas apgabalu 10 simbolu garumā). Ja informācijas daudzums ir lielāks nekā atvēlētais apgabals, tad dati netiek noīsināti (sk. Hallo, World!). Python atšķirībā no C++, tieši netiek nošķirti jēdzieni simbols un simbolu virkne simbols ir simbolu virkne (teksts) garumā 1. Ievērot, ka True un False izdrukājas attiecīgi kā 1 un 0. 123e-3 nozīmē 123*10-3.
c1 = 'F'
i1 = 50
d1 = 123e-3
b1 = True
b2 = False
s1 = "Hallo, World!"
print("{0:>10s}".format(c1))
print("{0:<10d}".format(i1))
print("{0:<10.3f}".format(d1))
print("{0:<10}{1:<10}".format(b1,b2))
print("{0:>20s}".format(s1))
Izdruka uz ekrāna:
F
50
0.123
1 0
Hallo, World!
3. Pirms izdrukas rindiņām ievietot:
c2 = i1
i2 = c1
4. No 5 izdrukas rindiņām atstāt tikai 2, kuras izdrukā attiecīgi c2 un i2.
Galvenā programma izskatās šādi (lab3.1b.py):
c1 = 'F'
i1 = 50
d1 = 123e-3
b1 = True
b2 = False
s1 = "Hallo, World!"
c2 = chr(i1)
i2 = ord(c1)
print("{0:10}".format(c2))
print("{0:10}".format(i2))
5. Darbināt programmu, iegūstot šādu rezultātu.
2
70
Funkcija chr pārveido burta(simbola) kodu par simbolu, bet funkcija ord otrādi burtu (simbolu virkni garumā 1) par tā kodu. Pēc izdrukas var secināt, ka (1) cipars 2 kā simbols tiek kodēts ar 50, bet lielais burts F ar 70. Ievērojiet, ka cipara vērtība un cipara kods, uztverot to kā simbolu, ir divas dažādas lietas, tātad 2 kā simbols un 2 kā skaitlis ir atšķirīgas vērtības.