1 Си тілінде бағдарламалау орталары және оларда жұмыс істеу 2 си++ бағдарламалау тілінің негізгі элементтері 1 Тілдің алфавиті және мәліметтер типі


Бірөлшемді массивтер және көрсеткіштер



бет2/3
Дата16.06.2016
өлшемі322 Kb.
#138774
1   2   3

5.3 Бірөлшемді массивтер және көрсеткіштер
Индекстеу операциясымен жасалынатын массивтің кез келген элементіне қол жеткізуді көрсеткіш арқылы жасауға болады.

Мысалы, int a[10];

он элементтен тұратын a[0], a[1], … ,a[9] массив болсын дейік және ра массивтің бірінші элементіне а[0] көрсеткіш болсын.



int *pa;

pa = &a[0]; немесе pa = a; деп жазуға болады

Онда ра+5 жазуы а[5] элементтің адресін көрсетеді, ал *(р+5) жазуы а[5] элементтің мәнін көрсетеді.

(a+i) = = &(a[i])

*(a+i) = = a[i]

Бұл жазбалар бір біріне тең. а массиві көрсеткіш ретінде сипатталмаса да *(a+i) жазу орынды болады.

Мысал 1: Массивті көрсеткіш көмегімен шығару

int arr[]={1,2,3,4,5,6,7,8,9,10};

for (int i=0;i<10; i++)

{

printf(“%d”, *(arr+i));



}

Көрсеткіш айнымалы болғандықтан pa=a немесе pa++ деп жазуға болады, бірақ а=ра; жазуы қате болады. ра++ операторы а массивінің келесі элементіне көшуді орындайды.

Ескерту *(a+2) мен *a+2 өрнектерінің айырмашылықтары бар:

*(а+2) –а массивінің үшінші элементі;

*а+2 – массивтің бірінші элементіне 2 санын қосу.
Мысал 2. Бірөлшемді массивті қарапайым тәсілмен және көрсеткіштерді пайдаланып шығару.

#include

int a[6]={10,20,30,40,50,60};

main ()


{int i, *p;

for (i=0; i<6; i++)

printf(“%d”,a[i]); /*массивті қарапайым тәсілмен шығару*/

for (p=&a[0];p<=&a[5];p++)

printf(“%d”,*p); /*массивті көрсеткішті пайдаланып шығару*/

for (p=&a[0],i=0; i<6; i++)

printf(“%d”,p[i]); /*көрсеткішті пайдаланатын тағы бір тәсіл*/

}

Егер p=&a[i], онда р++ операциясынан кейін р –да a[i+1] элементінің адресі сақталынады.


Мысал 3. Көрсеткіш көмегімен массив элементтерінің арифметикалық ортасын табу.

#include

int a[]={10,20,30,40,50,60}

main()


{int i,*p;

float s;


p=a;

for (s=0,i=0; i<6; i++)

s+=*(p+i); /*массив элементтерінің қосындысы*/

s=s/6; /*массивтің арифметикалық ортасы*/

printf(“%f”,s);

}
Мысал 4. Массив элементтерін кері ретпен шығару.

#include

main()


{float s[10];

int *p,i;

for (i=0;i<10;i++)

scanf(“%f”,s[i]);

p=&s[9]; /*көрсеткіш массивтің соңғы элементінің адресін алады */

for (i=0; i<10; i++)

printf(“%f”,*(p-i)); /*элементтерді кері ретпен шығару*/

for (p=&a[9]; p>=&a[0]; p--) /*кері ретпен шығарудың тағы бір тәсілі*/

printf(“/n%d”,*p);

}

5.4 Екіөлшемді массивтер және көрсеткіштер


Мысалы, 3 бағаннан және 3 жолдан тұратын а массиві берілсін және р массивтің бірінші элементіне а[0] көрсеткіш болсын, онда

a[3][3]= {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};


р р+3 р+6
р+3 көрсеткіші а[1][0] элементінің адресіне көшеді, р+6 көрсеткіші а[2][0] элементінің адресін көрсетеді.

Мысал 1. а матрицасы берілген. Экранға басты диагональ элементтерін, бірінші жол элементтерін және бірінші баған элементтерін көрсеткіштерді пайдаланып шығару.

#include

main ()


{

int a[3][3]={{10,20,30},

{40,50,60},

{70,80,90}};

int *pa[3]={a[0],a[1],a[2]};

/*а массивінің жолдарына ра көрсеткішін сипаттау және бастапқы мәндерін меншіктеу: pa[0]=a[0]; pa[1]=a[1]; pa[2]=a[2]*/

int p=a[0]; /*а массивінің бірінші элементіне көрсеткішті сипаттау */

int i;


for (i=0;i<9;i+=4)

printf(“%d”,*(p+i)); /*бас диагональ элементтерін шығару*/

for (i=0; i<3; i++)

printf(“%d”,*p[i]); /*бірінші жолдың элементтерін шығару*/

for (i=0; i<3; i++)

printf(“%d”,pa[i]); /*бірінші бағанның элементтерін шығару*/

}
Басты диагональ элементтері a[0][0], a[1][1], a[2][2] болғандықтан, оған сәйкес р, р+4, р+8 көрсеткіштері пайдаланады. Сондықтан қадам 4-ке көбейеді i+=4.

a[3][3]= {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};


р р+4 р+8

5.5 Динамикалық массив
Көрсеткіштер тақырыбында динамикалық үлестірілу туралы айта кеткен болатынбыз. Си тілі бағдарламаға қажетті көлем жадыны (байтта) сұратуға мүмкіндік береді. Осы әдісті динамикалық үлестіру деп атайды. Оның көмегімен жадының кез келген көлемін пайдалануға болады. Мысалы: массив өлшемділігі белгісіз. Ол енгізілетін санға байланысты болсын дейік. Динамикалық массивті пайдаланып массив өлшемділігін анықтау және массивті 1-ден енгізілетін санға дейін толтыру.

Бағдарлама 1: new функциясын пайдаланып

main()

