Құрылымы өзгеретін айнымалылар
Программаның кейбір объектілері өте жиі кейбір бөлшектерімен ғана өзгешеленетін бір ғана класқа жатады. Мысалға геометриялық фигуралардың көрінісін қарастырамыз. Фигуралар туралы жалпы ақпарат аудан, периметр сияқты элементтер туралы болуы мүмкін. Дегенмен, сәйкес геометриялық өлшемдер туралы ақпарат олардың формасына байланысты әр түрлі болуы мүмкін.
Геометриялық фигуралар туралы ақпарат құрылым мен біріктіруді қиыстырып пайдалану негізінде көрсетілетін мысалды қарастырамыз.
struct figure {
double area, perimetr; /* жалпы компоненттер */
int type; /* компонент белгісі */
union /* компоненттердің саналуы */
{ double radius; /* шеңбер */
double a[2]; /* тікбұрыш*/
double b[3];/* үшбұрыш*/
} geom_fig;
} fig1, fig2;
Жалпы жағдайда figure типті әрбір объект үш компоненттен тұратын болады: area, perimetr, type. type компоненті белсенді компоненттің белгісі (метка) деп аталады, өйткені ол geom_fig біріктіру компоненттерінің қайсысы берілген мезгілде белсенді екенін көрсету үшін пайдаланылады. Мұндай құрылым айнымалы құрылым деп аталады, өйткені оның компоненттері белсенді компоненттің белгісінің мәніне байланысты өзгеріп отырады (мәні type). int типті type компонентінің орнына саналынатын типті пайдаланған жөн. Мысалы, мынандай
enum figure_chess {CIRCLE,
BOX,
TRIANGLE };
CIRCLE, BOX, TRIANGLE тұрақтылары сәйкесінше 0, 1, 2—ге тең мәндерді қабылдайды. type айнымалысы саналынатын тип ретінде жариялана алады:
enum figure_chess type;
Бұл жағдайда Си компиляторы программиске потенциалды қате меншіктеулер жөнінде ескерту жасайды. Мысалға,
figure.type=40;
Жалпы жағдайда құрылым айнымалысы үш бөліктен тұратын болады: ортақ компоненттер жиынтығы, белсенді компоненттің белгілері және компоненттері өзгеріп отыратын бөліктер. Құрылым айнымалысының жалпы формасы келесі түрде болады:
struct {ортақ компиляторлар;
белсенді компилятордың белгісі;
union {1-компилятордың жазылуы;
2-компилятордың жазылуы;
…
…
n-компилятордың жазылуы;
} біріктіру идентификаторы
} құрылым идентификаторы;
Аты helth_record болатын құрылым айнымалысы анықтауға мысал
struct {/* жалпы ақпарат */
char name [25]; /* аты */
int age; /* жасы */
char sex; /* жынысы */
/* белсенді компилятор белгісі */
/* (отбасы жағдайы)*/
enum merital_status ins;
/* айнымалы бөлік */
union {/* бойдақ */
/* компиляторлар жоқ */
struct {/* некелескен */
char marripge_date [8];
char spouse name [25];
int no_children;
} marriage_info;
/* айрылысқан */
char date_divorced [8];
}marital_info;
}health_record;
enum marital_status {SINGLE, /* бойдақ */
MARRIGO, /* үйленген */
DIVOREED /* айрылысқан */
};
Құрылым компьютерлеріне сілтемелер көмегімен қарауға болады:
helth_record.name,
helth_record.ins,
helth_record.marriage_info.marriage_date.
Дәріс №8
Тақырыбы: Объектілер мен типтерді анықтау.
Мақсаты: С++ тілінде жарияланған айнымалының типі, тип спецификаторы, идентификатор, модификаторы бар идентификатор комбинациясы, ұғымдарын енгізу.
Жоғарыда айтылғандай, Си тілінде жазылған программаларда пайдаланылатын барлық айнымалылар жариялануы тиіс. Жарияланатын айнымалының типі типтің спецификаторы ретінде қай кілттік сөз пайдаланылатынына және түсіндіруші қарапайым идентификатор немесе модификаторы бар идентификатор комбинациясы, массив (квадрат жақшалар) немесе функциялар ма, соған байланысты.
Қарапайым айнымалыны, құрылымдарды қоспаларды немесе біріктірулерді, сонымен қатар саналуларды жариялау кезінде түсіндіруші – бұл қарапайым идентификатор. Көрсеткішті, массивті немесе функцияларды жариялау үшін идентификатор мына үлгіде өзгереді: сол жағында жұлдызша, оң жағында квадрат немесе дөңгелек жақшалар.
Си тілінің маңызды ерекшелігі мынада: жариялау кезінде әр түрлі күрделі типтер түсіндірушілер жиынын құруға мүмкіндік беретін модификаторды бір мезгілде бірнеше рет пайдалануға болады.
Дегенмен, модификаторлардың кейбір комбинациялары мүмкін емес екенін есте ұстау керек:
функциялар массив элементтері бола алмайды,
функциялар массивтерді немесе функцияларды қайтара аламайды.
Күрделі түсіндірушілерді инициализациялау кезінде квадраттық және дөңгелек жақшалар (идентификатордың оң жағындағы) жұлдызшаларға қарағанда басымырақ (идентификатордың сол жағынан). Квадраттық немесе дөңгелек жақшалардың басымдығы бірдей және солдан оңға қарай ашылады. Тип спецификаторы түсіндіруші толығымен талданып болған кезде соңғы қадамда қарастырылады. Дөңгелек жақшаларды талдау тәртібін қажеттіге ауыстыру үшін пайдалануға болады.
Күрделі түсіндірмелерді талдау үшін “іштен сыртқа” (изнутри наружу) деп естілетін және төрт қадамнан тұратын қарапайым ереже ұсынылады.
Идентификаторын бастау керек және квадраттық немесе дөңгелек жақшалар бар ма сол үшін оңға қарау керек.
Егер олар бар болса, онда түсіндірушінің осы бөлігін талдап және содан кейін жұлдызшаны іздеу үшін солға қарау керек.
Егер кез келген кезеңде оң жақтан жабатын дөңгелек жақша кездессе, онда басында барлық осы ережелерді дөңгелек жақшалардың ішінде қолдану қажет, содан кейін барып талдауды жалғастыру керек.
Тип спецификаторын талдау керек.
Мысалдар:
int * ( * comp[10]) ( );
6 5 3 1 2 4
Берілген мысалда comp (1) айнымалысы функцияны (4) көрсететін он (2) көрсеткіштен тұратын массив ретінде және бүтін мәндерге (6) қайтаратын көрсеткіштер жарияланған.
char * ( * ( * var ) ( ) ) [10];
7 6 4 2 1 3 5
var (1) айнымалысы char типті мәндерге көрсеткіш (6) болатын он элементтен тұратын массивке (5) көрсеткішті қайтаратын функцияға көрсеткіш ретінде жарияланады.
Әр түрлі типті айнымалыларды жариялаудан басқа типтерді жариялау мүмкіндігі бар. Мұны екі тәсілмен істеуге болады.
Бірінші тәсіл – құрылымдарды, біріктірулерді немесе саналуларды жариялау кезінде тег атын көрсету керек, ал содан кейін осы атты осы тегке сілтеме ретінде айнымалылар мен функцияларды жариялау кезінде пайдалану.
Екінші тәсіл – типті жариялау үшін typedef кілттік сөзін пайдалану.
typedef кілттік сөзімен жариялаған кезде жазылатын (баяндалатын) объектінің орнында тұрған идентификатор талдауға кіретін мәліметтер типінің аты болып табылатын және әрі қарай бұл тип айнымалыларды жариялау үшін пайдаланылуы мүмкін.
Кез келген тип көрсеткіш, функциялар немесе массивтер типтерін қосқандағы typedef кілттік сөзін пайдаланып жариялана алады. Көрсеткіш, құрылымдар, біріктірулер типтері үшін typedef кілттік сөзі бар ат осы типтер анықталғанға дейін жариялануы керек, бірақ жариялаушының көріну аралығында .
Мысалдар:
typedef double (* MATH) ();
/* MATH – double типті мәнді қайтаратын функцияға
көрсеткіш болатын типтің жаңа аты*/
MATH cos;
/* cos double типті мәнді қайтаратын функцияға көрсеткіш */
/* Эквивалентті жариялау жүргізуге болады */
double (*cos) ( );
typedef char FIO[40]
/* FIO – 40 символдан тұратын массив */
FIO person;
/* person айнымалысы 40 символдан тұратын массив */
/* Бұл жариялауға эквивалентті */
char person[40];
Айнымалылар мен типтерді жариялау кезінде мұнда тип (MATH FIO) атттары пайдаланылды. Бұдан басқа тип аттары тағы да үш жағдайда пайдаланыла алады: формалды параметрлер тізімінде, функцияларды жариялау кезінде, типтерді келтіру операцияларында және sizeof (типтің келтіру операциясы) операциясында.
Негізгі типтер, саналу, құрылым және қоспа типтері үшін тип аттары болып осы типтер үшін тип спецификаторы табылады. Массив және функция көрсеткішінің типтері үшін тип аттары келесі түрде абстрактылы түсіндірушілер көмегімен беріледі:
тип спецификаторы абстарктылы түсіндіруші;
Абстрактылы түсіндіруші – бұл бір немесе бірнеше көрсеткіш, массив модификаторларынан тұратын идентификаторсыз түсіндіруші. Көрсеткіш модификаторы (*) әрқашан түсіндірушідегі идентификатордың алдында беріледі, ал массив [ ]және функциялар ( ) модификаторлары – содан кейін. Осылайша абстрактылы түсіндірушіні дұрыс талдау үшін талдауды жобаланған идентификатордан бастау керек.
Абстрактылы түсіндірушілер күрделі болуы мүмкін. Күрделі абстрактылы түсіндірушілердегі жақшалар жариялауда күрделі түсіндірушілерді талдау кезінде жасаған сияқты талдау тәртібін береді.
Мәліметтердің инициализациялануы.
Айнымалыны жариялау кезінде оған бастаушыны (инициатор) түсіндірушіге қоса отырып бастапқы мәнді меншіктеуге болады. Бастаушы “=” таңбасынан басталады және келесі формаларға ие.
Формат 1:=бастаушы;
Формат 2:= {бастаушылар тізімі};
Формат1 негізгі типтер мен көрсеткіш айнымалыларын инициализациялау кезінде пайдаланылады, ал формат2 – құрама объектілердің инициализациясы кезінде.
Мысалдар:
char tol=’N’;
tol айнымалысы ‘N’символымен инициализацияланады.
const long megabute=(1024*1024);
Модификацияланбайтын megabute айнымалысы тұрақты өрнекпен инициализацияланады, осыдан кейін ол өзгере алмайды.
static int b[2][2]={1,2,3,4};
Бүтін шамалардың екі өлшемді b массиві инициализациланады, массив элементтеріне тізімнен мәндер меншіктеледі. Осы инициализация келесі түрде орындалуы мүмкін:
static int b[2][2]={{1,2},{3,4}};
Массивті инициализациялау кезінде бір немесе бірнеше өлшемдіктерді (размерность) алып тастауға болады
static int b[3[ ]={{1,2},{3,4}};
Егер инициализация кезінде жол үшін аз мән көрсетілсе, онда қалған элементтер нөлге инициализацияланады, яғни жазылу кезінде
static int b[2][2]={{1,2},{3}};
Бірінші жолдың элементтері 1 және 2 деген мәндерді, ал екінші жолдың элементтері 3 және 0 мәндерін алады.
Құрама объектілерді инициализациялау кезінде жақшаның және инициализаторлар тізімінің пайдаланылуын қатаң қадағалау керек. Мысалдар:
struct complex {double real;
double imag; } comp [2][3]=
{{{1,1}, {2,3}, {4,5}},
{{6,7}, {8,9}, {10,11}}};
Берілген мысалда comp екі жолдан және үш бағаннан тұратын құрылымдар массиві инициализацияланады, мұндағы әрбір құрылым real және imag екі элементінен тұрады.
struct complex 2 [2][3]=
{{1,1}, {2,3}, {4,5}, {6,7}, {8,9}, {10,11}};
Бұл мысалда компилятор қарастырылатын фигуралық жақшаларды келесі түрде талдайды:
бірінші сол жақ фигуралық жақша – comp2 массиві үшін құрама бастаушының басы.
екінші сол жақ фигуралық жақша - comp2[0] массивінің бірінші жолының инициализациялануының басы. 1,1 мәндері бірінші құрылымның екі элементіне меншіктеледі;
бірінші оң жақ жақша (1-ден кейін) бастаушылар тізімі массив жолы үшін аяқталғанын компиляторға нұсқайды және comp[0] жолындағы қалған құрылымдардың элементтері автоматты түрде нөлмен инициализациаланады;
алдыңғыға ұқсас {2,3} тізімі comp[1] жолында бірінші құрылымды инициализациялайды, ал массивтің қалған құрылымдары нөлге айналады;
{4,5} инициализаторлардың келесі тізіміне компилятор мүмкін қателер туралы хабарлайды, өйткені copm2 массивінде үшінші жол жоқ.
Біріктіруді инициализациялау кезінде біріктірудің оның типіне сәйкес бірінші элементінің мәні беріледі.
Мысал:
union tab {unsigned char name[10];
int tab1;
} pers={‘С’, ‘А’, ‘Л’, ‘Е’, ‘М’};
pers.name айнымалысы инициализацияланады және бұл массив болғандықтан оның инициализациялануы үшін фигуралық жақшаға алынған мәндермен, ал қалғандары нөлмен инициализацияланады.
Символдар массивінің инициализациялануын жолдық литералды пайдалану жолымен орындауға болады.
char stroka[]=”привет “;
Жеті элементтен тұратын символдар массиві инициализацияланады, оның соңғы элементі (жетінші) барлық жолдық литералдар аяқталатын ‘\0’ символы болады.
Егер массив өлшемі берілсе, ал жолдық ле\итерал массив өлшеміне қарағанда ұзынырақ болса, онда артық символдар алынып тасталады.
Келесі жариялау stroka айнымалысын жеті элементтен тұратын массив ретінде инициализациялайды.
char stroka[5]=”привет”;
stroka айнымалысына литералдың алғашқы бес элементі түседі, ал ‘T’ және ‘\0’ символдары алынып тасталады.
Егер жол массив өлшеміне қарағанда қысқа болса, онда массивтің қалған элементтері нөлмен толтырылады.
tab типті айнымалының инициализациялануы келесі түрде бола алатынын ескерейік:
union tab pers1=”Айман “;
және осылайша символдық массивке символдар түседі:
‘А’, ‘Й’, ‘М’, ‘А’, ‘Н’, ‘\0’,
ал қалған элементтер нөлмен инициализацияланады.
Дәріс №9
Тақырыбы: С++ тіліндегі файлдар.
Мақсаты: С++ тілінде файлдардан енгізу, файлдарға шығару, файлдарға жазбаларды толықтыруды ұйымдастыру ұғымдарын енгізу.
Файл – сыртқы жинақтауыштарда орналасып, өңдеу процессінде және сілтеме кезінде тұтас болып қарастырылатын мәліметтер жиынтығы.
Жұмыс істемес бұрын оған қол жеткізу үшін файлды ашу керек, яғни файл туралы информация дан тұратын мәліметтер облысын жасап, инициализациялау керек.
Си алгоритмдік тілінде оны fopen функциясы атқарады. Ол жинақтауыштағы физикалық файлды программадағы логикалық атымен байланыстырады. Логикалық аты – бұл файлға, яғни файл туралы ақпарат орналасқан жады облысына көрсеткіш. Файлдарға көрсеткіштерді жариялау керек. Мұндай көрсеткіштің форматы келесідей:
FILE * файлға көрсеткіш;
Мысал:
FILE *f;
f=fopen(“B:\BC.CPP”, “w”);
“w” символы ашылатын файлға қол жеткізу құқығын анықтайды. Осы мысалда В: дискісіндегі BC.CPP файлы тек қана оқу ашылады.
Си тілінде ашылатын файлдарға қол жеткізу режимдерін орнататын келесі кодтар қолданылады:
Символ
|
Сипатталуы
|
R
|
Файл тек оқу үшін ашылады, егер дискіде файл болмаса қателік туады.
|
W
|
Файл тек жазуға ашылады. Егер осы атаумен берілген файл болмаса, жасалады. Егер осы атаумен файл бар болса ашылмас бұрын ол файлдағы ақпарат өшіріледі.
|
A
|
Файл соңына ақпарат толықтырылуға ашылады.
|
r+
|
Файл ондағы мәліметтерді редакртрлеуге ашылады. Файлды жазуға да, оқуға да болады.
|
w+
|
r+ режиміндегідей.
|
a+
|
А режиміндегідей, тек жазбаны файлдың кез-келген орнына жазуға болады. Файлды оқуға да болады.
|
T
|
Файл текстік режимде ашылады. r, w,a,r+,w+,a+ өрістері көрсетіледі.
|
B
|
Файд екілік режимде ашылады. . r, w,a,r+,w+,a+ өрістері көрсетіледі.
|
Үнсіз келісім бойынша файл текстік режимде ашылады. Си тілінде файлды жабу үшін fclose функциясы пайдаланылады. Олдыңғы мысалдарғы файл fclose(f) функциясымен жабылады. Бірнеше файлды жабу үшін Си тілінде төмендегідей жарияланған функция пайдаланылады:
Void fcloseall(Void);
Мәліметтерді файлдарға жазу/файлдардан оқу әрекеттерін үш топқа бөлуге болады:
Символ бойынша енгізу/шығару операциялары.
Жол бойынша енгізу/шығару операциялары.
Блок бойынша енгізу/шығару операциялары.
Төменде көрсетілген үш топ бойынша қолданылатын негізгі функциялар көрсетілген.
Символ бойынша енгізу/шығару
Символ бойынша енгізу/шығару операцияларында файлға бір символды жіберу немесе файлдан бір символды алу операциялары орындалады.
Функция
|
Функция әрекеті
|
int fgets(FILE*fp)
|
Ашық тұрған файлдан бір символды оқу немесе қайтару.
|
int fgetchov(void)
|
stdin файлынан символды оқиды және қайтарады.
|
Int ungetc(int ch, FILE *fp)
|
сh символын файлға қайтарады. Келесі файлдан оқу операциясы символды қайта қайтарады.
|
Int fputs(int ch, FILE *fp)
|
Файлға сh символының кодын жазады.
|
Жол бойынша енгізу/шығару
Функция
|
Функция әрекеті
|
int gets(char *S)
|
stdin файлынан символды оқиды және нуль-терминатормен ауыстырылатын ‘\n’ символын кездестіргенше S жолына жазады.
|
int fgets(char *S int m, FILE *fp)
|
fp сипатталған файлдан символды алады және ‘\n’ символын кездестіргенше немесе m байт оқылғанша S жолына жазады.
|
int fputs(char *S, FILE *fp)
|
Файлға көшірілмейтін және‘\n’ символын ауыстырылмайтын нуль-терминатор кездестірмейінше S жолынан файлға жазады.
|
int puts(char *S)
|
Файлға көшірілмейтін және‘\n’ символын ауыстырылмайтын нуль-терминатор кездестірмейінше S жолынан stdout байттарын файлға жазады.
|
Блок бойынша енгізу/шығару
Блок бойынша енгізу/шығару операцияларында жұмыс бүтін блоктарға жүргізіледі.
Функция
|
Функция әрекеті
|
int fread (void *ptv, int size, int n, FILE *fp)
|
ptv көрсеткіші көрсететін жады облысына әрбір fp файлынан size байттан n блок оқиды.
|
int fwrite(void * ptv, int size, int n, FILE *fp)
|
ptv көрсеткіші көрсететін жады облысынан әрбір fp файлына size байттан n блок жазады.
|
Дәріс №10
Тақырыбы: С++ тілінде графикалық режимде жұмыс істеу.
Мақсаты: С++ тілінде графиктік операторлармен танысу.
Графикалық режимде жұмыс істеу барысында дисплей экраны нүктелер(пикселдер) матрицасы ретінде көрсетіледі. Мұнда пикселдер бағаны мен жолының саны (дисплей экранының шешімі) видеоадаптер жұмысына байланысты. Әрбір пикселдің түсін басқаруға болады: экран дисплейіндегі тұйықталған облысты түсін толтыру, суреттің фонының түсін беру бейненің қозғалыс эффектісін жасау және т.б.
Экран координаттарының басы ретінде x=0, y=0 координаталарымен жоғарғы сол жақ бұрыш қабылданған, мұндағы х – көлденең координаталық түзу, у – тік координаталық түзу. Си тіліндегі графикалық функциялар кітапханасы қамтитын барлық функциялар мобильдік емес (адаптер типіне тәуелді функциялар) және мобильдік топтарға бөлінеді. Мобильдің емес графикалық программаларды BGI (Borland Graphics Interface) драйвері көрсетеді.
Драйвер дегеніміз – 10h үзілісін өңдеуші, ол жүйелік өңдеушіні мобильдік графикалық функциялар қолданылғанша толықтыру керек. Программа жұмысын аяқтау алдында үзіліс векторларының кестесі қалпына келтіріледі.
Адаптерлердің әртүрлі типтеріне әртүрлі драйверлер қолданылады:
CGA.BGI драйвері – CGA және MCGA адаптерлері үшін, EGAVGA.BGI драйвері - EGA, VGA адаптерлері үшін. HERC.BGI драйвері Hercules монохромды адаптері үшін.
Мобильді топтың графикалық функциялары төмендегідей бөлінеді:
Графикалық жүйені дайындауға және текстік режимге көшуге арналған функциялар.
Дисплей экранында бейнелерді алуға арналған функциялар.
Бейнелеу параметрлерін орнатуға арналған (штрихтеу түрі, сызықтың қалыңдығы және т.б.) функциялар.
Режимдер мен бейнелеу параметрлерін анықтайтын функциялар.
Графикалық жүйені дайындауға арналған функциялар
Графикалық функцияларды қолданбас бұрын графика жүйесін инициализациялау қажет. Графика кітапханасымен қамтылатын графикалық режимдер файлында сипатталған символдық тұрақтылармен беріледі. Графикалық жүйенің инициализациясы initgraph() функциясымен жасалады. Ол графикалық драйверді жүктеп, дисплей экранын өажетті графикалық режимге қосады. initgraph функциясының прототипі:
Initgraph(&g_driver, &g_mode, “ “);
Тырнақшаның ішінде графикалық драйвердің жолын көрсету керек. Егер бос орын қалдырса, онда графикалық драйвер ағымдағы каталогта болуы керек. Бірінші параметр - (&g_driver – графикалық драйвер типі: 1- CGA, 3- EGA, 9- VGA және т.б. Екінші параметр - &g_mode – граикалық режим.
VGA драйвері үшін қарастырайық:
VGA 0 640х200
VGAMED 1 640x350
VGAHI 2 640x480
640x200 типті жазбалар графикалық режимдегі дисплей экранының шешім қабілеті (бағандар санын жолдар санына көбейту).
Графиканың автоматты режимін беру үшін төмендегідей жазба қажет:
Int g_driver=DETECT, g_mode;
Графикалық режимде жұмысты аяқтау үшін closegraph() функциясын қолдану керек.
Бейнені алуға арналған негізгі функциялар
circle(x,y,r) – шеңбер сызу;
bar(x1,y1,x2,y2) – боялған тіктөртбұрыш сызу;
bar3d(x1,y1,x2,y2, тереңдігі, р), р=0 р=1жоғарғы шекара бейнелену/бейнеленбеу – параллелепипед сызу.
line(x1,e1,x2,y2) – сызық сызу;
putpixel(x,y, түсі) – нүкте сызу;
rectangle(x1,y1,x2,y2) - тіктөртбұрыш сызу;
outtext(x,y, «текст») – текст енгізу;
moveto(x,y) – диспдей экранында көрсеткіш орнату;
cleardevice(void) дисплей экранын тазарту;
floodfill(x,y,c); с – сызық түсі, - алдын-ала дайындалған толтырғышпен тұйық облысты толтыру;
Бейнелеу параметрлерін орнатуға арналған функциялар
setcolor(n) – сызық түсін орнату;
setbkcolor(n) – фон түсін орнату;
setfillstyle(толтырғыш номері 0-12, түсі) – тұйықталған сызықтың толтырғышының стилін орнату;
setlinestyle(сызық стилі, 0, қалыңдығы); 0-үздіксіз, 1 – нүктелерден, 2,3-штрих – сызықтың қалыңдығын орнату;
settextstyle(шрифт 0-4, бағыты; 0-көлбеу, 1-тігінен, өлшем 1-0) – текст стилін орнату;
Қолдануға ұсынылған әдебиеттер тізімі
Березин Б.И., Березин С.Б. Начальный курс С и С++. –М:Диалог-МРТИ, 1999. -288с.
Керниган Б., Ритчи Д. Язык программирования Си. –М:Финансы истатистика, 1992.
Касаткин А.И., Вольвачев А.Н. Профессиональное программирование на языке Си: От Turbo-C к Borland C++: Справочное пособие – Мн: Вышейшая школа., 1992.
В.В.Тимофеев. Программирование в среде С++ Builder 5. М.:БИНОМ, 2000.
ЗЕРТХАНАЛЫҚ ЖҰМЫСТАРДЫ ЖҮРГІЗУГЕ АРНАЛҒАН
ӘДІСТЕМЕЛІК НҰСҚАУЛАР
Достарыңызбен бөлісу: |