Зеҳн
Алгоритмсозӣ ва барномасозӣ дар забони Go

Китоби таълимии забони Go барои мактабиён, донишҷӯён ва омӯзгорон: аз алгоритм ва блок-схемаҳо то веб-сервер ва боти Телеграм. Таҷдиди китоби А. П. Назаров «Алгоритмсозӣ ва барномасозӣ дар забони Бейсик» (2009).

Агенти Зеҳнӣ · 26 октябри 2026 · 15 саҳифа

МаорифБарномасозӣТехнология
Аз аввал хондан

Боби 4. Амалҳои арифметикӣ, бастаи `math` ва воридоту содирот

Боби 4. Амалҳои арифметикӣ, бастаи math ва воридоту содирот

Дар се боби аввал шумо бо сохтори забони Go, тарзи кори алгоритмҳо ва навъҳои асосии додаҳо шинос шудед. Ҳоло вақти он расид, ки барномаҳои воқеӣ нависед, ки аз корбар маълумотро қабул кунанд, ҳисоббарориҳои риёзиро анҷом диҳанд ва натиҷаро ба таври зебо ва дақиқ дар экран чоп намоянд.

Дар ин боб меомӯзем

  • Амалҳои асосии арифметикӣ дар Go (+, -, *, /, %).
  • Хусусиятҳои тақсими бутун ва бақия аз тақсим.
  • Функсияҳои муҳими бастаи math (Sqrt, Pow, Sin, Cos, Abs) ва собити Pi.
  • Ворид кардани маълумот аз клавиатура бо функсияҳои fmt.Scan ва fmt.Scanln.
  • Форматкунии касбӣ ва чопи натиҷаҳо бо функсияи fmt.Printf.
  • Ҳалли масъалаҳои хаттии риёзӣ, физикӣ ва геометрӣ.

Амалҳои арифметикӣ дар Go

Дар забони Go амалҳои асосии риёзӣ бо аломатҳои зерин иҷро карда мешаванд:

АмалАломат дар GoМисолНатиҷа
Ҷамъ+15 + 419
Тарҳ-15 - 411
Зарб*15 * 460
Тақсим/15.0 / 4.03.75
Бақия аз тақсим%15 % 43

Тақсими ададҳои бутун ва ҳақиқӣ

Ба як нуктаи бисёр муҳим диққат диҳед:

  • Агар ҳар ду адад аз навъи int (бутун) бошанд, амали тақсим / қисми касриро партофта, танҳо натиҷаи бутунро медиҳад:
    fmt.Println(7 / 2) // Натиҷа: 3 (на 3.5!)
    
  • Агар хоҳед, ки натиҷа дақиқ бо касраш бошад, ададҳо бояд касрӣ бошанд. Агар ададҳо бевосита дар код навишта шуда бошанд (собитҳо), кифоя аст, ки яке аз онҳо бо нуқта навишта шавад:
    fmt.Println(7.0 / 2.0) // Натиҷа: 3.5
    fmt.Println(7.0 / 2)   // Натиҷа: 3.5
    
  • Аммо агар ададҳо дар тағйирёбандаҳои навъи int бошанд, тавре ки дар боби 3 дидем, Go омехта кардани навъҳоро иҷозат намедиҳад — ҳар ду тағйирёбандаро бояд ба float64 табдил диҳем:
    a, b := 7, 2
    fmt.Println(a / b)                   // Натиҷа: 3
    fmt.Println(float64(a) / float64(b)) // Натиҷа: 3.5
    

Бақия аз тақсим (%)

Оператори бақия (%) танҳо барои ададҳои бутун кор мекунад ва барои бисёр масъалаҳои алгоритмсозӣ ниҳоят муҳим аст:

fmt.Println(17 % 5) // 2 (зеро 17 = 5 * 3 + 2)
fmt.Println(10 % 2) // 0 (агар бақия 0 бошад, пас адад ҷуфт аст!)
fmt.Println(11 % 2) // 1 (агар бақия 1 бошад, пас адад тоқ аст!)

Бастаи риёзии math

Барои иҷрои амалҳои мураккабтари риёзӣ (решаи квадратӣ, ба дараҷа бардоштан, синус, косинус ва ғайра) дар забони Go бастаи стандартии math истифода мешавад.

Барои истифодаи он, дар аввали файл сатри import "math"-ро илова мекунем.

[!NOTE] Қариб ҳамаи функсияҳои бастаи math (аз ҷумла ҳамаи функсияҳои ҷадвали поён) бо навъи float64 кор мекунанд ва натиҷаро низ дар шакли float64 бармегардонанд. Барои ҳамин адади бутунро пеш аз истифода табдил медиҳем: math.Sqrt(float64(n)).

Биёед функсияҳои муҳимтарини онро бубинем:

Мафҳуми риёзӣДар GoШарҳ
√x (решаи квадратӣ)math.Sqrt(x)x ≥ 0 бояд бошад
xʸ (ба дараҷа бардоштан)math.Pow(x, y)Масалан, x³ ин math.Pow(x, 3)
|x| (қимати мутлақ / модул)math.Abs(x)Модули адад
sin(x)math.Sin(x)Кунҷи x дар радианҳо
cos(x)math.Cos(x)Кунҷи x дар радианҳо
tan(x)math.Tan(x)Тангенси кунҷ
ln(x)math.Log(x)Логарифми натуралӣ
eˣmath.Exp(x)Экспонента
Адади доимии πmath.Pi3.141592653589793

Мисол: Тарҷумаи ифодаи мураккаби риёзӣ ба забони Go.

Формула: z = √(a² + b²) / (1 + sin²(a)) + |a − b|

Дар коди Go чунин навишта мешавад:

a, b := 3.0, 4.0
z := math.Sqrt(a*a+b*b)/(1+math.Pow(math.Sin(a), 2)) + math.Abs(a-b)
fmt.Printf("z = %.4f\n", z) // z = 5.9024

Диққат диҳед: a²-ро метавон ҳам ҳамчун a*a ва ҳам ҳамчун math.Pow(a, 2) навишт.


Ворид кардани маълумот бо fmt.Scan

То ҳол мо ба тағйирёбандаҳо дар дохили худи барнома қимат медодем. Аммо барои сохтани барномаҳои воқеӣ лозим аст, ки корбар тавонад қиматҳоро аз клавиатура ворид кунад.

Дар бастаи fmt барои ин функсияи fmt.Scan (ё fmt.Scanln) пешбинӣ шудааст:

package main

import "fmt"

func main() {
	var a, b float64

	fmt.Print("Ду ададро дохил кунед (бо фосила): ")
	fmt.Scan(&a, &b)

	summa := a + b
	fmt.Println("Суммаи онҳо баробар аст ба:", summa)
}

Агар ин барномаро иҷро кунед:

Ду ададро дохил кунед (бо фосила): 12.5 7.3
Суммаи онҳо баробар аст ба: 19.8

[!IMPORTANT] Ба аломати & (амперсанд) пеш аз номи тағйирёбанда диққат диҳед: fmt.Scan(&a). Ин аломат нишонии хотираи он қуттичаро нишон медиҳад. Ин ба Go мегӯяд: «Адади воридкардаи корбарро гирифта, бевосита дар хотираи ҳамин тағйирёбандаи a ҷойгир кун».

Фарқи fmt.Scan ва fmt.Scanln

  • fmt.Scan қиматҳоро то пур шудани ҳамаи аргументҳо ё рух додани хато мехонад. Барои он фосила ва аломати сатри нав ҷудокунандаанд: ададҳоро метавон дар як ё чанд сатр ворид кард.
  • fmt.Scanln хонданро дар охири сатр қатъ мекунад. Пас аз охирин қимати дархостшуда бояд аломати сатри нав ё охири вуруд бошад. Агар қиматҳо кам ё зиёд бошанд, функсия хато бармегардонад.
var a, b float64
fmt.Print("Ду ададро дар як сатр дохил кунед: ")
fmt.Scanln(&a, &b) // ҳарду адад бояд дар ҳамин сатр бошанд
fmt.Println("Ҳосили зарб:", a*b)

Агар корбар 4 2.5 ворид кунад, барнома Ҳосили зарб: 10 чоп мекунад. Агар танҳо 4 навишта, Enter-ро пахш кунад, fmt.Scanln хато бармегардонад. Дар ин мисоли сода хато санҷида намешавад: b қимати пешфарзи 0-ро нигоҳ медорад ва натиҷа 0 мешавад. Тарзи санҷиши хатои воридотро дар боби 5 меомӯзем.


Чопи форматшуда бо fmt.Printf

Ҳангоми ҳисоббарории ададҳои касрӣ, дар экран ададе бо рақамҳои зиёди пас аз нуқта пайдо мешавад (масалан: 3.141592653589793). Дар масъалаҳои воқеӣ (масалан, маош, нарх ё ченакҳо) мо танҳо ба 2 ё 3 рақами баъд аз нуқта ниёз дорем.

Дар забони кӯҳнаи Бейсик барои ин фармони ноқулайи PRINT USING "###.##" истифода мешуд. Дар забони Go функсияи ниҳоят қулай ва зебои fmt.Printf (Print with Format) мавҷуд аст.

Дар fmt.Printf мо аломатҳои махсуси қолабро истифода мебарем:

  • %f — барои ададҳои касрӣ (float64).
  • %.2f — барои адади касрӣ бо ду рақами пас аз нуқта!
  • %d — барои ададҳои бутун (int).
  • %s — барои сатрҳо (string).
  • %v — қолаби универсалӣ барои ҳар гуна қимат.
  • \n — гузаштан ба сатри нав (чунки Printf худаш ба таври худкор ба сатри нав намегузарад).

Биёед мисолро бубинем:

package main

import "fmt"

func main() {
	nom := "Салим"
	sol := 16
	baho := 4.86666

	fmt.Printf("Хонанда: %s, Синну сол: %d, Балли миёна: %.2f\n", nom, sol, baho)
}

Натиҷа дар экран:

Хонанда: Салим, Синну сол: 16, Балли миёна: 4.87

Бубинед: 4.86666 ба таври худкор ва озода ба 4.87 гирд карда шуд!


Ҳалли масъалаҳои амалии намунавӣ

Биёед чанд масъалаи воқеиро аз китоби аслӣ бо забони Go ҳал намоем:

Масъалаи 1. Баландии дарахт аз рӯи сояи он

Агар дарозии сояи дарахт L метр буда, кунҷи баландии офтоб аз уфуқ α дараҷа бошад, баландии дарахт бо формулаи H = L · tan(α) ёфта мешавад.

Ёдрас: Функсияҳои тригонометрии Go кунҷро бо радиан талаб мекунанд. Барои табдил додани дараҷа ба радиан аз формулаи rad = deg · π / 180 истифода мебарем.

package main

import (
	"fmt"
	"math"
)

func main() {
	var l, deg float64

	fmt.Print("Дарозии сояи дарахт (бо метр): ")
	fmt.Scan(&l)

	fmt.Print("Кунҷи баландии офтоб (бо дараҷа): ")
	fmt.Scan(&deg)

	// Табдил ба радиан
	rad := deg * (math.Pi / 180.0)
	h := l * math.Tan(rad)

	fmt.Printf("Баландии дарахт: %.2f метр аст.\n", h)
}

Намунаи иҷро:

Дарозии сояи дарахт (бо метр): 15
Кунҷи баландии офтоб (бо дараҷа): 35
Баландии дарахт: 10.50 метр аст.

Масъалаи 2. Ҳаҷм ва масоҳати силиндр

Радиуси асоси силиндр R ва баландии он H дода шудааст. Масоҳати сатҳи паҳлӯӣ (Sп = 2πRH), масоҳати пурраи сатҳ (S = 2πR² + 2πRH) ва ҳаҷми силиндрро (V = πR²H) ёбед.

package main

import (
	"fmt"
	"math"
)