{

int count;



scanf(“%d”, &count);

double *a=new double[count]; // динамикалық массивке жадыны дайындау

for (int i=0; i

{

a[i]=i+1;



printf(“%d”, a[i]);

}

delete [] a; // динамикалық массивке дайындалған жадыны тазалау.



}
Бағдарлама 2: calloc функциясын пайдаланып

#include

#include

main()


{

int i, n;

float *a;

scanf(“%d”, &n);

a=(float*)calloc(n,sizeof(float)); // динамикалық массивке жады беріледі

for (i=0; i

{

a[i]=i+1;



printf(“%d”, a[i]);

}

free(a); // динамикалық массивке берілген жадыны тазалау.



}
Бұл жердегі sizeof – тип өлшемін анықтау операциясы;

new - жадыны үлестіру операциясы. Динамикалық жадының бөлігіне қол жеткізуге мүмкіндік береді. Операнд ретінде тип аты пайдаланылады. Бұл операция жадыда орналасқан объектінің адресін қайтарады;

delete – new операциясымен бөлінген динамикалық жадыны тазалау операциясы.
Егер массив символдық тип болса, malloc функциясы пайдаланылады.

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

Жазылуы:

struct тип {элемент типі 1 элемент аты 1;

элемент типі n элемент аты n; };


Мысалы:

struct date { int day;

int month;

int year;} ;


Жақшадан кейін осы типті айнымалылар сипатталуы мүмкін, мысалы:

struct date {…} a, b, c;

При этом выделяется соответствующая память.

Құрылымды құрылымда пайдалануға рұқсат берілген. Мысалы

struct okushy { char fam [15];

aty [15];

struct date tkun;

int synyp, zhasy;};

Жоғарыда анықталған date типінің үш элементі бар: күн, ай, жыл. Олардың мәндері бүтін (int). Okushy құрылымында: fam [15]; aty [15]; tkun, synyp, zhasy элементтері бар. fam [15]; aty [15]; –бұл 15 символдан тұратын массив. Tkun айнымалысы date (ішкі құрылыммен) сипатталған.

Құрылымдық типті айнымалыларды келесідей сипаттайды:

struct okushy okuslar [50];

okuslar массиві okushy типті 50 элементтерден тұрады.


Мысал 1:

#include < stdio.h >

struct comp { int zhad;

int ozu;


char model [20]; };

/* zhad, ozu, model элементтерінен тұратын comp типті құрылымды сипаттау */

struct comp DK= {80, 1024, “Pentium 4”}

/* comp типті DK айнымалысын сипаттау */

main ( )

{

printf (“ Дербес компьютер % s\n\n “, DK.model);



printf ( “қатты диск сиымдылығы - % d Гбайт \n”, DK.zhad);

printf ( “жедел жады - % d Мбайт \n”, DK. ozu);

}
Мысал 2: құрылымда құрылымды пайдалану

# include < stdio.h >

struct date { int day;

int month;

int year; };

struct person { char fam [20];

char im [20];

char ot [20];

struct date f1;};

main ( )


{

struct person ind1;

printf ( “ Адамның фамилиясын, атын, әкесінің атын, туған күнін, \n айын және туған жылын енгіз \n”);

scanf (“ % S % S % S %d %d %d”, &ind1.fam, &ind1.im, &ind1.ot,

& ind1.f1.day, &ind1.f1.month, &ind1.f1.year );

printf (“ Фамилиясы, аты,әкесінің аты: % S % S % S \n”, ind1.fam, ind1.im, ind1.ot);

printf (“ туған жылы - % d \n”, ind1.f1.year);

printf (“ туған айы - % d \n”, ind1.f1.month);

printf (“ туған күні - % d \n”, ind1.f1.day);

}
Мысал 3: құрылымдар массиві

#include < stdio.h >

struct computer { int mem, sp;

char model [20];

} pibm [10];

main ( )

{ int i, j, k, priz;

for ( i=0; i<10; i++)

{

printf (“ ЭЕМ моделі - ”);



scanf (“%S”, &pibm [i].model );

printf ( “жедел жады көлемі -”);

scanf (“%d”, &pibm[i].mem);

printf (“винчестер көлемі - ”);

scanf ( “%d , &pibm[i].sp ”);
for (j=0; j<10, j++);

{

printf (“ дербес компьютер %s\n ”, pibm[j].model);



printf (“жедел жады көлемі - % d Гб \n ”, pibm[j].mem);

printf (“винчестер көлемі - % d Мб \n ”, pibm[j].sp);

}
Мысал 4: Құрылымға көрсеткішті пайдалану

main()


{

struct person

{

char fam[80];



char name[80];

char patronymic[80];

} man;

person *per=&man;



printf(“Фамилияны енгізіңіз”);

fgets(per->fam,80, stdin);

printf(“Атын енгізіңіз”);

fgets(per->name,80, stdin);

printf(“Әкесінің атын енгізіңіз”);

fgets(per->patronymic,80, stdin);

printf(“%s %s %s \n”, per->fam, per->name, per-> patronymic);

}
Нүкте – тура таңдаудың операциясы. Көрсеткішті пайдаланғанда нүктенің орнына -> белгісі пайдаланады. Ол жанама таңдауды білдіреді.



7 Функциялар және ішкі программалар
7.1 Функциялар

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

Мысалы:

float srzn(int a, int b)

{

int y;


y=(a+b)/2;

return(y);

}

Функция нәтиже ретінде бір мәнді бере алады. Ол үшін қайтару операторы пайдаланылады:



return (өрнек);

Бұл жердегі өрнек айнымалы болуы мүмкін.


Мысал 1: санның абсолютті шамасын функция көмегімен есептеу.

#include

#include "abc.cpp"

main()


{

int a=10, b=0, c=-20;

int d,e,f;

d=abc(a);

e=abc(b);

f=abc(c);

printf("%d %d %d", d, e, f);

}

Функцияның өзі



abc(x)

int x;


{int y;

y=(x<0)?-x:x;

return(y);

}

Көрсетілген бағдарламада функция типі сипатталмаған. Ол тек қана функция нәтижесі бүтін типті болғанда мүмкін. Басқа жағдайда типті сипаттау қажет.



Және де осы бағдарламада функция бөлек файлда abc.cpp сақталған және #include процедурасымен қосылған. Тырнақша (“ “) белгісімен қоршалған файл ағымды каталогтан ізделінеді (бағдарлама мен функция ағымды каталогта сақталу керек), ал < > жақшаға алынған файл кітапхана катологында ізделінеді.

Функцияны бағдарламаның ішінде де сипаттауға болады.

Мысал 2: f= формуласын функция көмегімен есептеу.

#include

double vv(x,y,z)

double x, y, z;

{

double f;



f=sqrt(x)+y/z;

return(f);

}

main()


{

double x=5.5, f, y=10, z=20.5;

f=vv(x,y,z);

printf(“%f “, f);

}

Егер функция main() функциясынан кейін сипатталса оның прототипін көрсету қажет.



Мысалы: алдыңғы есеп

#include

double vv(double x, double y, double z);

main()


{.......}

double vv(x,y,z)

double x, y, z;

{......}
Си тілінде сонымен қатар, аргументі жоқ функцияны және ешқандай нәтиже қайтармайтын функцияны пайдалануға болады. Нәтиже қайтармайтын функцияға void типін пайдалану қажет. Ол қайтарылатын мәннің болмауын білдіреді.

Мысал 3: а және b айнымалылардың орнын ауыстыру.

#include

#include “izm.cpp”

main()


{ int a,b;

scanf(“%d %d”, &a, &b);

izm(&a,&b);

printf(“%d %d”, a, b);

}

izm.cpp файлында сақталған функция



void izm(a, b);

int *a, *b;

{ int c;

c=*a;


*a=*b;

*b=c;


}
Егер функция аргументі ретінде массив аты пайдаланса, онда оған массивтің басталу адресі беріледі. Элементтердің өздері көшірілмейді. Функция массив элементтерін индекстеу арқылы басынан жылжыта алады.

Мысал 4: S массивінің элементтерін орындарымен ауыстыру: біріншісін екіншісімен, үшіншісін төртіншісімен және т.с.

#include

void reverse(s)

int s[];

{

int a,i;



for (i=1; i<5; i+=2)

{a=s[i]; s[i]=s[i+1]; s[i+1]=a;}

}

main()


{int i,j,s[6];

for (i=0; i<6; i++)

scanf(“%d”,&s[i]);

reverse(s); /* reverse функциясын шақыру*/

for (i=0; i<6; i++)

printf(“%d”,s[i]);

}
Бірөлшемді массивті int s[]; деп сипаттауға болады, ал екі өлшемді массивті сипаттағанда екінші жақшада баған саны жазылуы қажет, мысалы: a[][3].
Мысал 5. а(5,5) массивінің барлық элементтерін екіге арттыру.

#include

void mas(a)

int a[][5]; /* а массивін сипаттау */

{int i,j; /* i,j айнымалыларын сипаттау*/

for (i=0; i<5; i++)

for (j=0; j<5; j++)

a[i][j] = 2*a[i][j]; /*массив элементтерін екі есе арттыру*/

}

main()


{int a[5][5];

int i,j;

for (i=0;i<5;i++)

for (j=0; j<5; j++)

scanf(“%d”,a[i][j]); /*массивті енгізу*/

mas(a); /* mas функциясын шақыру*/

for (i=0; i<5; i++)

for (j=0; j<5; j++)

printf(“%d”, a[i][j]); /*нәтижені экранға шығару*/

}


    1. Жады класстары

Жады классы объектінің не айнымалының орналасуын анықтайды. Жады класстарының екі түрі болады:



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

register – айнымалы жиі пайдаланылатынын көрсетеді. Мүмкіндік болса осындай айнымалылардың мәндері процессордың ішкі регистрлеріне орналасады. Егер регистрлер бос болмаса, транслятор бұл айнымалыларды локальді жадыға орналастырады.

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

extern – айнымалыны бағдарламаның барлық модульдерінде пайдалануға болатынын көрсетеді. Айнымалыны басқа файлда анықтау үшін extern спецификаторын пайдаланады.
Мысал 5. Функция түрінде өрнекті есептеу: f=a*x2+b*x+c;
#include

int a=5, b=7, c=10,x; /* a,b,c,x бүтін типті сыртқы айнымалыларды сипаттау*/

/*функция*/

kv()


{int f;

f=a*x*x+b*x+c; /* f айнымалысын есептеу*/

return (f); /* f мәнін бағдарламада қайтарады */

}

main ()



{ int f;

scanf (“%d”, &x); /* x айнымалысының мәнін енгізу*/

f=kv(); /*функцияны шақыру*/

printf (“%d”,f); /* f айнымалысының нәтижесін шығару*/

}

Негізгі бағдарлама және функция әр түрлі файлда орналасқан мысалды қарастырайық:



#include “kv.cрр” /* kv.cрр файлындағы kv функциясын қосу */

#include

int a=5, b=7, c=10,x,f; /* a,b,c,x бүтін типті сыртқы айнымалыларды сипаттау */

main ()


{

scanf (“%d”, &x); /* x айнымалысының мәнін енгізу */

f=kv(); /* функцияны шақыру */

printf (“%d”,f); /* f айнымалысының нәтижесін шығару */

}

/*функция*/



kv()

{extern int a,b,c,x,f;

f=a*x*x+b*x+c;

return (f);

}

8 Препроцессорлық құралдар
8.1 # include, # define, # undef директивалары

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

Файлдарды қосу үшін # include директивасын пайдаланған болатынбыз.

Препроцессордың басқа директиваларын қарастырайық:

# define <идентификатор> < ауыстыру>

Бұл директива бағдарламадағы идентификатор орнына ауыстыру мәтінін қояды. Егер директива келесі түрде болса:

# define идентификатор ( идентификатор ,…идентификатор )

онда ол аргументтері бар макроауыстырудың анықтамасы.


Мысал 1:

# define FOOR TWO*TWO

# define PX printf(“x тең %d\n”,x)

#define FNT “x тең % d\n”

# include

# define TWO 2

main ( )

{ int x=TWO;

PX;

x=FOOR;


printf(FNT,X);

}

Бағдарлама орындалған соң экранға келесі жазу шығады:



Х тең 2

Х тең 4
Мысал 2. Аргументтері бар # define директивасының мысалын қарастырайық. Ондай директивалармен өте мұқият жұмыс істеу керек.

# include

# define KV(X) X*X

# define PR(X) printf(“X тең %d\n”,X)

main ( )


{ int x=4;

int z;


z=KV(x);

PR(z);


PR(х);

PR(KV(x+2));

pr(100/KV(2));

}

Бағдарламадағы KV(x) x*x ауыстырылады.



Бағдарлама жұмысының нәтижесі:

z тең 16


х тең 4

KV (x+2) тең 14

100/KV (2) тең 100

Бірінші екі жол түсінікті, ал KV (x+2) 36-ға, 100/KV (2) 50-ге тең болу керек, бірақ нәтижелері мүлдем басқа. Оның себебі Х*Х орнына Х+2*Х+2 және 100/2*2 қойылады. Егер KV (x+2) дұрыс шығарылсын десеңіз, формуланы келесідей жазу қажет:

# define KV(X) (X)*(X)

Онда KV (Х+2) орнына (Х+2)*(Х+2) қойылады.

#undef ең соңғы анықталған идентификаторды жояды. Жазылу түрі:

#undef идентификатор

Мұндағы идентификатор – #define директивасымен анықталған идентификатор:

#undef ESCAPE

Бұл процедураның орындалуынан кейін ESCAPE идентификаторы анықталмайды.
8.2 #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

main()

{ char s[50];



FILE *fl;

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

scanf(“%s”, &s);

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

fclose(fl);

getchar();

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

#include

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

# include

# include

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);



}



Достарыңызбен бөлісу:
1   2   3




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет