-->
Главная » Статьи » Информатика

СИ++ ТІЛІНІҢ НЕГІЗДЕРІ 2

Атаулы тұрақтылар

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

#define жолы символдық атауды немесе берілген стринг литері үшін аталған тұрақтыны анықтайды.

#define қойылатын_мәтіннің аты

Осы кезден бастап аттың кез-келген пайда болу кезінде, ол оған сәйкесті қойылатын мәтінмен алмастырылады.

Қойылатын мәтін арасында тек цифрлар ғана кездесетіндей емес, литерлердің кез-келген тізбегі болуы мүмкін.

                      # include <stdio.h> 

             # define LOWER 0                    // кестенің төменгі шегі

             # define UPPER 300                 // жоғарғы шегі

             # define STEP 20                      // қадам өлшемі

             /* Фаренгейт және Цельсий бойынша температура кестесін баспаға шығару */

             main ()

                {      int f;

                        for (f=LOWER; f<=UPPER; f=f+STEP)

                        printf ("%3d %6.1f\n”, f, (5.0/9.0)*(f-32));

                             }

Стандартты библиотека енгізу-шығарудың өте қарапайым моделін ұстанады. Мәтіндік енгізу-шығару, ол қайдан шығып немесе қайда бағытталғанынан тәуелсіз литер ағынымен жұмыс жасайды. Енгізу-шығару моделі – бұл мәтіндік ағын, яғни әрқайсысы нөлден тұратын немесе литерден артық жолдарға бөлінген және жаңа жол литермен аяқталатын (\n) литерлер тізбегі.

Литердің біреуінің қарапайым оқу және жазу функциялары getchar и putchar болып табылады, сәйкесінше мәтіндік ағыннан келесі литерді оқу және бүтін айнымалыны литер түрінде басу.

Мысалы, бір литер бойынша кіру ағынынан шығу ағынына көшіру программасы:

             # include <stdio.h>              // енгізуді шығаруға көшіру

             main ()

                {      int с;

                        c=getchar ();

                        while (c!=EOF)          // <stdio.h>-да анықталған, EOF тұрақтысы

                                                

  {       putchar (c);    

                                                 с=getchar ();

                                         }

                              }

Литерлі мәліметтерді сақтау үшін арнайы char типі тағайындалған, бірақта бұл үшін кез-келген бүтін тип те жарай береді.Айнымалы үшін char типін емес, int типін қолдану өте маңызды бір мәселемен байланысты болып отыр: getchar функциясы кіру ағынын алып тастау бойынша, өзінің нәтижесі ретінде кез-келген нақты литерлерден ерекше мән беру қажет.

Си-де кез-келген меншіктеу, жеке жағдайда c=getchar () меншіктеуден кейінгі сол бөлігінің мәніне тең болатын, мәнімен берілген өрнек ретінде айтылады. Яғни бұл меншіктеу күрделірек өрнектердің арасында кездесуі мүмкін екенін білдіреді. 

             # include <stdio.h>              // енгізуді шығаруға көшіру

             main ()

                {      int с;

                        while ((c=getchar ())!=EOF)        // тексерумен бірге меншіктеу

                            putchar (c);                   

                            }

Келесі программалар мәтіндік кіру ағынындағы литерлерді, жолдарды және сөздерді есептейді.

             # include <stdio.h>                                               // литерді есептеу

             main ()

               {    double nc;

                      for (nc=0; getchar ()!=EOF; ++nc);              // цикл денесінің бос операторы

                      printf ("%.0f \ n”, nc);

               }

 

             # include <stdio.h>                                                // жолды есептеу

             main ()

                 {      int c, nline=0;

                      while ((c=getchar ())!=EOF)

                          if (c= =’\n’) ++nline;

                        printf ("%d\n”, nline);

                             }

 

             # include <stdio.h>

             # define IN 1                          // сөздердің арасын

             # define OUT 0                     // сөздердің жан-жағын

                                // жолдарды, сөздерді және литерлерді есептеу

             main ()

               {    int c, nline, nword, nchar, state;

                      state=OUT;

                      nline=nword=nchar=0;

                          wohile ((c=getchar ())!=EOF)

                            {     ++nchar;

                                if (c= = ‘\n’)  ++nline;

                                if (c= =’ ‘ ¦ ¦ c = = ‘\n’ ¦ ¦ c= =’\t’) state=OUT;

                                     else if (state = = OUT)

                                               {    state = IN;

                                                  ++nword;

                                               }

                             }

                      printf ("%d%d%d\n”, nline, nword, nchar);

              }

 

Массивтер

int array[10] декларациясы array 10 мәннен тұратын int типінің массиві ретінде анықталады. Си-де массивтің элементтері әрқашан нөлден басталып нөмерлененеді. Индекс -  бүтін айнымалы мен бүтін тұрақтылардан құралған, кез-келген бүтін өрнек болуы мүмкін.

Әр цифрларды, бос орынды литерлерді (бос орын ‘ ’, ‘\t’ табуляциялары және ‘\n’ – жаңа жолдар) және басқа литерлерді жеке есептейтін программаны жазайық. Цифрларды есептеуді массивте сақтаймыз.

               # include <stdio.h>   /* цифрларды, бос орындарды және басқа литерлерді есептеу */

             main ()

               {   int c, i, nwhite, nother;

                    int ndigit [10];

                    nwhite=nother=0;

                      for (i=0; i<10; i++) ndigit [i]=0;

                      while ((c=getchar())!=EOF)

                          if (c>=’0’ && c<=’9’)            // литер цифр болып табылады ма?

                                ++ndigit [c-‘0’];

                           else if (c = = ‘ ‘¦ ¦ c = = ‘\n’ ¦ ¦ c = = ‘\t’)  ++nwhite;

                                else  ++nother;

                            printf ("цифры = ”);

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

                                printf ("%d”, ndigit [i]);

                             printf (", пробелы=%d,прочие =%d\n”, nwhite, nother);

               }

if (c>=’0’ && c<=’9’) тексеруі с-дағы литер цифр болатындығын анықтайды. Егер бұл осылай болса, онда c-‘0’ цифрдың сандық мәні болады.

char типінің мәнін анықтау кішкене бүтін сан болып қана табылады, сондықтан арифметикалық өрнектегі char типті айнымалылар мен тұрақтылар int типінің мәндерімен пара-пар.  Мысалы,  c-‘0’ – с айнымалысында сақталатын, ‘0’-ден ‘9’-ға дейінгі литермен сәйкес келетін, 0-ден 9-ға дейінгі мүмкін болатын мәндері бар бүтін өрнек. Сондықтан, берілген өрнектің мәніndigit массиві үшін дұрыс индекс болып табылады.

Функциялар

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

Кез-келген функцияны анықтау келесі түрде болады:

функция_аты нәтижесінің_типі (формальды_параметрлер_тізімі)

             {     декларация

                    инструкция

              }

Функцияны анықтаудан басқа, форматы келесі түрде болатын функция прототипі түсінігі бар.

функция_аты нәтижесінің_типі (формальды_параметрлер_тізімі)

Мұндай декларация main алдында тұруы керек және компиляторға программада осы функцияны қолдану мүмкіндіктері туралы хабарлауы керек (функцияны анықтаудың өзі main функциясынан кейін болуы керек), сол сияқты анықтамалармен және барлық шақырулармен келісімді болуы қажет. Егер функцияны анықтау немесе шақыру өзінің прототипіне сәйкес келмесе қателік туындайды.

Праметрлер атауы келісімділікті талап етпейді. Нақты түрде прототипте олар кез-келген немесе тіпті болмауы да мүмкін.

Функциямен есептелінетін мән return нұсқауының көмегімен main-ға оралады. return сөзінен кейін кез-келген өрнек жазылуы мүмкін:

return өрнек;

Функция қандай-да бір мәнді міндетті түрде қайтармайды. return нұсқауы өрнексіз, ешқандай нәтижесіз мәнді бермей-ақ, оны шақыратын программаға тек қана басқаруды береді.

main функция болғандықтан, кез-келген басқасы сияқты оны шақырған, нақты программа жіберілген операциялық ортада нәтижелі мәнді қайтара алады. Әдетте есептеуді дұрыс аяқтауды айтатындай нөлдік мән қайтарылады (return 0;).

Аргументтер, мән бойынша шақыру

Си-де функцияның барлық аргументтері "мән бойынша” беріледі, "сілтеме бойынша шақырудан” өзге аргументтердің локальды көшірмесіне емес, аргументтің өзіне қатынас жасай алады. Сондықтан Си-де функцияны шақырушы айнымалыны тікелей өзгертуге болмайтын функция шақырылады: ол оның жеке, уақытша көшірмесін ғана өзгерте алады.

Осы қасиеттің арқасында, негізінде жинақтырақ программа жазуға мүмкіндік бар.

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

Егер функцияның аргументі массив (массив аты) болса, онда функцияға осы массивтің бастапқы адресі болатын мән беріледі; массивтің ешқандай элементтері көшірілмейді.

main и getline функциялары аргументтер жұбы арқылы және қайтарылатын мән арқылы өзара әрекеттеседі. Бір функциялар нәтижелі мәнді қайтарады, басқасы (copy сияқты) ешқандай мәнді бермей, қандай-да бір әрекетті орындау үшін қажет. Нәтиже типі copy-дің орнында void тұрады. Бұл берілген функция ешқандай мәнді қайтармайтынын анық көрсетіп тұр.

Функцияны анықтауда массивтің өлшемін беру жадыны резервке қоюды мақсат етеді. getline-нің өзінде s массивінің ұзындығын берудің қажеттілігі жоқ, өйткені оның өлшемі main-да көрсетілген..

Құрылатын массивтің соңында литер міндетті түрде ‘\0’ литеріне (нөлдік байтпен кодталған, null – литері), литерді стринг соңына орналастыру үшін орналастырылады.

Категория: Информатика | Добавил: admin_ (17.11.2013)
Просмотров: 1337 | Теги: СИ++ ТІЛІНІҢ НЕГІЗДЕРІ қазақша | Рейтинг: 0.0/0
Всего комментариев: 0

Имя *:
Email:
Код *: