Rəsmi sənədləşmə — sıfırdan ilk veb və desktop proqramınıza qədər.
1Alqor nədir?
Alqor — tamamilə Azərbaycan dilində yazılan proqramlaşdırma dilidir. Açar sözlər, xəta mesajları və sənədlər ana dilimizdədir.
Aşağıdakı kodda bir dənə də ingilis sözü yoxdur — if yox, əgər; print yox, yaz. Və ə, ı, ş hərfləri tam işləyir.
salam.alqalqor
yaz("Adınızı daxil edin:")
dəyişən ad = oxu()
yaz("Yaşınızı daxil edin:")
dəyişən yaş = oxuTam()
əgər yaş >= 18ondayaz("{ad}, siz yetkinsiniz.")
yoxsayaz("{ad}, siz hələ yetkin deyilsiniz.")
son
Alqor ilə konsol proqramları, veb saytlar və API-lər, desktop tətbiqlər və kitabxanalar yaza bilərsiniz — hamısı eyni dildə, eyni sintaksislə.
Alqor-u vuqar.pro/hub ünvanından yükləyin (Windows, Linux, macOS) və ya bu bələdçi ilə dili öyrənməyə başlayın.
2İlk proqram
salam.alq adlı fayl yaradın və içinə yazın:
salam.alqalqor
yaz("Salam, dünya!")
Sonra işə salın:
terminalbash
alqor işlət salam.alq
nəticəoutput
Salam, dünya!
Fayl yaratmadan sınamaq üçün interaktiv rejim (REPL) var:
terminalbash
alqor söhbət
Azərbaycan hərfləri: Alqor Studio-da sadəcə ASCII yazın — eger yazırsınız, əgər olur. Və ya ;e → ə, ;s → ş kompozisiyasından istifadə edin.
3Dəyişənlər və tiplər
tiplər.alqalqor
dəyişən ad = "Aysel"// mətndəyişən yaş = 24// tam ədəddəyişən boy = 1.68// onluq ədəddəyişən tələbədir = doğru// məntiqidəyişən heçnə = boş// dəyər yoxdursabit Pİ = 3.14159// dəyişməz
əgər yaş >= 18ondayaz("Yetkin")
yoxsaəgər yaş >= 13ondayaz("Yeniyetmə")
yoxsayaz("Uşaq")
son
Çox variant üçün seç:
sec.alqalqor
seç gün
hal"B.e", "Ç.a"→yaz("İş günü")
hal"Ş", "B"→yaz("İstirahət")
hal1..5→yaz("Rəqəm")
digərhallarda→yaz("Naməlum")
son
5Dövrlər
dovr.alqalqor
// 1-dən 5-ə qədərhər i üçün1..5içindəyaz("Rəqəm: {i}")
son// Siyahı üzərindədəyişən meyvələr = ["alma", "armud", "üzüm"]
hər m üçün meyvələr içindəyaz(m)
son// Şərtli dövrdəyişən i = 0nəqədərki i < 5yaz(i)
i += 1son// Sayla təkrartəkrarla3dəfəyaz("Salam")
son
6Funksiyalar
funksiya.alqalqor
funksiya salamla(ad: mətn)
yaz("Salam, {ad}!")
sonfunksiya topla(a: tam, b: tam) ->tamqaytar a + b
son
salamla("Aysel")
yaz(topla(3, 4)) // 7// Qısa (lambda) funksiyadəyişən ikiqat = (x) => x * 2yaz(ikiqat(21)) // 42
dəyişən yaşlar = {"Aysel": 24, "Rəşad": 31}
yaz(yaşlar["Aysel"]) // 24
yaşlar["Nigar"] = 28hər ad, yaş üçün yaşlar içindəyaz("{ad}: {yaş}")
son
8Siniflər
sinif.alqalqor
sinif İnsan
xassə ad: mətnxassə yaş: tamqurucu(ad: mətn, yaş: tam)
özü.ad = ad
özü.yaş = yaş
sonmetod təqdim()
yaz("Mən {özü.ad}, {özü.yaş} yaşım var.")
sonsondəyişən a = yeni İnsan("Aysel", 24)
a.təqdim()
Miras (irsiyyət) və metodun əvəz edilməsi:
teleb.alqalqor
sinif Tələbə miras İnsan
xassə universitet: mətnqurucu(ad: mətn, yaş: tam, universitet: mətn)
üst(ad, yaş)
özü.universitet = universitet
sonəvəzetmetod təqdim()
yaz("Mən {özü.ad}, {özü.universitet} tələbəsiyəm.")
sonson
9Xətaların idarə edilməsi
xeta.alqalqor
cəhdetdəyişən n = tamƏt(oxu("Ədəd: "))
yaz("İki qatı: {n * 2}")
tut (x: ÇevrilməXətası)
yaz("Bu ədəd deyil!")
son
Öz xətanızı yaratmaq və şərti yoxlamaq:
bol.alqalqor
funksiya böl(a: onluq, b: onluq) ->onluqtəmin b != 0yoxsaat BölməXətası("Sıfıra bölmək olmaz")
sonqaytar a / b
son
10Veb server
Cəmi beş sətirdə işləyən veb server:
server.alqalqor
gətir veb
dəyişən s = yeni veb.Server()
s.al("/", (sorğu) => veb.mətn("Salam, dünya!"))
s.dinlə(8080)
gətir pəncərə
dəyişən p = yeni pəncərə.Pəncərə("Mənim Proqramım", 800, 600)
p.məzmun(<h1>Salam, dünya!</h1>)
p.göstər()
pəncərə.işlət()
Vəziyyəti olan komponent — eyni kod vebdə də işləyir:
saygac.alqalqor
gətir vidjet
komponent Sayğac
vəziyyət say: tam = 0göstər()
qaytar <button klik={() =>özü.say += 1}>
Basıldı: {özü.say}</button>
sonson
12Şəkilçi formalarıYeni2.5
Azərbaycan dilində söz əlaqəsini hal şəkilçiləri qurur. Alqor bu şəkilçiləri sintaksis kimi qəbul edir: diapazonu 1-dən 5-ə qədər kimi yazmaq olar — hər iki uc daxildir, azalan diapazonda addım avtomatik -1 olur.
diapazon.alqalqor
hər i üçün1-dən 5-ə qədər// 1..5 — hər iki uc daxilyaz(i)
sondəyişən geri = siyahı(5-dən 1-ə qədər) // [5, 4, 3, 2, 1]
Metod çağırışını Azərbaycan cümləsinin söz sırası ilə də yazmaq olar: əvvəl tamamlıq, sonra hal şəkilçili obyekt, sonda fel. Sondakı et köməkçi sözdür.
Defis bitişik yazılmalıdır: 1-dən. Boşluqla yazılan n - a həmişə çıxmadır.
13Sorğu — sorğu hər … sonYeni2.5
Kolleksiyalar üzərində Azərbaycan dilində oxunan sorğu: süzmək (harada), sıralamaq (sırala), qruplamaq (qrupla) və nəticəni seçmək (seç) bir ifadədə. Nəticə həmişə siyahıdır.
sorğu.alqalqor
struktur Adam
qurucu(açıqxassə ad: mətn, açıqxassə yaş: tam, açıqxassə şəhər: mətn)
sondəyişən adamlar = [Adam("Aysel", 28, "Bakı"), Adam("Murad", 17, "Gəncə"),
Adam("Leyla", 34, "Bakı"), Adam("Elçin", 22, "Şəki")]
dəyişən böyüklər = sorğu hər a üçün adamlar içində
harada a.yaş >= 18
sırala a.şəhər, a.yaş azalan
seç"{a.ad} ({a.şəhər})"son// ["Leyla (Bakı)", "Aysel (Bakı)", "Elçin (Şəki)"]
Qruplama — qrupla açar olaraq (k, q). Həmçinin seç fərqli, ilk n, atla n və bir neçə hər mənbəyi dəstəklənir.
qrupla.alqalqor
dəyişən sayları = sorğu hər a üçün adamlar içində
qrupla a.şəhər olaraq (şəhər, qrup)
sırala uzunluq(qrup) azalan, şəhər
seç"{şəhər}: {uzunluq(qrup)}"son// ["Bakı: 2", "Gəncə: 1", "Şəki: 1"]
14Ölçü vahidləriYeni2.5
Ədəddən sonra vahid adı yazılanda dəyər kəmiyyət olur. Uyğun gəlməyən vahidlər toplanmır — km-ə san əlavə etmək kimi səhvlər dərhal VahidXətası verir.
vahidlər.alqalqor
dəyişən məsafə = 5 km
yaz(məsafə + 300 m) // 5.3 kmyaz((90 km/saat).çevir("m/san")) // 25.0 m/sanyaz(1500 m kimi km) // 1.5 kmyaz(2 m * 3 m) // 6 m²yaz(5 km > 4000 m) // doğruyaz(5 km + 3 san) // ✖ VahidXətası: `km` və `san` toplanmır
Uzunluq (mm…km, mil), kütlə (q, kq, ton), vaxt (ms…həftə) və verilənlər (B…TB) vahidləri var. Mürəkkəb vahid boşluqsuz yazılır: 90 km/saat, 9.8 m/san^2.
15Nəticə tipi və ? operatoruYeni2.5
İstisna atmaq əvəzinə nəticəni dəyər kimi qaytarın: Uğur(dəyər) və ya Uğursuz(xəta). Bu tiplər hər proqramda hazırdır — gətir lazım deyil.
nəticə.alqalqor
funksiya böl(a: tam, b: tam) -> Nəticə
əgər b == 0ondaqaytar Uğursuz("sıfıra bölmə")
sonqaytar Uğur(a / b)
sonseç böl(10, 2)
hal Uğur(d) →yaz("Nəticə: {d}")
hal Uğursuz(m) →yaz("Xəta: {m}")
sonyaz(böl(10, 0).dəyərVəYa(0.0)) // 0.0
Metodlar: uğurludur(), dəyərVəYa(), çevir(), zəncirlə(), aç(). ifadə? isə nəticəni açır və ya uğursuz nəticəni funksiyadan dərhal yuxarı qaytarır:
yayma.alqalqor
funksiya hesabla(x, y, z) -> Nəticə
dəyişən a = böl(x, y)? // Uğursuz olsa, dərhal qaytarılırdəyişən b = böl(a, z)?
qaytar Uğur(a + b)
son
16Müqavilələr — tələb və zəmanətYeni2.5
Funksiyanın ilk cümlələri onun müqaviləsini yaza bilər: tələb — gövdədən əvvəl yoxlanan ön şərt, zəmanət — funksiya qayıdanda yoxlanan son şərt. zəmanət-də nəticə qaytarılan dəyərdir.
müqavilə.alqalqor
funksiya böl(a, b)
tələb b != 0, "bölən sıfır ola bilməz"// ön şərt
zəmanət nəticə * b == a // son şərtqaytar a / b
sonsinif Hesab
xassə balans = 100metod çıxar(məbləğ)
tələb məbləğ <= özü.balans, "balans çatmır"
zəmanət özü.balans >= 0özü.balans -= məbləğ
qaytarözü.balans
sonson
Pozulanda ÖnŞərtXətası və ya SonŞərtXətası atılır; ikisi də tut (x: MüqaviləXətası) ilə tutulur.
17BəzəyicilərYeni2.5
Bəzəyici funksiyanı (metodu, sinfi) qəbul edib yerinə yeni dəyər qaytaran adi funksiyadır. @jurnalla funksiya topla yazılışı topla = jurnalla(topla) deməkdir.
bəzəyici.alqalqor
funksiya jurnalla(f)
qaytarfunksiya(...arq, **adlı)
yaz("→ {f.ad}({arq})")
qaytar f(...arq, **adlı)
sonson
@jurnalla
funksiya topla(a, b) qaytar a + b son
topla(2, 3) // → topla([2, 3]) və nəticə 5
Parametrli bəzəyici (@neçəDəfə(3)), bir neçə bəzəyici və metod bəzəyiciləri də işləyir. Funksiyanın adı f.ad ilə oxunur, **lüğət adlı arqumentləri ötürür.
18MakrolarYeni2.5
Makro təhlil zamanı açılan kod şablonudur: çağırış yeri makronun gövdəsi ilə əvəz olunur. Çağırış ad!(…) formasındadır — ! makronu funksiyadan ayırır. Sonuncu parametr ad: blok olarsa, makro kod bloku qəbul edir.
makro.alqalqor
makro kvadrat(x) = x * x
yaz(kvadrat!(4)) // 16yaz(kvadrat!(1 + 2)) // 9 — (1 + 2) * (1 + 2)
makro vaxtÖlç(ad, iş: blok)
dəyişən başla = vaxt.ölç()
iş
yaz("{ad}: {vaxt.ölç() - başla:.3} san")
son
vaxtÖlç!("hesablama")
ağırHesab()
son
Makrolar gigiyenikdir: gövdədə elan olunan adlar çağıranın dəyişənləri ilə toqquşmur. Başqa fayldakı makrolar gətir "./makrolar.alq" ilə gəlir.
19Aktyorlar və kanallarYeni2.5
Aktyor öz vəziyyətini qoruyan obyektdir: xaricdən hər metod çağırışı mesajdır, çağırana dərhal Gələcək qayıdır və mesajlar gəliş sırası ilə bir-bir emal olunur — kilidə ehtiyac yoxdur.
aktyor.alqalqor
aktyor Bank
xassə balans = 0metod yatır(məbləğ: tam) ->tamözü.balans += məbləğ
qaytarözü.balans
sonmetod çək(məbləğ: tam) ->taməgər məbləğ > özü.balans ondaat Xəta("balans çatmır")
sonözü.balans -= məbləğ
qaytarözü.balans
sonsondəyişən hesab = Bank()
hesab.yatır(100) // mesaj — cavab gözlənilmirdəyişən g = hesab.çək(30) // Gələcək[tam]yaz(gözlə g) // 70
Kanal — saplar və aktyorlar arasında FIFO mesaj növbəsi: göndər, al, bağla. Göndərəcək kimsə qalmayıbsa, dalan DalanXətası ilə aşkarlanır.
kanal.alqalqor
dəyişən k = Kanal()
k.göndər(1)
k.göndər(2)
k.bağla()
hər x üçün k içində// bağlanıb boşalana qədəryaz(x)
son
20Sınaq bloklarıYeni2.5
Sınaqları funksiya və annotasiya olmadan, birbaşa proqram faylının içində yazın. sınaq "ad" … son bloku adi icrada atlanır — onu yalnız alqor sına işlədir.
riyazi.alqalqor
funksiya topla(a, b)
qaytar a + b
sonsınaq"toplama işləyir"
gözlənilir topla(2, 2) == 4
gözlənilir topla(-1, 1) == 0sonsınaq"sıfıra bölmə"
gözlənilir xəta BölməXətası: 1 / 0son
terminalbash
alqor sına riyazi.alq
gözlənilir uğursuz olanda müqayisənin hər iki tərəfini göstərir; gözlənilir xəta Tip: ifadə ifadənin həmin xətanı atdığını yoxlayır.
21Python kitabxanalarıYeni2.4
İstənilən Python modulu — standart kitabxana və ya PyPI paketi — python: prefiksi ilə birbaşa idxal olunur. Ədəd, mətn, siyahı, lüğət, dəst və kortej iki tərəfə avtomatik çevrilir, Alqor funksiyalarını Python-a ötürmək olar.
python.alqalqor
gətir python:math.{sqrt, pi kimi PI}
gətir python:statistics kimi st
gətir python:collections kimi kol
yaz(sqrt(2), PI)
yaz(st.mean([87, 92, 78, 95, 88, 92]))
dəyişən say = kol.Counter("azərbaycan")
yaz(say.most_common(2)) // [("a", 3), ("z", 1)]
Python istisnaları PythonXətası kimi cəhd et / tut ilə tutulur:
Kod bayt koduna çevrilir və Rust-da yazılmış virtual maşında işləyir: Python icraçısından təxminən 100 dəfə sürətli (məsələn, fib 7.5 s → 0.08 s). Rust icraçısı bütün quraşdırıcılara daxildir.
Rust icraçısında veb, http, şəbəkə, verilənlər (SQLite), şifrə, csv, toml, xml və digər modullar var. Standart motor hələ py-dir; ALQOR_MOTOR=avto ilə dəyişmək olar.
Proqramı sürətli Rust icraçısı ilə işlədir Yeni2.4
Yeni layihə şablonları:
terminalbash
alqor yeni mənim-saytım --şablon veb
alqor yeni mənim-tətbiqim --şablon desktop
alqor yeni mənim-kitabxanam --şablon kitabxana
24Nümunə kod bazasıYeni2.5
Kopyalayıb dərhal işlədə biləcəyiniz hazır proqramlar. Hər nümunə Alqor 2.5.1-də işə salınıb yoxlanılıb — aşağıdakı nəticələr real icradan götürülüb.
Kodu kopyalayın, faylda saxlayın (məsələn, proqram.alq) və işə salın:
terminalbash
alqor işlət proqram.alq
01
Salamlama və giriş
İstifadəçidən ad və yaş alır, şərtə görə cavab verir.
Əsaslar
01-salam.alqalqor
// İstifadəçidən ad və yaş alıb salamlayırdəyişən ad = oxu("Adınız: ")
dəyişən yaş = oxuTam("Yaşınız: ")
yaz("Salam, {ad}!")
əgər yaş >= 18ondayaz("Siz yetkinsiniz.")
yoxsayaz("Yetkinliyə {18 - yaş} il qalıb.")
son
Nümunə icraNəticəoutput
Adınız: Aysel
Yaşınız: 16
Salam, Aysel!
Yetkinliyə 2 il qalıb.
02
Kalkulyator
Dörd əməl, seç ilə əməl seçimi və sıfıra bölmə xətasının tutulması.
Əsaslar
02-kalkulyator.alqalqor
// Dörd əməl və sıfıra bölmə xətasıfunksiya hesabla(a: onluq, əməl: mətn, b: onluq) ->onluqseçəməlhal"+"→qaytar a + b
hal"-"→qaytar a - b
hal"*"→qaytar a * b
hal"/"əgər b == 0ondaat BölməXətası("sıfıra bölmək olmaz")
sonqaytar a / b
digərhallarda→at ArqumentXətası("naməlum əməl: {əməl}")
sonsondəyişən misallar = [(12, "+", 30), (7, "/", 2), (5, "*", 8), (1, "/", 0)]
hər (a, əməl, b) üçün misallar içindəcəhdetyaz("{a} {əməl} {b} = {hesabla(a, əməl, b)}")
tut (x: BölməXətası)
yaz("{a} {əməl} {b} → xəta: {x.mesaj}")
sonson
// Eratosfen ələyi: n-ə qədər bütün sadə ədədlərfunksiya sadələr(n: tam) ->siyahı[tam]
dəyişən ələk = [doğruüçün _ içində0..n]
ələk[0] = yanlış
ələk[1] = yanlışhər i üçün2..n içindəəgər i * i > n ondadayansonəgər ələk[i] ondahər k üçün i * i..n addım i içində
ələk[k] = yanlışsonsonsonqaytar [i üçün i içində0..n əgər ələk[i]]
sonyaz(sadələr(50))
yaz("100-ə qədər {uzunluq(sadələr(100))} sadə ədəd var")
NəticəNəticəoutput
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
100-ə qədər 25 sadə ədəd var
07
Fibonaççi
@yaddaşla ilə sürətli rekursiya və sonsuz generator.
Alqoritmlər
05-fibonacci.alqalqor
// Fibonaççi: yaddaşlı rekursiya və generator
@yaddaşla
funksiya fib(n: tam) ->taməgər n < 2ondaqaytar n sonqaytar fib(n - 1) + fib(n - 2)
sonyaz("fib(90) = {fib(90)}")
generatorfunksiya ardıcıllıq() ->tamdəyişən a, b = 0, 1həmişəver a
a, b = b, a + b
sonsondəyişən ilkOn = []
hər x üçün ardıcıllıq() içindəəgəruzunluq(ilkOn) == 10ondadayanson
ilkOn.əlavə(x)
sonyaz(ilkOn)
Böyük hərf, söz sayı, tərsinə çevirmə, saitlər və palindrom.
Alqoritmlər
06-metn-aletleri.alqalqor
// Mətn üzərində tez-tez lazım olan əməliyyatlardəyişən cümlə = " azərbaycan dili gözəl və zəngin dildir "dəyişən təmiz = cümlə.kəs()
yaz(təmiz.hərSözBöyük())
yaz(təmiz.böyüyə())
yaz("Söz sayı: {uzunluq(təmiz.sözlər())}")
yaz("Tərsinə: {təmiz.tərs()}")
dəyişən saitlər = "aıoueəiöü"dəyişən say = təmiz.simvollar().filtr((h) => saitlər.ehtiva(h)).uzunluq()
yaz("Sait sayı: {say}")
funksiya palindromdur(s: mətn) ->məntiqdəyişən t = s.kiçiyə().əvəz(" ", "")
qaytar t == t.tərs()
sonyaz(palindromdur("Ana"), palindromdur("Alqor"))
NəticəNəticəoutput
Azərbaycan Dili Gözəl Və Zəngin Dildir
AZƏRBAYCAN DİLİ GÖZƏL VƏ ZƏNGİN DİLDİR
Söz sayı: 6
Tərsinə: ridlid nignəz əv ləzög ilid nacyabrəza
Sait sayı: 13
doğru yanlış
09
Söz tezliyi
Lüğətlə sayma və nəticəni azalan sıra ilə göstərmək.
Alqoritmlər
07-soz-tezliyi.alqalqor
// Mətndə ən çox işlənən sözləri tapırdəyişənmətn = "alma armud alma üzüm armud alma nar üzüm alma"dəyişən say: lüğət[mətn, tam] = {}
hər söz üçünmətn.sözlər() içində
say[söz] = say.al(söz, 0) + 1sondəyişən sıralı = say.cütlər().sıralanmış((c) => -c.1)
hər i, (söz, n) üçün sıralı.dilim(0, 2) içindəyaz("{i + 1}. {söz:<6} {n} dəfə")
son
NəticəNəticəoutput
1. alma 4 dəfə
2. armud 2 dəfə
10
Tələbə qiymətləri
Diapazonlu seç, orta bal və ən yaxşı nəticə.
Alqoritmlər
09-qiymetler.alqalqor
// Tələbələrin balları: orta, ən yaxşı və qiymətdəyişən ballar = {"Aysel": 95, "Murad": 72, "Leyla": 88, "Elçin": 54}
funksiya qiymət(bal: tam) ->mətnseç bal
hal90..100→qaytar"əla"hal70..<90→qaytar"yaxşı"hal50..<70→qaytar"kafi"digərhallarda→qaytar"qeyri-kafi"sonsonhər ad, bal üçün ballar içindəyaz("{ad:<6} {bal:>3} {qiymət(bal)}")
sondəyişən hamısı = ballar.dəyərlər()
yaz("Orta bal: {hamısı.orta():.1}")
dəyişən ən = ballar.cütlər().sıralanmış((c) => -c.1)[0]
yaz("Ən yaxşı: {ən.0} ({ən.1})")
NəticəNəticəoutput
Aysel 95 əla
Murad 72 yaxşı
Leyla 88 yaxşı
Elçin 54 kafi
Orta bal: 77.2
Ən yaxşı: Aysel (95)
11
Ədəd tapmaca oyunu
Təsadüfi ədəd, sonsuz dövr və istifadəçi girişi.
Oyun və alətlər
10-tapmaca.alqalqor
// Ədəd tapmaca oyunu: kompüter 1–100 arası ədəd tuturgətir təsadüfi
dəyişən tutulan = təsadüfi.tam(1, 100)
dəyişən cəhdSayı = 0həmişədəyişən təxmin = oxuTam("Təxmininiz: ")
cəhdSayı += 1əgər təxmin < tutulan ondayaz("Daha böyük ↑")
yoxsaəgər təxmin > tutulan ondayaz("Daha kiçik ↓")
yoxsayaz("Təbriklər! {cəhdSayı} cəhddə tapdınız.")
dayansonson
Nümunə icraNəticəoutput
Təxmininiz: 50
Daha kiçik ↓
Təxmininiz: 25
Daha böyük ↑
Təxmininiz: 37
Daha kiçik ↓
Təxmininiz: 31
Təbriklər! 4 cəhddə tapdınız.
12
Şifrə generatoru
Hər növ simvoldan ən azı biri olan güclü təsadüfi şifrə.
Oyun və alətlər
12-sifre-generatoru.alqalqor
// Güclü təsadüfi şifrə yaradırgətir təsadüfi
funksiya şifrə(uzunluq: tam = 16) ->mətndəyişən hərflər = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"dəyişən rəqəmlər = "23456789"dəyişən işarələr = "!@#$%&*?"dəyişən hamısı = hərflər + rəqəmlər + işarələr
// hər növdən ən azı bir simvol olsundəyişən s = [təsadüfi.seç(hərflər), təsadüfi.seç(rəqəmlər), təsadüfi.seç(işarələr)]
təkrarlauzunluq - 3dəfə
s.əlavə(təsadüfi.seç(hamısı))
son
təsadüfi.qarışdır(s)
qaytar"".birləşdir(s)
sontəkrarla3dəfəyaz(şifrə())
sonyaz(şifrə(24))
naxış modulu ilə ünvanları yoxlamaq, nömrələri tapmaq və gizlətmək.
Oyun və alətlər
20-email-yoxla.alqalqor
// Naxış (regex) ilə e-poçt ünvanlarını yoxlamaqgətir naxış
// x"…" — xam mətn: \ və {…} olduğu kimi qalır (naxışlar üçün rahatdır)sabit EMAİL = x"^[\w.+-]+@[\w-]+(\.[\w-]+)+$"hər ünvan üçün ["aysel@vuqar.pro", "yanlış@", "info@mail.az", "ad soyad@x.com"] içindədəyişən nəticə = əgər naxış.uyğundur(EMAİL, ünvan) onda"düzgün"yoxsa"yanlış"sonyaz("{ünvan:<18} → {nəticə}")
sondəyişənmətn = "Əlaqə: 050-111-22-33 və ya 055-444-55-66"yaz(naxış.hamısınıTap(x"\d{3}-\d{3}-\d{2}-\d{2}", mətn))
yaz(naxış.əvəz(x"\d", mətn, "*"))
NəticəNəticəoutput
aysel@vuqar.pro → düzgün
yanlış@ → yanlış
info@mail.az → düzgün
ad soyad@x.com → yanlış
["050-111-22-33", "055-444-55-66"]
Əlaqə: ***-***-**-** və ya ***-***-**-**
15
Bank hesabı
Gizli xassə, hesablanan xassə və öz xətanı atmaq.
Siniflər
13-bank-hesabi.alqalqor
// Sinif, hesablanan xassə və öz xətanı atmaqsinif BankHesabı
gizlixassə _balans: onluq = 0qurucu(açıqxassə sahib: mətn)
xassə balans: onluqoxuqaytarözü._balans sonsonmetod yatır(məbləğ: onluq)
əgər məbləğ <= 0ondaat ArqumentXətası("məbləğ müsbət olmalıdır")
sonözü._balans += məbləğ
sonmetod çıxar(məbləğ: onluq)
əgər məbləğ > özü._balans ondaat Xəta("balans çatmır: {özü._balans} AZN")
sonözü._balans -= məbləğ
sonsondəyişən h = yeni BankHesabı("Aysel")
h.yatır(500)
h.çıxar(120)
yaz("{h.sahib}: {h.balans} AZN")
cəhdet
h.çıxar(1000)
tut (x: Xəta)
yaz("Əməliyyat rədd edildi — {x.mesaj}")
son
NəticəNəticəoutput
Aysel: 380.0 AZN
Əməliyyat rədd edildi — balans çatmır: 380.0 AZN
16
Fiqurlar: interfeys və miras
Polimorfizm — eyni metod müxtəlif siniflərdə.
Siniflər
14-fiqurlar.alqalqor
// İnterfeys, miras və polimorfizmgətir riyaziyyat kimi r
interfeys Fiqur
metod sahə() ->onluqmetod ad() ->mətnsonsinif Dairə tətbiq Fiqur
qurucu(açıqxassə radius: onluq)
metod sahə() ->onluqqaytar r.Pİ * özü.radius ** 2sonmetod ad() ->mətnqaytar"Dairə"sonsonsinif Düzbucaqlı tətbiq Fiqur
qurucu(açıqxassə en: onluq, açıqxassə hündürlük: onluq)
metod sahə() ->onluqqaytarözü.en * özü.hündürlük
sonmetod ad() ->mətnqaytar"Düzbucaqlı"sonsonsinif Kvadrat miras Düzbucaqlı
qurucu(tərəf: onluq)
üst(tərəf, tərəf)
sonəvəzetmetod ad() ->mətnqaytar"Kvadrat"sonsondəyişən fiqurlar: siyahı[Fiqur] = [yeni Dairə(2), yeni Düzbucaqlı(3, 5), yeni Kvadrat(4)]
hər f üçün fiqurlar içindəyaz("{f.ad():<11} sahə = {f.sahə():.2}")
sonyaz("Cəm: {fiqurlar.çevir((f) => f.sahə()).cəm():.2}")
NəticəNəticəoutput
Dairə sahə = 12.57
Düzbucaqlı sahə = 15.00
Kvadrat sahə = 16.00
Cəm: 43.57
17
Svetofor (sadalama)
Sadalama dəyərləri, sıra() və hamısı() ilə vəziyyət maşını.
Siniflər
15-svetofor.alqalqor
// Sadalama (enum): svetoforun vəziyyətləri növbə ilə dəyişirsadalama İşıq
QIRMIZI
YAŞIL
SARI
sonsabit İZAH = ["Dayan", "Keç", "Hazırlaş"] // sıra() ilə eyni düzülüşfunksiya növbəti(i: İşıq) -> İşıq
dəyişən hamısı = İşıq.hamısı()
qaytar hamısı[(i.sıra() + 1) % uzunluq(hamısı)]
sondəyişən işıq = İşıq.QIRMIZI
təkrarla4dəfəyaz("{işıq} → {İZAH[işıq.sıra()]}")
işıq = növbəti(işıq)
sonyaz("Bütün vəziyyətlər: {İşıq.hamısı()}")
NəticəNəticəoutput
QIRMIZI → Dayan
YAŞIL → Keç
SARI → Hazırlaş
QIRMIZI → Dayan
Bütün vəziyyətlər: [QIRMIZI, YAŞIL, SARI]
18
Fayla yazmaq və oxumaq
Yazmaq, sonuna əlavə etmək, sətir-sətir oxumaq və silmək.
Fayl və verilənlər
17-fayl-qeydler.alqalqor
// Fayla yazmaq, əlavə etmək və sətir-sətir oxumaqgətir fayl
sabit YOL = "qeydlər.txt"
fayl.yaz(YOL, "Alqor ilə ilk qeyd")
fayl.əlavəEt(YOL, "\nİkinci qeyd")
fayl.əlavəEt(YOL, "\nÜçüncü qeyd")
hər i, sətir üçün fayl.oxuSətirlər(YOL) içindəyaz("{i + 1}: {sətir}")
sonyaz("Ölçü: {fayl.ölçü(YOL)} bayt")
fayl.sil(YOL)
yaz("Fayl qalıbmı? {fayl.vardır(YOL)}")
NəticəNəticəoutput
1: Alqor ilə ilk qeyd
2: İkinci qeyd
3: Üçüncü qeyd
Ölçü: 48 bayt
Fayl qalıbmı? yanlış
19
JSON ilə saxlamaq
Siyahını JSON fayla yazıb geri oxumaq və hesablamaq.
Sürət, məsafə və fayl ölçüsü — vahidlərlə səhvsiz hesab.
2.5 yenilikləri
26-olcu-vahidleri.alqalqor
// 2.5 · Ölçü vahidləri: səhvsiz fizika hesablarıdəyişən yol = 120 km
dəyişən müddət = 1.5 saat
dəyişən sürət = yol / müddət
yaz("Orta sürət: {sürət}")
yaz("m/san ilə: {sürət.çevir("m/san")}")
yaz("Marafon: {42195 m kimi km}")
yaz("Fayl: {(3 GB).çevir("MB")}")
cəhdetyaz(5 km + 3 san)
tut (x: VahidXətası)
yaz("Xəta tutuldu: {x.mesaj}")
son
NəticəNəticəoutput
Orta sürət: 80.0 km/saat
m/san ilə: 22.22222222222222 m/san
Marafon: 42.195 km
Fayl: 3072.0 MB
Xəta tutuldu: `km` və `san` toplanmır — ölçülər uyğun deyil
28
Nəticə tipi və ?
İstisnasız xəta idarəsi: Uğur / Uğursuz və yayma operatoru.
2.5 yenilikləri
27-netice-tipi.alqalqor
// 2.5 · Nəticə tipi və ? operatoru: istisnasız xəta idarəsifunksiya ədədə(m: mətn) -> Nəticə
cəhdetqaytar Uğur(m kimitam)
tut (x)
qaytar Uğursuz("`{m}` ədəd deyil")
sonsonfunksiya cəm(a: mətn, b: mətn) -> Nəticə
qaytar Uğur(ədədə(a)? + ədədə(b)?)
sonhər (a, b) üçün [("2", "3"), ("10", "x")] içindəseç cəm(a, b)
hal Uğur(d) →yaz("{a} + {b} = {d}")
hal Uğursuz(m) →yaz("Xəta: {m}")
sonsonyaz(ədədə("abc").dəyərVəYa(0))
NəticəNəticəoutput
2 + 3 = 5
Xəta: `x` ədəd deyil
0
29
Sınaq blokları və müqavilə
Testlər proqramla eyni faylda; tələb ilə ön şərt.
2.5 yenilikləri
28-sinaq.alqalqor
// 2.5 · Sınaq blokları: proqramla eyni faylda testlərfunksiya endirim(qiymət: onluq, faiz: tam) ->onluq
tələb faiz >= 0və faiz <= 100, "faiz 0–100 arası olmalıdır"qaytar qiymət * (100 - faiz) / 100sonyaz(endirim(200, 15)) // adi icra — 170.0sınaq"endirim düzgün hesablanır"
gözlənilir endirim(200, 15) == 170.0
gözlənilir endirim(99, 0) == 99.0sonsınaq"yanlış faiz rədd edilir"
gözlənilir xəta ÖnŞərtXətası: endirim(100, 150)
son
NəticəNəticəoutput
170.0
$ alqor sına 28-sinaq.alq
Alqor Sınaq 2.5.1
28-sinaq.alq
✓ endirim düzgün hesablanır 0.1ms
✓ yanlış faiz rədd edilir 0.1ms
Nəticə: 2 uğurlu, 0 uğursuz, 0 xəta, 0 atlanmış 0.93s
30
Aktyor və kanal
Kilidsiz vəziyyət və saplar arasında mesaj növbəsi.
2.5 yenilikləri
30-aktyor.alqalqor
// 2.5 · Aktyor: vəziyyəti kilidsiz qoruyan obyekt
aktyor Sayğac
xassə dəyər = 0metod artır(n: tam) ->tamözü.dəyər += n
qaytarözü.dəyər
sonsondəyişən s = Sayğac()
hər i üçün1..5içində
s.artır(i) // mesaj — cavab gözlənilmirsonyaz("Son dəyər: {gözlə s.artır(0)}")
dəyişən k = Kanal()
hər söz üçün ["salam", "dünya"] içində
k.göndər(söz)
son
k.bağla()
hər x üçün k içindəyaz("kanaldan: {x}")
son