If, #ifdef, #ifndef, #else, #endif директивалары

Осы бөлімде қарастырылатын директивалар шартты компиляцияны орындауға мүмкіндік береді. Шартты компиляция – бұл кейбір шарттарды қанағаттандыратын бағдарлама бөліктерін компиляциялау. Шартты компиляция көмегімен әр түрлі жүйелерде идентификаторларға әр түрлі мәндерді бере аласыз, қажетті файлдарды қоса аласыз. Осылайша бағдарламаның орындалу барысында қажетсіз код жадыда орын алмайды.

#if директивасы if операторына ұқсас:

мысалы:

#if sys==”IBM”

#include “ibm.h”

#endif

Мысалда көрсетілгендей ол #endif директивасымен аяқталады.

#ifdef директивасы идентификатордың анықталғанын тексереді, #ifndef директивасы идентификатордың анықталмағанын тексереді, яғни идентификатор #define –мен анықталды ма, жоқ па, соны тексереді.

Мысалы:

#ifndef SIZE

#define SIZE 128

#endif

Егер SIZE анықталмаған болса, 128 мәнін қабылдайды.

Көрсетілген директивалар #else директивасымен бірге пайдаланылуы мүмкін. Ол else операторына ұқсас.

Мысалы:

#ifdef MAVIS

#include “horse.h”

#define STABLE 5

#else

#include “cow.h”

#define STABLE 15

#endif

Егер MAVIS идентификаторы анықталған болса, #else директивасына дейінгі барлық директивалар орындалады. Басқа жағдайда #else және #endif арасында тұрған барлық директивалар орындалады.

9 С++ тілінде файлдармен жұмыс

9.1 Файлға тізбектей қол жеткізу

Файлға тізбектей қол жеткізгенде ақпараттың алмастырылуы енгізу – шығару жүйесімен берілетін арнай буфер арқылы жасалады. Си тілінің компиляциясы енгізу –шығаруды тізбектей келетін файлдар ағымы ретінде қарастырады. Әр ағым файлмен байланыстырылады. Файл мен ағым арасындағы байланыс оның ашылуы кезінде жасалады. Файлдың ашылуы fopen функциясымен жасалады. Бұл функция файлға көрсеткіш қайтарады.

Файлға көрсеткішті келесідей сипаттайды:

FILE * lst;

Мұндағы FILE- тип аты, ол stdio.h стандартты анықтамада сипатталған;

lst- файлға көрсеткіш (логикалық аты).

fopen функциясы бағдарламада келесідей шақырылады:

lst= fopen (файлдың физикалық аты, файлды пайдалану түрі);

Файлдың физикалық аты - сақталынған орнын көрсетеді, мысалы "D:zni.f”- D: дискісіндегі zni.f файлы үшін.

Файлды пайдалану түрі “w” (егер файлға мәліметтерді жазу керек болса), “r” (файлдан мәліметтерді оқу қажет болса) және “a” (файлдағы мәліметтерге тағы мәліметтерді қосу қажет болса) болуы мүмкін. Егер ондай файл болмаса, ол жасалады.

Файлға жазу үшін fprintf, fputs, файлдан оқу үшін fscanf, fgets кітапханалық функциялар пайдаланылады. Файлмен жұмысты аяқтағанда ол жабылу тиіс, мысалы:

fclose (lst)

lst- файлға көрсеткіш;

Мысал 1: Енгізілген мәтінді файлға жазу

#include <stdio.h>

main()

{ char s[50];

FILE *fl;

fl=open (“fayl.txt”, “w”);

scanf(“%s”, &s);

fprintf(fl, “%s”, s);

fclose(fl);

getchar();

}

Мысал 2: Файлдан жолдарды оқып экранға шығару

#include <stdio.h>

main()

{ char s[50];

FILE *fl;

fl=open (“fayl.txt”, “r”);

while(!feof(fl))

{

fscanf (fl, “%s”, &s);

printf(“%s”, s);

}

fclose(fl);

getchar();

}

9.2 Файлдың кез келген жеріне қол жеткізу

Файлдың кез келген жеріне қол жеткізу үшін fseek функциясы пайдаланылады. Оның жазылу түрі:

fseek (stream, offset, origin);

