Section 4

4-dars — Foydalanuvchidan kiritish

fmt.Scan, & (pointer) operatori, Scan cheklovlari va profit kalkulyatori mashqi


Hozirgacha qiymatlarni kod ichida o'zimiz yozardik. Endi dasturni foydalanuvchidan so'rashga o'rgatamiz — u terminalga raqam kiritadi, dastur o'qib oladi.

fmt.Scan bilan o'qish

fmt paketi nafaqat ekranga chiqarish, balki terminaldan ma'lumot o'qish funksiyasini ham beradi — bu Scan. U terminalni foydalanuvchi kiritishi uchun "skanerlaydi".

package main
 
import (
	"fmt"
	"math"
)
 
func main() {
	const inflationRate = 2.5
	var investmentAmount float64
	var years float64
	expectedReturnRate := 5.5
 
	fmt.Print("Investment Amount: ")
	fmt.Scan(&investmentAmount)
 
	fmt.Print("Expected Return Rate: ")
	fmt.Scan(&expectedReturnRate)
 
	fmt.Print("Years: ")
	fmt.Scan(&years)
 
	futureValue := investmentAmount * math.Pow(1+expectedReturnRate/100, years)
	futureRealValue := futureValue / math.Pow(1+inflationRate/100, years)
 
	fmt.Println(futureValue)
	fmt.Println(futureRealValue)
}

Dasturni ishga tushirsangiz, u to'xtab, sizdan raqam kutadi. Yozib Enter bossangiz — davom etadi.

Foydalanuvchiga nima kutilayotganini bildirish uchun Scan dan oldin Print bilan kichik xabar chiqaramiz ("Investment Amount: "). Println emas, Print — chunki foydalanuvchi javobini shu qatorga yozsin.


Qiymatsiz e'lon

var investmentAmount float64

Bu yerda = ... yo'q — qiymatni foydalanuvchi beradi, shuning uchun Go null qiymat (0) qo'yadi.

Diqqat: bunday holatda tipni qo'lda yozish shart (float64), chunki boshlang'ich qiymat yo'q — Go tipni o'zi aniqlay olmaydi. Va := ishlatib bo'lmaydi (:= qiymat talab qiladi). Qiymatsiz e'lon faqat var + tip bilan bo'ladi.


& operatori — eng muhim joy

Diqqat qiling:

fmt.Scan(&investmentAmount)

Nega & belgisi bor? Scan foydalanuvchi kiritgan qiymatni o'zgaruvchining ichiga yozishi kerak. Buning uchun unga o'zgaruvchining manzili (xotirada qayerda turishi) kerak — qiymati emas.

  • investmentAmount → qiymatni beradi (masalan 0)
  • &investmentAmount → o'zgaruvchining manzilini beradi ("qiymat shu yerda turibdi")

& ni shunday o'qing: "...ning manzili". Bu manzil pointer (ko'rsatkich) deyiladi. Scan shu manzilga borib, yangi qiymatni yozadi.

Pointerlar Go'da muhim va murakkabroq mavzu — keyinroq chuqur o'rganamiz. Hozircha shuni bilsangiz yetarli: Scan ga &o'zgaruvchi uzatiladi. & ni unutsangiz, dastur kiritilgan qiymatni saqlay olmaydi — bu boshlovchilar tez-tez qiladigan xato.

Aytgancha, Scan o'zi ham natija qaytaradi (nechta qiymat o'qigani), lekin bu yerda u bizga kerak emas, e'tibor bermaymiz.


fmt.Scan cheklovi

Scan bitta so'z yoki raqamni oson o'qiydi, lekin bir nechta so'zdan iborat matnni (masalan to'liq ism, bo'shliq bilan) qiyin o'qiydi. Hozircha bizga faqat raqamlar kerak, shuning uchun bu muammo emas. Murakkabroq kiritish kerak bo'lganda, kursning keyingi qismlarida muqobil usullarni ko'rasiz.


Mashq: profit kalkulyatori

Endi bilganlaringizni yangi dasturda qo'llang. Foydalanuvchidan Revenue (daromad), Expenses (xarajat), Tax Rate (soliq %) so'rab, foydani hisoblang:

package main
 
import "fmt"
 
func main() {
	var revenue float64
	var expenses float64
	var taxRate float64
 
	fmt.Print("Revenue: ")
	fmt.Scan(&revenue)
 
	fmt.Print("Expenses: ")
	fmt.Scan(&expenses)
 
	fmt.Print("Tax Rate: ")
	fmt.Scan(&taxRate)
 
	ebt := revenue - expenses          // soliqdan oldingi foyda (EBT)
	profit := ebt * (1 - taxRate/100)  // soliqdan keyingi foyda
	ratio := ebt / profit
 
	fmt.Println(ebt)
	fmt.Println(profit)
	fmt.Println(ratio)
}

Maslahat: revenue, expenses, taxRate ni float64 qiling — shunda foydalanuvchi 25.8 kabi kasrli qiymat ham kirita oladi va konvertatsiya kerak bo'lmaydi.


O'zingiz sinab ko'ring

  1. Investitsiya kalkulyatorini ishga tushiring va turli qiymatlar kiriting.
  2. Bitta & ni o'chirib ko'ring (masalan fmt.Scan(years)) — qanday xato chiqadi?
  3. var years float64 dan float64 ni olib tashlang — qanday xato chiqadi? Nega?
  4. Profit kalkulyatorini o'zingiz boshidan yozing (qoraga qaramasdan).

3-dars · → 5-dars — Stringlarni formatlash