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

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

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

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

Боби 8. Кор бо сатрҳо ва рамзҳо

Боби 8. Кор бо сатрҳо ва рамзҳо

Бисёр барномаҳо бо матн кор мекунанд: паёмҳои корбарон, номҳо, ҳуҷҷатҳо ва дархостҳои ҷустуҷӯ. Барои коркарди дурусти чунин додаҳо бояд фарқи байт, рамзгузорӣ ва аломати матниро донем. Go воситаҳои кор бо Юникод ва рамзгузории UTF-8 дорад. Дар ин боб тарзи кор бо сатрҳо ва ҳарфҳои тоҷикиро меомӯзед.

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

  • Сохтори сатрҳо дар Go: фарқи байни байтҳо (bytes) ва рамзҳои Юникод (runes).
  • Чаро дарозии сатри тоҷикӣ бо len() ва utf8.RuneCountInString фарқ мекунад.
  • Буридани сатрҳо ба қисмҳо бо истифода аз навъи []rune.
  • Чаро s[0] байт медиҳад, на ҳарф, ва даври for range бар сатр чӣ гуна кор мекунад.
  • Функсияҳои муҳимтарини бастаи strings (Contains, Split, Join, ReplaceAll, ToUpper, ToLower).
  • Табдилдиҳии адад ба сатр ва баръакс бо бастаи strconv (Itoa ва Atoi).
  • Алгоритмҳои матнӣ: ҷустуҷӯи калимаҳо, санҷиши палиндром ва ҳисоби ҳарфҳо.

Сатрҳо, байтҳо ва навъи rune

Дар Go сатр (string) пайдарпайии тағйирнопазири байтҳо мебошад. Матни мисолҳои ин китоб бо UTF-8 рамзгузорӣ шудааст, аммо худи навъи string дуруст будани ин рамзгузориро кафолат намедиҳад.

Дар стандарти UTF-8:

  • Ҳарфҳои алифбои лотинии англисӣ (A–Z, a–z) танҳо 1 байт хотираро ишғол мекунанд.
  • Ҳарфҳои алифбои тоҷикӣ ва кириллӣ (А–Я, ӯ, ӣ, ҳ, қ, ғ, ҷ) 2 байт хотираро ишғол мекунанд!
  • Баъзе аломатҳои махсус ва эмоҷиҳо метавонанд то 3 ё 4 байт бошанд.

Фарқи len() аз шумораи воқеии ҳарфҳо

Функсияи дарунсохти len(s) дар Go шумораи байтҳоро ҳисоб мекунад, на шумораи ҳарфҳоро!

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	matn := "Китоб"

	fmt.Println("Бо len():", len(matn))
	fmt.Println("Шумораи ҳарфҳо бо RuneCount:", utf8.RuneCountInString(matn))
}

Натиҷа:

Бо len(): 10
Шумораи ҳарфҳо бо RuneCount: 5

Калимаи «Китоб» аз 5 ҳарф иборат аст. Ҳар ҳарфи он дар UTF-8 ду байт ҷой мегирад, бинобар ин len() қимати 10 медиҳад. Функсияи utf8.RuneCountInString() шумораи нуқтаҳои рамзии Юникодро мешуморад. Дар ин мисол он ба шумораи ҳарфҳо баробар аст, аммо як аломати намоён метавонад аз чанд нуқтаи рамзӣ иборат бошад.

Навъи rune (рун) чист?

Дар Go rune (рун) номи дигари навъи int32 аст. Он барои ифодаи нуқтаи рамзии Юникод (code point) истифода мешавад.

Агар хоҳед, ки сатри тоҷикиро ба рамзҳо ҷудо кунед, беҳтарин роҳ табдил додани он ба буриши рунҳо ([]rune) мебошад:

package main

import "fmt"

func main() {
	s := "Тоҷикистон"
	runes := []rune(s)

	fmt.Printf("Ҳарфи аввал: %c\n", runes[0])          // 'Т'
	fmt.Printf("Ҳарфи сеюм:  %c\n", runes[2])          // 'ҷ'
	fmt.Println("Се ҳарфи аввал:", string(runes[0:3])) // "Тоҷ"
}

