ПоәК 042-39 104/03-2014 №1 басылым 18. 09. 2014ж



жүктеу 0,87 Mb.
бет7/8
Дата01.01.2020
өлшемі0,87 Mb.
#25615
1   2   3   4   5   6   7   8

8 апта



9 тақырып. Жады кластары
Дәріс жоспары

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

  2. Объектілердің локализациясы.

  3. Глобальды объектілер.

  4. Динамикалық жады.

  5. Ішкі объектілер.

  6. Автоматты, статистикалық, ішкі айнымалылар.


Дәрістің қысқаша конспектісі

Жады кластары және программаларды ұйымдастыру

Объектілердің локализациялануы. Автоматы жадыны сипаттау үшін auto немесе register жадыларының классспецификаторлары қолданыла береді. Бірақта бұл жады класының спецификаторлардың-кілттік сөздерінсіз-ақ блок ішінде анықталған(мысалы,функция денесінің ішінде) кез-келген объект (мысалы,массивтер немесе айнымалылар), автоматты жады объектісі ретінде қабылданады. Автоматты жады объектісі өзі анықталған блоктың ішінде ғана бар болады. Аuto немесе register типіндегі объектілерімен белгіленген жады блоктан шыға бергенде босатылады, яғни объектілер жоғалады. Блокқа қайта кіргенде сол объектілер үшін жадыдан алдыңғылардан тәуелдсіз жаңа аймақтар бөлінеді. Автоматты жады объектілері өздері анықталған блоктың ішінде локалданған, олардың бар болу уақыты("өмір сүру" уақыты) сол блоктың ішіндегі басқарудың бар болуымен анықталады. Басқаша айтқанда, автоматты жады әрқашанда ішкі болады, оған тек сол блокта, яғни өзі анықталған блокта болғанда ғана байланыса аласыз.

Мысал:

# include

/* Автоматты жады айнымалылары */

void autofunc(void)

{

int K=l;


printf("\tK=%d",K);

K++;


return;

}

void main()



{

int x;


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

autofunc();

}

Программаның орындалуының нәтижелері: K=1 K=1 K=1 K=1 K=1



Бұл программаның орындалуының нәтижесі айқын көрініп тұр, және келтірмей-ақ қоюға болатын еді егер ішкі жадының тағы бір классы – статистикалық ішкі жады болмаса. Келтірілген программаға өте ұқсас программаны қарастырайық:

#include

/* Статистикалық жадының локальды айнымалылары */

void stat(void)

