Си және Си тілініңи көрсеткіштері мен массив элементтері



Жұмыс түрі:  Курстық жұмыс
Тегін:  Антиплагиат
Көлемі: 20 бет
Таңдаулыға:   
Мазмұны

Кіріспе
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... ..5
І. Си және Си ++ тілініңи көрсеткіштері мен массив элементтері

1.1 Көрсеткіштер және массив
элементтері ... ... ... ... ... ... ... ... ... ...6
1.2.Динамикалық жадыдағы
массивтер ... ... ... ... ... ... .. ... ... ... ... ... 11
1.3.Массив көрсеткіштері және көп өлшемді массивтертерді

модельдеу ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... 14
1.4.Әртүрлі ұзындықтағы матрица
жолдары ... ... ... ... ... ... ... ... ...15
1.5. Көрсеткіштер мен массивтердің арасындағы
байланыс ... ... ... ... ... ... ... 16
ІІ. Си тілінде массивтермен жұмыс жасау
2.1 n ретті квадраттық матрицаны
алу ... ... ... ... ... ... ... ... 18
2.2 Массивтің ең үлкен элементін
табу ... ... ... ... ... ... ... ... 19
2.3 Массив элементіне сілтеме жасаудың 4 әдісі ... ... ... ... ..20
2.4 Көрсеткіш пен индекс арқылы жолды көшіру ... ... ... ... 22
2.5 Массивті
сорттау ... ... ... ... ... ... ... ... ... ... ... ... ... ... .23
2.6 Екі өлшемді массивтің
есебі ... ... ... ... ... ... ... .. ... ... ... 24

ІІІ.Қорытынды ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ..
... ... ... ... ... ... ... ... ... ... .25
Қолданылған әдебиеттер
тізімі ... ... ... ... ... ... ... . ... ... ... ... ... ..

Кіріспе

Си –бұл программа құруға және күрделі есептерді шығаруға арналған
объектілі бағытталған тіл. Си тіліндегі берілгендерді тиімді пайдалану
әдістері, қазіргі уақыттағы механизмдермен бағыттаушы есептеулері және
операторлардың қызметінің кеңінен пайдаланылатыны анықталған.
Си тілінің көрсеткіштері – мәні ЭЕМ-нің оперативтік жадысының адресі
болып табылатын айнымалы. Көрсеткіш бұл идентификатордың орналасуы үшін
бөлінетін жадының адресі, яғни бұл тілдің жан -жақтылығы оны көп ыңғайлы
етеді, басқа тілдерге қарағанда көптеген тапсырмаларға ыңғайлы әрі қолайлы.
Си тілі 1972 жылы Bell Laboratoties бірлескен фирмасында Денис Ритчи
қолдауымен жасалған. Ол системалық бағдарламаны, бағдарлама тілдерімен
жұмысты, операциялық жүйені, текстік процессорды меңгерген. Си тілі
бағдарламаушылар арасында өзінің жоғарғы және төменгі деңгейімен, машина
бағдарламасының қолайлылығымен, яғни жан жақты жоғарғы жылдамдықта жұмыс
істеуімен белгілі. Си тілімен жүйелік бағдарламаны сапалы жаңа түрге
көтеруге болады.
Менің бұл курсық жұмыcымның тақырыбы: Си тіліндегі көрсеткіштер және
массивтер. Жалпы менің курстық жұмысым “кіріспе, негізгі, практика және
қорытынды” бөлімдерден тұрады. Негізгі бөлімінде мынандай тақырыптар
қарастырылды: көрсеткіштер және массив элементтері, динамикалық жадыдағы
массивтер, массив көрсеткіштері және көп өлшемді массивтертерді модельдеу,
әртүрлі ұзындықтағы матрица жолдары. Мен бұл курстық жұмыста мына
әдебиеттерді қолдандым:Подбельский В.В. Фомин С.С. Программирование на
языке Си Москва, Финансы и статистика, 2003, Ритчи Д.,Керниган Б.Язык
программиорвания Си -М: Финансы м статистика, 1992, Хэнкок Л., Кригер М.
Введение в программирования на языке Си -М: Радио и связь, 1986, т.б.

І.Си және Си ++ тілініңи көрсеткіштері мен массив элементтері

1.1. Көрсеткіштер мен массивтер элементтері

Массивтер (жиымдар) – бұл бір атаумен белгіленіп біріктірілген біртекті
элементтер жиыны. Жиымдардың негізгі параметрлеріне оның типі
(сандық,символдық, логикалық) өлшемі (бір өлшемді, екі өлшемді) және
көлемі жатады. Тұрмыста тізбектелген сандарды, кестелердің реттелген
жолдарын, фамилия тізімін көп пайдаланамыз, олар бір өлшемді(вектор) немесе
екі өлшемді (матрица) жиым элементтері болуы мүмкін.
Бір өлшемді массив мына түрдегі операторлармен сипатталады:
аттың типі [өлшемі];
Мысалы:
#include stdio.h
#degine KO 3
main()
{ int mas[KO], i;
int mas[KO], i;
mas[0]=123;
mas[1]=456;
mas[2]=1990;
printf((айнымалылардың адрестері:();
for (i=0;iKO;i++);
printf(\n Айнымалылардың мәні:();
for (i=0;iKO;i++);
printf((%5d),mas[i]);
printf((\n();}
Массивтің элементтері нольден бастап нөмірленеді (индексацияланады),
яғни соңғы элемент мына форматта болады:
аты [1-өлшемі]
Массив үшін бөлінген байттардың саны, мына өрнек бойынша анықталады:
өлшемі *(sizeof(типі))
Көп өлшемді жиымдар. Көп өлшемді массив келесі үлгі бойынша
сипатталады:
Массив атының типі [1-өлшем] [2-өлшем] ... [N-өлшем];
Егер жиым атауында бір ғана индекс болса, онда жиымды бір өлшемді, ал
екі индексі болса, онда екі өлшемді және тағы сол сияқты n индексі болса, n
- өлшемді жиым деп аталады. Бір өлшемді жиым вектор элементтері, ал екі
өлшемді жиым матрица болып табылады. Осы айтылғандарға байланысты жиым
элементтері былай белгіленеді:
А[i], B[i,j], C[i,j,k] және тағы сол сияқты жиымдар өлшеміне шек
қойылмайды, ол бір, екі, үш, төрт тіпті одан да көп болуы мүмкін. Бір
өлшемді жиымдарды сызықтық десек, онда екі өлшемді жиымдарды математикада
матрица деп аталалды.
Мысалы:
А(3,4) матрицасын В(4,2) матрицасына көбейту.
#include stdio.h
main()
{ int a[3][4]={{5,2,-4,13}, {4,9,0,6},{7,-1,8,3}};
int b[4][2]={{23,-6}, {92,-53},{-6,0},{12,3}};
int c[3][2]=i,j,k;
for (i=0;i3;i++)
{for(j=0;j2;j++);
{c[i][j]=0;
for (k=0;k4;k++)
c[i][j]=a[i][k]*b[k][j];}
for (i=0;i3;i++)
for(j=0;j2;j++);
{prinf((c[%d][%d]=%d9i,j,c[i][j]);
printf((\n();}}
Көрсеткіштер деп – мәні ЭЕМ-нің оперативтік жадысының адресі болып
табылатын айнымалы. Көрсеткіш бұл идентификатордың орналасуы үшін
бөлінетін жадының адресі . Жады – биттер жиыны: 8 бит –байт деп аталады,
биттер тобы; 2 байт сөзді құрайды; 4 байт ұзын сөз; 16 байт – параграф.
Жадыда байттар бірінен соң бірі келеді. Егер m – кейбір байттардың адресі
болса, онда (m-1) – алдыңғы байттың, ал (m+1) – келесі байттың адресі
болады. Егер айнымалы көрсеткіш ретінде хабарланған болса, онда ол кез
келген типтің скалярлық мөлшерін құрайтын жады адресін құрайды.
Көрсеткіштің құрамында қайсы бір байттардың адрестері бар. Көрсеткіш
айнымалысының типін хабарлағанда адресі жұлдызшасы бар көрсеткіш аты және
айнымалы құрайтын мәліметтер объектісін типін анықтау қажет. Көрсеткіштің
мәнін өзгерте отыра, жады бойынша “орналасуға” мүмкін, сол бір немесе
әртүрлі құрылымның әртүрлі берілгендеріне адрестеуімізге болады.
Мысалы:
#include stdio.h
main()
{ int x,*u;
u=&x;
x=123;
printf ((адрес x:%p\n(,&x);
printf ((мәні x:%d\n (,x);
printf ((мәні u:%p\n(,u);
printf ((мәні адрес x:%p\n(,&x);
scanf((%e%e(,&a,&b);
if(x*x+y*y1) printf ((нүкте кесіндіге жатады();
else printf ((нүкте кесіндіге жатпайды();

Көрсеткіштер мен массив элементтеріне рұқсат ( доступ ) Анықтама
бойынша, көрсеткіш – бұл не мәні бар объект “объект адресі” немесе “функция
адресі”, не болмаса объектің адресін немесе функциясын ашуға мүмкіндік
беретін берілген (выражение). Фрагментті қарастырайық:
Int x,y;
Int *p=&x;
P=&y;
Мұнда р- объект- көрсеткіш, ал &x,&y – берілген – көрсеткіштер, яғни
тұрақтылар - адресі. Біз р- дің &x,&y мәні сияқты айнымалы екенін білеміз.
Адрес пен объект – көрсеткіш арасындағы айырмашылығы, ол объект –
көрсеткіштерінің мәнін өзгерте алуында. Сондықтан да көрсеткіштер –
берілгендерді көрсеткіштер-тұрақтылар немесе адрестер деп атайды, ал объект
көрсеткіштерін айнымалы –көрсеткіш немесе жай көрсеткіш деп аталады.
Си тілінің синтаксисіне сәйкес индекссіз массив аты көрсеткіш-
тұрақтылары болып табылады, яғни оның бірінші элементінің адресі (0-дік
индексті). Мұны массивпен жұмыс кезінде естен шығармаған жөн.
Массив символық “инверттау есебін” және айнымалы көрсеткіші бар
есептің шешімін әртүрлі жолдармен қарастырайық. Мысалы char типті массивтің
ұзындығы болсын. Ол 80-ге тең делік.
Массивті инверциялау есебінің бірінші шешімі:
Char z [80], s;
Char *d,*h;
* d және h – символды объектінің көрсеткіштері *
for (d=z, h=&z [79]; d h ;d++, h--)
{
s=*d;
*d=*h;
*h=s;
Цикл басында d көрсеткішіне бірінші элементтің массиві z беріледі.
Мұнда басқа жолды қолдануға болдар еді, яғни d&z[0]. Көрсеткіш h соңғы
элемент массив z адрес мәнін алады. әрі қарай көрсеткіштермен жұмыс
қарапайым бүтін санды айнымалылармен жалғасады. Цикл d h болғанда
қайталанады. Әр итерациядан кейін d мәні өседі, ал h мәні 1-ге кішірейеді.
Бірінші итерациядан кейін цикл денесінде мәндер z[0] және z[79] алмасуы
болады. Себебі d-z[0] адресі, ал h - z[79] адресі. Екінші итерациядан кейін
d мәніне z[1] адресі, ал h үшін z[78] адресі болып табылады.
Массивті инверциялау есебінің екінші шешімі:
Char z[80] ,s, *d, *h;
For (d=z, h=&z[79]; dh;)
{
s=*d; *d++=*h; *h-- = s;
}
d көрсеткішінің өсуі және h көрсеткішінің кемуі цикл денесіне
ауыстырылады. Ескерту: *d++ және *h--берілгендерінде өсуі мен азаюы
операцияларында унарлы адрестік ‘*’ операция сияқты шамаға ие болады.
Сондықтан 1-ге элемент – массиві өзгермейді, ал көрсеткіштердің өзі
өзгереді. Әрекеттік тізбегі мынандай: көрсеткіш d (немесе h) мәні бойынша
массив элементіне рұқсат қамтамассыз етілуі бұл элементке оң жақ
оператордың мәні келіп түседі, әрі d көрсеткіші (немесе h) өсіп(кеміп)
отырады.
Массивті инверциялау есебінің үшінші шешімі:
Char z[80], s, *d, *h;
d=z;
h=&z[79];
while (dh)
{
s=*d; *d ++= *h; *h -- =s;
}
Массивті инверциялау есебінің төртінші шешімі:
Char z[80], s;
Int i;
For (i=0; i40; i++)
{
s=*(z+i);
* (z+i) = * (z+(79-i));
* (z+(79-i))=s;
}
Соңғы мысал есептің индексті элементінің z(i) орнына берілгендерді
қолдануға * (z+i) мүмкіндік береді. Си тілінде индексі жоқ массив алдында
аты бірінші элементінің адресі болып келетіні жайлы айтылды. Массив атына
бүтін шаманы қосып, сәйкес элемент адрес табамыз, яғни &z[i] және z+1 – бұл
бір массив элементінің екі анықталған адрес формасы.
Сонымен индекстеу операциясы Е1[E2], *(E1+E2) эквивалентті болып
анықтлады, мұнда Е1 – массив аты, Е2- бүтін. Көп өлшемді массив үшін де
есепті шешу жолы дәл осындай. Сондықтан, E[n][m][k] эквивалентті
*(E[n][m]+k) және тағы сол сияқты *(*(*(E+n)+m)+k).
Көрсеткіш типіндегі массив аты айнымалы емес, ол тұрақты делік.
Сонымен, массив атына ‘++’ (арту), ‘--’(кему) операциясын қолдануға
болмайды, яғни массив аты оператордың сол жақ бөлігінде меншіктелмейді.
Қарастырылған мысалдарда көрсеткіштер символды айнымалыларға жататын,
сондықтан олардың өсімшесі бірдей болған. Бірақ бұл жадта символдардың
сақталуы қамтылады. Әр символ жадта 1 байтты алады, сондықтан символды
массивтердің көршілес элементтердің адрестері 1-ден өзгеше болады.
Келесі программада көрсеткіштерді өзгеру қасиетін тағы бір көрсетейік,
яғни әртүрлі типті элемент массивтің элементінен элементке көшуін
қарастырады:
Include stdio.h
* массив элементінің көрсеткіш мәнінің өзгеруі*
void main()
{
char z[5]; int m[5]; float a[5];
char *uz; int *um; fload *ua;
printf(“\n массивтің символдық элементінің адресі ”);
for (uz=z; uz=&z[4]; uz++)
printf(“%10p”,uz);
printf(“\n массивтің бүтін элементінің адресі”);
for (um=m;um=&m[4]; um++)
printf(“%10p”,um);
printf(“\n массивтің нақты элементінің адресі” “:\n”);
for (ua=a; ua&a[4];ua++)
printf(“%10p”,ua);
}
Нәтижесі:
Символды массивтің элементтерінің адресі:
FFF0 FFF1 FFF2 FFF3 FFF4
Бүтін сандар массив элементтінің адресі:
FFF6 FFF8 FFFA FFEC FFFE
Нақты сандар массив элементінің адресі:
FFD0 FFD4 FFD8 FFDC FFE0
Қарастырылған мысалдан, көрсеткіштердің 1-ге өзгерді объект типіне
тәуелді әртүрлі нәтижеге әкеледі. Көрсеткіштің мәні элемент үшін бөлінген
ұзындығында өзгереді. Жадта символдар 1 байт орын алады, сондықтан uz
көрсеткіштерінің мәні символды массив көршілес элементтеріне көшкен
кезінде 1-ге өзгереді. Бүтін санды массив үшін көрші элементке көшу
көрсеткіш um-длі 2-ге өзгертеді. Затты элементтің массиві көрші элементке 4-
ке өзгертеді.

1.2. Динамикалық жадындағы массив

Тілдің стандартына сәйкес массив элементтер жиынын көрсетеді. Барлық
элементтер тегіс жадтық көршілес учаскілерінде орналасады. Массивті анықтау
үшін:
Тип аты _массивтің [саны_ элементтер];
Массивтің аты жад облысына көрсеткіш болып келеді, массив
элементтерінің орналасуы үшін бөлінеді. Тип массивтің әр элементке
бөлінетін жадтың өлшемін анықтайды. Нәтижесінде массив элементінің жалпы
саны мен оған бөлінетін жад өлшемі тұтас және бірмәнде анықтаушыға
беріледі.
Айнымалы өлшемді массивті көрсеткіштермен жадтың динамикалық әдісімен
құрауға болады. Мына стандартты библиотекалық файлдарды alloc.h және
stdlib.h 4.1 кестеде осы библиотекалық функциялар көрсетілген. Malloc(),
calloc() функциялары мен realloc() жадты параметр мәніне сәйкес бөледі де
адресті бастапқы бөлінген жад учаскісіне қайтарады. Әмбебаптық үшін
қайтарылған типтегі мән void* болып табылады. Бұл көрсеткішті кез келген
типтегі көрсеткішке (тип*) типтің көмегімен өзгертуге болады.
Free() функциясы кері амалды шешеді . malloc(), calloc() және
realloc() – функцияның бірінің көмегімен бөлінген жадты босатады. void*
типті параметр көрсеткішінің көмегімен участок жайлы мәлімет free()
функциясына келіп түседі. Кез келген типті көрсеткіштің void* типке өзгеруі
автоматты түрде орындалады, сондықтан void*bl формальді параметрінің орнына
типті фактілі параметрді қоюға болады.

Бөліну және жадты босатуға арналған функциялар
Функция Қысқа мазмұны
malloc() Void* malloc (unsigned s);
Көрсеткішті динамикалық жадтың ұзындығы s байтты болатын
көрсеткішті бастапқы облысына қайтарады. Әрекет орындалмаған
жағдайда NULL мәні қайтарады.
calloc() Void* calloc (unsigned n, unsigned m);
әр қайсысы m байттан тұратын n элементі сию үшін бөлінген
0-дік динамикалық жадтың көрсеткішін бастапқы облысына
қайтарады. әрекет орындалмаған жағдайда NULL мәні қайтарылады.
realloc() Void* realloc (void*bl, unsigned ns);
Алдында бөлінген динамикалық жадты ns байт өлшемге дейін
өлшеуін өзгертеді. Bl бастапқы өзгертілген блоктың адресі.
Егер bl = NULL болса, онда функция malloc түрінде орындалады.
free() Void* free (void*bl);
Алдында бөлінген динамикалық жадтың учаскісін босатады, оның
бірінші байтының адресі bl мәніне тең.

Келесі программа malloc және free функцияларының қатысуымен орындалады.
Келесі есеп шешіледі: кері ретпен заттық сандарды енгізу және теру, заттық
саны көрсетілмеген, ол бастапқы сандар мәні өзінен енгізілсін. Программа
мәтіні келесі түрде көрсетіледі:
# include stidio.h
# include studio.h
{
*жадыдағы блок үшін көрсеткіш*
float *t;
int i,n;
prinf(“\nn=”); *n-элементтер саны *
scanf (“%d”,&n);
t=(float *)malloc(n*sizeof(float));
for(i=0;in;i++) *санды шығаратын цикл *
{ prinf (“x[%d]=”,i);
scanf (“%f”,&t[i]);
}
*цикл баспаға беру нәтижесі*
for (i=n-1; i=0; i--)
{
if (i%2==0) printf(“\n”);
prinf (“ \ tx [%d] = %f ”, i, t[i] );
}
free (t); *жадыны босату*
}

Нәтижесі (компилятор BC++3.1 және операциялық жүйеден алынған компилятор
Free BSD UNIX):
n=4
x [0]=10
x[1]=20
x[2]=30
x[3]=40
x[3]=40.000000
x[2]=30.000000
x[1]=20.000000
x[0]=10.000000

int n программасында енгізілген сандар мөлшерінің типі float, t –
енгізілетін n сандар сыйымдылығы үшін бөлінген көрсеткіш. Келесі ескерту Си
тілінің стандартынан мүлдем тыс болмақ. Жоғарыда программа нәтижесі Си
тілінің компилятор көмегімен алынғаны көрсетілген. Scanf() функциясы
динамикалық зат массивінің индекстелген элементтерінің мәнін енгізуде
“қабылдамайды”. Мысалы: Turbo C++1.01 ортасында программа орындалмайды.
X(0)=scanf: floating point formats not linked
Adnormal program termination
Бұл қиындықтан екі жолмен шығуға болады:
Біріншіден , енгізу үшін көмекші айнымалыны қолдануға болады. Мысалы:
float w ;
for (i=0; in; i++)
{
printf (“x[%d]=”, i);
scanf (“%f”, &w);
t[i]=w;
}
Екіншіден, мұндай қателікті жібермейтін библиотекалық функция
компиляторды қолдануға болады. Мұндай Си тілінің компиляторы интегралданған
Borland C++3.1ортасына енгізілген.
Массивті анықтауда енгізілетін массивтер динамикалық жад массивінен
өзгеше болып келеді.көбіне бұл функция массивінің “өз атының ” жоқ болуымен
ерекшеленеді.канондық элементтер санын анықтайтын стандартты процедураны
sizeof операцияның көмегімен анықтайық.
Есімізге түсірейік, sizeof операциясы екі шақыру формадан тұратынын.
Sizeof(тип)
Sizeof(берілген)
Тип түрінде кез келген объектінің типі қолданылады, void типінен басқа.
Егер операнда берілген болса, онда оның мәні есептеледі. Мысалы:
Sizeof(long) 4-ке тең
Sizeof(long double) 10-ға тең
Программадан массивтің конондық элемент санын есептеу керек болса, онда
Sizeof операциясын массив атына және нольдік элементіне екі рет қолдана
отырып шығаруға болады.
sizeof (массив__ аты) sizeof (массив аты [0]).
Келесі мысалда массивтің элементтері х түрінде жазылады.
float x[8];
for ( i=0; sizeof (x) sizeof ( x[0] i; i++)
. . . . x[i]. . .
Егер sizeof операциясын жадтың бастапқы адрес мәнінде қолдансақ. Мысал
ретінде көрсетейік:
double *pointer
pointer=(double*) malloc(100);
. . . . sizeof (pointer)

1.3 Массив көрсеткіштері және көп өлшемді
массивтерді модельдеу

Си тілінің синтаксисінде массив бір өлшемді элементтер болып
қабылданса, онда әр элемент массив бола алады. Дәл солай көп өлшемді
массивтерде құралады. Массив өлшемінің мәтін тұрақты анықтайды. Көрсеткіш
өлшемдерінің массиві келесі анықтамалар енгізеді:
тип * массив__ аты [өлшеуіші];
тип ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Си программалау тілі
Меншіктеу операторы, барлық тілде пайдаланылатын негізгі оператор
Көрсеткіштер массиві
Программа жұмысын басқару операторлары
Жұмысшылар класын құру (C++ тілінде)
Обьектілі - бағытталған программалау негіздері
Си тілінен дәрістер
Информатика ( лекциялар )
Массивтермен жұмыста көрсеткіштерді пайдалану
Дәріс кешені с/с++ тілдері
Пәндер