Индекси сатр байт медиҳад, на ҳарф

Агар ба сатр бевосита бо индекс муроҷиат кунем (s[0]), Go на ҳарфро, балки як байтро (навъи byte, яъне uint8) бармегардонад. Барои ҳарфҳои тоҷикӣ ин танҳо нимаи ҳарф аст:

s := "Тоҷ"
fmt.Println(s[0])   // 208 — байти аввали ҳарфи «Т»
fmt.Println(len(s)) // 6   — 3 ҳарф × 2 байт
fmt.Println(s[0:2]) // Т   — ду байти аввал якҷоя як ҳарфи пурраро ташкил медиҳанд
fmt.Println(s[0:1]) // �   — нимаи ҳарф, ки ҳамчун аломати нодуруст чоп мешавад

Аз ин рӯ сатрҳои тоҷикиро бо индексҳои байтӣ набуред: барои кор бо ҳарфҳо []rune-ро истифода баред.

Даври for range бар сатр

Даври for range сатри UTF-8-ро рун ба рун мехонад. Тағйирёбандаи якум на рақами тартибии рун, балки мавқеи байтии оғози он дар сатр мебошад:

package main

import "fmt"

func main() {
	for i, r := range "Тоҷ" {
		fmt.Printf("байти %d: %c\n", i, r)
	}
}

Натиҷа:

байти 0: Т
байти 2: о
байти 4: ҷ

Индексҳо 0, 2, 4 мебошанд, на 0, 1, 2, зеро ҳар як ҳарф 2 байт дорад. Агар рақами тартибии ҳарф лозим бошад, сатрро ба []rune табдил диҳед ва бар буриши рунҳо давр занед: for i, r := range []rune(s).


Функсияҳои бастаи strings

Барои иҷрои амалиётҳои гуногун бо матн дар Go бастаи стандартии strings истифода мешавад:

ФунксияВазифаМисол
strings.Contains(s, substr)Санҷиши мавҷудияти зерсатрstrings.Contains("Мактаб", "ак") // true
strings.HasPrefix(s, prefix)Оё сатр бо ҳамин матн оғоз мешавад?strings.HasPrefix("file.go", "file") // true
strings.HasSuffix(s, suffix)Оё сатр бо ҳамин матн ба охир мерасад?strings.HasSuffix("main.go", ".go") // true
strings.ToUpper(s)Ба ҳарфҳои калон табдил доданstrings.ToUpper("салом") // "САЛОМ"
strings.ToLower(s)Ба ҳарфҳои хурд табдил доданstrings.ToLower("ВАҲДАТ") // "ваҳдат"
strings.ReplaceAll(s, old, new)Иваз кардани ҳамаи такрорҳоstrings.ReplaceAll("як, ду, як", "як", "се")
strings.TrimSpace(s)Тоза кардани фосилаҳои пешу паси сатрstrings.TrimSpace(" салом ") // "салом"
strings.Split(s, sep)Ҷудо кардани сатр ба рӯйхат аз рӯи ҷудокунандаstrings.Split("себ, анор, ангур", ", ")
strings.Join(slice, sep)Пайваст кардани рӯйхат ба як сатрstrings.Join(mevaho, " ва ")
strings.Fields(s)Ҷудо кардани калимаҳо аз рӯи фосилаҳо (як ё якчанд)strings.Fields(" як ду се ") // [як ду се]

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

package main

import (
	"fmt"
	"strings"
)

func main() {
	jumla := "  ДУ ШАКЛИ ИСМ: ИСМИ ХОС ВА ИСМИ ҶИНС  "

	// 1. Тоза кардани фосилаҳои зиёдатии ду тараф
	jumla = strings.TrimSpace(jumla)

	// 2. Ҷудо кардани калимаҳо ба буриш
	kalimaho := strings.Fields(jumla) // аз рӯи фосилаҳо тақсим мекунад
	fmt.Println("Шумораи калимаҳо:", len(kalimaho))
	fmt.Println("Рӯйхати калимаҳо:", kalimaho)

	// 3. Ҷустуҷӯи калима
	if strings.Contains(jumla, "ХОС") {
		fmt.Println("Калимаи 'ХОС' дар ҷумла мавҷуд аст.")
	}
}

