1. Axın std::cin və >> operatoru ilə tokenlərin oxunması
Proqram yalnız çap edəndə radioya bənzəyir: boşluqda nəsə deyir və kimsə dinləyəcək ümid edir. Amma giriş olanda proqram dialoqa çevrilir: siz məlumat verirsiniz, o cavab verir. C++-da giriş adətən std::cin vasitəsilə edilir. cin-i simvollardan ibarət lent (axın) kimi təsəvvür etmək faydalıdır: orada istifadəçinin yazdıqları, o cümlədən boşluqlar və sətirsonları yerləşir.
Ən vacib məqam: >> operatoru “hər şeyi ardıcıl” oxumur, o, bir dəfə üçün bir məlumat porsiyasını oxuyur. Və bu “porsiya” adətən boşluq simvolları ilə məhdudlaşır.
std::cin və >>: dəyəri dəyişənə oxumaq
Nəsə oxumaq üçün onu yerləşdirəcəyimiz dəyişən lazımdır. Məntiq belədir: dəyişəni elan edirsiniz → ora məlumat oxuyursunuz → daha sonra istifadə edirsiniz (məsələn, çap edirsiniz).
Minimal nümunə: bir tam ədəd oxuyuruq.
#include <iostream>
int main() {
int age = 0;
std::cin >> age;
std::cout << "Age = " << age << '\n'; // əgər 20 daxil edilibsə, çıxış olacaq: Age = 20
}
Burada iki şeyi qeyd etmək vacibdir. Birincisi, std::cin >> age; növbəti dəyəri girişdən oxuyub age-ə yazmağa cəhd edir. İkincisi, dəyişənin tipi önəmlidir: age int olduğuna görə proqram girişdə ədəd gözləyir (məsələn, 20, -5, 0).
Necə oxuyur >>: token və boşluq ayırıcıları
İndi söz «token» olacaq, amma qorxmayın: bu sadəcə «boşluqsuz mətn parçası» deməkdir. >> operatoru belə işləyir: “Boşluqları keç, sonra növbəti boşluğa qədər ardıcıl simvolları götür”. Boşluq dedikdə yalnız ' ' (adi boşluq) yox, həmçinin sətirsonu '\n' və tabulyasiya '\t' nəzərdə tutulur.
Təsəvvür edin istifadəçi belə bir sətir daxil edib (simvol ⏎ Enter-dir, yəni '\n'):
12 34 ⏎
12 ilə 34 arasında üç boşluq var. >> üçün bu əhəmiyyətli deyil: o “ədəd”, sonra “boşluqlar”, sonra “ədəd” görür.
#include <iostream>
int main() {
int a = 0;
int b = 0;
std::cin >> a >> b;
std::cout << "a=" << a << ", b=" << b << '\n'; // giriş "12 34" zamanı: a=12, b=34
}
Nəzərinizə çatdırım: std::cin >> a >> b; — bu iki oxuma əməliyyatı ardıcıl yazılıb. Əvvəlcə a, sonra b oxunur.
Ayırıcılar: boşluq, Enter və tabulyasiya tokenləri eyni şəkildə “kəsir”
Bəzən yeni başlayan proqramçı Enter-in boşluqdan “daha güclü” olacağını gözləyir, ya da boşluğun “yalnız gözəlik üçün” olduğunu düşünür. operator>> üçün isə hər bir boşluq simvolu tokenin sərhədidir və başqa bir şey yoxdur.
Təsəvvür edək belə giriş var (hər sözü yeni sətrə yazmaq):
Ivan⏎
Ivanov⏎
və belə giriş (hər iki söz bir sətirdə):
Ivan Ivanov⏎
Aşağıdakı kod üçün nəticə eyni olacaq, çünki həm boşluq, həm də Enter tokenləri ayırır.
#include <iostream>
#include <string>
int main() {
std::string first;
std::string last;
std::cin >> first >> last;
std::cout << first << " | " << last << '\n'; // Ivan | Ivanov
}
Bu yaxşı xəbərdir: məlumatları “rahat” formada daxil etmək olar (tək sətirdə və ya bir neçə sətirdə). Amma məhz buna görə də növbəti bölmədə danışacağımız məhdudiyyətlər yaranır.
Mini-sxem: >> girişə necə tokenləri “kəsir”
Girişi sehr kimi qəbul etməmək üçün modeli bir dəfə görmək faydalıdır. Məsələn, istifadəçi belə daxil edib:
23 Ada Lovelace⏎
Onda simvol axınını ağlınızda tokenlərə belə parçalamaq olar:
flowchart LR
A["23"] --> B["Ada"] --> C["Lovelace"]
Boşluqlar və sətirsonları isə tokenlər arasında sadəcə “ayırıcı qarışıq” kimidir və atılır.
Praktik nəticə: əgər əvvəlcə int, sonra std::string oxuyursunuzsa, int ilk tokeni “yuyacaq”, sonra std::string növbəti tokeni oxuyacaq. >> səviyyəsində “yeni sətirdə daxil edin” kimi əlavə razılaşma yoxdur — o hər halda boşluqlara görə ayırır.
2. Təcrübə: mini-anket və boşluqsuz sətirlər
Praktik nümunə: mini-anket hazırlayırıq
İndi bir mini-proyekt aparacağıq: konsol anketi. Sadədir, lakin bacarıqları artırmaq üçün əlverişlidir: bu gün tokenləri oxuyuruq, sonra isə tam sətirləri oxumağı və girişi düzgün işləməyi öyrənəcəyik.
Versiya 1: yaş və ad (bir söz kimi) oxunur.
#include <iostream>
#include <string>
int main() {
int age = 0;
std::string name;
std::cin >> age >> name;
std::cout << "User: " << name << '\n';
std::cout << "Age: " << age << '\n';
}
Əgər daxil etsəniz:
20 Ivan
proqram çıxış verəcək:
User: Ivan
Age: 20
Həmçinin belə də daxil etmək olar (Enter ilə ayrılmış):
20
Ivan
>> üçün bu eynidir: tokenlər ardıcıl şəkildə oxunur.
>> ilə sətirlərin oxunması: sözü oxuyur, cümləni yox
İndi klassik sürprizə gəlirik: std::cin >> s üçün std::string yalnız bir sözü oxuyur, yəni boşluq/Enter/tab-ə qədər tokeni. Bir neçə söz daxil etsəniz, onlar yox olmayacaq, sadəcə giriş axınında növbəti tokenlər kimi qalacaq və sonrakı >> əməliyyatları onları oxuyacaq.
Anket nümunəsində göstərəək: “şəhər” sahəsini string kimi oxuyuruq.
#include <iostream>
#include <string>
int main() {
std::string city;
std::cin >> city;
std::cout << "City=[" << city << "]\n";
}
İstifadəçi daxil etsə:
New York
onda city "New" olacaq, və "York" növbəti token kimi giriş axınında qalacaq. Proqram göstərəcək:
City=[New]
Bu bug deyil və “pis C++” deyil. Bu >> operatorunun normal məntiqidir: o bir token oxuyur.
Nümunə təcrübə: “itkin” söz əslində itmir
Birinci string dəyişənə sığmayan və ya ilk oxumada görünməyən söz adətən yox olmur. O sadəcə növbəsini gözləyir. Bunu göstərmək üçün iki sözü iki dəyişənə oxuyaq.
#include <iostream>
#include <string>
int main() {
std::string w1;
std::string w2;
std::cin >> w1 >> w2;
std::cout << "w1=[" << w1 << "], w2=[" << w2 << "]\n";
}
Əgər daxil etsəniz:
New York
çıxış olacaq:
w1=[New], w2=[York]
Yəni >> “ayrı sözlər daxil edilir” formatı üçün çox uyğundur (ad, soyad, komanda, login). Amma “ünvan” və ya “kitabın adı” kimi sahələr üçün uyğun deyil, çünki orada adətən boşluq olur.
Qaydalar: >> üçün nə ayırıcı sayılır
Kiçik proqramlar yazmağa başlayanda tez-tez özünüzdən soruşacaqsınız “nə üçün burada dayandı?”. Adətən cavab aşağıdakı cədvəldədir:
| Girişdəki simbol | Nümunə | >> üçün bu… | Nə baş verir |
|---|---|---|---|
| boşluq ' ' | |
ayırıcı | >> ilə oxunan sətir yalnız Ivan-ı oxuyacaq |
| sətirsonu '\n' (Enter) | |
ayırıcı | davranış boşluqla eynidir |
| tabulyasiya '\t' | |
ayırıcı | tokenlər də bölünür |
Nəticə sadədir: >> “ən yaxın boşluğa qədər” oxuyur.
std::cin >> üçün uyğun giriş formatını necə seçmək
std::cin >> seçmək o deməkdir ki, siz formatı seçirsiniz: “istifadəçi dəyərləri ayrı-ayrı tokenlər kimi daxil edir”. Bu, giriş “iki ədəd”, “üç ədəd”, “söz və ədəd”, “ad və soyad”, “komanda və parametr” kimi formatlar üçün ideal uyğun gəlir.
Məsələn, bizim anketimiz tokenlərə yaxşı uyğundur, əgər əvvəlcədən razılaşmışıqsa ki, ad və soyad ayrı-ayrı daxil ediləcək. Onda proqramı rahat genişləndirmək olar: ad, soyad və yaşı oxuyuruq.
#include <iostream>
#include <string>
int main() {
std::string first;
std::string last;
int age = 0;
std::cin >> first >> last >> age;
std::cout << "Profile: " << first << " " << last << '\n';
std::cout << "Age: " << age << '\n';
}
Əgər daxil etsəniz:
Ada Lovelace 36
hər şey düzgün oxunacaq: üç token → üç dəyişən.
Kiçik nüans: >> boşluqları məlumat kimi “yutmur”
“Boşluq — ayırıcıdır” dedikdə başa düşmək lazımdır: boşluq tokenin oxunan dəyərinə daxil olmur. O, yalnız tokenin başlanğıcı və sonunu ayırır. Buna görə də std::string word; üçün std::cin >> word; heç vaxt "Hello world" kimi boşluqlu frazanı tam olaraq oxumayacaq: tokenin tərifi üzrə içində boşluq ola bilməz.
Əgər tam sətiri, o cümlədən boşluqları oxumaq istəyirsinizsə, başqa vasitə lazımdır. Biz bu dərsdə qabağa keçmirik: hədəfimiz >> operatorunu yaxşı mənimsəmək və ondan nə gözləmək lazım olduğunu bilməkdir.
3. >> məhdudiyyətləri: tip uyğunsuzluğu və təhlükəsiz mətn oxuma
Tip sizin istəyinizdən daha vacib ola bilər: oxumaq “sındırıla” bilər
İkinci böyük məhdudiyyət qrupu tip uyğunsuzluğudur. Əgər int oxuyursunuzsa, istifadəçi “söz” daxil edərsə proqram “kotik” sözünü ədədə dürüst şəkildə çevirə bilməz.
Məntiqi ssenarini göstərək: insan səhvən yaşı sözlə yazır.
#include <iostream>
#include <string>
int main() {
int age = 0;
std::string name;
std::cin >> age >> name;
std::cout << "age=" << age << ", name=" << name << '\n';
}
Əgər daxil edilsə:
twenty Ivan
proqram age-i düzgün ədəd kimi oxuya bilməyəcək. Biz bu dərsdə belə girişləri “gözəl” şəkildə düzəltməyi hələ öyrənməmişik (kursun daha sonra ayrıca mövzusu olacaq). Odur ki, sadə və dürüst qayda: əgər giriş formatı verilibsə, istifadəçi həmin formatda dəyərlər daxil etməlidir.
Niyə sətrləri std::string-də oxuyuruq, char[]-də yox
Köhnə C/C++ nümunələrində bəzən belə yazılar görmək olar: char name[20]; sonra std::cin >> name;. Bu işləyir, amma təhlükəlidir: əgər istifadəçi çox uzun söz daxil etsə, bu buffer overflow-a qədər problem yarada bilər.
Biz hələ massivlər və pointerləri dərindən öyrənməmişik, ona görə praktik qayda: mətn üçün std::string istifadə edin — o simvollar üçün daha təhlükəsiz konteynerdir.
4. std::cin >> ilə işləyərkən tipik səhvlər
Səhv №1: std::cin >> s;-in bütün cümləni oxuyacağını gözləmək.
Bu ən çox rastlanan tələlərdən biridir. Yeni başlayan insan New York daxil edir, amma dəyişəndə yalnız New qalır. Səbəb sadədir: >> boşluğa qədər tokeni oxuyur. Əgər mənəvi baxımdan sizə boşluqlu mətn lazımdırsa, >> bu format üçün uyğun deyil.
Səhv №2: oxumadan əvvəl dəyişəni elan etməməklə bağlıdır.
Bəzən yazmaq istəyirsən “yaşı oxu” amma dəyişən olmadan. std::cin “heç yerə” oxuya bilməz. Əvvəl müvafiq tipdə dəyişən elan edilir (int age = 0;), sonra std::cin >> age; icra olunur. Bu formal deyil: dəyişən yaddaşda nəticənin düşəcəyi yerdir.
Səhv №3: oxuma sırasını və məlumatların sırasını qarışdırmaq.
Əgər proqram std::cin >> age >> name; edirsə, amma istifadəçi Ivan 20 daxil edirsə, age Ivan-ı almağa çalışacaq (bu ədəd deyil) və oxuma düzgün getməyəcək. >>-ın telepatiyası yoxdur: o tokenləri sərt ardıcıllıqla oxuyur və onları göstərilən tipə yerləşdirməyə cəhd edir.
Səhv №4: Enter-in proqram üçün “girişi bitirdiyini” düşünmək.
Enter yalnız giriş axınına '\n' simvolunu əlavə edir. >> üçün bu adi boşluq kimi bir ayırıcıdır. Odur ki, “yeni sətirdə daxil etmək” və “boşluqla daxil etmək” çox vaxt ekvivalentdir. Bu rahatdır, amma əgər siz girişin “sətir-sətrə” olduğunu fikirləşmisinizsə gözlənilməz ola bilər.
Səhv №5: yanlış tip daxil edib qəribə nəticələrə təəccüblənmək.
Əgər int gözlənilirsə, ten kimi giriş >> operatoru tərəfindən düzgün ədədə çevrilə bilməz. Kursun bu mərhələsində belə girişləri “gözəl” düzəltmirik, ona görə tədris tapşırıqları üçün ən yaxşı yol — giriş formatına diqqətlə əməl etmək və dəyərləri proqramın gözlədiyi şəkildə daxil etməkdir.
GO TO FULL VERSION