Дарси 26. Ишоракунак ва сатр дар C++ - Технологияи иттилоотӣ — синфи 11
Ишоракунак ва суроға
Барои нигоҳ доштани қимати ҳар объекти барнома миқдори муайяни байтҳо ҷудо мешавад. Тағйирёбанда ном ва суроға дорад: суроға – шумораи катаки хотира. Дар барнома ба тағйирёбанда бо ном муроҷиат мекунем.
Ишоракунак – ин ҳам тағйирёбанда аст, вале қимати он – суроғаи объекти дигар. Агар x суроғаи y-ро дошта бошад, мегӯянд: «x ба y ишора мекунад».
Ду амал бо ишоракунак:
& (амали унарӣ): &tr – суроғаи tr. Масалан, abc = &tr; – ба abc суроғаи tr дода мешавад, на қимати он.
* (амали унарӣ): *abc – қимати катаке, ки abc ба он ишора мекунад. Масалан, mfa = *abc; – ба mfa қимати tr дода мешавад.
Аломати * ҳамон *-и зарб аст, вале маъно дигар: агар пеш аз он операнд набошад (амали унарӣ), ин «қимати суроға» аст; агар ду операнд бошад (бинарӣ), ин зарб аст.
Натиҷа:
Нигоҳ кунед: суроғаро чоп накардем. Дар баъзе мисолҳои кӯҳна суроға чун 0xfff4 чоп мешуд, вале дар компютери шумо суроға ҳамеша дигар мешавад (ҳар иҷро – дигар), бинобар ин (abc == &tr)-ро санҷидем: суроғаи дар abc бо суроғаи tr мувофиқ аст – 1.
Хотира: ишоракунак ва катаксанҷида бин!
навбатӣТакрор ва санҷиш · Боби 1
1 соат · санҷиш дар синф, такрор дар хона
Тавассути ишоракунак катакро тағйир додан мумкин аст:
Сатр
Сатр – пайдарпайии аломатҳо; шумораи аломатҳо дарозии сатр аст. Дар C++ ду намуди сатр ҳаст:
- сатр ҳамчун массиви аломатҳо (
char), ки бо рамзи махсуси \0 (сифр) тамом мешавад;
- сатр ҳамчун объекти навъи
string.
Масалан, char satr[11]; – массиви сатр, ки аз 10 аломати асосӣ иборат аст. Ҷузъи 11-ум – рамзи \0, ки дар охири сатр меистад. Пас барои k ҳарф k+1 катак лозим аст.
Ҳамин «11 10 0»: массив 11 катак дорад, дарозии сатр 10 ва ҷузъи охирин – сифр.
Хотира: сатр ва рамзи \0санҷида бин! Доимии сатрӣ – аломатҳои дар нохунак гирифташуда: «Tojikiston», «C++». Дар охири он \0-ро навиштан лозим нест: компилятор худаш илова мекунад. Сатри холӣ (сифрӣ) – сатре, ки танҳо \0 дорад.
Навъи string ном дорад (ҷузъиёти он – дар курсҳои барномасозии пешрафта): барои пайвастан ва ченкунӣ осон аст.
Воридкунии сатр
Сатрро бо cin дохил мекунанд, вале диққат: ҳамин ки сатр фосила дошта бошад, cin >> ҳамон ҷо қатъ мешавад.
Танҳо калимаи якум чоп шуд. Барои тамоми сатр (то Enter) cin.getline(satr, 50) истифода мебаранд: аргумент якум – массив, дуюм – ҳадди аксари аломатҳо.
Лаборатория чунин менависад:
Ба ҷояш ҳамеша cin.getline(satr, 50).
Функсияҳои сатрӣ
Барои функсияҳои зерин парвандаи <string.h> лозим аст (дар C++: <cstring>).
| Функсия | Вазифа |
|---|
strcpy(s1, s2) | нусхаи s2-ро ба ҷойи s1 мегузорад (s1 калонтар бошад) |
strcat(s1, s2) | s2-ро ба охири s1 мепайвандад |
strcmp(s1, s2) | муқоиса: сифр – сатрҳо яксон; манфӣ – s1 пештар; мусбат – s1 баъдтар |
strlen(s) | дарозии сатр (бе \0) |
strcmp ҳарфҳоро аз чап ба рост ҳарф ба ҳарф муқоиса мекунад, ба шумораи ҳарфҳо нигоҳ намекунад. Аввалин ҳарфи гуногун ҷавобро мегӯяд.
Се функсияи дигар – strlwr (ҳарфҳои калонро хурд мекунад), strupr (хурдро калон мекунад), strset(s, r) (ҳамаи аломатҳоро бо r иваз мекунад) – танҳо бо ҳарфҳои лотинӣ кор мекунанд ва дар баъзе компиляторҳои Windows (Dev-C++) ҳастанд, на дар стандарти C++. Лабораторияи мо онҳоро дорад:
Мисоли 1. Дарозии ду сатрро ҳисоб мекунем, онҳоро пайваст мекунем ва натиҷаро чоп мекунем.
strcpy сатрҳоро пур кард, strlen дарозиро шумурд (8 ва 22), strcat(Q1, Q2) Q2-ро ба охири Q1 пайваст кард (дарозӣ 8+22=30).
Кор дар синф
Лаборатория
Се барномаи аввал – барои озмоиш. Баъд чор супориш: ишоракунак, дарозии сатр, пайвастан, суммаи рақамҳо.
Лабораторияи C++: ишоракунак ва сатрсанҷида бин! Машқҳо
Саволҳо. Шифоҳӣ ҷавоб гӯед.
2. Бо ишоракунак кадом амалҳоро иҷро кардан мумкин аст?
3. Дар C++ зери мафҳуми сатр чӣ фаҳмида мешавад?
4. Дар мавриди истифодаи функсияҳои сатрӣ дар барнома бояд номи кадом парвандаи сарлавҳавӣ ба қайд гирифта шавад?
5. Сатрро бо чанд тарз дохил кардан мумкин аст?
6. Дар кадом маврид функсияи strcmp қимати манфиро ҳосил мекунад?
Супоришҳо. Мустақилона иҷро кунед.
7. Матни мавзуъро бодиққат хонед ва онро нақл кунед.
8. Ҳар як функсияи коркарди сатриро бо мисолҳои мушаххас шарҳ диҳед.
9. Бо истифода аз мафҳуми сатр барномаи ёфтани суммаи рақамҳои адади натуралии n-ро тартиб диҳед.
Вазифаи хонагӣ
- Саволҳои 1–6 ва супоришҳои 7, 8-ро барои ҷавоби шифоҳӣ омода кунед.
- Супориши 9-ро дар лаборатория иҷро кунед (супориши 4).
- Вазифаи хонагии онлайнро («ТИ 11 · Вазифаи хонагӣ · Дарси 26») дар саҳифаи «Супоришҳо» иҷро кунед, агар омӯзгор таъин карда бошад.
Хулоса
- Ишоракунак:
int *p = &x;. &x – суроға, *p – қимати катаки p ишора мекунад.
- Бо
*p = ... катаки x-ро тағйир додан мумкин аст.
- Сатр –
char бо \0 дар охир; барои k ҳарф – k+1 катак.
cin >> – то фосила; cin.getline(s, n) – то Enter; gets дигар нест.
strcpy, strcat, strcmp, strlen – дар <string.h>.
Дар ин дарс
- мефаҳмед, ки суроға ва ишоракунак чист, ва
& ва *-ро истифода мебаред;
- мефаҳмед, ки сатр – массиви ҳарфҳо бо рамзи
\0 дар охир аст;
- сатрро бо
cin ва cin.getline мехонед ва фарқи онҳоро мегӯед;
- бо
strcpy, strcat, strcmp, strlen кор мекунед.
Такрор (2 дақиқа)
- Массиви
char s[6] чанд ҷузъ дорад ва охирини он кадом аст?
- Чӣ тавр бо истинод ду ном як катакро нишон медиҳанд?
- Чӣ фарқ дорад
a[3] аз a[2][3]?
Ҷавоб
- 6 ҷузъ; охирин
s[5]. 2. int &r = x; – r ва x як катак. 3. a[3] – ҷузъи якченака; a[2][3] – ҷузъи сатри 2 ва сутуни 3-и матритса.
Вазъият барои андешаронӣШумо дӯстатонро ба хонаатон даъват мекунед. Ба вай чӣ медиҳед – худи хона ё суроғаи хона? Дар барнома ҳам: ба функсия ё ба тағйирёбанда «суроға»-и катак додан мумкин аст – ва он бо ёрии суроға катакро тағйир дода метавонад.
ТаърифМасалан, int *ix; – ишоракунак ба int, double *dx; – ба double. Аломати * пеш аз ном тағйирёбандаро ишоракунак мекунад.
ИмрӯзДар барномаҳои кӯҳна сатри пурраро бо функсияи gets(satr) мехонданд. Он аз C++ соли 2014 хориҷ шудааст: сабаб он, ки gets андозаи массивро намедонад ва ба хатоҳои ҷиддӣ оварда мерасонад. Ҳоло чунин барнома тарҷума намешавад:
Калимаҳои калидӣсуроғаишоракунаксатррамзи \0сатри холӣstrcpystrcatstrcmpstrlen
Ман дар ин дарс чӣ омӯхтам?Кадомашро аллакай метавонед ва кадомашро боз машқ мекунед?
- ✓ Ман
& ва *-ро мефаҳмам.
- ✓ Ман медонам, ки сатр бо
\0 тамом мешавад.
- ✓ Ман сатри пурраро бо
cin.getline мехонам.
- ✗ Ман ҳоло боз ба машқ ниёз дорам: ____________
Нависед: барои чӣ дар char s[10] 10 ҳарф ҷой намешавад?
#include <iostream>
using namespace std;
int main() {
int tr = 0, mfa = 0;
int *abc;
tr = 2008;
abc = &tr;
mfa = *abc;
cout << tr << endl;
cout << mfa << endl;
cout << (abc == &tr) << endl;
return 0;
}
Як ҷавобро интихоб кунед
Вуруд: «Salom dunyo». Чӣ чоп мешавад?
Як ҷавобро интихоб кунед
Дар int *p = &x; ифодаи &x чиро медиҳад?
Як ҷавобро интихоб кунед Натиҷаи strcmp("Salom", "Salon") чӣ аст?
Як ҷавобро интихоб кунед Кадом хато дорад: char s[5] = "Salom";?
Як ҷавобро интихоб кунед Satrro dokhil kuned: Tojikistoni sohibistiqlol
Satri voridshuda: Tojikistoni
Satrro dokhil kuned: Tojikistoni sohibistiqlol
Satri voridshuda: Tojikistoni sohibistiqlol
Хатои тарҷума: Функсияи gets аз C++ бароварда шудааст, чунки хатарнок аст: ба ҷойи он cin.getline(s, андоза) нависед.
Darozii Q1: 8
Darozii Q2: 22
Asri XXI- asri technologiyahoi
30
#include <iostream>
using namespace std;
int main() {
int tr = 2008;
int *abc = &tr;
*abc = 2025;
cout << tr << endl;
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char satr[11] = "Tojikiston";
cout << sizeof(satr) << " ";
cout << strlen(satr) << " ";
cout << (int)satr[10] << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string a = "Salom", b = " dunyo";
string c = a + b;
cout << c << " " << c.size() << endl;
return 0;
}
#include <iostream>
using namespace std;
int main() {
char satr[50] = "";
cout << "Satrro dokhil kuned: ";
cin >> satr;
cout << "Satri voridshuda: ";
cout << satr << endl;
return 0;
}
#include <iostream>
using namespace std;
int main() {
char satr[50] = "";
cout << "Satrro dokhil kuned: ";
cin.getline(satr, 50);
cout << "Satri voridshuda: ";
cout << satr << endl;
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char satr[50];
gets(satr);
cout << satr << endl;
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char a[20] = "Salom";
char b[20] = "Salom";
char c[20] = "Salon";
cout << (strcmp(a, b) == 0) << " ";
cout << (strcmp(a, c) < 0) << " ";
cout << (strcmp(c, a) > 0) << endl;
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char s[20] = "Salom";
strupr(s);
cout << s << endl;
strlwr(s);
cout << s << endl;
strset(s, '*');
cout << s << endl;
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main() {
char Q1[50], Q2[50];
strcpy(Q1, "Asri XXI");
strcpy(Q2, "- asri technologiyahoi");
cout << "Darozii Q1: " << strlen(Q1);
cout << endl;
cout << "Darozii Q2: " << strlen(Q2);
cout << endl;
strcat(Q1, Q2);
cout << Q1 << endl;
cout << strlen(Q1) << endl;
return 0;
}
int x = 7;
int *p = &x;
*p = *p + 3;
cout << x << " " << *p;
#include <string.h>
cout << strlen("Salom");
char s[50] = "";
cin >> s;
cout << s;