Download presentation
Presentation is loading. Please wait.
1
7 лекция Си функциялары және жиымдар
2
Сұрақтар: Cи тіліндегі функциялар Жиымдарды пайдалану
3. Адрестік операциялар 4. Нұсқауыштар 5. Жиымдар және оларға қолданылатын нұсқауыштар 6. Жиымдарды сұрыптау
3
1. Cи тіліндегі функциялар
Програмада кем дегенде, бір функция болады және программадағы бір функцияның аты main болуы тиіс. Программаның орындалуы осы main функциясынан басталады. Main функциясының орындалуы барысын-да басқа функциялар шақырылады, ал олар одан да басқа функцияларды шақыруы мүмкін.
4
Бір функция жұмыс істеп тұрғанда, екінші функ-цияны орындау керек болса, онда бірінші функция жұмысын тоқтата тұрады да, екінші функция жұм-ысқа кіріседі. Ол өз жұмысын аяқтап, return сөзін кезіктіргенде ғана қайтадан бірінші программа өзі-нің тоқтаған жерінен ары қарай іске кіріседі. Функ-ция атынан соң, жақшалар ( ) болуы тиіс. Әрбір функция сипатталып анықталуы тиіс. Функцияның типі және ол арқылы есептелетін мәннің типі бірдей болуы керек. Функция типі көрсетілмесе, келісім бойынша, ол int типтес болып саналады. Енді функцияның сипатталуын қарастырайық. Функцияны сипаттағанда екі түрлі форматты немесе екі стильді қолдануға болады.
5
Функция мынадай жалпы түрде сипатталады:
[<функция типі>] <функция аты> ([<формальды параметрлер спецификациясы>]) <функция тұлғасы>; мұндағы [<функция типі>] – функцияның есептелетін нәтижесі типі; <функцияның аты> – функция идентификаторы, яғни аты; <формальды параметрлер спецификациясы> – бұл болмауы да мүмкін (void) немесе әрбір параметр специфи-кациясы: <типі> <параметр аты> – формальды пара-метрлердің типтерін және идентификаторларын анықтайды; <функция тұлғасы> – орындалатын операторлар тізбегі және оның ішінде локальді айнымалының сипатталуы болуы мүмкін.
6
Функцияны шақыру үшін функцияның аты және жақ-шада нақты аргументтері көрсетіледі. Функция өз жұм-ысын аяқтағаннан кейін есептелген нәтижені return операторы арқылы қайтарады. Бұл оператордың жалпы түрі мынадай: return(өрнек); return; return операторы функцияның орындалуын аяқтайды да, функцияны шақырған оператордан кейінгі жолға басқаруды береді.
7
Мысалы, келесі функция void типіндегі мән қайтарады, яғни жұмыс атқарады, бірақ ешқандай мән бермейді: void print(int gg, int mm, int dd) { printf(“\n жыл: %d”,gg); printf(“\t ай: %d”,mm); printf(“\t күн: %d”,gg); } Енді программада осы функцияны төмендегідей түрде шақырсақ, printf(2006, 10, 15); Оның нәтижесі: жыл: ай: күн:15 болады.
8
нәтижесі: 14:16:25 (час:мин:сек.) болады.
Келесі функция ешқандай мән қайтармайды және ешқандай параметрлері де жоқ: #include <stdio.h> //vremia.cpp void real_time(void) { printf(“\nТекущее время: %s”,_ _TIME_ _ “(час: мин: сек.)”); } main() { real_time(); нәтижесі: :16:25 (час:мин:сек.) болады. ТурбоСи
9
Функцияны компилятор дұрыс түсінуі үшін оны шақырып пайдаланғанға дейін функцияның қысқаша сипаттамасы берілуі тиіс, яғни функция программаның соңғы жағында сипатталса, программа басында типі функция_аты (параметрлер_спецификациясы); сияқты оның прототипі – алдын ала қысқаша көрсе-тілуі тиіс. Прототипте формальды параметрлер атын жазбаса да болады, мысалы: double f(int n, float x); немесе double f(int, float);
10
Прототипті көрсетуді алдыңғы мысал арқылы былай көрсетуге болады:
#include <stdio.h> void real_time(void); main() { real_time(); } void real_time(void) { printf(“\nТекущее время: %s”, _ _TIME_ _ “(час: мин: сек.)”);
11
Оң бүтін санның факториалын анықтау функциясын былай жазуға болады:
long fakt(int k) { if (k<0) return 0; if (k==0) return 1; long p=1; for (int j=1; j<=k;j++) p*=j; return (p); } Теріс сандардың факториалы болмайды, мұндайда функция 0 мәнін береді, ал 0!=1, қалған жағдайлар-да бұл функция цикл ішінде факториалды есептейді.
12
// с=( m!*n!)/(m+n)! eсептеу funk_2.cpp
#include <conio.h> #include <stdio.h> long fakt(int k) { if (k<0) return 0; if (k==0) return 1; long p=1; for (int j=1; j<=k;j++) p*=j; return (p); } main () {int m,n; float c; printf("m,n = : "); scanf("%d%d",&m,&n); ТурбоСи
13
c=fakt(m)*fakt(n)/fakt(m+n);
printf("c=%e\n",c); getch(); } Функция ішінде орналасқан айнымалылар типтері сипат-талуы осы функцияның ішінде ғана анықталған болып саналады, (мұнда тек қана main функциясы ерекше жағдайда болып саналады). Программа мәтінінде функ-циялар кез келген ретпен орналасуы мүмкін. Функцияны шақыру үшін функцияның аты және жақшада нақты аргументтері көрсетіледі. Функция өз жұмысын аяқта-ғаннан кейін есептелген нәтижені return операторы арқылы қайтарады. Бұл оператордың жалпы түрі мына-дай: return(өрнек); return операторы функцияның орындалуын аяқтайды да, функцияны шақырған оператордан кейінгі жолға басқаруды береді.
14
2. Жиымдарды пайдалану Массив немесе жиым – бір типтегі элементтердің реттелген жиыны. Олар бір атаумен – идентификатормен аталады да, индексті айнымалы ұғымына сәйкес келеді. Мысалы, мынадай тізбек Фибоначчи тізбегінің 9 элементін құрайды (алғашқы екі санды таңдап алып, келесі санды алдыңғы екеуін қосу жолымен алады), математикада a9 = 0,1,1,2,3,5,8,13,21. Си тілінде осы тізбекке сай жиымды сипаттап, оған бастапқы мән беріп инициалдау үшін былай жазамыз: int fib[8]={0,1,1,2,3,5,8,13,21}; немесе int fib[]={0,1,1,2,3,5,8,13,21}; мұндағы fib – жиым аты, оның элементтері типі int, ал ұзындығы – 9, жиым элементтерінің индек-стері 0-ден бастап нөмірленеді, сол себепті 9 элемент 8 индекспен көрсетіледі. Мәндері көрсетілсе, индексті жазбаса да болады.
15
Ал былай болса, int fib[8]={0,1,1,2,3}; қалған элементтер 0 болып саналады. n=10; k=2; fib[n-k]={0,1,2,3}; деп те жазуға болады. Жоғарыдағы тізбектің 3-ші элементін бір бүтін айнымалыға меншіктеу үшін былай жазамыз. int а=fib[3]; // а = 2 Жиымды сипаттау кезінде оның ұзындығы нақты санмен көрсетіледі, мыс., a[20], a[n] деп жазу үшін алдын ала #define n 20 жолы көрсетіледі немесе const n=20; болып жазылады.
16
Жиым элементтерін енгізу немесе оларды түрлендіру үшін цикл операторы қолданылады. Төменде 10 элем-енті бар жиымды 0-ден 9-ға дейінгі сандармен толты-рып, сонан кейін оларды кері бағытта экранға шығару мысалы көрсетілген: main () { int a[10]; int i; for (i = 0; i<10; i++) a[i] = i; for (i = 9; i>=0; i--) printf(“ %i”, a[i]); }
17
Си тілінде жиымды жиымға бірден теңестіруге бол-майды, мыс
Си тілінде жиымды жиымға бірден теңестіруге бол-майды, мыс., а0, а1, а2, ... , а9 және с0, с1, с2, ... , с9 жиымдары үшін а=c деп жазуға болмайды. Олардың элементтерін цикл ішінде бір-біріне біртіндеп теңес-тіру керек. int a[9], c[9]; … a=c; // қате Мұның орнына мынадай цикл жазу керек: for (int i=0; i<9; ++i) a[i]=c[i];
18
Есеп. Бүтін оң және теріс сандардан тұратын a[n] жиымының жұп нөмірлі элементтерінің қосындысын табу керек, мұнда n саны енгізіледі, ал жиым элементтерінің мәндері кездейсоқ бүтін сандардан тұрады. rand() функциясы аралығын-дағы бүтін сан береді. Оны қолдану үшін stdlib.h директивасын қолдану қажет. Жиым элементтері екі разрядты оң және теріс сандар-дан тұруы үшін алынған кездейсоқ сан 100-ге бөлінгендегі қалдықтан 50 алып тасталынады.
19
ТурбоСи #include<stdio.h> //sum_mas.cpp #include<stdlib.h>
main() { int a[50]; int n; printf("\nЖиым ұзындығы: "); scanf("%d",&n); for(int i=0;i<n;i++) a[i]=rand()%100-50; // кездейсоқ сандар 0 – 32767 printf("%i ",a[i]); // 100-ден қалдық – 50 } int sum=0; for(i=0;i<n;i+=2) sum+=a[i]; // 0, 2, 4 индексті элементтер... printf("\nжұп индексті элементтер қосындысы: %i",sum); ТурбоСи
20
#include <conio.h> //sum_mas1.cpp #include <stdlib.h>
Есеп: Бүтін сандардан құралған А10 жиымы берілген. Сол жиымның оң элементтерінің қосындысын табу керек. #include <conio.h> //sum_mas1.cpp #include <stdlib.h> #define n 10 main () {int i=0,s=0; int a[n]; textcolor(RED); textbackground(WHITE); clrscr(); while (i<n) { printf("a[%i]=",i); scanf("%i",&a[i]); if (a[i]>0) s+=a[i]; i++; } printf(“s = %d\n",s); getch(); иә жоқ басы n енгізу i:=0; s:=0; i<n ? ai енгізу ai > 0 ? s = s + ai; i = i+1; s соңы ТурбоСи
21
Есеп: Бүтін сандардан тұратын А(n) бір өлшемді жиымы берілген
//a[n] ішінен max-ын және оның индексін табу #include <stdio.h> // max.cpp #include <stdlib.h> #include <conio.h> main () { int max,n,k,i,a[100]; printf("\nЖиым ұзындығы:");scanf("%d",&n); printf(“Жиым элементтері:"); for(i=0;i<n;i++) {a[i] = rand()%100-50;//кездейсоқ сандар printf(" %i ",a[i]); } max=a[0];k=0; for (i=1;i<n; i++) if (a[i]>max) {max=a[i]; k=i;} printf("\nmax = %d индексі=%d\n",max,k+1); getch(); } ТурбоСи
22
Мысал: Бүтін сандардан тұратын А[15] массиві берілген
Мысал: Бүтін сандардан тұратын А[15] массиві берілген. Массив оң элeменттерінің геометриялық ортасын анықтау керек. #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define n 15 main () { int a[n],i; randomize(); for(i=0;i<n;i++) {a[i]=random(100)-50;//кездейсоқ сандар 0-100 printf(" %i",a[i]);} //одан 50-дi алу //Элементтер санын,көбейтіндісін анықтау i=0; // бастапқы индекс = 0 float p=1; //оң элементтер көбейтіндісі int k=0; // оң элементтер саны
23
do { if (a[i]>0) { k++; p*=a[i];} i++; } while (i<n); printf("\nОң эл-ттер саны: %d\n",k); p=pow(p,1.0/k); printf(“Геометриялық ортасы = %f",p); getch();
24
Тыңдағандарыңызға рахмет!
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.