}
L= abs(L1 - L2);
printf(" L = %i ",L);
getch();
}
Екі өлшемді жиымдармен жұмыс істеу кезінде
нұсқауыштарды қолдану
A
3,2
жиым берілген болсын. Олар бүтін сандар, яғни
int a[3][2];
int *pri;
pri = a; // бұл pri=a[0][0] деген сөз
a
–
жиымның аты немесе a[0][0] элементінің адресі
45
a=&a[0][0];
рri нұсқауышына 1-ді қоссақ, pri+1 деген нұсқауыш a[0][1] элементіне сілтейді. Бұл
жиымды қарастырғанда, келесі теңдеулер дұрыс болып табылады:
pri == &a[0][0];
pri+1== &a[0][1];
pri+2== &a[1][0];
pri+3== &a[1][1];
pri+4== &a[2][0];
pri+5== &a[2][1];
Екі өлшемді жиым бір өлшемді жиымдардан құрастырылған жиым ретінде
қарастырылуы мүмкін. Яғни берілген екі өлшемді жиым үш жолдан тұрады, ал әрбір
жол екі элементтен тұратын жиым болып табылады.
Бірінші жол аты –
a[0],
екінші жол аты –
a[1],
үшінші жол аты –
a[2].
Жиымның аты берілген жиымның нұсқауышы болып табылады, яғни ол жиымның
1-
элементіне сілтейді.
Екі өлшемді жиымның осы қасиеті бір өлшемді жиымға арналған функцияны екі
өлшемді жиыммен жұмыс істеуге мүмкіндік береді.
Бақылау сұрақтары
1.
Екі өлшемді жиымды – матрицаны сипаттау, бастапқы мәндерді тағайындау тәсілдері.
2.
Екі өлшемді жиымды инициалдауды қабаттасқан циклдер арқылы орындау.
3.
Матрица элементтерін толық өңдейтін алгоритмдер.
4.
Матрицалардың көрсетілген элементтерін өңдеу тәсілдері.
5.
Матрицалардың диагоналына байланысты орналасқан элементтерін өңдеу жолдары.
6.
Матрицалардың жолдарының және бағаналарының ең үлкен (кіші) элементтерін,
қосындыларын, көбейтінділерін табу.
7.
Матрицалардың жолдарында және бағаналарында орналасқан элементтерді өсуі (кемуі)
бойынша реттеу алгоритмдері.
10
дәріс. С тілінде сөз тіркестерін пайдалану
С тілінде сөз тіркестері
char
типті бір өлшемді жиым ретінде қарастырылады,
яғни сөз тіркесі – нөлдік байтпен аяқталатын
char
типті бір өлшемді жиым. Нөлдік
байт – барлық биттері де нөлге тең байт, ол ´ \0 ´ символдық константасымен
анықталады (тіркес соңы белгісі немесе нөл-терминатор). Сондықтан егер тіркесте
k
символ болса, онда жиымды сипаттауда
k+1
элемент көрсетілуі тиіс.
Мысалы,
char a[7]
деген сипаттау тіркестің 6 символдан тұратынын, ал соңғы
байт нөлдік екенін білдіреді. С тіліндегі тіркестік (жолдық) константа – қос тырнақ-
шаға алынған символдар жиыны. Мысалы, “Берілген тапсырма” тіркесі, оның соңына
нөлдік байтты компилятор автоматты түрде өзі жазады.
Айнымалы мәні болатын сөз тіркесін сипаттау кезінде бірден көрсетуге болады,
мысалы,
char S1[10]= "123456789", S2[]="
Болат
";
Соңғы сөз ұзындығы тіркестің символдары санымен анықталады.
46
Символдар тіркесін пернелерден енгізу үшін екі стандартты функция –
scanf()
немесе
gets()
қолданылады, ал олардың прототиптері
stdio.h
тақырып-
тық файлында болады.
Символдық таңбаларды енгізу/шығару
Символдарды біртіндеп енгізу/шығару үшін
printf()
және
scanf()
функция-
ларының
%c
форматы қолданылады.
getch()
–
параметрсіз функция, басылған перненің кодын (
int
) береді, экранға
ешқандай символ шығармайды.
getchar()
–
параметрсіз функция. Пернеден символдарды бір-бірлеп енгізеді. Сөз
тіркесі <Enter> пернесі басылғанша енгізіле береді, оған дейін оны өзгертуге де
болады.
putch(c)
–
бір символды (c – cимволдық айнымалы немесе константа), яғни бір
таңбаны ғана экранға шығарады.
putchar(c)
–
бұл да тек бір таңбаны экранға шығарады.
Бұлар
conio.h
тақырып файлы бойынша жұмыс істейді.
Мысалы, латын алфавиті әріптерін экранға шығару программасы төмендегідей
болады:
#include
#include
void main()
{
char z;
clrscr();
for(z='A';z<='Z';z++)
putchar(z);
getch();
}
Нәтижесі:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Ал енді осы символдарды ASCII-кодтарымен бірге шығаратын мына программаны
көрейік.
/* латын алфавиті*/
#include
#include
void main()
{char z;
clrscr();
for(z='A';z<='Z';z++)
{ if (z=='K' || z=='U') printf("\n");
printf(" %c-%d ",z,z);
}
getch();
}
Программа жұмысы нәтижесі:
A-65 B-66 C-67 D-68 E-69 F-70 G-71 H-72 I-73 J-74
K-75 L-76 M-77 N-78 O-79 P-80 Q-81 R-82 S-83 T-84
U-85 V-86 W-87 X-88 Y-89 Z-90
Символдық тіркестер
Символдық жолдарды немесе тіркестерді бірнеше тәсілмен өңдеуге болады,
олардың негізгілері:
47
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
символымен инициалданады.
Сөз тіркестерін шығару функциялары
printf(),puts()
printf()
–
экранға формат арқылы сөз тіркесін шығарады;
puts(str)
–
экранға сөз тіркесін шығарып, курсорды бірден келесі жолдың басына
алып барады, мұндағы str – тіркестік константа немесе тіркестік айнымалы. Бұлар
stdio.h тақырып файлы бойынша жұмыс істейді.
Екі функция да символдық жиымды нөлдік байтқа дейін шығарады.
printf()
функциясы символ тіркесі шығарылған соң, курсорды келесі жолға көшірмейді, ол
үшін арнайы формат (
\n
) жазылуы тиіс. Ал
puts()
функциясы символдар
шығарылған соң, автоматты түрде курсорды келесі жол басына көшіреді.
//puts
функциясын пайдалану мысалы
#include
#include
main()
{ char str1[]="abc";
char str2[]="def\nghi\n";
char str3[]="jkl";
puts(str1);
puts(str2);
48
puts(str3);
}
Нәтижесі:
abc
def
ghi
jkl
Сөз тіркестерімен орындалатын басқа операциялар да стандартты функциялар
арқылы атқарылады. Ол функциялар жұмыс істеуі үшін
string.h
тақырыптық
файлы қажет.
Жалпы сөз тіркестеріне қолдану үшін
stdlib.h
немесе
string.h
тақырыптық
файлдары қолданылады.
Бақылау сұрақтары
1.
Тіркестік айнымалылардың сипатталу тәсілдері қандай?
2.
Тіркестік айнымалы қандай идентификатормен және қалай анықталады?
3.
Бір тіркестік айнымалыға немесе тұрақтыға қанша символ жазуға болады?
4.
Тіркестік айнымалының ұзындығы қалай анықталады?
5.
Тіркестік өрнектер дегеніміз не?
6.
Тіркестік айнымалылар мен тұрақтыларға қандай амалдар қолданылады?
7.
Тіркестің ішкі символдарын қалай бөліп алуға болады?
8.
Си тілінде сөз тіркестерін өңдейтін қандай функциялар бар? Оларды қалай
пайдаланады және олар қалай жазылады?
11
дәріс. С тілінде құрылымдарды пайдалану
С тіліндегі құрылымдар өзара логикалық байланысқан әртүрлі типті мәліметтерді
байланыстырады. Мәліметтердің құрылымдық типтері келесі сипаттаумен анықтала-
ды:
struct
құрылым_ аты
{
элементтерді сипаттау;
};
Құрылымға компьютер жадынан орын бөлу үшін құрылымдық айнымалыны
анықтап алу керек:
struct құрылым_аты айнымалы_аты;
Құрылымдарды анықтау барысында олардың элементтеріне бастапқы мәндерді
меншіктеуге болады. Құрылым элементтерінің мәндерін енгізу үшін ағымдық енгізу
операторы
cin>> немесе форматпен енгізу операторы –
scanf қолданылады.
Құрылымдармен келесі амалдарды орындауға болады:
1) Құрылымның адресін алу амалы. Құрылымның адресін алу үшін құрылымдық
айнымалыға нұсқауыш (&) амалы қолданылады.
2) Құрылымның элементін пайдалану үшін нүкте (.) амалы (тікелей ену) немесе
(-
>) (нұсқауыш бойынша ену) амалы қолданылады.
Құрылымдық айнымалы
float, int, char
типті айнымалылар сияқты пайда-
ланылуы мүмкін. Мысалы:
struct gr
/* құрылым аты */
{char fio[10];
/
* құрылым элементі */
int est[25];
/* құрылым элементі */
int nomer;
/* құрылым элементі */
}
gruppa1;
/*құрылымдық айнымалы аты */
49
struct gr gruppa2;
/* құрылымдық айнымалыны хабарлау*/
Егер құрылымды сипаттаушы берілген файлдағы барлық функциялардың алдында
орналасса, онда ол құрылымды осы файлдағы барлық функциялар пайдалана алады.
Құрылымдық айнымалыны анықтау барысында оған алғашқы мәндерді меншіктеуге
болады (құрылым өрістеріне мән беруге болады). Мысалы:
struct date { int day,month,year;};
d[5]={{1,3,1980},
{5,1,1990},
{1,1,2002}};
Құрылымдарды пайдалану мысалы:
#include
#include
#include
struct Spisok {
char Fio[20];
char Grup[10];
int Ot[3];
float S_Bal;
} *sved;
void Vvod(int nom,struct Spisok *sved)
{printf("\n
Мәліметтерді енгізіңіз
:");
scanf("%d",nom+1);
printf("\n
фамилиясы
- ");
gets(sved.Fio);
printf("
топ нөмірі
- ");
gets(sved.Grup);
float s=0;
for(int i=0;i<3;i++) {
printf("\n
бағалары
- ");
scanf("%d",sved.Ot[i]);
s+=sved.Ot[i];
}
sved.S_Bal=s/3.;
return;}
void main(void)
{struct Spisok Stud[50]; int i,N; char Bukva;
clrscr();
printf("\n 50-
ден кіші бүтін сан енгізіңіз
");
scanf("%d",&N);
for(i=0;i
printf ("\n
студенттердің тізімі:
");
for(i=0;i
printf("\n %20s %10s %4.2f",Stud[i].Fio,
Stud[i].Grup,Stud[i].S_Bal);
printf ("\n
Фамилиядағы әріпті іздеу
");
scanf("%c",&Bukva);
printf("\n
Студенттер туралы мәлімет
");
int kod_p=0;
50
for(i=0;i
if(Stud[i].Fio[0]==Bukva){ kod_p=1;
printf("\n %20s %10s%4.2f",Stud[i].Fio,
Stud[i].Grup,Stud[i].S_Bal);}
if(kod_p==0) printf("
Ондай жазба жоқ
!");
printf ("\n
Жазбаны іздеу
");
Vvod(-1,sved);
kod_p=0;
for(i=0;i
if(memcmp(sved,&Stud[i],sizeof(sved))==0) { kod_p=1;
printf("\n
Іздеу:
\n %20s %10s",Stud[i].Fio,
Stud[i].Grup);}
if(kod_p==0) printf("Ондай жазба жоқ!");
getch();}
С тілінде құрылымдарда өрістердің ерекше типі – биттік өрістерді қолдануға
мүмкіндік жасалған. Биттер өрісі дегеніміз – компьютер жадында бүтін типті
айнымалылардың аймағында орналасқан көрші разрядтар (биттік – екілік) топтары.
Ақпараттарды мәліметтер құрылымдарында сақтау үшін бірнеше бит жеткілікті
болса, биттер өрістерін пайдаланған ыңғайлы.
Биттік өрісті сипаттаудың синтаксисі:
тип[аты]:ені;
Құрылымның элементтері бір немесе бірнеше құрылымдық айнымалы болуы
мүмкін. Құрылымдармен жұмыс істеудің бірнеше мысалын қарастырайық.
Бақылау сұрақтары
1.
Си тілінде құрылымдар мен жолдар қалай сипатталады?
2.
Айырмашылықтарын түсіндіріңіз.
3.
“Құрылымға нұсқауыш” терминін түсіндіріңіз?
4.
Нұсқауыштарды құрылымдарға қатысты қолдану ерекшеліктерін атаңыз.
5.
Құрылымдармен жұмыс істеу ерекшеліктерін түсіндіріңіз.
6.
Құрылым элементтерін қорытып шығару мүмкіндіктерін көрсетіңіз.
12
дәріс. Файлдарды пайдалану
Файл – сыртқы есте сақтау құрылғыларында (магниттік дискілерде) орналас-
тырылған және мәлімет өңдеу, тасымалдау кездерінде біртұтас күйде қарасты-
рылатын мәліметтер жиыны.
Файлдармен жұмыс істеу үшін оларды алдымен ашу керек, яғни файл туралы
мәліметті – атын, адресін программаға белгілі ету қажет.
С тілінде файл ашу fopen() функциясы арқылы орындалады. Ол сыртқы құрыл-
ғыдағы физикалық файлды, мысалы, А:\NUR.DAT, программадағы оның логикалық
атымен байланыстырады. Логикалық ат дегеніміз – файлға нұсқауыш, яғни файл
туралы мәлімет сақталатын жады аймағына сілтеме жасау. Файлға нұсқауыш
сипатталуы тиіс.
Сонымен, файлдармен жұмыс істегенде нұсқауыштар қолданылады. Файлға
нұсқауыш мынадай түрде сипатталады:
FILE *fp;
мұндағы FILE типі – тақырыптық файлында анықталған құрылым. Бұл
нұсқауышты көрсетілген файлмен сол файл ашылғаннан бастап, байланыстырып
қоюға болады. Ол үшін келесі функция пайдаланылады:
fopen ("файл адресі/аты","қатынасу типі");
ол файлға нұсқауыш мәнін қайтарады немесе қате болса, NULL мәнін береді.
51
Мысалы, мынадай оператор орындалуы нәтижесінде
fp = fopen ("ex1.txt", "w");
жұмыс бумасындағы ex1.txt файлы оған мәлімет жазу (write) үшін ашылады, ал
программада бұл файлды
fp
нұсқауышы арқылы пайдаланамыз (яғни
fopen()
функциясы файлдың сыртқы атын оның программада қолданылатын ішкі логикалық
атымен байланыстырады).
Сонымен, файлды ашатын fopen() функцияcының жалпы жазылуы:
fp = fopen(name,mode)
мұнда
fp
–
файлға сілтейтін нұсқауыш;
name
–
файлдың адресін де көрсетуге
болатын аты, көбінесе символдық тіркес арқылы жазылады;
mode
–
файл қандай
режимде қолданылатынын көрсететін параметр, бұл да символдар тіркесімен төмен-
дегідей түрде жазылады:
"
r" –
файлды оқу үшін ашу (файл бұрын ашылған болуы тиіс);
"
w" –
бос файлды информация жазу үшін ашу;
"
a" –
файл соңына мәлімет қосып жазу үшін оны ашу;
"
r+"–
файлдан информация оқу және оған информация жазу үшін ашу);
"
w+"–
бос файлдан информация оқу және оған мәлімет жазу үшін файл ашу (бұрын
файл болса, ол өшіріледі);
"
a+"–
файлдан мәлімет оқу және оның соңына мәлімет қосып жазу үшін ашу).
Келісім бойынша файл көбінесе мәтіндік режимде ашылады.
Файлмен жұмыс істеп болған соң, оны жабу үшін келесі функция қолданылады:
fclose(файл_нұсқауышы).
Файлға мәлімет жазу/оқу үшін жалпы енгізу/шығару функциялары тәріздес
бірсыпыра функциялар пайдаланылады:
FPRINTF
(),
FSCANF
(),
FPUTS
(),
FGETS
(),
GETC
(),
PUTC
(),
FGETC
(),
FPUTC
().
Бұлардың ішіндегі
getc()/fgetc(),
putc()/fputc()
функциялары
әрекеттері ұқсас, айырмашылықтары тек
getc
() пен
putc
()
макроанықтаулар да, aл
fgetc
() және
fputc
() –
нағыз функциялар болып табылады.
Барлық файлдық функциялар прототиптері
файлында орналасқан.
Файлдардан мәлімет жазу/оқу әрекеттерін үш топқа бөлуге болады:
-
символдарды енгізу/шығару операциялары;
-
сөз тіркестері жолдарын енгізу/шығару операциялары;
-
блок бойынша енгізу/шығару операциялары.
Символдарды енгізу/шығару операцияларында файлдан бір ғана символ
оқылады немесе оған бір символ жазылады. Мысалы:
fgetc(FILE *fp);
ашылған файлдан символ оқиды.
fputc(int
ch,FILE *fp)
;
ch
символы кодын файлға жазады.
Сөз тіркестері жолдарын енгізу/шығару операцияларында бір мәлімет алмасуы
кезінде файлдан сөз тіркесі жолдары оқылады немесе оған сөз тіркесі жазылады.
Мысалы:
gets(char *S);
файлдан мәлімет байттарын '\n' символы кездескенше
біртіндеп оқиды да, оларды
S
тіркесіне орналастырып, '\n' символын ‘\0’ (нөл-
терминатор) белгісіне айналдырады.
fgets(char *S,int m,FILE *fp)
;
fp
түрінде сипатталған файлдан
байттарды оқып, оларды '\n' символы кездескенше немесе m байт оқылып біткенше S
тіркесі мәні ретінде жазып шығады.
Блок бойынша енгізу/шығару операцияларында мәліметтер алмасу олардың
бір блогын толық қамтиды. Мысалы:
52
fread (void *ptv, int size, int n, FILE *fp);
мұнда
fp
файлынан әрқайсысы
size
байттан тұратын мәліметтің
n
блогы
ptv
нұсқауышы көрсетіп тұрған жады аймағына оқылады (оқылатын блок үшін алдын ала
орын дайындап қою қажет).
fwrite (void *ptv, int size, int n, FILE *fp);
мұнда
ptv
нұсқауышы көрсетіп тұрған жады аймағында орналасқан әрқайсысы
size
байттан тұратын мәліметтің
n
блогы ашық тұрған
fp
файлына жазылады.
fprintf
және
fscanf
функцияларын пайдалану
fprintf -
файлға информация жазу үшін, ал
fscanf –
файлдан
информация оқу үшін қолданылады. Олардың жалпы жазылу түрі:
fprintf(fp, “спецификация шаблоны”,p);
Достарыңызбен бөлісу: