Laboratorijas darbs 2.1. Kompilatora kļūdas paziņojumi, teksta literāļi C++
C:/Darbi/prg/lab1.1.cpp: In function `int main()':
C:/Darbi/prg/lab1.1.cpp:7: parse error before `return'
Aiz katra operatora (instrukcijas) valodā C++ ir jābūt semikolam.
8. Nomainīt endl uz lielajiem burtiem ENDL.
9. Nokompilēt un konstatēt kompilatora sniegto kļūdas paziņojumu.
C:/Darbi/prg/lab1.1.cpp: In function `int main()':
C:/Darbi/prg/lab1.1.cpp:6: `ENDL' undeclared (first use this function)
C++ ir reģistrjūtīga (case sensitive) programmēšanas valoda.
11. Nomainīt tekstu Hello, World! uz lielajiem burtiem HELLO, WORLD!
12. Nokompilēt. Programmai veiksmīgi jānokompilējas. Darbināt programmu.
Reģistrjūtība, protams, attiecas tikai uz identifikatoriem mainīgo, funkciju vārdiem, komandām u.c., izmaiņas teksta konstantēs nav pretrunā ar sintaksi, bet vienkārši ietekmē programmas darbību
13. HELLO, WORLD! tekstā vārdu WORLD ielikt pēdiņās, bet pirms komata ielikt atpakaļsvītru:
cout << "HELLO\, "WORLD!"" << endl;
C:/Darbi/prg/lab1.1.cpp:6:13: warning: unknown escape sequence '\,'
C:/Darbi/prg/lab1.1.cpp: In function `int main()':
C:/Darbi/prg/lab1.1.cpp:6: parse error before `!' token
Teksts C++ tiek rakstīts, ievietojot dubultpēdiņās, tomēr ne visus simbolus šeit var rakstīt tiešā veidā. lai, piemēram, nesajauktu, vai dubultpēdiņa () pieder pie teksta vai ir atdalītāj simbols daži speciālie simboli teksta konstantēs ir jākodē speciālā veidā, parasti, pieliekot priekšā papildus simbolu (\) (escape symbol), pie šiem simboliem pieder apostrofs (), dubultpēdiņa (), pati atpakaļsvītra (\), turklāt \n nozīmē jaunu rindu (to pašu ko endl ārpus teksta konstantes, bet \t tabulāciju)
cout << "HELLO\\,\n \"WORLD!\"" << endl;
HELLO\,
"WORLD!"
Ievērojiet, ka salīdzinājumā ar teksta konstantes pierakstu, izdrukā neparādās neviens simbols (\), ja vien tas neatrodas aiz tāda paša simbola. Ievērojiet līdzību ar mēmo taustiņu latviskajā klaviatūrā šādu principu pielieto, ja burtu/taustiņu ir mazāk nekā simbolu, kas ar tiem jānokodē.
Laboratorijas darbs 2.2. int un double tipa vērtības, veselo skaitļu dalīšana un parastā dalīšana C++
1. Atvērt failu lab1.2.cpp no 1. laboratorijas darba un nokompilēt.
x = 12;
y = 7;
3. Saskaitīšanu z = x + y; nomainīt ar dalīšanu z = x / y;
4. Tekstu sum nomainīt ar result.
Tagad programma izskatās šādi:
#include <iostream>
using namespace std;
int main ()
{
int x, y, z;
cout << "Input 2 integer values:" << endl;
x = 12;
y = 7;
z = x / y;
cout << "Result is " << z << endl;
system ("pause");
return 0;
}
5. Darbināt programmu, rezultātam jābūt 1.
Veselu skaitļu dalīšanā 12 dalot ar 7, rezultāts ir 1. Veselo skaitļu dalīšana notiek, ja abi dalīšanas operācijas operandi ir veseli skaitļi (int tādi ir).
6. Nomainīt rindiņu int x, y, z; ar float x, y, z;
Tādējādi mainīgo x, y, z tips tiek uzstādīts skaitlis ar peldošo komatu
7. Kompilēt un darbināt programmu, rezultātam jābūt 1.71429
Ja kaut viens operands dalīšanas operācijai ir skaitlis ar peldošo komatu (skaitlis, kas nav vesels skaitlis), tad tiek veikti parastā dalīšana.
8. Nomainīt rindiņu float x, y, z; par
int
x, y;
float
z;
Tādā veidā x un y tiek pārveidoti par veseliem skaitļiem, kas var ietekmēt dalīšanu.
9. Nomainīt rindiņu z = x / y; ar z = x / 5; (y vietā tiek ielikts skaitlis 5 tiešā veidā)
10. Darbināt programmu, rezultātam jābūt 2, tātad tikusi veikta veselo skaitļu dalīšana, tātad skaitlis 5 ticis uzskatīts par veselu skaitli (valodā C++ skaitliskas konstantes-vērtības, kas pierakstītas bez decimālās zīmes, tiek uzskatītas pat int tipa vērtībām)
11. Nomainīt rindiņu z = x / 5; ar z = x / 5.0;
12. Darbināt programmu, rezultātam jābūt 2.4, tātad tikusi veikta parastā dalīšana, tātad skaitlis 5 ticis uzskatīts par skaitli ar peldošo komatu (valodā C++ skaitliskas konstantes-vērtības, kas pierakstītas ar decimālo zīmi, tiek uzskatītas pat double tipa vērtībām double ir līdzīgs datu tips kā float, bet tas nodrošina 2 reizes lielāku atmiņas vietu un spēj saglabāt lielākus skaitļus)
Laboratorijas darbs 2.3. Formatētais ievads C++
13. Atvērt failu lab2.3.cpp no 2. laboratorijas darba un nokompilēt.
Tas, ka mēs varam ievadīt otru skaitli vēl pirms it kā programma mums to ir prasījusi, parāda to, ka informācijas nolasīšana no klaviatūras un tās izmantošana programmā ir divas dažādas lietas, tātad, sākumā informācija no klaviatūras nonāk atmiņas buferī neatkarīgi no mūsu programmas, un tikai tad programma no tā paņem vajadzīgos simbolus kādas vērtības nolasīšanai. Šo buferi sauc par plūsmu (stream), no tā arī bibliotēkas nosaukums (<iostream>).
16. Darbinām programmu ar burtu nevis skaitli, ievadot: a <ENTER>
Input numeric value #1
a
Output: 987
Input numeric value #2
Output: 987
Ievadot vērtību, kas nav interpretējama par skaitli, iestājās divas sekas: (a) pirmajā reizē (ievades operatora izsaukumā) netika nolasīts nekāds skaitlis, bet mainīgajam d palika sākotnējā (iepriekšējā) tā vērtība 987; (b) otrajā reizē skaitļa ievadīšana vispār netika prasīta (programma neapstājās, lai paprasītu lietotājam ievadīt otru skaitli). Tas izskaidrojams ar to, ka pēc kļūdas, ievades objekts cin tika nobloķēts un pirms nākošās darbības tas ir jāatbloķē.
17. Pirms otrā skaitļa ievadīšanas cin >> d; ievietot šādu programmas bloku:
if (!cin.good())
{
cin.clear();
cin.ignore (256, '\n');
};
18. Darbināt programmu ar burtu un skaitli, pa vidu lieko ENTER, piemēram, a <ENTER> 1.23 <ENTER>.
Input numeric value #1
a
Output: 987
Input numeric value #2
1.23
Output: 1.23
Ievietotais programmas kods nozīmē: ja ar ievades operāciju kas notikusi iepriekš) nav viss kārtībā (! nozīmē NOT, tātad nav), tad pirmkārt atbloķēt cin objektu turpmākam darbam, otrkārt ignorēt visus no klaviatūras ievadītos simbolus (ignore) no kļūdas vietas līdz tuvākajam <ENTER> ieskaitot (\n). Komanda ignore vajadzīga tādēļ, ka normālā situācijā (kad nenotiek) ievades kļūdas, viss uzreiz tiek nolasīts līdz tuvākajam ENTER, bet tad, kad notiek kļūda (piemēram, parādās simbols, kas neatbilst skaitlim, kā tas ir šajā gadījumā), nolasīšana apstājas pēc kļūdainā simbola nolasīšanas.
19. Darbināt programmu ar abc567 <ENTER> 1.23 <ENTER>.
Input numeric value #1
abc567
Output: 987
Input numeric value #2
1.23
Output: 1.23
20. Nomainiet rindiņā
cin.ignore (256, '\n');
256 par 1, lai sanāktu rindiņa
cin.ignore (1, '\n');
21. Darbināt programmu ar a12345 <ENTER>.
Input numeric value #1
a12345
Output: 987
Input numeric value #2
Output: 12345
Ievērojiet, ka programma otrreiz neprasīja ievadīt skaitli, bet pārlēca vienu simbolu uz priekšu buferī un mēģināja nolasīt skaitli no tās vietas, un tas arī izdevās.
Šī ievades sistēmas uzvedība izskaidrojama ar 2-daļīgo tās darbības shēmu (sīkāk sk. teorētiskajā materiālā):
|
Laboratorijas darbs 2.4. Formatētais izvads C++
Šajā laboratorijas darbā tiks apskatītas dažas formatēta izvada īpašības.
1. Atvērt failu lab2.4.cpp no 2. laboratorijas darba un nokompilēt.
Programma izdrukā skaitli 123.46589, to noapaļojot uz 3 cipariem aiz komata 123.466.
Programma izdrukā skaitli 1.23466, tātad noapaļošana pēc noklusēšanas notiek nevis uz kādu noteiktu ciparu skaitu aiz komata, bet gan līdz 6 zīmīgajiem cipariem.
5. Pirms rindiņas cout << d << endl; ievietot papildus rindiņu cout.precision (3);
Ar to precizitāte tiek uzstādīt uz 3.
6. Kompilēt un darbināt programmu.
Programma izdrukā skaitli 1.23, tātad 3 zīmīgos ciparus.
7. Lai precizitāte 3 cipari attiektos nevis uz zīmīgajiem cipariem, bet uz cipariem aiz komata, pirms izdrukas rindiņas pievienot rindiņu cout.setf (ios::fixed);
Tagad funkcija main izskatās šādi:
int main()
{
double d = 1.2346589;
cout.precision (3);
cout.setf (ios::fixed);
cout << d << endl;
return 0;
}
8. Darbināt programmu un sagaidīt rezultātu 1.235.
9. Nomainīr rindiņu cout << d << endl; uz
cout << d << "#" << endl;
10. Kompilēt un darbināt programmu, iegūstot 1.235#
11. Aiz rindiņas cout << d << "#" << endl; ievietot līdzīgu rindiņu:
cout << d << "@" << endl;
12. Kompilēt un darbināt programmu, iegūstot
1.235#
1.235@
13. Pirms rindiņas cout << d << "@" << endl; ievietot:
cout.unsetf (ios::fixed);
Tagad funkcija main izskatās šādi:
int main()
{
double d = 1.2346589;
cout.precision (3);
cout.setf (ios::fixed);
cout << d << "#" << endl;
cout.unsetf (ios::fixed);
cout << d << "@" << endl;
return 0;
}
14. Kompilēt un darbināt programmu.
Tādā veidā otrā izdruka notiks ar 3 zīmīgiem cipariem, nevis 3 cipariem aiz decimālās zīmes:
1.235#
1.23@
15. Pirms pirmās izdrukas rindiņas ievietot rindiņu:
cout.width (7);
16. Kompilēt un darbināt programmu, iegūstot rezultātu
1.235#
1.23@
Secinājumi: (1) Pirmais skaitlis ir ievietojies apgabalā no 7 simboliem, pielīdzinoties pie labās malas un liekās vietas atstājot tukšas, (2) Komanda width (atšķirībā no precision un fixed vai scientific) attiecas tikai uz nākošo izdrukās komandu (resp., << value)
17. Pirms otrās izdrukas rindiņas ievietot rindiņu:
cout.width (8);
18. Pēc mainīgā d deklarācijas rindiņas ievietot rindiņu:
cout.fill ('-');
Tagad funkcija main izskatās šādi:
int main()
{
double d = 1.2346589;
cout.fill ('-');
cout.precision (3);
cout.setf (ios::fixed);
cout.width (7);
cout << d << "#" << endl;
cout.unsetf (ios::fixed);
cout.width (8);
cout << d << "@" << endl;
return 0;
}
19. Kompilēt un darbināt programmu, iegūstot rezultātu
--1.235#
----1.23@
Ar fill tikai nomainīt aizpildīšanas simbols uz -
20. Pirms pirmās izdrukas rindiņas ievietot rindiņu:
cout.setf (ios::left);
21. Kompilēt un darbināt programmu, iegūstot rezultātu
1.235--#
1.23----@
Novērtēt rezultātu un pieraksta veidu alternatīvs veids formatēšanas komandām ir t.s. manipulatori, kurus raksta pa tieši iekšā izdrukas operatorā starp vērtībām, tikai nepieciešama papildus bibliotēkas <iomanip> iekļaušana.
Laboratorijas darbs 2.5. Aritmētiskas darbības
Izveidot C++
programmu ar attiecīgajiem nosacījumiem, izmantojot aritmētiskas darbības (+ ,-
,* , /, %). Aritmētisku darbību vietā neizmantot simbolu virkņu apstrādes
operācijas!
Uzdevums #1. Dots vesels pozitīvs skaitlis N, lielāks vai
vienāds ar 100. Izmantojot aritmētiskas operācijas, izrēķināt trešo ciparu no
beigām. Piemērs. N=123456; Rezultāts=4.
Uzdevums #2. Doti veseli skaitļi M un N. Neizmantojot veselo
skaitļu dalīšanu (int / int) un atlikuma operāciju (%),
izrēķināt šo skaitļu (1) veselo dalījumu, (2) dalījuma atlikumu. Papildus
ieteicams izmantot iebūvētās noapaļošanas funkcijas floor(∙) un ceil(∙),
kas atrodas bibliotēkā <cmath> vai <math.h>.
Laboratorijas darbs 2.6. Interpretatora kļūdas paziņojumi, teksta literāļi Python
1. Izveidot darba direktoriju (<WORK>), kurā iekopēt 1. laboratorijas darba piemēru lab1.1.py.
4. Nomainīt print uz lielajiem burtiem PRINT.
5. Darbināt un konstatēt interpretatora sniegto kļūdas paziņojumu (vai nu ziņojuma lodziņā vai nu ziņojumu panelī, vai konsolē):
Traceback
<module> C:\lab01\py\lab1.1.py 1
NameError:
name 'PRINT' is not defined
Python (tāpat kā C++) ir reģistrjūtīga (case sensitive) programmēšanas valoda.
7. Nomainīt tekstu Hello, World! uz lielajiem burtiem HELLO, WORLD!
8. Darbināt programmu. Tam jānotiek veiksmīgi.
Reģistrjūtība, protams, attiecas tikai uz identifikatoriem mainīgo, funkciju vārdiem, komandām u.c., izmaiņas teksta konstantēs nav pretrunā ar sintaksi, bet vienkārši ietekmē programmas darbību
9. HELLO, WORLD! tekstā vārdu WORLD ielikt pēdiņās:
print("HELLO, "WORLD!"")
File "C:\lab01\py\lab1.1b.py", line
1
print("HELLO,
"WORLD!"")
^
SyntaxError:
invalid syntax
Teksts C++ tiek rakstīts, ievietojot dubultpēdiņās, tomēr ne visus simbolus šeit var rakstīt tiešā veidā. lai, piemēram, nesajauktu, vai dubultpēdiņa () pieder pie teksta vai ir atdalītājsimbols, daži speciālie simboli teksta konstantēs ir jākodē speciālā veidā, parasti, pieliekot priekšā papildus simbolu (\) (escape symbol), pie šiem simboliem pieder apostrofs (), dubultpēdiņa (), pati atpakaļsvītra (\), turklāt \n nozīmē jaunu rindu, bet \t tabulāciju.
print("HELLO\\,\n \"WORLD!\"")
HELLO\,
"WORLD!"
print('HELLO\\,\n "WORLD!"')
HELLO\,
"WORLD!"
print('''HELLO\\,
"WORLD!"''')
HELLO\,
"WORLD!"
Ievērojiet, ka salīdzinājumā ar teksta konstantes pierakstu, izdrukā neparādās neviens simbols (\), ja vien tas neatrodas aiz tāda paša simbola. Ievērojiet līdzību ar mēmo taustiņu latviskajā klaviatūrā šādu principu pielieto, ja burtu/taustiņu ir mazāk nekā simbolu, kas ar tiem jānokodē.
Laboratorijas darbs 2.7. Formatētais ievads Python (Python 3)
1. Atvērt failu lab2.3.py.
d = float(input("Input numeric value: "))
print("Output:",d)
Output: 1.23
Valodā Python ievade notiek, izmantojot funkciju input, un ievades rezultāts ir teksts, kuru pēc tam nepieciešamības gadījumā pārveido uz attiecīgo datu tipu (šeit float). Konkrēta skaitlisko datu tipa pārveidošanas vietā var lietot universālo funkciju eval:
d = eval(input("Input numeric value: "))
print("Output:",d)
3. Atgriežamies pie float.
d = float(input("Input numeric value: "))
print("Output:",d)
4. Darbinām programmu, ievadot float tipam neatbilstošu vērtību piemēram, abc:
Input numeric value: abc
5. Programma beidz darboties ar kļūdu:
Traceback (most recent call last):
File "D:\darbi\Dropbox\acad\courses\prog\proglab\lab02\py\lab2.3.py", line 1,
in <module>
d = float(input("Input numeric value: "))
ValueError: could not convert string to float: 'abc'
Ievērojiet, ka šeit parādās kļūdas veids ValueError.
6. Izveidojam gudrāku programmu, kas māk tikt galā ar kļūdu (bez tam papildus pirms tan d tiek inicializēts ar 789) (lab2.3a.py):
d = 789
try:
d = float(input("Input numeric value: "))
except ValueError:
print("Value error!")
print("Output:",d)
Kļūdas apstrādi nodrošina try-except bloks.
7. Ar vienu ievades operāciju input iespējams ievadīt vairākas vērtības (sekojošā programma atļauj ievadīt vairākas vērtības un izdrukā to kvadrātus) (lab2.3b.py):
text = input("Input several integer values: ")
mylist = text.split()
print(mylist)
for m in mylist:
i = int(m)
print(i,i*i)
Papildus tiek izmantota
funkcija split, kas sadala tekstu (text) vērtību sarakstā (mylist).
8. Programma darbībā:
Input several integer values: 2 8 11
['2', '8', '11']
2 4
8 64
11 121
Izdrukā redzams,
ka saraksts mylist ir saraksts no
teksta vērtībām (ievietotām pēdiņās).
Laboratorijas darbs 2.8. Formatētais izvads Python (Python 3)
Šajā laboratorijas darbā tiks apskatītas dažas formatēta izvada īpašības.
1. Atvērt failu lab2.4.py.
Programma izdrukā skaitli 123.46589, izdrukājot visus ciparus aiz komata.
d = 123.46589
print("{0:.3f}".format(d))
123.466
Trīs zīmes aiz komata nosaka teksts .3f formatējuma sadaļā.
5. Ja tiek nomests formatējuma burts f:
d = 123.46589
print("{0:.3}".format(d))
6. tad skaitlis 3 formatējumā attiecas uz zīmīgo ciparu skaitu (nevis zīmju skaita aiz komata):
1.23e+02
Tas nozīmē 1.23*102.
Formatēt vienā virknē var vairākas un vairāku tipu vērtības (lab2.4a.py):
a = 456
b = 123.46589
c = "Hallo"
print("{0:d}=={1:.4f}\n{2:s}".format(a,b,c))
7. kas izdrukā dod.
456==123.4659
Hallo
8.
Sākot ar Python v.3.6, funkcijas format vietā var lietot speciālu formatēšanas virkni f...
(lab2.4b.py):
a = 456
b = 123.46589
c = "Hallo"
print(f"{a:d}=={b:.4f}\n{c:s}")
9.
Parasti nav nepieciešams speciāli
norādīt formatējumu veseliem skaitļiem un tekstam (lab2.4c.py):
a = 456
b = 123.46589
c = "Hallo"
print(f"{a}=={b:.4f}\n{c}")
{} nozīmē formatējamās vienības:
1,2,3 formatējamo vienību numuri
d vesels skaitlis
f skaitlis ar peldošo punktu
s simbolu virkne (teksts)
Viss, kas ir starp formatējamām vienībām, tiek drukāts (atgriezts) tiešā veidā.
Laboratorijas darbs 2.9. Vienkāršas programmas piemērs C++ ar ievadi un izvadi
Vienkārša programma skaitļa kvadrāta aprēķināšanai (io.cpp):
// Skaitļa kvadrāta aprēķināšana
#include<iostream>
using namespace std;
int main()
{
double valnum;
cout << "Ievadi skaitli: ";
cin >> valnum;
cout << "Skaitlis " << valnum << " kvadraataa ir " << valnum*valnum << endl;
}
Vienkārša programma skaitļa kvadrāta aprēķināšanai ar ievades kļūdas pārbaudi (ioplus.cpp):
// Skaitļa kvadrāta aprēķināšana
#include<iostream>
using namespace std;
int main()
{
double valnum;
cout << "Ievadi skaitli: ";
cin >> valnum;
if (cin.good())
cout << "Skaitlis " << valnum << " kvadraataa ir " << valnum*valnum << endl;
else
cout << "Ievades kluuda -- jaaievada skaitlis." << endl;
}
Vienkārša programma skaitļa kvadrāta aprēķināšanai ar atkārtotu izpildi (iorepeat.cpp):
// Skaitļa kvadrāta aprēķināšana
#include<iostream>
using namespace std;
int main()
{
int ok;
do
{
double valnum;
cout << "Ievadi skaitli: ";
cin >> valnum;
cout << "Skaitlis " << valnum << " kvadraataa ir " << valnum*valnum << endl;
cout << " Vai turpinaat (1) vai beigt (0)?" << endl;
cin >> ok;
} while (ok == 1);
}
Vienkārša programma skaitļa kvadrāta aprēķināšanai ar atkārtotu izpildi un ievades kļūdas pārbaudi (iorepeatplus.cpp):
// Skaitļa kvadrāta aprēķināšana
#include<iostream>
using namespace std;
int main()
{
int ok;
do
{
double valnum;
cout << "Ievadi skaitli: ";
cin >> valnum;
if (cin.good())
cout << "Skaitlis " << valnum << " kvadraataa ir " << valnum*valnum << endl;
else
{
cin.clear();
cin.ignore(256,'\n');
cout << "Ievades kluuda -- jaaievada skaitlis." << endl;
}
cout << " Vai turpinaat (1) vai beigt (0)?" << endl;
cin >> ok;
} while (ok == 1);
}
Laboratorijas darbs 2.10. Vienkāršas programmas piemērs JavaScript ar dažādiem ievades un izvades variantiem
Vienkārša programma skaitļa kvadrāta aprēķināšanai (ioprompt1.html), izvadei izvēloties funkciju window.alert:
<!-- Skaitļa kvadrāta aprēķināšana -->
<script>
var valnum = Number(prompt("Ievadi skaitli",""));
var outputtext = "Skaitlis " + valnum + " kvadrātā ir " + (valnum ** 2);
window.alert(outputtext);
</script>
Vienkārša programma skaitļa kvadrāta aprēķināšanai (ioprompt2.html), izvadei izvēloties funkciju console.log:
<!-- Skaitļa kvadrāta aprēķināšana -->
<script>
var valnum = Number(prompt("Ievadi skaitli",""));
var outputtext = "Skaitlis " + valnum + " kvadrātā ir " + (valnum ** 2);
console.log(outputtext);
</script>
Vienkārša programma skaitļa kvadrāta aprēķināšanai (iohtml.html), ievadei un izvadei izvēloties html līdzekļus:
<!-- Skaitļa kvadrāta aprēķināšana -->
<html>
<p id="text1"><b>Skaitļa kvadrāta aprēķināšana</b></p>
<p id="text2">Ievadi skaitli: </p>
<input type="number" id="idinput" value="0"/>
<p></p>
<button onclick="main()">Aprēķināt kvadrātu</button>
<p id="idoutput"></p>
<script>
function main() {
var valtxt = document.getElementById("idinput").value;
var valnum = Number(valtxt);
var outputtext = "Skaitlis " + valnum + " kvadrātā ir " + (valnum ** 2);
document.getElementById("idoutput").innerHTML = outputtext;
}
</script>
</html>