Professional Documents
Culture Documents
ან უფრო მოკლედაც
int total = 0; // ყველა რიცხვის ჯამი
for(int number = 15; number <= 25; ++number)
total += number;
cout << "The grand total is "<< total << endl;
შემდეგი პროგრამა შეკრებს შემთხვევით რიცხვებს, ვიდრე ჯამი არ გახდება 10 –ის ჯერადი,
ოღონდ ჯამში არ გაითვალისწინებს 13-ზე დამთავრებულ რიცხვებს:
#include <iostream>
using namespace std;
int main (){
int a; // შემთხვევითი რიცხვი
int s =0; // რიცხვების ჯამი
for ( ; ; ) // უსასრულო განმეორება, იგივეა რაც while(true)
{
a = rand();
if(a%100 = = 13)
continue;
s += a;
if(s%10 = = 0)
break;
}
cout<< "s = " << s <<'\n';
} s = 554810
პროგრამის შესრულების შედეგია: Press any key to continue . . .
Page 2 of 9
განაცხადი ქმნის ლოკალურ ცვლადს, რომლის საშუალებითაც ხდება დიაპაზონში
მოთავსებული სიდიდეების შემოვლა. შეტყობინება შესაძლოა რამდენიმე მარტივი
შეტყობინებისგან შედგებოდეს, რომლებიც ბლოკშია გაერთიანებული.
მაგალითებზე გავეცნოთ ამ განმეორების შესაძლებლობების ნაწილს:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {10, 12, 3, 4, 15 };
for (auto m : v)
std::cout << m << ' ';
std::cout << '\n';
for (auto n : {-1, 0, 1, 2, 3, 4, 5})
std::cout << n << ' ';
std::cout << '\n';
}
10 12 3 4 15
რომლის შედეგია: -1 0 1 2 3 4 5
Press any key to continue . . .
auto -ს ადგილზე შესაძლოა ეწეროს int, მაგრამ auto -თი უფრო ზოგადი და დაცული კოდი
მიიღება, რადგან პროგრამა თვითონ განსაზღვრავს ცვლადის ტიპს (იხ.ბოლო პუნქტი).
თუ გვინდა, რომ განაცხადში შექმნილი ცვლადის მნიშვნელობები დავიცვათ ცვლილებისგან,
მის წინ უნდა მოვათავსოთ const. მაგალითად, for (const auto m : v). თუმცა, ამ
კონსტრუქციიდან სრული ეფექტის მიღება შესაძლებელია მხოლოდ რეფერენსების გამოყენების
შემთხვევაში.
დიაპაზონიანი განმეორების ტანში (ბლოკში) ჩვეულებრივი წესით მოქმედებენ break და
continue შეტყობინებები. მაგალითად,
for (int n : {-1, 0, 1, 2, 3, 4, 5})
{
if (n == 3) continue;
std::cout << n << ' ';
if (4 == n) break;
}
-1 0 1 2 4
ფრაგმენტის შესრულების შედეგი იქნება
Press any key to continue . . .
Page 3 of 9
}
10 სვეტად დაგვიბეჭდავს 100 შემთხვევით მთელ რიცხვს.
აქ k = rand(); შეტყობინების შესრულება მიანიჭებს k ცვლადს რომელიღაცა მთელ რიცხვს
[0, RAND_MAX] დიაპაზონიდან..
იმისათვის, რომ rand() ფუნქციით მოვახდინოთ შემთხვევითი k რიცხვის გენერირება [0,m]
შეალედიდან, უნდა გამოვიყენოთ ფორმულა: k = rand()% (m + 1); თუმცა, შედეგად
მიღებული სიდიდეები მთლად ვერ აკმაყოფილებენ შემთხვევითი რიცხვებისთვის წაყენებულ
მოთხოვნებს (მაგალითად, ლუწების და კენტების რაოდენობები შორსაა ერთმანეთისგან და
სხვა).
თუ შემთხვევითი მთელი k რიცხვის მიღება გვინდა [n,m] დიაპაზონიდან, უნდა
გამოვიყენოთ ფორმულა: k = rand()%(m + 1 - n) + n;
მაგალითად,
#include <iostream>
using namespace std;
int main()
{
int i, k, n, m;
puts("ShemoitaneT diapazonis sazgvrebi : ");
cin >> n >> m;
for(i = 1; i <= 10; i++) {
k = rand()%(m + 1 - n) + n;
cout << k << ' ';
}
cout << endl;
} ShemoitaneT diapazonis sazgvrebi :
პროგრამის შესრულების შესაძლო შედეგია: -5 30
0 30 29 -1 12 23 25 13 29 15
Press any key to continue . . .
Page 4 of 9
time(NULL)-ის შედეგი წარმოადგენს მიმდინარე კალენდარულ დროს, გაზომილს წამებში.
დროის ათვლა მიმდინარეობს 1970 წლის 1 იანვრიდან.
საინტერესოა ფუნქციის სათაურიც. გავრცელებული ვერსიით, srand ნიშნავს შემთხვევითობის
დათესვას (seed rand), თუმცა, იგი შეიძლება ნიშნავდეს წანაცვლებულ შემთხვევითობას
(shifted rand) , რადგან რა არგუმენტითაც არ უნდა გავუშვათ ფუნქცია srand(), rand()
ფუნქციის მომდევნო შედეგები მაინც მოგვცემს (2) მიმდევრობას, დაწყებულს რაღაც
მომენტიდან (მაგალითად, მე-100-იდან დაწყებული, ან 2 345-ედან და ა.შ.).
time ფუნქციით სარგებლობისათვის საჭიროა #include <ctime>-ის ჩართვა
შემდეგი პროგრამა ქმნის 15 შემთხვევით რიცხვს [-7, 15] შუალედიდან და ბეჭდავს 5 სვეტად.
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
int i, k;
srand( time(NULL) );
for( i = 1; i <= 15; i++){
k = rand()% 23 - 7;
cout << k << '\t';
if(i % 5 = = 0) cout << endl;
}
}
პროგრამის შესრულების შედეგები:
ტესტი # 1 ტესტი # 2
-7 5 1 15 14 10 -6 -3 2 13
13 5 -3 2 5 8 8 -3 -4 9
14 -2 2 9 11 9 -2 2 4 -2
Press any key to continue . . . Press any key to continue . . .
Page 5 of 9
რომელიც ბევრად უკეთეს ენტროპიას უზრუნველყოფს time(NULL)-თან შედარებით.
მაგალითად, განაცხადის სახე იქნება:
default_random_engine dre (std::random_device{}());
აქ გაკეთდება k ცალი მთელი რიცხვი int-ის დიაპაზონიდან და არა short-ის, როგორც ეს იყო
rand() ფუნქციის შემთხვევაში. უფრო მეტი, შეგვეძლო განაცხადი გაგვეკეთებინა ძალიან დიდ
შემთხვევით მთელებზე შემდეგი სახით:
uniform_int_distribution<long long> di;
#include <iostream>
using namespace std;
int global; // გლობალური ცვლადი
int main(){
int local; // ლოკალური ცვლადი
global = 10; // აქ გლობალურ ცვლადზე წვდომა გვაქვს
local = 19; // ასევე ლოკალურ ცვლადზეც
Page 7 of 9
რომელიმე თეფშის აღებაც მხოლოდ იმ შემთხვევაში შეიძლება, თუ ის ზემოდან დევს. სტეკშიც
ბოლოს დამატებული ინფორმაცია თავსდება სტეკის ბოლოში და წაშლაც ხდება ბოლოდან.
მუშაობის ასეთ პრინციპს ეწოდება LIFO(last-in,first-out) - ანუ ბოლოს მოსული
პირველი მიდის.
სტეკის სიგრძე დამოკიდებულია ოპერაციულ სისტემაზე და კომპილერზე.
ლოკალური ცვლადი არის დროებითი გარდა იმ შემთხვევისა, როცა მის განაცხადში
მითითებულია static.
თუ static გამოიყენება გლობალურ ცვლადზე განაცხადში, მაშინ მას აქვს სრულიად სხვა
დანიშნულება. ის მიუთითებს, რომ ცვლადი არსებობს მხოლოდ მიმდინარე ფაილში.
Page 8 of 9
static, ბლოკის შიგნით ლოკალური მუდმივი ერთხელ
Page 9 of 9