Тегін сынақ сабағы: Golang Developer
Осы курстың бірнеше нақты сабағын өтіңіз — тіркелудің қажеті жоқ.
Сабақ 1: Пакеттер, түсініктемелер, айнымалылар және операторлар
Пакеттер. Түсініктемелер.
Go тіліндегі кез келген код пакеттің ішінде сақталады. Пакет — бұл .go файлдары орналасқан қалта.
Go бағдарламасын жасаудың алғашқы қарапайым мысалын қарастырайық:
package main
import "fmt"
func main() {
fmt.Println("Salem Bitlab!")
}
Salem Bitlab!Осы бағдарламаны орындау үшін біз main және fmt пакеттерін қолдандық.
package main — бұл негізгі пакет. Онда міндетті түрде бағдарламаның кіру нүктесі болып табылатын func main() функциясы болуы керек. Go қосымшасын іске қосқанда, бірінші шақырылатын функция дәл осы.
package fmt — деректерді консольге шығару үшін қолданылатын стандартты пакет. Шығарудан басқа, ол пішімделген енгізу мен шығаруды да қолдайды.
Бағдарлама үлкейген сайын кодты оқып, түсіну қиындай түседі. Бағдарлама логикасын түсінуді жеңілдету үшін түсініктемелер қолданылады.
Түсініктемелер кодты түсіндіру және оны логикалық бөліктерге бөлу үшін қажет. Олар компиляцияға қатыспайды және бағдарламаның орындалуына ешбір әсер етпейді.
Түсініктеме түрлері
Бір жолды түсініктемелер
package main
import "fmt"
func main() {
fmt.Println("I like Bitlab Academy!") // мәтінді консольге шығару
}
I like Bitlab Academy!Бір жолды түсініктеме белгілі бір жолды немесе код бөлігін қысқаша түсіндіру үшін қолданылады.
Көп жолды түсініктемелер
package main
import "fmt"
/*
Бұл бағдарламада
"fmt" пакеті арқылы
біз деректерді
консольге шығарамыз
*/
func main() {
fmt.Println("I like Bitlab Academy!")
}
I like Bitlab Academy!Көп жолды түсініктемелер функцияларды, құрылымдарды және үлкен логикалық код блоктарын толық сипаттау үшін қолданылады.
Айнымалылар және деректер түрлері
Go — статикалық типтелген бағдарламалау тілі. Go компиляторы бағдарламаны іске қоспас бұрын деректер түрлерін тексереді, бұл жоғары сенімділікті, өнімділікті және кодтың оқылуын қамтамасыз етеді.
Go соншалықты жылдам тіл, мен оны бағдарламалау әлеміндегі Флэш деп атаймын.
— Сусликов Битлабхан, пайдалы дағдыларға ие болу саласындағы қоғам таныған қайраткер
Деректер түрлерімен танысудан бұрын, айнымалы деген не екенін түсініп алу керек.
Айнымалы — бұл белгілі бір мәнді сақтайтын жады бөлігі. Әрбір айнымалының деректер түрі болады, ол осы айнымалымен қандай әрекеттер жасауға болатынын анықтайды.
Айнымалыны жариялау мына түрде болады:
package main
import "fmt"
func main() {
var age int = 22
fmt.Println(age)
}
22Айнымалыны жариялау үшін біз var кілт сөзін, содан кейін айнымалының атын және оның деректер түрін қолданамыз. Осыдан кейін айнымалыны бағдарламада еркін қолдана аламыз.
Go тілінде айнымалыны жариялаудың қысқа түрі де бар:
package main
import "fmt"
func main() {
age := 22
fmt.Println(age)
}
22:= операторын қолданғанда, Go берілген мән негізінде айнымалының түрін өзі анықтайды.
Go-дағы негізгі деректер түрлері
Сандармен жұмыс істеу үшін:
int— оң және теріс бүтін сандарuint— тек оң бүтін сандарfloat32— бөлшек сандар (32 бит)float64— бөлшек сандар (64 бит)complex64— комплекс сандар (2 × float32)complex128— комплекс сандар (2 × float64)
Мәтінмен жұмыс істеу үшін:
string— мәтіндік деректер
Логикалық амалдар үшін:
bool— true немесе false
Деректер жиынтықтарымен жұмыс істеу үшін:
array— тұрақты ұзындықтағы массивslice— өзгермелі ұзындықтағы массивmap— кілт-мән құрылымыstruct— әртүрлі деректер түрлерінің бірігуіinterface— абстрактілі деректер түрі
Қосымша деректер түрлері:
pointer— көрсеткішfunction— функция деректер түрі ретіндеchannel— горутиналар арасындағы байланыс
Математикалық операторлар
Математикалық операторлар сандармен әрекеттер орындауға мүмкіндік береді.
Қосу (+)
a := 2
b := 2
c := a + b // 4
Азайту (-)
a := 10
b := 5
c := a - b // 5
Көбейту (*)
a := 3
b := 3
c := a * b // 9
Бөлу (/)
a := 6
b := 2
c := a / b // 3
Бөлуден қалған қалдық (%)
a := 7
b := 3
c := a % b // 1
Инкремент (++)
a := 7
a++ // 8
Декремент (--)
a := 7
a-- // 6
Қазірше осы материал жеткілікті — дайындалған тапсырмаларды шығарып жаттығу ұсынылады. Сәттілік!
Квадраттар қосындысы
SumOfSquares(a int, b int) int функциясын жазыңыз, ол a*a + b*b мәнін қайтарады.SumOfSquares(2, 2) → 8SumOfSquares(3, 4) → 25-
Кіріс:
SumOfSquares(2, 2) -
Кіріс:
SumOfSquares(3, 4) -
Кіріс:
SumOfSquares(1, 1) -
Кіріс:
SumOfSquares(0, 0) -
Кіріс:
SumOfSquares(-2, -2)
Соңғы цифр
LastDigit(n int) int функциясын жазыңыз, ол оның соңғы цифрын қайтарады.LastDigit(123) → 3LastDigit(0) → 0-
Кіріс:
LastDigit(123) -
Кіріс:
LastDigit(0) -
Кіріс:
LastDigit(9) -
Кіріс:
LastDigit(100) -
Кіріс:
LastDigit(4567)
Ондықтар саны
TensDigit(n int) int функциясын жазыңыз, ол ондықтар санын (оңнан екінші цифрды) табады.TensDigit(2010) → 1TensDigit(0) → 0-
Кіріс:
TensDigit(2010) -
Кіріс:
TensDigit(0) -
Кіріс:
TensDigit(5) -
Кіріс:
TensDigit(99) -
Кіріс:
TensDigit(12345)
Ел және қала
Describe(country string, city string) string функциясын жазыңыз, ол ел мен қаланың атауын мысалдарда көрсетілгендей форматта қайтарады.Describe("Kazakhstan", "Astana") → Country: Kazakhstan
City: AstanaDescribe("France", "Paris") → Country: France
City: Paris-
Кіріс:
Describe("Kazakhstan", "Astana") -
Кіріс:
Describe("France", "Paris") -
Кіріс:
Describe("Japan", "Tokyo") -
Кіріс:
Describe("USA", "New York") -
Кіріс:
Describe("Germany", "Berlin")
Формуланы есептеу
Evaluate(x int) int функциясын жазыңыз, ол берілген x үшін y = 4(x - 3) - 7(x - 3) + 2 мәнін табады.Evaluate(4) → -1Evaluate(-4) → 23-
Кіріс:
Evaluate(4) -
Кіріс:
Evaluate(-4) -
Кіріс:
Evaluate(3) -
Кіріс:
Evaluate(0) -
Кіріс:
Evaluate(10)
Сабақ 2: Шартты құрылымдар және логикалық операторлар
Go-да шарттар деген не?
Нақты бағдарламаларда код әрдайым жоғарыдан төменге қарай бірдей орындала бермейді. Кейде бағдарлама шешім қабылдауы керек: бір код блогын немесе басқасын орындау.
Мысалы:
- егер пайдаланушының жасы 18-ден үлкен немесе тең болса — қолжетімділік беру;
- егер пароль дұрыс болса — жүйеге кіру;
- егер баланс жеткілікті болса — төлемді орындау;
- егер баға жоғары болса — сәттілік туралы хабарлама шығару.
Осындай жағдайлар үшін Go-да шартты құрылымдар қолданылады. Олар бағдарламаға қандай кодты орындау керектігін таңдауға мүмкіндік береді.
Шарт — бұл нәтижесі әрқашан true немесе false болатын өрнек.
Шарт қалай жұмыс істейді?
Шартты құрылым өрнекті тексереді. Егер өрнектің нәтижесі true болса, бір код блогы орындалады. Егер нәтиже false болса, бұл блок өткізіп жіберіледі немесе басқа блок орындалады.
if құрылымы
Ең қарапайым шартты құрылым — if. Ол тек шарт ақиқат болған жағдайда ғана кодты орындайды.
package main
import "fmt"
func main() {
age := 20
if age >= 18 {
fmt.Println("Доступ разрешён")
}
}
Доступ разрешёнМұнда бағдарлама age >= 18 шартын тексереді. age айнымалысының мәні 20-ға тең, сондықтан шарт ақиқат. Демек, if блогының ішіндегі код орындалады.
Маңызды: Go-да if ішіндегі шарт дөңгелек жақшаға алынбайды. Бірақ бұйра жақшалар { } міндетті түрде болуы керек.
if ... else құрылымы
Шарт ақиқат болғанда бір код, ал жалған болғанда басқа код орындалуы керек болса, if ... else құрылымы қолданылады.
package main
import "fmt"
func main() {
age := 15
if age >= 18 {
fmt.Println("Доступ разрешён")
} else {
fmt.Println("Доступ запрещён")
}
}
Доступ запрещёнage мәні 15-ке тең. age >= 18 шарты false қайтарады. Сондықтан if блогы орындалмайды, оның орнына else блогы орындалады.
Бірнеше шарт: else if
Кейде екі нұсқа жеткіліксіз болады. Мысалы, студенттің бағасын тексеріп, әртүрлі нәтиже шығару керек. Мұндай жағдайда else if қолданылады.
package main
import "fmt"
func main() {
score := 85
if score >= 90 {
fmt.Println("Отлично")
} else if score >= 75 {
fmt.Println("Хорошо")
} else if score >= 50 {
fmt.Println("Можно лучше")
} else {
fmt.Println("Не сдал")
}
}
ХорошоБағдарлама шарттарды жоғарыдан төменге қарай тексереді:
score >= 90 — false
score >= 75 — true
«Хорошо» шығады
қалған шарттар енді тексерілмейді
Салыстыру операторлары
Шарт құру үшін жиі салыстыру операторлары қолданылады. Олар мәндерді салыстырып, true немесе false нәтижесін қайтарады.
==— тең!=— тең емес>— үлкен<— кіші>=— үлкен немесе тең<=— кіші немесе тең
package main
import "fmt"
func main() {
a := 10
b := 5
fmt.Println(a == b)
fmt.Println(a != b)
fmt.Println(a > b)
fmt.Println(a < b)
}
false
true
true
falseЛогикалық операторлар
Логикалық операторлар бірнеше шартты біріктіруге мүмкіндік береді. Бұл бір салыстыру жеткіліксіз болғанда пайдалы.
&&— ЖӘНЕ, екі шарт та true болуы керек||— НЕМЕСЕ, кем дегенде бір шарт true болуы керек!— ЕМЕС, true-ды false-ке, false-ты true-ға айналдырады
Бірнеше ережені бір мезгілде тексеру керек болса, көбіне && және || операторлары қолданылады.
&& операторымен мысал
&& операторы екі шарттың да ақиқат болуы керек дегенді білдіреді. Мысалы, пайдаланушы жүйеге тек логин мен пароль дұрыс болғанда ғана кіре алады.
package main
import "fmt"
func main() {
login := "admin"
password := "12345"
if login == "admin" && password == "12345" {
fmt.Println("Добро пожаловать")
} else {
fmt.Println("Неверный логин или пароль")
}
}
Добро пожаловать|| операторымен мысал
|| операторы кем дегенде бір шарттың орындалуы жеткілікті дегенді білдіреді. Мысалы, қала Astana немесе Nur-Sultan деп аталуы мүмкін.
package main
import "fmt"
func main() {
city := "Astana"
if city == "Astana" || city == "Nur-Sultan" {
fmt.Println("Здравствуй столица")
} else {
fmt.Println("Это другой город")
}
}
Здравствуй столица! операторымен мысал
! операторы логикалық өрнектің мәнін керісіне айналдырады. Егер true болса, false болады. Егер false болса, true болады.
package main
import "fmt"
func main() {
isBlocked := false
if !isBlocked {
fmt.Println("Пользователь активен")
} else {
fmt.Println("Пользователь заблокирован")
}
}
Пользователь активенif ішінде инициализациялау
Go-да айнымалыны тікелей if құрылымының ішінде жасауға болады. Мұндай айнымалы тек осы шарттың ішінде ғана қолжетімді болады.
package main
import "fmt"
func main() {
if age := 19; age >= 18 {
fmt.Println("Совершеннолетний")
} else {
fmt.Println("Несовершеннолетний")
}
}
Совершеннолетнийage айнымалысы шартты тексерместен бұрын жасалады. if ... else құрылымы аяқталғаннан кейін бұл айнымалыны қолдануға болмайды.
switch ... case құрылымы
Бір мәнді бірнеше нұсқамен салыстыру керек болса, switch ... case құрылымын қолданған ыңғайлы.
Нұсқалар көп болғанда ол кодты тазарақ етеді.
package main
import "fmt"
func main() {
day := 3
switch day {
case 1:
fmt.Println("Понедельник")
case 2:
fmt.Println("Вторник")
case 3:
fmt.Println("Среда")
case 4:
fmt.Println("Четверг")
case 5:
fmt.Println("Пятница")
default:
fmt.Println("Выходной или неизвестный день")
}
}
СредаGo-да әрбір case-тен кейін break жазудың қажеті жоқ. Сәйкес келген нұсқа орындалғаннан кейін switch құрылымы автоматты түрде аяқталады.
default ешбір case сәйкес келмегенде орындалады.
Мәні жоқ switch
Go-да switch-ті нақты мәнсіз де қолдануға болады. Бұл жағдайда әрбір case өз алдына жеке шартқа айналады.
package main
import "fmt"
func main() {
temperature := 30
switch {
case temperature >= 30:
fmt.Println("Жарко")
case temperature >= 20:
fmt.Println("Тепло")
case temperature >= 10:
fmt.Println("Прохладно")
default:
fmt.Println("Холодно")
}
}
ЖаркоПрактикалық мысалдар
Шарттарды жақсырақ түсіну үшін қарапайым тапсырмаларды шығарған пайдалы.
- Санның оң немесе теріс екенін тексеру.
- Санның жұп немесе тақ екенін тексеру.
- Пайдаланушының жасы бойынша қолжетімділік ала алатынын тексеру.
- Пайдаланушының логині мен паролін тексеру.
- Нөмірі бойынша апта күнінің атауын шығару.
Қорытынды
Шартты құрылымдар бағдарламаға шешім қабылдауға мүмкіндік береді. Шарттарсыз толыққанды бағдарлама жазу мүмкін емес, себебі кез келген логика дерлік әртүрлі жағдайларға байланысты болады.
ifқарапайым тексеру үшін қолданылады;elseшарт жалған болғанда орындалады;else ifбірнеше нұсқаны тексеру үшін керек;switchмәнді бірнеше нұсқамен салыстыру керек болғанда ыңғайлы;&&,||,!шарттарды біріктіруге және өзгертуге мүмкіндік береді.
Оң, теріс немесе нөл
Positive, теріс болса — Negative хабарламасын шығарыңыз. Егер нөл берілсе — Zero шығарыңыз. Хабарламаны қайтаратын Sign(n int) string функциясын жазыңыз (тырнақшасыз).Sign(5) → PositiveSign(-13) → Negative-
Кіріс:
Sign(5) -
Кіріс:
Sign(-13) -
Кіріс:
Sign(0) -
Кіріс:
Sign(1) -
Кіріс:
Sign(-100)
Барлық цифрлар түрлі ме?
AllDigitsDifferent(n int) string функциясын жазыңыз, ол оның барлық цифрлары түрлі болса YES, әйтпесе NO қайтарады.AllDigitsDifferent(237) → YESAllDigitsDifferent(117) → NO-
Кіріс:
AllDigitsDifferent(237) -
Кіріс:
AllDigitsDifferent(117) -
Кіріс:
AllDigitsDifferent(123) -
Кіріс:
AllDigitsDifferent(111) -
Кіріс:
AllDigitsDifferent(989)
Қай мектеп?
SchoolByGrade(grade int) string функциясын жазыңыз. 1-ден 4-ке дейінгі сыныптар (қоса алғанда) — Beginners School, 5-тен 9-ға дейін — Middle School, 10-нан 11-ге дейін — High School.SchoolByGrade(2) → Beginners SchoolSchoolByGrade(10) → High School-
Кіріс:
SchoolByGrade(2) -
Кіріс:
SchoolByGrade(10) -
Кіріс:
SchoolByGrade(1) -
Кіріс:
SchoolByGrade(9) -
Кіріс:
SchoolByGrade(11)
Екі саннның үлкені
MaxOfTwo(a int, b int) int функциясын жазыңыз, ол олардың үлкенін қайтарады.MaxOfTwo(17, 81) → 81MaxOfTwo(872, 976) → 976-
Кіріс:
MaxOfTwo(17, 81) -
Кіріс:
MaxOfTwo(872, 976) -
Кіріс:
MaxOfTwo(5, 5) -
Кіріс:
MaxOfTwo(-10, -20) -
Кіріс:
MaxOfTwo(100, 1)
Үш санның ішіндегі үлкені
MaxOfThree(a int, b int, c int) int функциясын жазыңыз, ол үш бүтін санды қабылдап, олардың ішіндегі ең үлкенін қайтарады.MaxOfThree(17, 18, 19) → 19MaxOfThree(89, 221, 19) → 221-
Кіріс:
MaxOfThree(17, 18, 19) -
Кіріс:
MaxOfThree(89, 221, 19) -
Кіріс:
MaxOfThree(5, 5, 5) -
Кіріс:
MaxOfThree(-1, -2, -3) -
Кіріс:
MaxOfThree(0, 100, 50)
Сабақ 3: Циклдар және for операторы
Цикл дегеніміз не?
Цикл — бұл белгілі бір әрекеттерді бірнеше рет орындауға мүмкіндік беретін нұсқаулар тізбегі.
Бағдарламалауда бір әрекетті бірнеше рет қайталау керек болатын жағдайлар өте жиі кездеседі. Мысалы:
- 1-ден 10-ға дейінгі сандарды шығару;
- сандардың қосындысын есептеу;
- консольден бірнеше мән оқу;
- студенттер тізімін өңдеу;
- көбейту кестесін басып шығару.
Циклдарсыз бірдей кодты қолмен көп рет жазуға тура келер еді. Циклдар кодты қысқа, түсінікті және ыңғайлы етеді.
Go тілінде тек бір ғана цикл бар — for, бірақ ол әртүрлі түрде болуы мүмкін.
Цикл қалай жұмыс істейді?
- алдымен бастапқы мән беріледі;
- содан кейін шарт тексеріледі;
- шарт ақиқат болса, цикл денесі орындалады;
- осыдан кейін мән өзгереді;
- содан кейін шарт қайта тексеріледі.
Классикалық for
Классикалық for циклі цикл шамамен қанша рет орындалатынын алдын ала білгенде қолданылады.
Мысалы, 0-ден 4-ке дейінгі сандарды шығару керек болса:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}
0
1
2
3
4Цикл құрылымы үш бөліктен тұрады:
i := 0— инициализация (бастапқы мән)i < 5— шарт (ақиқат болғанша цикл жұмыс істейді)i++— қадам (әр итерациядан кейін айнымалыны өзгерту)
Осылайша цикл 5 рет орындалды — i саны 5-ке тең болғанша.
Мысал: 1-ден 10-ға дейінгі сандарды шығару
Белгілі бір диапазондағы сандарды шығару өте жиі кездесетін тапсырма. Ол үшін қарапайым for циклін қолдануға болады.
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
fmt.Println(i)
}
}
1
2
3
4
5
6
7
8
9
10Бұл мысалда i айнымалысы 1-ден басталады. Цикл i <= 10 болғанша жұмыс істейді. Әр итерациядан кейін i мәні 1-ге артады.
Мысал: сандардың қосындысы
Циклдар нәтижені жинақтау үшін жиі қолданылады. Мысалы, 1-ден 5-ке дейінгі сандардың қосындысын есептеуге болады.
package main
import "fmt"
func main() {
sum := 0
for i := 1; i <= 5; i++ {
sum = sum + i
}
fmt.Println(sum)
}
15Мұнда sum айнымалысы жалпы нәтижені сақтайды. Әр итерацияда біз оған i-дің ағымдағы мәнін қосамыз.
sum қалай өзгереді:
- i = 1, sum = 0 + 1 = 1
- i = 2, sum = 1 + 2 = 3
- i = 3, sum = 3 + 3 = 6
- i = 4, sum = 6 + 4 = 10
- i = 5, sum = 10 + 5 = 15
Мысал: тек жұп сандарды шығару
Цикл ішінде шартты құрылымдарды қолдануға болады. Мысалы, 1-ден 10-ға дейінгі сандар бойынша жүріп, тек жұп сандарды шығаруға болады.
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
if i%2 == 0 {
fmt.Println(i)
}
}
}
2
4
6
8
10i%2 == 0 шарты санның 2-ге қалдықсыз бөлінетінін тексереді. Егер қалдық 0 болса, сан жұп болғаны.
for-дің while ретіндегі түрі
Go тілінде бөлек while кілт сөзі жоқ. Бірақ тек шартты қалдырсаңыз, for циклін while ретінде қолдануға болады.
package main
import "fmt"
func main() {
i := 1
for i < 10 {
fmt.Println(i)
i++
}
}
1
2
3
4
5
6
7
8
9Бұрынғыдай — цикл шарт ақиқат болғанша жұмыс істейді. Бұл жағдайда — i < 10 болғанша.
Шексіз цикл
Егер for-ды шартсыз жазсаңыз, шексіз цикл пайда болады. Мұндай цикл біз оны қолмен тоқтатпайынша немесе break қолданбайынша шексіз жұмыс істейді.
package main
import "fmt"
func main() {
i := 1
for {
fmt.Println(i)
i++
if i > 5 {
break
}
}
}
1
2
3
4
5Маңызды: шексіз циклді абайлап қолдану керек. Егер шығу шартын ұмытып кетсеңіз, бағдарлама шексіз жұмыс істеуі мүмкін.
break операторы
break операторы циклді мерзімінен бұрын аяқтауға мүмкіндік береді. Ол керекті мәнді тапқанда және циклді жалғастырғымыз келмегенде пайдалы.
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
if i == 6 {
break
}
fmt.Println(i)
}
}
1
2
3
4
5i саны 6-ға тең болғанда, break іске қосылады. Цикл дереу аяқталады, сондықтан 6 саны және одан кейінгі сандар шығарылмайды.
continue операторы
continue операторы ағымдағы итерацияны өткізіп жіберіп, келесісіне дереу өтеді. Ол кейбір мәндерді өткізіп жіберу керек болғанда пайдалы.
package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ {
if i == 3 {
continue
}
fmt.Println(i)
}
}
1
2
4
5i саны 3-ке тең болғанда, continue орындалады. Сондықтан бұл сан үшін fmt.Println(i) өткізіп жіберіледі.
Деректер енгізетін цикл
Циклдарды консольден деректер оқу үшін де қолдануға болады. Мысалы, пайдаланушы 0 енгізгенше сандарды енгізуге болады.
package main
import "fmt"
func main() {
var number int
for {
fmt.Scan(&number)
if number == 0 {
break
}
fmt.Println(number)
}
}
Бұл мысалда цикл шексіз жұмыс істейді, бірақ пайдаланушы 0 санын енгізгенде аяқталады.
Мұндай тәсіл пайдаланушы қанша мән енгізетіні алдын ала белгісіз болғанда жиі қолданылады.
Кірістірілген циклдар
Цикл басқа циклдің ішінде болуы мүмкін. Мұндай тәсіл кірістірілген циклдар деп аталады.
Ең танымал мысалдардың бірі — көбейту кестесі.
package main
import "fmt"
func main() {
for i := 1; i < 10; i++ {
for j := 1; j < 10; j++ {
fmt.Print(i*j, "\t")
}
fmt.Println()
}
}
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81Көбейту кестесі шықты: көлденеңінен i, тігінен — j. Әрбір цикл өз айнымалысы 10-нан кіші болғанша жұмыс істейді.
Бұл қалай жұмыс істейді:
- сыртқы цикл жолдарға жауап береді;
- ішкі цикл бағандарға жауап береді;
- әр итерацияда i * j нәтижесі шығарылады;
- ішкі цикл аяқталғаннан кейін жаңа жолға көшу орындалады.
Кірістірілген цикл мысалы: жұлдызшалардан тұратын тіктөртбұрыш
Кірістірілген циклдар консольде қарапайым фигураларды салу үшін жиі қолданылады. Мысалы, * таңбаларынан тұратын тіктөртбұрышты шығаруға болады.
package main
import "fmt"
func main() {
for i := 1; i <= 3; i++ {
for j := 1; j <= 5; j++ {
fmt.Print("*")
}
fmt.Println()
}
}
*****
*****
*****Сыртқы цикл 3 рет орындалып, 3 жол жасайды. Ішкі цикл 5 рет орындалып, әр жолда 5 жұлдызша басып шығарады.
for range циклі
Go тілінде for range түрі жиі қолданылады. Ол деректер жиынын аралап шығу керек болғанда ыңғайлы.
Мысалы, есімдер тізімін аралап шығуға болады:
package main
import "fmt"
func main() {
names := []string{"Aibek", "Dana", "Miras"}
for index, name := range names {
fmt.Println(index, name)
}
}
0 Aibek
1 Dana
2 Mirasindex айнымалысы элементтің нөмірін сақтайды, ал name айнымалысы мәннің өзін сақтайды.
Индекс керек болмаса
Кейде бізге тек мән керек, ал индекс керек болмайды. Мұндай жағдайда индекстің орнына _ таңбасын қолдануға болады.
package main
import "fmt"
func main() {
names := []string{"Aibek", "Dana", "Miras"}
for _, name := range names {
fmt.Println(name)
}
}
Aibek
Dana
Miras_ таңбасы бұл мән бізге керек емес дегенді білдіреді.
Циклдармен жұмыс істегендегі жиі кездесетін қателер
- цикл айнымалысын өзгертуді ұмыту;
- әрқашан ақиқат болатын шарт жазу;
- break-сіз шексіз цикл жасау;
- цикл шектерін дұрыс көрсетпеу;
- < және <= таңбаларын шатастыру.
Мини-практика
Циклдарды жақсырақ меңгеру үшін келесі тапсырмаларға бағдарлама жазып көріңіз:
- 1-ден 100-ге дейінгі сандарды шығару;
- 1-ден 50-ге дейінгі тек тақ сандарды шығару;
- 1-ден N-ге дейінгі сандардың қосындысын есептеу;
- бір сан үшін көбейту кестесін шығару;
- пайдаланушы 0 енгізгенше сандарды енгізу;
- енгізілген сандардың ішінен ең үлкенін табу;
- * таңбаларынан тұратын шаршыны шығару.
Қорытынды
Циклдар бір кодты көп рет орындауға мүмкіндік береді. Go тілінде ол үшін тек for циклі қолданылады, бірақ ол әртүрлі түрде жазылуы мүмкін.
- классикалық
forцикл шектері белгілі болғанда ыңғайлы; forwhileретінде тек шартты тексеру маңызды болғанда ыңғайлы;- шексіз
forbreakоператорымен бірге қолданылады; breakциклді аяқтайды;continueағымдағы итерацияны өткізіп жібереді;- кірістірілген циклдар кестелер мен фигуралармен жұмыс істеуге мүмкіндік береді;
for rangeдеректер жиындарын аралап шығу үшін қолданылады.
n-ден m-ге дейін санау
RangeString(n int, m int) string функциясын жазыңыз, ол n-ден m-ге дейінгі барлық сандарды бос орынмен бөліп қайтарады.RangeString(5, 10) → 5 6 7 8 9 10RangeString(2, 9) → 2 3 4 5 6 7 8 9-
Кіріс:
RangeString(5, 10) -
Кіріс:
RangeString(2, 9) -
Кіріс:
RangeString(1, 3) -
Кіріс:
RangeString(7, 7) -
Кіріс:
RangeString(4, 1)
n-ге дейінгі жұп сандар
EvensUpTo(n int) string функциясын жазыңыз, ол 0-ден n-ге дейінгі барлық ЖҰП сандарды бос орынмен бөліп қайтарады (жұп сан 2-ге қалдықсыз бөлінеді).EvensUpTo(6) → 0 2 4 6EvensUpTo(10) → 0 2 4 6 8 10-
Кіріс:
EvensUpTo(6) -
Кіріс:
EvensUpTo(10) -
Кіріс:
EvensUpTo(0) -
Кіріс:
EvensUpTo(1) -
Кіріс:
EvensUpTo(7)
for арқылы факториал
Factorial(n int) int функциясын жазыңыз, ол for циклін қолданып n санының факториалын қайтарады.Factorial(5) → 120Factorial(0) → 1-
Кіріс:
Factorial(5) -
Кіріс:
Factorial(0) -
Кіріс:
Factorial(1) -
Кіріс:
Factorial(3) -
Кіріс:
Factorial(6)
Сандар және олардың квадраттары
NumbersAndSquares(n int) string функциясын жазыңыз, ол 1-ден n-ге дейінгі барлық сандарды олардың квадраттарымен бірге, әр жұпты жеке жолда, мысалдарда көрсетілгендей қайтарады.NumbersAndSquares(3) → 1 1
2 4
3 9NumbersAndSquares(5) → 1 1
2 4
3 9
4 16
5 25-
Кіріс:
NumbersAndSquares(3) -
Кіріс:
NumbersAndSquares(5) -
Кіріс:
NumbersAndSquares(1) -
Кіріс:
NumbersAndSquares(2) -
Кіріс:
NumbersAndSquares(4)
1-ден n-ге дейінгі қосынды
SumUpTo(n int) int функциясын жазыңыз, ол 1-ден n-ге дейінгі барлық сандардың қосындысын қайтарады (1 + 2 + 3 + ... + n).SumUpTo(3) → 6SumUpTo(5) → 15-
Кіріс:
SumUpTo(3) -
Кіріс:
SumUpTo(5) -
Кіріс:
SumUpTo(1) -
Кіріс:
SumUpTo(0) -
Кіріс:
SumUpTo(10)
Сабақ 4: Тілімдер
Тілім дегеніміз не?
Тілім (slice) — бір типтегі элементтердің ретті жиынтығы. Массивтерден айырмашылығы, тілімдердің ұзындығы динамикалық: оларға жаңа элементтер қосуға және барларын жоюға болады.
Тілімдер массивтерге өте ұқсас, бірақ нақты әзірлемеде әлдеқайда ыңғайлы. Массивтің өлшемі тұрақты болса, тілім қажеттілікке қарай өсе алады.
Сондықтан Go тілінде әдетте кәдімгі массивтермен емес, тілімдермен жұмыс істейді.
Тілімдер қазақ тойы сияқты: 200 адамға іс-шара жоспарлауға болады, ал соңында қанша қонақ келетіні белгісіз. Бәлкім 150? 250? Немесе тұтас 300? Тілімдер той ұйымдастырушылары сияқты бір қасиетке ие — икемділік.
Мейрам "Уақтылық" Тойбастаров — "ешқашан" кешікпейтін және тілімдерден хабардар кісі
Тілім мен массивтің басты айырмашылығы — тілімнің ұзындығы программа жұмыс істеп тұрған кезде өзгере алады.
Массив vs тілім
Көрнекі түрде массив пен тілім бір-біріне өте ұқсас, бірақ олардың арасында маңызды айырмашылық бар.
Массив
Өлшемі тұрақты. Егер массив 5 элементке жасалса, ол әрқашан дәл 5 элементтен тұрады.
Тілім
Өлшемі динамикалық. Тілімге элементтер қосып, жаңа, үлкейтілген тілім алуға болады.
Go тілінде тілім массив сияқты жазылады, тек шаршы жақшаның ішінде өлшемі көрсетілмейді.
Тілім жасау
Тілімдер массивтер сияқты жасалады, тек жасау кезінде ұзындығы көрсетілмейді.
package main
import "fmt"
func main() {
boxers := []string{"Muhammad Ali", "Mike Tyson", "George Foreman", "Joe Frazier"}
for _, value := range boxers {
fmt.Println(value)
}
}
Muhammad Ali
Mike Tyson
George Foreman
Joe FrazierНазар аударыңыз: [] ішінде біз ұзындықты көрсеткен жоқпыз — дәл осы себепті бұл slice.
Егер [4]string деп жазсақ, бұл массив болады. Ал []string деп жазсақ, бұл тілім болады.
Әртүрлі типтегі тілім
Тілім әртүрлі деректер типіндегі элементтерді сақтай алады, бірақ бір тілімнің ішінде барлық элементтер бір типті болуы керек.
Сандар тілімі:
numbers := []int{10, 20, 30, 40}
Жолдар тілімі:
cities := []string{"Almaty", "Astana", "Paris"}
Логикалық мәндер тілімі:
answers := []bool{true, false, true}
make() арқылы тілім жасау
Тілімдерді make() функциясы арқылы да жасауға болады:
package main
import "fmt"
func main() {
cities := make([]string, 4)
cities[0] = "Almaty"
cities[1] = "Astana"
cities[2] = "New-York"
cities[3] = "Washington"
for _, value := range cities {
fmt.Println(value)
}
}
Almaty
Astana
New-York
Washingtonmake([]string, 4) деп жазғанда, Go ұзындығы 4 болатын жолдар тілімін жасайды. Содан кейін біз 0-ден 3-ке дейінгі индекстер бойынша элементтерге жүгіне аламыз.
Енді элементтерді қалай қосу, жою керектігін және тілім операторы дегеніміз не екенін қарастырайық.
Ұзындығы мен сыйымдылығы: len және cap
Тілімнің екі маңызды сипаттамасы бар: ұзындығы және сыйымдылығы.
len— тілімде қазір қанша элемент бар;cap— қазіргі ішкі массивке қанша элемент сыяды.
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30}
fmt.Println(len(numbers))
fmt.Println(cap(numbers))
}
3
3Басында len мен cap көбіне тең болады. Бірақ append арқылы элементтер қосқаннан кейін сыйымдылық өзгеруі мүмкін.
Элементтерді қосу (append)
Тілімге элемент қосу үшін append(slice, value) функциясы қолданылады.
package main
import "fmt"
func main() {
cities := []string{"Almaty", "Astana"}
cities = append(cities, "Paris")
cities = append(cities, "Marcel")
for _, value := range cities {
fmt.Println(value)
}
}
Almaty
Astana
Paris
MarcelНәтижені айнымалыға қайта сақтау маңызды: cities = append(cities, "Paris"). append функциясы жаңа тілім қайтарады.
Бірнеше элемент қосу
append арқылы бірден бірнеше элемент қосуға болады.
package main
import "fmt"
func main() {
numbers := []int{1, 2, 3}
numbers = append(numbers, 4, 5, 6)
fmt.Println(numbers)
}
[1 2 3 4 5 6]Бір тілімді екінші тілімге қосу
Кейде бір мән емес, басқа тілімнің барлық элементтерін қосу керек болады. Ол үшін ... қолданылады.
package main
import "fmt"
func main() {
first := []int{1, 2, 3}
second := []int{4, 5, 6}
first = append(first, second...)
fmt.Println(first)
}
[1 2 3 4 5 6]Үш нүкте ... екінші тілімді жеке элементтер жиынтығы ретінде ашады.
Тілім операторы (s[i:j])
Тілім операторы былай жазылады: s[i:j], мұндағы:
s— бастапқы тілімi— бастапқы индекс (қоса алғанда)j— соңғы индекс (қоспағанда)
| Индекс | Мән |
|---|---|
| 0 | Almaty |
| 1 | Astana |
| 2 | New-York |
| 3 | Washington |
Мысалы, cities[0:2] деп жазсақ, 0 және 1 индекстеріндегі элементтерді аламыз. 2 индексіндегі элемент нәтижеге кірмейді.
package main
import "fmt"
func main() {
cities := []string{"Almaty", "Astana", "New-York", "Washington", "Paris", "Marcel"}
kzCities := cities[0:2]
usaCities := cities[2:4]
frCities := cities[4:6]
fmt.Println(kzCities) // Almaty, Astana
fmt.Println(usaCities) // New-York, Washington
fmt.Println(frCities) // Paris, Marcel
}
[Almaty Astana]
[New-York Washington]
[Paris Marcel]Тілімнің қысқа түрлері
Go тілінде бастапқы немесе соңғы индексті көрсетпеуге болады.
s[:3]— басынан бастап 3-индекске дейін алу, 3-ті қоспағанда;s[2:]— 2-индекстен соңына дейін алу;s[:]— тілімнің барлығын алу.
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30, 40, 50}
fmt.Println(numbers[:3])
fmt.Println(numbers[2:])
fmt.Println(numbers[:])
}
[10 20 30]
[30 40 50]
[10 20 30 40 50]Тілім элементін өзгерту
Массивтердегідей, тілім элементтерін индекс бойынша өзгертуге болады.
package main
import "fmt"
func main() {
cities := []string{"Almaty", "Astana", "Paris"}
cities[2] = "London"
fmt.Println(cities)
}
[Almaty Astana London]Мұнда 2-индекстегі элемент Paris-тен London-ға ауыстырылды.
Элементті жою
Жою әдетте append пен тілім операторын біріктіру арқылы жасалады. Біз индекске дейінгі элементтер мен индекстен кейінгі элементтерді алып, содан кейін оларды "жабыстырамыз".
package main
import "fmt"
func main() {
capitals := []string{"Astana", "Washington", "Marcel", "Paris"}
num := 2 // 2-индекстегі элементті жоямыз (Marcel)
capitals = append(capitals[:num], capitals[num+1:]...)
fmt.Println(capitals)
}
[Astana Washington Paris]Маңызды: capitals[:num] — num-ге дейінгі элементтер, ал capitals[num+1:] — num-нен кейінгі элементтер. Үш нүкте ... тілімді аргументтер жиынтығы ретінде "ашады".
Бұл қалай жұмыс істейді:
capitals[:2]—[Astana Washington]береді;capitals[3:]—[Paris]береді;appendосы бөліктерді біріктіреді;Marcelэлементі нәтижеден жоғалады.
range арқылы тілімді аралау
Тілімдерді range арқылы аралау ыңғайлы. Біз индексті де, мәнді де ала аламыз.
package main
import "fmt"
func main() {
cities := []string{"Almaty", "Astana", "Paris"}
for index, value := range cities {
fmt.Println(index, value)
}
}
0 Almaty
1 Astana
2 ParisИндекс керек болмаса
Егер тек элемент керек болса, индексті _-ге ауыстыруға болады.
package main
import "fmt"
func main() {
cities := []string{"Almaty", "Astana", "Paris"}
for _, value := range cities {
fmt.Println(value)
}
}
Almaty
Astana
ParisМысал: тілім элементтерінің қосындысы
Тілімдер циклдармен бірге жиі қолданылады. Мысалы, тілімдегі барлық сандардың қосындысын есептеуге болады.
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30, 40}
sum := 0
for _, value := range numbers {
sum = sum + value
}
fmt.Println(sum)
}
100Мысал: ең үлкен санды табу
Цикл мен тілім көмегімен ең үлкен санды табуға болады.
package main
import "fmt"
func main() {
numbers := []int{15, 90, 12, 45, 7}
max := numbers[0]
for _, value := range numbers {
if value > max {
max = value
}
}
fmt.Println(max)
}
90Тілімдермен жұмыс істеудегі жиі кездесетін қателер
appendнәтижесін айнымалыға қайта сақтауды ұмыту;- тілімде жоқ индекске жүгіну;
[5]intмассиві мен[]intтілімін шатастыру;s[i:j]-дегі соңғы индекстің кірмейтінін ұмыту;- бір тілімді екіншісіне қосқанда
...қоюды ұмыту.
Мини-практика
Тілімдерді жақсырақ меңгеру үшін мына тапсырмаларға программа жазып көріңіз:
- 5 саннан тұратын тілім жасап, барлық элементтерін шығарыңыз;
- тілімге
appendарқылы тағы бірнеше сан қосыңыз; - тілімнің тек алғашқы 3 элементін шығарыңыз;
- 2-индекстен соңына дейінгі элементтерді шығарыңыз;
- индекс бойынша элементті жойыңыз;
- барлық элементтердің қосындысын есептеңіз;
- ең үлкен санды табыңыз;
- тек оң сандарды шығарыңыз.
Қорытынды
- тілім массивке ұқсайды, бірақ ұзындығы динамикалық;
- тілім
[]типарқылы, өлшемін көрсетпей жасалады; makeқажетті ұзындықтағы тілім жасауға мүмкіндік береді;appendжаңа элементтер қосады;s[i:j]тілімнің бір бөлігін алуға мүмкіндік береді;s[i:j]-дегі соңғы индекс кірмейді;- элементтерді индекс бойынша өзгертуге болады;
- жоюды
appendпен тілім операторы арқылы жасауға болады; rangeтілімді аралау үшін ыңғайлы.
4-ші элемент
FourthElement(numbers []int) int функциясын жазыңыз.FourthElement([]int{41, -231, 24, 49, 6}) → 49FourthElement([]int{1, 2, 3, 4}) → 4-
Кіріс:
FourthElement([]int{41, -231, 24, 49, 6}) -
Кіріс:
FourthElement([]int{1, 2, 3, 4}) -
Кіріс:
FourthElement([]int{10, 20, 30, 40, 50, 60}) -
Кіріс:
FourthElement([]int{-5, -10, -15, -20}) -
Кіріс:
FourthElement([]int{100, 200, 300, 400, 500})
Минимум және максимум
MinMax(numbers []int) string функциясын жазыңыз.MinMax([]int{4, 9, 2, 5}) → 2 9MinMax([]int{1, 2, -1, 4, 5, 56, 7, 8, 9, -21}) → -21 56-
Кіріс:
MinMax([]int{4, 9, 2, 5}) -
Кіріс:
MinMax([]int{1, 2, -1, 4, 5, 56, 7, 8, 9, -21}) -
Кіріс:
MinMax([]int{5}) -
Кіріс:
MinMax([]int{-1, -2, -3}) -
Кіріс:
MinMax([]int{100, 50, 75, 25, 0})
Максимум мен минимум айырмасы
MaxMinDiff(numbers []int) int функциясын жазыңыз.MaxMinDiff([]int{4, 9, 2, 5, 8, 7, 11, 16}) → 14MaxMinDiff([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) → 9-
Кіріс:
MaxMinDiff([]int{4, 9, 2, 5, 8, 7, 11, 16}) -
Кіріс:
MaxMinDiff([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) -
Кіріс:
MaxMinDiff([]int{5}) -
Кіріс:
MaxMinDiff([]int{-10, -5, -1}) -
Кіріс:
MaxMinDiff([]int{100, 1})
Тілімді кері ретте шығару
Reverse(numbers []int) string функциясын жазыңыз.Reverse([]int{6, 19, 26, -3, 46, 8, 5, -65, 90, 25}) → 25 90 -65 5 8 46 -3 26 19 6Reverse([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) → 10 9 8 7 6 5 4 3 2 1-
Кіріс:
Reverse([]int{6, 19, 26, -3, 46, 8, 5, -65, 90, 25}) -
Кіріс:
Reverse([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) -
Кіріс:
Reverse([]int{1}) -
Кіріс:
Reverse([]int{1, 2}) -
Кіріс:
Reverse([]int{5, 10, 15, 20, 25})
Тек жұп элементтер
EvensOnly(numbers []int) string функциясын жазыңыз.EvensOnly([]int{4, 9, 2, 5, 8, 7, 11, 16}) → 4 2 8 16EvensOnly([]int{6, 19, 26, 3, 46, 8, 5, 65, 90, 25}) → 6 26 46 8 90-
Кіріс:
EvensOnly([]int{4, 9, 2, 5, 8, 7, 11, 16}) -
Кіріс:
EvensOnly([]int{6, 19, 26, 3, 46, 8, 5, 65, 90, 25}) -
Кіріс:
EvensOnly([]int{1, 3, 5, 7}) -
Кіріс:
EvensOnly([]int{2, 4, 6, 8}) -
Кіріс:
EvensOnly([]int{0, -2, -4, 3})