{

static int K=l;



printf("\tK=%d",K>

K++;


return;

}

void main()



{

int i;


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

stat() ;


}

Программаның орындалуының нәтижелері:K=1 K=2 K=3 K=4 K=5

Отличие функций autofunc() и stat() состоит в наличии спецификатора static при определении переменной int К, локализованной в теле функции stat(). К айнымалысы autofunc() функциясындағы - бұл автоматты жады айнымалысы, ол функцияға әр кірген сайын анықталады және инициализацияланады. static int К айнымалысы жадыдан орын алады және бір-ақ рет қана инициализирленеді. К статистикалық ішкі айнымалысының соңғы мәні stat() функциясынан шыға берісте, дәл осы функцияның кезеті шақырылуына дейіін сақталады.

Глобальды объектілер. Блоктар ішінде объектілерді қолдану мүмкіндігіне назар аудару қажет, Следует обратить внимание на возможность использовать внутри блоков объекты, которые по месторасположению своего определения оказываются глобальными по отношению к операторам и определениям блока. Есімізге түсірейік, блок – бұл тек функция денесі ғана емес, сонымен қоса ирек жақша ішіне алынған кез-келегн анықтама және операторлар кезектілігі.

Глобальды айнымалы программасынан мысал:

#include

int N=5;


/* Глобальная переменная */

void func(void)

{

printf("\tN=%d",N);



N--;

return;

}

void main()



{

int i;


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

{

func();



N+=2;

}

}



Программа орындалуының нәтижесі: N=5 N=6 N=7 N=8 N=9

int N айнымалысы main( ) және func() функциясының ішінде анықталмаған және олардың әрқайсысына байланысты глобальды объект болып табылады. Ғunc( ) –ты әр шақырған сайын N-нің мәні 1-ге азаяды, негізгі программада 2-ге ұлғаяды. Глобальді обьект блоктың ішінде глобальді обьектінің аты басқа мақсатпен иқолданғанда, анықтамамен "затенен" немесе "жасырылған" болуы мүмкін. Алдыңғы программаны модифицирлейміз:

#include

int N=5; /* глобальды айнымалы*/

void func(void)

{

printf("\tN=%d",N);



N--;

return;


}

void main()

{

int N; /* локальды айнымалы */



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

func() ;


}

Программа орындалуының нәтижесі: N=5 N=4 N=3 N=2 N=l

Автоматты жадының main( ) функциясынан шыққан int N айнымалысы int N глобальды айнымалысының мәніне еш әсер етпейді. Бұлар жадыдан әртүрлі аумақтары берілген әртүрлі объектілер. Ішкі айнымалы N main() функциясынан "көрінбейді" және бұл int N анықтамасының нәтижесі оның ішінде болады.

Динамикалық жады – бұл программаның орындалу барысында бөлінетін жады. Ал мына сұраққа: "Динамикалық жадыда глобальды ма әлде локальді объект орналасқан?" дұрыс жауап тауып көрейік.

Динамикалық жадыны бөлгеннен кейін, арнайы библиотекалық free() функциясының көмегімен ғана орындалуы мүмкін, оның толық босатылуына дейін сақталады.

Егер динамикалық жады программаның память не была освобождена до окончания выполнения программы, то она освобождается автоматически при завершении программы. Тем не менее, явное освобождение ставшей ненужной памяти является признаком хорошего стиля программирования.

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



  • нұсқаушы (динамикалық жады аумағында) автоматты жадының локальды объектісі ретінде анықталған. Бұл жағдайда бөлініп алынған жады нұсқаушының локальденуі блогының сыртына шыға бергенде рұқсат жоқ болады, және оны блоктан шығар алдында босату қажет;

  • нұсқаушы статистикалық жадының локальды объектісі ретінде анықталған. Блокта бөлініп алынған динамикалық жады әр блокқа кірген сайын нұсқаушы арқылы рұқсат етілген. Жадыны тек оны қолдануды аяқтағаннан кейін ғана босату керек;

  • нұсқаушы блокқа байланысты глобальді объект болып табылады. Динамикалық жады нұсқаушы "көрінген" барлық блокта мүмкін. Жадыны тек оны қолдануды аяқтағаннан кейін босату керек.

Динамикалық жадының объектісі ішкі статистикалық нұсқаушымен(локальденген) байланысты болғанда, екінші нұсқасын иллюстрациялаймыз:

#include

#include /* malloc(),free() функциялары үшін */

void dynam(void)

{

static char *uc=NULL; /* Ішкі нұсқаушы */



/* Жадының бірнеше рет бөлінуінен сақтау: */

if (uc ==NULL)

{

uc=(char*)malloc(1);



*uc='A';

}

printf("\t%c",*uc);



(*uc)++;

return;


}

void main()

{

int i;


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

dynam( );

}

Программа орындалуының нәтижесі: А B C D E



Алдыңғы программаның дұрыс еместігі - malloc()функциясымен бөлінген жады аумағы free( ) функциясымен босатылуы екіталай.

Келесі программада нұсқаушы жадының динамикалық аумағында - глобальды объект:

#include

#include /* malloc( ), free( ) функциялары үшін */

char * uk=NULL; /* глобальды нұсқаушы */

void dynam1 (void)

{

printf("\t%c", *uk) ;



(*uk)++;

}

void main (void)



{

int i ;


uk=(char*) malloc (1);

*uk='A' ;

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

{

dynam1();



(*uk)++;

}

free(uk);



}

Программа орындалуының нәтижесі: А С Е G I

Динамикалық объект негізгі функцияда құрылады және uk нұсқаушысымен байланысады. Сол жерде меншіктеуде бастапқы 'А' мәнін қабылдайды. Динамикалық объект глобальды нұсқаушы есебінен екі main() және dynam1() функцияларында да мүмкін. main() және dynam1() функциясының ішінде циклдың орындалу барысында динамикалық объект мәні өзгереді.

Жадының динамикалық бөлінген аумағын адрестейтін нұсқаушы, автоматты жады объектісі болып табылатындығына мысал келтірудің қажеттігі жоқ. Атап өтейік, динамикалық жады, анықталған немесе сыртқы объект ретінде сипатталған нұсқаушының осы жадымен байланысқан жерінде(кез-келген функцияда және кез-келген файлда) бөлінгеннен кейін барлық жерде рұқсат етілген. Ішкі объект анықтамасын нақты анықтау керек, ол тақырыпқа да көшеміз.



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

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



Сыртқы объектілер программаның көптеген функцияларынан алына алады, бірақта бұндай рұқсат алу үнемі автоматты түрде болмайды-жағдайлар қатарында программисттің қосымша араласуы қажет. Егер объект программамен бірге файлдың басында анықталған болса, онда ол файлда орналасқан барлық функциялар үшін глобальды болып табылады, және соның ішінде ешқандай қосымша жазылымдарсыз-ақ байланысу мүмкін болады. (Шектеу - егер функция ішінде глобальды объект атауы ішкі объект ретінде қолданылса, онда сыртқы объект мүмкін емес болып қалады, яғни "көрінбейтін" дәл осы функция денесінде.).

Суретте:


  • X объектісі: глобальді сияқты f11(), f12()-де болады; сыртқы сияқты файл 2-де extern X сипаттамасы енгізілген тек сол функцияларда ғана болады;

  • Y объектісі: f21( ) және f22( )-де глобальды сияқты; сыртқы сияқты 1 файлының extern Y сипаттамасы енгізілген сол функцияларында;

  • Z объектісі: f22( )-де және extern Z сипаттамасы енгізілген файл 1 және файл 2-нің барлық функцияларында глобальды сияқты болады.

Егер сыртқы объект басқа файлдың немесе функцияның функциясы үшін рұқсат етілген болуы қажет болса, онда ол сұхбаттасудан бұрын қосымша кілттік extern сөзін қолданумен бірге қосымша сипатталған болуы керек. (Наличие этого слова по умолчанию предполагается и для всех функций, т.е. не требуется в их прототипах.) Ондай сипаттама, extern сөзінің спецификаторымен бірге файлдың басында енгізіледі, және сонда объект файлдың барлық функцияларында доступен. Бірақта бұл сипаттама бір функцияның денесінде орналасуы мүмкін, онда объект сонда(ішнде) ғана доступен.

Сыртқы объект сипаттамасы оның анықтамасы емес. Естеріңізде сақтаңыздар: анықтамада объектіге ылғида жады бөлінеді, және ол инициализирленген болуы мүмкін. Анықтама мысалы:

double summa[5];

char D_Phil []="Doctor of Philosophy";

long M=1000;

Сипаттауда инициализация мүмкін емес, массивтер элементтерінің санын да көрсетуге болмайды:

extern double summa [ ];

extern char D_Phil [ ];

extern long M;



Өзін-өзі бақылау сұрақтары:

  1. Қандай жады кластары бар?

  2. Автоматты жады дегеніміз не?

  3. Динамикалық жады дегеніміз не?

  4. Статистикалық ішкі жады дегеніміз не?

  5. Қандай жады кластарының спецификаторлары қолданылады?

  6. Автоматты айнымалылар дегенімізе?

  7. Статистикалық айнымалылар дегеніміз не?

  8. Ікі айнымалылар ьдегеніміз не?


8.1. Негізгі әдебиеттер

1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995

2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999

3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005

8.2. Қосымша әдебиеттер

1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000

2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984

9 апта



Тақырып 10. Берілгендердің күрделі типі: массивтер
Дәріс жоспары

  1. Массивтер.

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

  3. Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.

  4. Бір өлшемді массивтер мен нұсқауыштар.


Дәрістің қысқаша конспектісі

Массив – бұл бір типті ақырлы сандардың жиыны.

Массив атпен аталады.

Мысалы, 1.6, 14.9, -7, 0, -4 сандарының терілімін 5 элементтен тұратын массив деп санауға болады және белгілі бір атпен атауға мысылы, А болады.

Массивтің әр элементі массивтің аты мен квадратты жақша ішінде индексін көрсетумен аталады.

Массив элементтері индекстерінің ретімен реттелген.

Массивтерді сипаттауда:



  • Элементтерінің типін,

  • Массивтің атын,

  • Өлшемін , яғни, нақты элеметті көрсетуге қажет, индекстерінің санын

көрсету қажет.

Сонымен қатар, сипаттауда әр индекс қабылдайтын мәндердің саны көрсетіледі. Мысалы, int а[10]; 10 элементтен тұратын а[0], а[1], ..., а[9] массивті анықтайды. float Z[13][[6]; бірінші индексі 0 ден 12 ге дейінгі 13 мәннен, екінші индексі 0 ден 5 ке дейінгі 6 міннен тұратын екі өлшемді массивті анықтайды. Сөйтіп, Z екі өлшемді массив элементтерін келесідей көрсетуге болады: Z[0][0], Z[0][5], , Z[12][5]

Си тілінің синтаксисіне сәйкес, тек бір өлшемді массивтер ғана болады, дегенмен, бір өлшемді массивтің элементері массив бола алады. Сондықтан екі өлшемді массив массивтің массиві ретінде анықталады. Сөйтіп, мысалда әрқайсысы float типті 6 элементтен тұратын 13 элемент-массивтерден тұратын массив берілген. Кез келген массив элементін нөмірлеу 0- ден басталып, N-1 -ге дейін нөмірленетініне назар аударыңыз, мұндағы N –индекс мәндерінің саны .

Массивтердің шектелуі, яғни, Си тілінде оның элементінің индекстерінің санына жоқ. Си тілінің стандарты транслятор 31- ге дейінгі массивтердің сипаттамасын ғана өңдеуге рұқсат етеді . Әдетте, көбінесе, бір өлшемді және екі өлшемді массивтер кеңінен қолданылады.



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

double d[ ]={1.0, 2.0, 3.0, 4.0, 5.0};

Бергілген мысалда массивтің ұзындығын компилятор фигуралық жақшалардың ішіндегі бастапқы мәндер саны бойынша есептейді. Осындай сипаттаудан кейін элемент d[0] тең 1.0, d[l] тең 2.0 және т.с.с d[4] тең 5.0.

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

int М[8]={8,4,2};

Берілген мысалда келесі айнымалылардың мәні ғана анықталған: М[0], М[1] және М[2], олар сәйкесінше 8, 4 және 2 –ге тең. М[3],..., М[7] элементтері инициализацияланбаған.

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

double A[3][2]={{10,20}, {30,40}, {50,60}};

Бұл жазу келесі меншіктеу операторының кезектілігіне эквивалентті: А[0][0]=10; А[0][1]=20; А[1][0]=30; А[1][1]=40; А[2][0]=50; А[2][1]=60; Осы тізімді келесі инициализациялау тізімі арқылы да алуға болады:

double A[3][2]={10,20,ЭО,40,50,60};

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

double Z[4][6]={{1}, {2}, {3}, {4}};

Келесі жазылым 5 жол және 4 бағаннан тұратын бүтін санды массивте "үшбұрышты" матрицада түрлендіреді:

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

Бұл мысалда ақырғы бесінші жол х[4] толтырылмаған, ал бастапқы үш жол толықтай толтырылмаған болып қалады.

Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.

Тапсырма. 5 элементтен тұратын бір өлшемді массивтің теріс элементтерінің арифметикалық ортасын есептеу керек.
#include

main()
{

int I,K,N;

float s;


int A[5]={-1,2,-3,4,5};

K=0;


N=0;

for (I=0; I<= 4; I++)

{

if (A[I]<0)



{

K=K+A[I];

N++;

}

}



s=K/N;

printf("\ns=%f",s);


}
Бір өлшемді массивтер және нұсқаушылар.
Си тілінде массивтер мен нұсқауыштар арасында байланыс бар. Мысалы, массив int array[25] түрінде сипатталса, онда массивтің жиырма бес элементі үшін жадыдан орын бөлу ғана орындалмайды, сонымен қатар мәні массивтің бірінші элементінің (яғни, саны бойынша нөлдік) адресіне тең, array атты нұсқауыш үшін де орын бөлу орындалады, яғни, массивтің өзі атсыз қалады, ал массивтің элементтеріне рұқсат алу array атты нұсқауыш арқылы жүзеге асырылады. Тіл синтаксисіне сәйкес array нұсқауышы тұрақты болып табылады, оның мәнін өрнектерде қолдануға болады, бірақ, бұл мәндерді өзгертуге болмайды.

Массив аты нұсқауыш болғандықтан, келесідей меншіктеуге рұқсат етілген :

int array[25];

int *ptr;

ptr=array;

Мұнда ptr нұсқауышы массивтің бірінші элементінің адресіне орнатылған, сонымен қатар ptr=array меншіктеуін келесі эквивалентті түрінде жазуға болады:

ptr=&array[0].

Массив элементтеріне рұқсат алудың екі әдісі бар. Біріншісі, қарапайым квадрат жақша ішінде индекс мәндерін қолданумен байланысты. Мысалы, array[16]=3 немесе array[i+2]=7. Мұндай рұқсат алу әдісінде екі өрнек жазылады, екінші өрнек квадрат жақшаға алынады. Бұл өрнектердің біреуі нұсқауыш, ал екіншісі бүтін типті мән. Бұл кезектіліктің жазылуы кез келген бола алады, бірақ, жақша ішіне екінші тұрғаны жазылады. Сондықтан array[16] және 16[array] жазылулары эквивалентті және массивтің он алтыншы элементін білдіреді. Индекті түрде қолданылған нұсқауыштың міндетті түрде қандай да бір массивке нұсқайтын, тұрақты болуы керек емес, ол айнымалы да бола алады. Дербес жағдайда, ptr=array меншіктелуі орындалғаннан кейін массивтің он алтыншы элементіне рұқсат алу ptr формасында келесідей болуы мүмкін: ptr[16] немесе 16[ptr].

Массив элементтеріне рұқсат алудың екінші әдісі *(array+16)=3 немесе *(array+i+2)=7 түріндегі адрестік мәндер мен адрестеу операциясымен байланысты. Мұндай рұқсат алу әдісінде массивтің он алтыншы элементінің адресіне тең адрестік өрнек келесі түрду жазылуы мүмкін :

*(array+16) или *(16+array).

Компьютерде жүзеге асыру барысында бірінші әдіс екінші әдіске келтіріледі, яғни, индекстік өрнек адрестік өрнекке түрленеді. Келтірілген array[16] және 16[array] мысалдары *(array+16) түріне тұрленеді.

Массивтің бастапқы элементіне рұқсат алу үшін (яғни нөлдік индексті элементке), тек array немесе ptr нұсқауыштарының мәнін қолдануға болады. Келесі меншіктеулердің кез келгені

*array = 2;

array[0] = 2;

*(array+0) = 2;

*ptr = 2;

ptr[0] = 2;

*(ptr+0) = 2;

Массивтің алғашқы элементіне 2 мәнін меншіктейді, бірақ, *array=2 және *ptr=2 меншіктеулері жылдам орындалады, себебі, оларда қосу операторларын орындау қажет емес.
Өзін өзі тексеру сұрақтары


  1. Массив деген не?

  2. Массивтің өлшемі деген не?

  3. Программада бір өлшемді, екі өлшемді массивтер қалай сиптталады?

  4. Массив элементтеріне рұқсат алу қалай орындалады?

  5. Массивті қалай толтыруға болады?

  6. Массивті экранға қалай шығарады?

  7. Бір өлшемді массивтер мен нұсқауыштар.


8.1. Негізгі әдебиеттер

1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995

2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999

3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005

8.2. Қосымша әдебиеттер

1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000

2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984

10 апта



Тақырып 10. Берілгендердің күрделі типі: массивтер
Дәріс жоспары

  1. Екі өлшемді массивтің сипатталуы.

  2. Екі өлшемді массивтің элементтерімен жұмыс.

  3. Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.

  4. Екі өлшемді массивтер үшін нұсқауыштарды қолдану.



Дәрістің қысқаша конспектісі

float Z[13][[6]; бірінші индексі 0 ден 12 ге дейінгі 13 мәннен, екінші индексі 0 ден 5 ке дейінгі 6 міннен тұратын екі өлшемді массивті анықтайды. Сөйтіп, Z екі өлшемді массив элементтерін келесідей көрсетуге болады: Z[0][0], Z[0][5], , Z[12][5]

Си тілінің синтаксисіне сәйкес, тек бір өлшемді массивтер ғана болады, дегенмен, бір өлшемді массивтің элементері массив бола алады. Сондықтан екі өлшемді массив массивтің массиві ретінде анықталады. Сөйтіп, мысалда әрқайсысы float типті 6 элементтен тұратын 13 элемент-массивтерден тұратын массив берілген. Кез келген массив элементін нөмірлеу 0- ден басталып, N-1 -ге дейін нөмірленетініне назар аударыңыз, мұндағы N –индекс мәндерінің саны .
Сандық массивтерді өңдеудің типтік алгоритмдерін программалау.

Тапсырма. 3 жол және 3 бағаннан тұратын екі өлшемді массивті экранға шығару. Бас диоганалінен жоғары орналасқан оң элементтердің қосындысын есептеу керек.
# include

main()


{

int A[3][3]={3,-2,4,10,-7,1,-9,12,5};

int I,J,D;
D=0;

printf("\n");

for (I=0; I<=2; I++)

{

for (J=0; J<=2; J++)



{

if (I0) D+=A[I][J];

printf("%3d",A[I][J]);

}

printf("\n");



}

printf("\n%d",D);


}
Көп өлшемді массивтерге нұсқаушылар.

Си тілінде көп өлшемді массивтерге нұсқауыштар – ол массивтердің массивтері, яғни, элементтері массив болатын массивтер. Бұндай массивтерді жариялауда компьютердің жадысында әр түрлі обьектілер пайда болады. Мысалы, int arr2[4][3] екі өлшемін жариялағанда жадыда төрт нұсқаушыдан тұратын массивке нұсқаушы болып табылатын , arr айнымалысының мәнін сақтауға арналған орын бөлінеді. Төрт нұсқаушылы массиыке де орын бөлінеді. Бұл төрт нұсқаушының әрқайсысы int типті үш элементтен тұратын мссив адресінен тұрады Сөйтіп, arr2[4][3] жариялануы программада үш түрлі обьект тудырады: arr идентификаторымен нұсқауыш, төрт нұсқауыштан тұратын атсыз массив және int типті он екі саннан тұратын атсыз массив. Атсыз массивтерге рұқсат алу үшін arr нұсқаушысымен адрестік өрнек қолданылады. Нұсқаушылар массиві элементтеріне рұқсат алу arr2[2] немесе *(arr2+2) түрінде бір индекстік өрнекті көрсету арқылы жүзеге асады. Int типті сандық екі өлшемді массив элементтеріне рұқсат алу үшін екі индекстік өрнек int түрінде немесе оған эквивалентті *(*(arr2+1)+2) және (*(arr2+1))[2] түріндегі қолданылуы мүмкін.

Тіл синтаксисіне сәйкес arr нұсқауышы және arr[0], arr[1], arr[2], arr[3] нұсқауыштары тұрақты болып табылады, оның мәнін өрнектерде қолдануға болады, бірақ, бұл мәндерді программаның орындалу барысында өзгертуге болмайды.

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

Мысалы, arr2[1][2] элементіне рұқсат алу int *ptr2=arr2[0] түрінде жарияланған, ptr2 нұсқаушысының көмегімен жүзеге асады. Ішкі ұқсас arr2[6] рұқсат алуын орындау мүмкін емес, себебі 6 индексті нұсқаушы жоқ.
Өзін_- өзі тексеру сұрақтары


  1. Екі өлшемді массивті қалай сипаттауға болады?

  2. Екі қлшемді массив элементіне қалай рұқсат алуға болады?

  3. Екі өлшемді массивті қалай толтыруға болады?

  4. Екі өлшемді массивті экранға қалай шығаруға болады?

  5. Екі өлшемді массив үшін нұсқауыштарды қолдануға болады.


8.1. Негізгі әдебиеттер

1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995

2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999

3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005

8.2. Қосымша әдебиеттер

1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000

2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984

11 апта



Тақырып 11. Жолдар
Дәріс жоспары

  1. Символдық берілгендер.

  2. Жолдық тұрақтылар мен айнымалылар.

  3. Жолдармен жұмыс жасауға арналған функциялар.

  4. Символды массивтерді өңдеудің типтік алгоритмін программалау.


Дәрістің қысқаша конспектісі

Символдық берілгендермен жұмыс

Символдық тұрақты– бұл апострофқа алынған бір символ.

Мүмкін мәндер ASCII символдар кодының кеңейтілген теріліміне жатады. ASCII – бұл American Standard Code for Information Interchange-тің (ақпаратты алмастыруға арналған американдық код) аббревиатурасы. ASCII стандартына сәйкес әр символға және кейбір басқарушы инструкциялардың 0 ден 127- ге дейінгі мәндерді қабылдайтын өз сандық коды бар. ASCII кеіейтілген кестесі екі бөлімнен тұрады. Біріншісіне, 0-127 кодымен символдар кіреді, ол универсалды болып табылады, ал екіншісі, (128-255) кодтары, арнайы символдар мен халықтардың әріптеріне (соның ішінде орыс әріптеріне) арналған. Сөйтіп, пернетақтаның әр перненің ішкі коды бар, ол код перненің пренетақтада орналасуы мен пернедегі символдың бейнесіне байланысты.


Мысалдар:

ASCII-ге сәйкес :

  • 'F' символының коды 70

  • 'f' символының коды 102

  • 2 символының коды 50

  • ESC пернесінің коды 27

  • ENTER пернесінің коды 13

  • ПРОБЕЛ пернесінің коды 32

және т.б.
Си тілінде символды берілгендерді сипаттау үшін анайы берілгендер типі жоқ, символды берілгендерді сипаттау үшін CHAR типі қолданылады.

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

Латын алфабитінің әріптерінің ішкі кодтары реттелген, сондықтан оларды цикл операторында қолдануға болады.

Мысал:

'a' дан 'n ' –ға дейінгі латын алфавитінің символдарын экранға баған ретінде шығару.

#include

main()


{

char x;


for (x='a';x<='n';x++)

printf("\n%c",x);

}
Назар аударыңыз!

Егер символды айнымалыны шығару кезінде %d спецификациясын қолданса, онда символдың өзі емес оның коды шығады.


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

getchar() – функциясы пернетақтадан енген символдарды бір бірден оқиды. Енгізілген смволдарды оқу Enter пернесін басқаннан кейін орындалады. getchar() функциясының параметрлері жоқ.

putchar(x) – x -тің символдық мәнінін экранға шығарады.

getch() – пернетақтадан енген символды экранда бейнелемей енгізуге арналған. getch()функциясының параметрлері жоқ.

Ескерту: putchar() функциясында форматты жолды көрсетуге болмайды.
Жолдармен жұмыс

Жолдық тұрақты – бұл тырнақшаға алынған символдардың кезектілігі.

Жолдық символдардың ішінде арнайы символдық тұрақтылар кодына сәйкес басқарушы кезектіліктер болуы мүмкін.

Жолды жадыға орналастырғанда, транслятор оның соңына автоматты түрде '\0' символын , яғни, нөлдік байтты орналастырады.

Программада жолдарды жеке символдардан түрлендіріп, жолды аяқтау белгісінің келісімін сақтау керек.



Жолдың ұзындығы – бұл +1 жолындағы символдадың саны (нөлдік байт қосу есебінен).

Жолды жазуда бір символ болуы да мүмкін, мысалы, "A", бірақ, "A" символдық тұрақтысына қарағанда, "A" жолының ұзындығы екі байтқа тең.

Си тілінде жолдар үшін жеке тип жоқ.Жол-бұл символдардың массиві деп қабылдауға болады. Бұндай массивтегі символдар саны сәйкес жолдық тұрақтыда бейнеленгеннен 1 – ге артық (нөлдік байт қосу есебінен).

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

Символдар массивіне инициализация (символды массивті сипаттауда) көмегімен немесе енгізу функциясының көмегімен жолды орналастыруға болады.

scanf() және printf() функцияларында символдық жолдар үшін %s спецификациясы қолданылады.

Жолды шығару үшін puts(s) функциясын қолдануға болады, мұндағы s – жол.

char типті массивті инициализациялаумен бірге сипаттауда жолдың ұзындығын көрсетпеуге болады.


Мысал:

Экранға жолды шығару.


#include

main()


{

char x[]="Привет";

printf("\n%s",x); /* бұл оператордың орнына puts(x) қолдануға болады * /

}
Өзін өзі тексеру сұрақтары



  1. Жол дегеніміз не?

  2. Программада жолды қалай сипаттауға болады?

  3. Жолдық берілгендерге қандай операциялар қолдануға болады?

  4. Жолдың жеке символына қалай рұқсат алуға болады?

  5. Жолдармен жұмыс жасаудың қандай функциялары бар?

  6. Екі жолды қалай салыстыруға болады?

  7. Жолдық айнымалыға мәнді қалай меншіктеуге болады?

  8. Жолдың ұзындығын қалай анықтауға болады?


8.1. Негізгі әдебиеттер

1. Нейбауэр А. Моя первая программа на С/С++ /Перев. с англ. – СПб: Питер, 1995

2. Подбельский В.В., Фомин С.С. Программирование на языке СиЖ Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999

3. Информатика. Базовый курс. 2-е издание / Под ред. С.В. Симоновича. – СПб.: Питер, 2005

8.2. Қосымша әдебиеттер

1.Дейтел Х., Дейтел П. Как программировать на Си. – М.: Бином, 2000

2. Мейер Б., Бодуэн К. Методы программирования. Т. 1 и 2. – М.: Мир, 1984

12 апта



Тақырып 12. Берілгендер құрылымы
Дәріс жоспары

  1. Құрылымды қолдану.

  2. Құрылымды сипаттау.

  3. Құрылымдық айнымалыларды сипаттау.

  4. Құрылым массивтері.

  5. Берілгендердің құрылымы мен нұсқауыштар.


Дәрістің қысқаша конспектісі

Құрылымдық типтер мен құрылымдар

Үлкен көлемді мәнді жиынды өңдеу тапсырмасын шешуде массивтер қолданылады. Бірақ, масивтрмен жұмыста массивтің әр элементінің типтері бірдей болу керек.

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


  • Тауар аты;

  • Көтерме(сататын) бағасы;

  • Сауда қымбаттатуы пайызбен;

  • Тауар партиясының көлемі;

  • Тауар партиясының түскен күні.

Бұл мысалда өлшемдердің типтері келесідей:


  • Тауар аты (char []);

  • Көтерме(сататын) бағасы (long);

  • Сауда қымбаттатуы пайызбен(float);

  • Тауар партиясының көлемі (int);

  • Тауар партиясының түскен күні (char [9]).

Бұндай обьектілерді Си тілінде сипаттау үшін құрылымдық берілгендер типі қолданылады.


Құрылым– бұл бір компонент деп аталынатын (өріс) немесе бірнеше типтердің фиксирленген элементтер санынан тұратын берілгендер типі.

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

"Қоймадағы тауарлар" құрылымының аталған элементерінің типтерін программист өзі таңдаған. Мағынасына қарай компонентердің типтері тілде рұқсат етілгендердің кез келгені бола алады. Өоймадағы тауар көп болуы мүмкін болғандықтан, нақты тауар туралы мәліметтен тұратын жекеленген құрылымдарды сипаттау үшін , программист құрылымдық деп аталатын өз бетінше тип енгізеді. Біздің мысалымыз үшін оны былай енгізуге болады:

struct goods {

char name[]; /* Атауы */

long price; /* Көтерме бағасы */

float percent; /* Қымбаттауы % */

int vol; /* Партия көлемі */

char date [9]; /* Партияны әкелу күні */

};

Мұнда struct – құрылымдық тип спецификаторы (қызметтік сөзі ); goods – құрылымдық типтегі пограммист ұсынған атау (ат). ("tag" ағылшынн терминінің аудармасын қолданып,құрылымдық типтің орыс тіліндегі баламасы Си тілінде көбінесе тег деп аталады). goods типтік әр обьектісіне кіретін, элементті сипаттау фигуралық жақшаға алынады. Сөйтіп, құрылмдық типті анықтау форматы келесідей:


struct құрылымдық_тип_аты { элементті_сипаттау };

мұндағы struct – құрылымдық тип спецификаторы;



құрылымдық_тип_аты – программист өз еркімен таңдайтын идентификатор;

элементті_сипаттау – әр қайсысы енгізілетін құрылымдық типтің элементтері үшін прототип қызметін атқаратын, бір немесе одан да көп обьектілерді сипаттау жиыны .

Құрылымдық тип сипаттамасы үтір нүктемен аяқталатынын ескеру керек.



struct конструкциясы құрылымдық_тип_аты тип спеификатор сияқты рөл атқарады. Мысалы, double немесе int.
Құрылымдық сипаттау. Құрылымдық типтегі элементтерді (компонентерді) сипаттау сыртынан қарағанда сәйкес типті берілгендерді сипаттауға ұқсас. Бірақ, маңызды айырмашылықтары бар. Құрылымдық типті сипаттағанда оған жады бөлінбейді, оларды инициялизациялауға болмайды. Басқаша айтқанда, құрылымдық тип обьект болып табылмайды.

Біздің goods деп аталатын, құрылымдық типті анықтау мысалымыздан, тауардың атауы name атты char типті массивпен байланысты. Тауар бірлігінің көтерме бағасы percent аты long типті болады. Сауда қымбаттауы percent аты float типті болады. Бұның бәрі goods атты құрылымдық иптің сипатталуынан шығады. Бірақ, құрылымдық типті сипаттауға енген элементтерден бірінші мән ала алады, осындай типті бір құрымым болсын (яғни, құрылымдық обьект) сипатталған болу керек. Мысалы, келесі сипаттау екі құрылымды шығарады, яғни, goods типті екі обьектті шығарады:



struct goods coat, tea;

Сөйтіп, құрылымдық тип сипатталған және оның аты анықталған болса, онда нақты құрылымды сипаттау форматы (құрылымдық тип обьектісі) келесідей:



struct құрылымдық_тип_аты құрылым_тізімі,

мұндағы құрылым_тізімі – қолданушы таңдаған аттар тізімі (идентификаторлар).

Аталған құрылымдық сипаттау кезектіліктерден басқа (құрылымдық тип сипатталады, содан соң оның атын қолдану арқылы құрылымы сипаталады) Си тілінде тағы екі сызба және оның сипатталуы бар. Бірінші, құрылым құрылымдық типиен бірге сипаттала алады:

struct құрылымдық тип аты { элементерді сипаттау } құрылым тізімі;
Мысал

Кесте жолында берілген берілгендерді сипаттау:





Атауы

Саны

Бағасы

Шығарылған жылы

1

Стол

120

3000,5

2002

жүктеу 0,87 Mb.

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




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

    Басты бет
рсетілетін қызмет
халықаралық қаржы
Астана халықаралық
қызмет регламенті
бекіту туралы
туралы ережені
орталығы туралы
субсидиялау мемлекеттік
кеңес туралы
ніндегі кеңес
орталығын басқару
қаржы орталығын
қаржы орталығы
құрамын бекіту
неркәсіптік кешен
міндетті құпия
болуына ерікті
тексерілу мемлекеттік
медициналық тексерілу
құпия медициналық
ерікті анонимді
Бастауыш тәлім
қатысуға жолдамалар
қызметшілері арасындағы
академиялық демалыс
алушыларға академиялық
білім алушыларға
ұйымдарында білім
туралы хабарландыру
конкурс туралы
мемлекеттік қызметшілері
мемлекеттік әкімшілік
органдардың мемлекеттік
мемлекеттік органдардың
барлық мемлекеттік
арналған барлық
орналасуға арналған
лауазымына орналасуға
әкімшілік лауазымына
инфекцияның болуына
жәрдемдесудің белсенді
шараларына қатысуға
саласындағы дайындаушы
ленген қосылған
шегінде бюджетке
салығы шегінде
есептелген қосылған
ұйымдарға есептелген
дайындаушы ұйымдарға
кешен саласындағы
сомасын субсидиялау