Табдилдиҳӣ бо бастаи strconv

Дар забони кӯҳнаи Бейсик барои табдили адад ба матн функсияи STR$ ва барои табдили матн ба адад функсияи VAL истифода мешуд. Дар забони Go ин вазифаро бастаи стандартии strconv (string convert) иҷро мекунад:

1. Адад ба сатр: strconv.Itoa (Integer to ASCII)

sol := 2026
satr := strconv.Itoa(sol) // "2026"

2. Сатр ба адад: strconv.Atoi (ASCII to Integer)

Азбаски сатр метавонад матни нодурустро дар бар гирад (масалан "салом"-ро наметавон ба адад табдил дод), функсияи Atoi ду қимат бармегардонад: худи адад ва хатогӣ (error):

package main

import (
	"fmt"
	"strconv"
)

func main() {
	voridot := "150"

	adad, err := strconv.Atoi(voridot)
	if err != nil {
		fmt.Println("Хато: сатри воридшуда адад нест!")
		return
	}

	fmt.Printf("Адад: %d, Дучандаи он: %d\n", adad, adad*2)
}

Алгоритми намунавӣ: Санҷиши палиндром

Палиндром калима ё ҷумлаест, ки аз чап ба рост ва аз рост ба чап якхела хонда мешавад (масалан: «нон», «тут», «каллак»).

package main

import "fmt"

func main() {
	kalima := "каллак"
	runes := []rune(kalima)
	n := len(runes)

	palindromAst := true
	for i := 0; i < n/2; i++ {
		if runes[i] != runes[n-1-i] {
			palindromAst = false
			break
		}
	}

	if palindromAst {
		fmt.Printf("Калимаи «%s» ПАЛИНДРОМ аст.\n", kalima)
	} else {
		fmt.Printf("Калимаи «%s» палиндром НЕСТ.\n", kalima)
	}
}

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

8–1. Ҳисоби садонокҳо: Барномае нависед, ки ҷумлаи тоҷикиро аз корбар қабул карда, миқдори ҳарфҳои садонокро (а, о, у, ӯ, э, и, ӣ, инчунин е, ё, ю, я) дар он ҳисоб намояд. Ҳарфҳои калонро низ ба назар гиред (strings.ToLower).

8–2. Сатри баръакс: Барномае тартиб диҳед, ки сатри ихтиёрии тоҷикиро (масалан «Барномасозӣ») қабул карда, онро аз охир ба аввал («ӣзосамонраБ») баргардонад ва чоп кунад.

8–3. Ҷудо кардани рақамҳои адад тавассути сатр: Адади бисёррақамаи натуралии M-ро қабул кунед (масалан 94825). Бо истифода аз табдили он ба сатр (strconv.Itoa), ҳар як рақамашро дар сатри алоҳида бо намуди зерин инъикос намоед:

Рақами 1: 9
Рақами 2: 4
Рақами 3: 8
Рақами 4: 2
Рақами 5: 5

Хулоса

Дар ин боб шумо тарзи дуруст ва бехатари кор бо матнҳоро дар забони Go омӯхтед. Шумо фаҳмидед, ки чаро барои алифбои тоҷикӣ навъи rune ва функсияи utf8.RuneCountInString зарур аст, чӣ гуна аз имкониятҳои бойи бастаи strings истифода баред ва тарзи табдили ададҳо ба матнро бо бастаи strconv аз худ намудед.

Дар боби 9 мо ба яке аз мавзӯъҳои муҳимтарини муҳандисии нармафзор — функсияҳо (зербарномаҳо) — мегузарем ва тарзи тақсим кардани барномаҳои калонро ба қисмҳои хурду мустақил меомӯзем.

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