stream – файлға көрсеткіш;

оrigin – бағыт көрсеткіші.

Функция файлдың ішкі көрсеткішін оның жаңа орнына қояды. Ол offset қадамы бойынша және origin бағыт көрсеткіші бойынша есептелінеді.

Көрсетілген stream ағымындағы келесі операция ауысу жасалған позициядан басталады. Аргумент origin келесі мәндерді қабылдайды:

0 – файл басы;

1 – файл көрсеткішінің ағымды позициясы;

2 – файлдың соңы.

Көрсеткішті жылжыту үшін жазбадағы символдар санын білу қажет. Сондықтан n – жазба номері болсын, m – жазбадағы символдар саны.

Келесі жағдайларды қарастырайық:

origin = 0. Онда n жазбасына көшу үшін оffset = (n-1)*m.

origin = 1. Келесі жолға түсу үшін offset=0. Бірінші жазбадан үшінші жазбаға көшу үшін offset = m. Кері бағытта жылжуға болады, онда offset теріс сан болу керек. Бесінші жазбадан үшіншіге көшу үшін offset = -3*m.

origin = 2. Егер төменнен жоғарыға көрсеткішті жылжыту керек болса, offset = 2*m.

Файлдың кез келген жеріне қол жеткізгенде файлдың басынан және соңынан шығып кетуге болады, сондықтан файлдың өлшемін білу керек. Ол үшін келесі үш оператор пайдаланылады:

handle =open (“файл аты”, O_CREATE);

l = file length (handle);

close (handle);

handle айнымалысының типі int, ал 1 айнымалысының типі offset айнымалысының типіне сәйкес long. Опреаторларды жазбас бұрын келесі файлдарды қосу қажет.

# include < fcnt.h >

# include < io.h >

Мысалы: енгізілген номерге сәйкес жазбаны шығару

# include <stdio.h>

# include <fcntl.h>

# include <io.h>

main ()

{char fio[10], gr [5];

float st;

long offset,l;

int p=1, handle, n;

FILE *lf;

clrscr ();

lf=fopen(“student.dat”,”w”);

while(p)

{

printf(“студент туралы мәліметтерді енгіз”);

printf(“\n Аты –жөніненгіз”);

scanf(“%s”,&fio);

printf(“\n топ номерін енгіз”);

scanf(“%s”,&gr);

printf(“\n стипендияны енгіз”);

scanf(“%s”,&st);

fprintf(lf,“%15s%6s%6.2f ”,fio,gr,st);

printf(“\n Бітті ме 0-ия, 1-жоқ”);

scanf(“%s”,&p);

}

fclose (lf);

handle = open(“student.dat”,O_CREAT);

l=filelength(handle);

close(handle);

n=1;

lf=fopen(“student.dat”,”r ”);

while(n)

{

printf (“жазба номерін енгіз”);

scanf (“%d”,&n);

offset=(n-1)*28;

if (offset>=1 | | n==0) continue;

fseek (lf,offset,0);

fscanf (lf,”%s %s %f ”,&fio,&gr,&st);

printf (“%15s%6s%6.2f\n”,fio,gr,st);

}

fclose(lf);

}

10 Символдық жолдармен жұмыс

СИ тілінде символдар жолын енгізуге және шығаруға арналған екі ыңғайлы puts және gets функциялары бар. Оларды пайдалану мысалын қарастырайық:

#include<stdio.h>

main()

{

char q[40]; /*символдар жолын сипаттау*/

puts(“Символдар жолын енгізіңіз ”);

gets(q); /*символдар жолын енгізу */

puts(q); /* символдар жолын шығару */

}

Программаның жұмысы нәтижесінде экранда алдымен келесі мәтін пайда болады:

Символдар жолын енгізіңіз

Содан кейін кез келген символдық жолды енгізу қажет. Енгізілген жолдың әрбір символы gets операторының көмегімен q массивінің элементтеріне меншіктеледі. Символдарды puts операторы шығарады.

10.1 Символдық жолдар және олардың жадыда орналасуы

Символдық жол – бұл char типті массив болып табылады. Жол бос литерамен, яғни (‘\0’) символымен аяқталады. Бұл дегеніміз ешқандай символ тұрмағанын білдіреді. Компилятор бұл символды автоматты түрде жолдың соңғы символынан кейін қояды. Мысалы «Сәлем!» символдық жолы жадыда келесідей орын алады:

С ә л е м ! \ 0

Символдық жол үшін жадыны дайындағанда бір байтты жолдың аяқталу белгісіне жіберу керектігін ұмытпау қажет.

Символдық жолдарды инициализациялау тәсілдері

1 тәсіл. char stroka [ ] = “Cәлем!”;

2 тәсіл. char stroka [ ] = {‘С’, ‘ә’, ‘л’, ‘е’, ‘м’, ‘!’, ‘\0’};

Осындай инициализацияда міндетті түрде ‘\0’ - бос литераны қосу қажет.

3 тәсіл. char *str; str = ” Сәлем!”; немесе char *str = “Сәлем!”;

5 - 53 6 – 54 7 – 55 8 – 56 9 – 57

0 – 48 1 – 49 2 – 50 3 – 51 4 – 52

Getch();

Clrscr();

Char z;

Void main()

U-85 V-86 W-87 X-88 Y-89 Z-90

K-75 L-76 M-77 N-78 O-79 P-80 Q-81 R-82 S-83 T-84

Келесі программа 0 мен 9 арасындағы цифрлық символдарды және олардың ASCII кодтарын басып шығарады:

#include <conio.h>

#include <stdio.h>

{

for(z='0';z<='9';z++)

{

if (z=='0' || z=='5') printf("\n");

зкштеа(Э %с-%в Эбябя)ж

}

}

Жұмыс нәтижесі:

Символдық тіркестер

Символдық жолдарды немесе тіркестерді бірнеше тәсілмен өңдеуге болады, олардың негізгілері:

1. Тіркестік константаларды қолдану;

2. Char типті жиымды қолдану;

3. Char типіне сілтейтін нұсқауыштарды пайдалану;

4. Символдық тіркестерден тұратын жиымдарды қолдану.

Сөз тіркестері немесе тіркестік (жолдық) константа қостырнақшаға алынып жазылады. Тырнақшаға алынатын символ­дар тізбегінің ең соңына автоматты түрде ‘\0’ символы жазылады. Ком­пи­лятор жолдық символдарды компьютер жадына жазғанда, олардың көлемін анықтау үшін сол символдар санын есептейді. Символдық константа осы сөз тіркесі жазылған жады аймағына сілтейтін нұсқауыш болып табылады. Символдық тіркестер жиымын (массивін) беру кезінде компилятор компьютер жады­ның қажетті көлемін анықтау үшін жиымды сипат­тағанда, оны тіркестік константа арқылы инициалдауға болады. Мысалы:

char c[]= “Атырау, Алтай - жеріміз”;

Әдеттегі жиым қолданылатын жағдайлар сияқты бұл жиым аты с осы жиымның 1-элементіне сілтейтін нұсқауыш болып табылады.

c ==&c[0];

*c ==’0’;

*(c+1) == c[1] == ‘n’;

Сөз тіркестерін анықтау үшін нұсқауыштарды мынадай түрде сипаттауға болады:

char *c1 = “\n студенттер саны”;

осы сипаттауға эквивалентті болып келесі сипаттау есептеледі:

static char c1[]=”\n студенттер саны”;

Осы қарастырылған екі сипаттау да с1 тіркесінің нұсқауыш екенін білдіре­ді. Компьютер жадының қажетті көлемін айқын көрсетуге де болады. Мысалы, сыртқы сипаттауда келесі жолдың мынадай түрде жазылғаны көрсетілген.

char c[25]=”Білім - өмір шырағы”;

Элементтердің саны жолдың ұзындығынан бір символ артық болуы керек, яғни оның ең соңында ‘\0’ символы болуы тиіс.

Статикалық немесе сыртқы жиымдағы бұрынғы қарастырылған әдеттегі жиымдар оларды қолдану кезінде автоматты түрде 0-мен инициалданған болатын. Ал сөз тіркестерін пайдалану кезінде де статистикалық немесе сыртқы жиымдар солар тәрізді 0 символымен инициалданады.

