Пеш аз синфҳоро муҳокима кардан, дар ин дарс мо бо чунин намуди маълумот, ки ба синфҳо монанд аст шинос мешавем. Дар массивҳо якчанд тағйирёбандаҳо (элементҳои массив) зери як ном (номи массив) нигоҳ дошта мешаванд, лекин намуди ҳамаи ин тағйирёбандаҳо якхела аст. Сохтор (structure) ин усули нигоҳ доштани тағйирёбандаҳои намудҳои гуногун зери як ном мебошад. Чунин хосияти сохторҳо ба мо сохтани барномаҳоеро, ки дигаргун намудани онҳо осонтар аст, имконият медиҳад. Масалан, сохторҳо барои ташкили манбаи маълумот (database) қулай мебошанд. Шакли эълони сохтор дар C++ чунин аст:
struct Name {
Variable1;
Variable2;
..........
Variablen;
};
Дар ин ҷо struct - калимаи махсус, ки барои офаридани сохтор таин шудааст, Name - номи сохторе, ки шумо офарида истодаед, Variable1, Variable2, ..., Variablen, - тағйирёбандаҳое, ки ба ин сохтор дохил мешаванд. Яъне дохили қафсҳои фигуравӣ { ва } намуд ва номи тағйирёбандаҳои ба ин сохтор дохилшаванда, нишон дода мешаванд. Пас сохтор дар асоси намудҳои маълум (int, char ва гайра) ва инчунин сохторҳои пештар офаридашуда сохта мешаванд. Дар охири сохтор мавчуд будани нуқтавергулро низ ба инобат гиред. Барои сохтани тағйирёбандаи намуди Name чунин навиштан зарур аст:
Name name_of_var;
Дар ин ҷо name_of_var - номи тағйирёбандаи намуди Name мебошад. Одатан, тағйирёбандаҳое, ки дар асоси ягон сохтор эълон шудаанд, худашон низ сохтор номида мешаванд. Акнун барои дастрас намудани аъзои сохтори name_of_var ё ки элементи ба сохтори name_of_var дохилшаванда чунин навиштан зарур аст:
name_of_var.Variable
Қайд мекунем, ки дар ин ҷо байни номи сохтор ва номи аъзои (ё ки элементи) ба сохтор дохилшаванда рамзи нуқта истодааст. Масалан,
struct student{
char nasab[20];
char nom[20];
int kurs;
};
ин сохторест, ки дар он ному насаб ва курси донишҷӯро нигоҳ доштан мумкин аст. Барномаи ин сохторро истифодабарандаро месозем:
//namuna30.cpp
using namespace std;
#include <fstream>
#include <iostream>
struct student {
char nasab[20];
char nom[20];
int kurs;
};
int main() {
student x;
char a='h';
ofstream db("c:\\student.txt", ios::app);
if(!db.is_open()) {
cout<<"Khatogi bo sokhtani manba'!"<<endl;
return 0;
}
while(a=='h') {
cout<<"Ma'lumot dar borai student"<<endl;
cout<<"Nasab: ";
cin>>x.nasab;
cout<<"Nom: ";
cin>>x.nom;
cout<<"Kurs: ";
cin>>x.kurs;
db<<x.nasab<<","<<x.nom<<","<<x.kurs<<endl;
cout<<"Boz ma'lumot dokhil mekuned?(h-ha, n-ne) ";
cin>>a;
cin.ignore();
}
db.close();
return 0;
}
Дар ин барнома сохтори student тартиб дода шудааст, ки он аз се элемент иборат аст:
char nasab[20] - сатр барои нигоҳ доштани номи студент;
char nom[20] - сатр барои нигоҳ доштани номи студент;
int kurs - адади бутун барои нигоҳ курси студент.
Дар оператори ofstream db("student.txt", ios::app) файли student.txt барои сабт ба давоми он кушода шудааст, агар файли student.txt мавҷуд набошад, он сохта мешавад. Баъд тағйирёбандаи x-и намуди student эълон карда шудааст. Барои ягон аъзои ин тағйирёбандаро дастрас намудан x, нуқта ва номи тағйирёбандаро (nasab, nom ё int), навишта шудааст.
Инчунин имконпазир аст, ки функсия ҳамчун натиҷа ягон сохторро бозгардонад. Барномаи зерин аз файли student.txt маълумот дар бораи донишҷӯёнро хонда, онро коркард мекунад:
//namuna31.cpp
using namespace std;
#include <iostream>
#include <fstream>
#include <stdlib.h>
struct student {
char nasab[20];
char nom[20];
int kurs;
};
struct student record(char *s) {
student y;
char k[10];
int i, l;
for(i=0;s[i]!=',';i++)
y.nasab[i]=s[i];
y.nasab[i]='\0';
i++;
for(l=0;s[i]!=',';i++,l++)
y.nom[l]=s[i];
y.nom[l]='\0';
i++;
for(l=0;s[i]!='\0';l++,i++)
k[l]=s[i];
k[l]='\0';
y.kurs=atoi(k);
return y;
}
int main() {
char s[256];
student x;
ifstream db("c:\\student.txt", ios::in);
db.getline(s,256);
while(!db.eof()) {
x=record(s);
x.kurs++;
cout<<x.nasab<<","<<x.nom<<","<<x.kurs<<endl;
db.getline(s,256);
}
db.close();
return 0;
}
Дар ин ҷо функсияи record ҳамчун натиҷа сохтори student-ро бозмегардонад. Функсияи atoi() барои пайдарпаии рамзҳоро ба адади бутун табдил додан истифода шудааст.
Агар зарурияти истифодаи ишоракунак ба сохтор пайдо шавад, барои дастрас намудани маълумоти дар сохтор буда, оператори -> ба ҷои нуқта истифода бурда мешавад. Мисол:
//namuna32.cpp
using namespace std;
#include <iostream>
#include <fstream>
#include <stdlib>
struct student {
char nasab[20];
char nom[20];
int kurs;
};
record(char *s, student *y) {
char k[20];
int i, l;
for(i=0;s[i]!=',';i++)
y->nasab[i]=s[i];
y->nasab[i]='\0';
i++;
for(l=0;s[i]!=',';i++,l++)
y->nom[l]=s[i];
y->nom[l]='\0';
i++;
for(l=0;s[i]!='\0';l++,i++)
k[l]=s[i];
k[l]='\0';
y->kurs=atoi(k);
return;
}
int main() {
char s[256];
student x;
ifstream db("c:\\student.txt", ios::in);
db.getline(s,256);
while(!db.eof()) {
record(s,&x);
x.kurs++;
cout<<x.nasab<<","<<x.nom<<","<<x.kurs<<endl;
db.getline(s,256);
}
db.close();
return 0;
}
Дар ҳолати мураккабу калонҳаҷм будани сохтор усули дар мисоли namuna32 истифодашуда аз namuna31 аз ҷиҳати сарфаи хотира беҳтар аст.
Инчунин қайд кардан зарур аст, ки барои нигоҳ доштани сабтҳо аз системаҳои махсус барои ин масъала офаридашуда ба монанди Microsoft SQL Server, MySQL, PostgreSQL, Oracle ва ё дигар истифода мебаранд.
САВОЛҲО БАРОИ МУСТАҲКАМКУНӢ
1. Тарзи муайян кардани сохтор чӣ гуна аст?
2. Барои элементи сохторро дастрас намудан аз кадом рамзҳо истифода мебаранд?
3. Ҳангоми истифодаи ишоракунак ба сохтор, барои элементи сохторро дастрас намудан аз кадом рамзҳо истифода мебаранд?
4. Функсия atoi() барои чӣ лозим аст?