Konsoldan ma'lumot kiritish
Bundan oldingi qismlarda dastur ishlatadigan qiymatlarni kodning ichida yozdik. Asosan dasturlar foydalanuvchidan ism, son yoki boshqa ma'lumotlarni qo'lda kiritishini so'raydi.
Bu qismda shu ishni terminalda amalga oshirishni va uni o'zgaruvchiga biriktirishni o'rganamiz.
Termenaldan ma'lumotni olish uchun fmt paketida fmt.Scan() funksiyasi bor. Shu funksiya bilan qiymatlarni o'qib olish
mumkin.
| main.go | |
|---|---|
Dasturni ishga tushiring:
Terminalda so'rov chiqganidan so'ng 25 yozib Enter tugmasini bosing:
Natija quyidagicha bo'lishi kerak:
Info
fmt.Print() matnni chiqaradi, lekin yangi qator qo'shmaydi. Shu sababli foydalanuvchi qiymatni so'rovning yoniga
yozadi. fmt.Println() esa natijadan keyin yangi qator qo'shardi.
Keling endi yuqoridagi dasturni tushunishga harakat qilamiz:
var yosh int o'zgaruvchini yaratadi va unga 0 nol qiymatini beradi. fmt.Scan(&yosh) terminaldan qiymat o'qib, uni
shu o'zgaruvchiga yozadi.
&yosh — yosh o'zgaruvchisining xotiradagi manzili. Scan() qiymat sifatida o'zgaruvchining xotiradagi manzilini qabul
qiladi.
Warning
fmt.Scan(yosh) emas, fmt.Scan(&yosh) yoziladi. & bo'lmasa, Scan() o'zgaruvchiga yangi qiymat yoza olmaydi va
xato qaytaradi.
Info
Xotira manzili haqida mana bu Kompyuter va Operatsion tizim maqolasida tanishishingiz mumkin.
Hozircha &ni qiymatni shu o'zgaruvchi turgan manzilga yoz degan ko'rsatma sifatida tushunish yetarli. Xotira manzili va pointerlar
keyingi alohida qismda batafsil tushuntiriladi.
Bir nechta qiymat o'qish
Scan()ga bir nechta o'zgaruvchining manzilini berish mumkin. Qiymatlar terminalda bo'sh joy yoki yangi qator bilan
ajratiladi:
| main.go | |
|---|---|
Natija:
Qiymatlarni alohida qatorlarda ham kiritish mumkin:
fmt.Scan() matnlarni o'qishda bo'sh joygacha o'qiydi. Ya'ni bitta so'z:
| main.go | |
|---|---|
Natija:
Foydalanuvchi Ali Valiyev deb kiritsa, ismga faqat Ali yoziladi. To'liq qator uchun boshqa boshqa funksiyadan
foydalanish kerak.
To'liq ism yoki uzun matnlarni bufio.Reader yordamida bir qator qilib o'qish mumkin:
| main.go | |
|---|---|
Natija:
Bu dasturda:
os.Stdinterminaldan keladigan ma'lumot oqimini bildiradi;bufio.NewReader()shu oqimdan o'qish vositasini yaratadi;ReadString('\n')Enterbosilganda keladigan yangi qator belgisigacha o'qiydi;strings.TrimSpace()matn boshidagi va oxiridagi bo'sh joy hamda yangi qator belgisini olib tashlaydi.
Info
reader.ReadString('\n') ikkita qiymat qaytaradi. Foydalanuvchi kiritgan matn va o‘qish vaqtida yuz berishi mumkin
bo‘lgan xatolik. ism, _ := ... qismida matn ism o‘zgaruvchisiga saqlanadi, _ esa xatolik
qiymatini e’tiborsiz qoldiradi. Goda _ bo‘sh identifikator deb ataladi. Funksiyalar va xatoliklar bilan ishlash
qismlarida bular haqida chuqurroq o'rganamiz.
Keyingi darsda operatorlar va kiritilgan sonlardan foydalanib sodda matematik hisob-kitoblarni ko'rib chiqamiz.
Misollar
1. Ikki sonni bitta qatordan o‘qish
package main
import "fmt"
func main() {
var a, b int
fmt.Print("Ikki son kiriting: ")
fmt.Scan(&a, &b)
fmt.Println("Yig‘indi:", a+b)
}
fmt.Scan() qiymatlarni bo‘sh joy yoki yangi qator bilan ajratib o‘qiydi. &a va &b kiritilgan qiymatlar qayerga yozilishini ko‘rsatadi.
2. Kasrli sonni o‘qish
package main
import "fmt"
func main() {
var narx float64
fmt.Print("Narx: ")
fmt.Scan(&narx)
fmt.Printf("Narx: %.2f\n", narx)
}
float64 uchun kasr ajratuvchi nuqta bilan yoziladi: 12.5.
3. Ha yoki yo‘q qiymatini o‘qish
package main
import "fmt"
func main() {
var faol bool
fmt.Print("Faolmi (true/false): ")
fmt.Scan(&faol)
fmt.Println(faol)
}
bool o‘zgaruvchiga true yoki false matni bevosita o‘qiladi.
4. Fscan bilan o‘qish manbasini ko‘rsatish
package main
import (
"fmt"
"os"
)
func main() {
var son int
fmt.Fscan(os.Stdin, &son)
fmt.Println(son * son)
}
Fscan() ma’lumot manbasini alohida qabul qiladi. Bu yerda manba terminalni bildiruvchi os.Stdin.
5. Butun qatorni o‘qish
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Manzil: ")
manzil, _ := reader.ReadString('\n')
fmt.Println(strings.TrimSpace(manzil))
}
ReadString() bo‘sh joyli matnni ham qator oxirigacha saqlab oladi.
6. Scanner bilan qator o‘qish
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Izoh: ")
scanner.Scan()
fmt.Println("Qabul qilindi:", scanner.Text())
}
Scanner.Text() qator oxiridagi \n belgisini qo‘shmaydi.
7. Birinchi Unicode belgini o‘qish
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Bitta belgi: ")
belgi, baytlar, _ := reader.ReadRune()
fmt.Printf("Belgi: %c, UTF-8 hajmi: %d bayt\n", belgi, baytlar)
}
ReadRune() bitta Unicode belgini o‘qiydi. Ikkinchi natija shu belgi UTF-8 kodlashida necha bayt egallaganini bildiradi.
8. Scanln bilan bitta qatorni o‘qish
package main
import "fmt"
func main() {
var ism, familiya string
fmt.Print("Ism va familiya: ")
fmt.Scanln(&ism, &familiya)
fmt.Println("Salom,", ism, familiya)
}
Scanln() qiymatlarni faqat joriy qator oxirigacha o‘qiydi. Bu misolda ism va familiya alohida o‘zgaruvchilarga yoziladi.
9. Vergul bilan ajratilgan sonlarni o‘qish
package main
import "fmt"
func main() {
var a, b int
fmt.Print("a,b: ")
fmt.Scanf("%d,%d", &a, &b)
fmt.Println(a + b)
}
Scanf() kiritish formatini belgilashga imkon beradi. Bu misolda vergul majburiy ajratuvchi.
10. Kiritishlar sonini tekshirish
package main
import "fmt"
func main() {
var eni, boyi int
n, err := fmt.Scan(&eni, &boyi)
fmt.Println("O‘qilgan qiymatlar:", n)
fmt.Println("Xato:", err)
fmt.Println("Yuza:", eni*boyi)
}
Scan() nechta qiymat muvaffaqiyatli o‘qilgani va yuz bergan xatoni ham qaytaradi. Keyingi darslarda bu natijalarni shart bilan tekshirish o‘rganiladi.