func main() {
	var r, h float64

	fmt.Print("Радиуси силиндр R ва баландии H-ро дохил кунед: ")
	fmt.Scan(&r, &h)

	sAsos := math.Pi * r * r
	sPahlav := 2 * math.Pi * r * h
	sPura := 2*sAsos + sPahlav
	hajm := sAsos * h

	fmt.Printf("Масоҳати паҳлӯии силиндр: %.2f\n", sPahlav)
	fmt.Printf("Масоҳати пурраи силиндр: %.2f\n", sPura)
	fmt.Printf("Ҳаҷми силиндр: %.2f\n", hajm)
}

Намунаи иҷро:

Радиуси силиндр R ва баландии H-ро дохил кунед: 3 10
Масоҳати паҳлӯии силиндр: 188.50
Масоҳати пурраи силиндр: 245.04
Ҳаҷми силиндр: 282.74

Масъалаи 3. Ҳисоби музди меҳнат ва андозҳо

Дар ин масъалаи шартии таълимӣ корманд дар як моҳ M сомонӣ маош мегирад. Фарз мекунем, ки аз маош 12% ҳамчун андози даромад ва 1% ҳамчун саҳми нафақа нигоҳ дошта мешавад. Маблағи ҳар як нигоҳдошт ва маоши софи пардохтшавандаро ҳисоб кунед.

package main

import "fmt"

func main() {
	var maosh float64

	fmt.Print("Маоши умумии моҳонаро дохил кунед (сомонӣ): ")
	fmt.Scan(&maosh)

	andoz := maosh * 0.12  // 12% андоз
	nafaqa := maosh * 0.01 // 1% нафақа
	maoshiDasti := maosh - andoz - nafaqa

	fmt.Printf("Маоши умумӣ:      %10.2f сомонӣ\n", maosh)
	fmt.Printf("Андози даромад:   %10.2f сомонӣ\n", andoz)
	fmt.Printf("Фонди нафақа:     %10.2f сомонӣ\n", nafaqa)
	fmt.Println("------------------------------------")
	fmt.Printf("Маоши софи дастӣ: %10.2f сомонӣ\n", maoshiDasti)
}

Намунаи иҷро:

Маоши умумии моҳонаро дохил кунед (сомонӣ): 3000
Маоши умумӣ:         3000.00 сомонӣ
Андози даромад:       360.00 сомонӣ
Фонди нафақа:          30.00 сомонӣ
------------------------------------
Маоши софи дастӣ:    2610.00 сомонӣ

Худатон бисанҷед

4–1. Формулаи Герон: Тарафҳои секунҷа a, b, c дода шудаанд. Нимпериметр (p = (a + b + c) / 2) ва масоҳати онро аз рӯи формулаи Герон (S = √(p(p − a)(p − b)(p − c))) бо ёрии бастаи math ҳисоб кунед.

4–2. Физика — суръати миёна: Велосипедрон дар t₁ сония масофаи s₁ метр ва дар t₂ сония масофаи s₂ метрро тай кард. Барномае нависед, ки ин чор қиматро қабул карда, суръати миёнаро (v = (s₁ + s₂) / (t₁ + t₂)) бо дақиқии ду рақами пас аз нуқта чоп намояд.

4–3. Адади серақама: Адади бутуни серақамаи N дода шудааст (масалан 375). Бо истифода аз амалҳои тақсими бутун / ва бақия % рақамҳои онро ҷудо кунед ва суммаи рақамҳои онро ёбед (3 + 7 + 5 = 15).


Хулоса

Дар ин боб шумо бо асбобҳои асосии ҳисоббарорӣ дар Go ошно шудед. Шумо амалҳои арифметикӣ, махсусан фарқи тақсими бутун ва касриро аз худ кардед, функсияҳои муҳими бастаи math-ро омӯхтед ва ёд гирифтед, ки чӣ тавр бо fmt.Scan маълумотро аз корбар қабул карда, бо fmt.Printf натиҷаро ба таври озода ва касбӣ чоп намоед.

Дар боби 5 мо ба сохторҳои шартӣ (if, else, switch) мегузарем, ки ба барнома имкон медиҳанд қарор қабул кунад ва масъалаҳои мураккабтаре мисли муодилаи квадратиро ҳал намояд.

пешина
аз 15
навбатӣ