Келесі мысалды қарастыралық: #include <stdio.h> #include <string.h> main () { char msg[30]; strcpy(msg, "Сәлем, Азат!"); puts(msg); }Мұндағы msg сөзінен соң тұрған [30] саны компиляторға 29 символ үшін, яғни char типіндегі 29 айнымалыдан тұратын жиым үшін жады бөлуді қамтамасыз етеді (30-орын нөлдік символмен – \0 толтырылады). msg айнымалысының символдық мәні жоқ; ол тек char типіндегі 29 айнымалының алғашқысының адресін (компьютер жадындағы белгілі бір орын адресі) сақтайды. Компилятор strcpy(msg, "Сәлем, Азат!") операторын кездестір­генде, екі түрлі әрекет орындайды: - "Сәлем, Азат!" тіркесі соңына (\0) символын (ASCII коды 0) қосады.- strcpy функциясын орындап, msg айнымалысы нұсқап тұрған жады аймағына сол сөз тіркесі символдарын біртіндеп көшіреді. Ол тіркесті көшіруді сөз соңындағы нөлдік символдан кейін барып аяқтайды. puts(msg) функциясын орындағанда, оған msg мәні, яғни тіркес құрамындағы бірінші символ адресі беріледі. Одан кейін puts сол символдың нөлдік символ емес екенін анықтап, ары қарай адреске бірді қосып, келесі симводы оқиды, т.с.с. тіркес соңына дейін жетеді. Нөлдік символға жеткен соң, puts жұмысты аяқтайды;

Осындай тәсіл тіркес ұзындығына шек қоймай, нөлдік символға дейінгі символдарды біртіндеп оқуды жүзеге асырады.

Символға нұсқауышты пайдалануЕкінші тәсіл – символдарға нұсқауыш жасау. Программаны келесі түрге келтірейік: #include <stdio.h> #include <string.h> main() { char *msg; msg = "Сәлем, Азат!"; puts(msg); }msg алдындағы жұлдызша (*) компиляторға оның символға нұсқауыш екенін білдіреді, яғни msg белгілі бір символ адресін сақтай алатын айнымалы. Бірақ мұнда компилятор символдар үшін ешқандай орын бөлмейді және msg да ешқандай мәнге ие болмайды. Компилятор strcpy(msg, "Сәлем, Азат!") операторын кездес­тір­генде, ол тағы екі түрлі әрекет орындайды: - объектілік код файлы ішіндегі бір орынға соңына (\0) символы қосылған "Сәлем, Азат!" тіркесін (ASCII коды 0) жазып қояды.- сол тіркестің алғашқы символы адресін msg айнымалысына меншіктейді. strcpy функциясын орындалып, puts(msg) командасы бұрынғыша нөлдік символға дейінгі мәліметті көшіреді.

Енді символдық тіркестерден тұратын жиымдарды қарас­тыралық. Бұл жиымдардың әрбір жолы символдық жиым болып табылады. Мысалы, статикалық жиымның сипатталуы келесідей түрде жазылуы мүмкін:

*m[4]={”регистр”,”жады”,”курсор”,”элемент”};

бұл жиым символдық тіркестерге сілтейтін 4 нұсқауыш болып табылады. Сонымен, символдық тіркестер жиымдар болып табылатын болса, онда осы жиымдарға сілтейтін 4 нұсқауыш қарастырылады. 1-жолға сілтейтін 1-нұсқауыш болып m[0]есептеледі, m[1]– 2-жолға сілтейтін 2-нұсқауыш болып табылады. Сонымен, әрбір нұсқауыш соған сәйкес жолдың немесе қатардың ең бірінші символына сілтейді.

*m[0]==’р’; *m[1]==’ж’; *m[2]==’к’; *m[3]==’э’;

Тіркестерден құрылған жиымдарды сипаттағанда, символдық тіркес­тер көле­мін көрсетуге де болады және бұл сипаттауда тіркестердің ұзындығын келе­сідей түрде көрсетуге болады:

static char m[10];

Символдар тіркестерін енгізу/шығару үшін printf() және scanf() функцияларының %s форматы қолданылады.

Тағы мысалдар келтірейік.

/* символдық тіркесті шығару */

#include <conio.h>

#include <stdio.h>


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: