Сохторхо

Пеш аз классхоро мухокима кардан, дар ин дарс мо бо чунин намуди маълумот, ки ба классхо монанд аст шинос мешавем. Дар массивхо якчанд тагйирёбандахо (элементхои массив) зери як ном (номи массив) нигох дошта мешаванд, лекин намуди хамаи ин тагйирёбандахо якхела аст. Сохтор (structure) ин усули нигох доштани тагйирёбандахои намудхои гуногун зери як ном мебошад. Чунин хосияти сохторхо ба мо сохтани барномахоеро, ки дигаргун намудани онхо осонтар аст, имконият медихад. Масалан, сохторхо барои ташкили манбаи маълумотхо (database) кулай мебошанд. Шакли эълони сохтор дар C++ чунин аст:

struct Name {
Variable1;
Variable2;
..........
Variablen;
};

Дар ин чо struct - калимаи махсус, ки барои офаридани сохтор таин шудааст, Name - номи сохторе, ки шумо офарида истодаед, Variable1, Variable2, : , Variable1, - тагйирёбандахое, ки ба ин сохтор дохил мешаванд. Яъне дохили кафсхои фигурави { ва } намуд ва номи тагйирёбандахои ба ин сохтор дохилшаванда, нишон дода мешаванд. Пас сохтор дар асоси намудхои маълум (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() барои чи лозим аст?

Дополнительная информация