ДЪРЖАВЕН ИЗПИТ

ОТК-ТУ-София
15.01.2005
Михаил Николов Нейков
фак.№ 102204055

УСЛОВИЕ НА ЗАДАЧАТА
Да се състави програма на С, която:
- въвежда от клавиатурата р?35 положителни реални числа (дължини на отсечки) и ги съхранява в масив;
- извежда съдържанието на масива;
- извиква функция, която връща като резултат най-дългата и най-късата отсечки и техните поредни номера;
- извежда получените резултати.
ОБЯСНИТЕЛНА ЗАПИСКА

При решаването на задачата дефинирам макроса MAXIND, в който задавам максимално допустимия размер на масива. Самият масив и неговият индекс дефинирам в главната функция main(). При решаването на задачата се налага дефиниране на 5 потребителски функции.
int GetN(void) – за въвеждане на дължината на масива. Функцията връща въведения размер. Във функцията се реализира цикъл с подусловие, за да се гарантира, че въведения размер е в допустимите граници. Връщаната стойност се задава след оператора return.
void GetA(float *a,int n) – за въвеждане на масива. Функцията получава като аргументи масива а (адреса на първия му елемент) и неговия размер n. Въведените стойности се записват директно в паметта, заделена за масива, поради което функцията не връща стойност. Функцията съдържа един цикъл for за въвеждане на елементите на масива.
void OutA (float *a,int n) – за извеждане на масива. Функцията получава като аргументи масива а (адреса на първия му елемент) и неговия размер n. Функцията съдържа един цикъл for за извеждане на елементите на масива. Извежданата стойност се форматира - %10.2f (извеждането става в 10 знака, като двата последни са за дробната част).
void GetMax(float *a,int n,int *Imax, float *max) – за намиране на максималния елемент на масива и неговият индекс. Функцията получава 4 аргумента:
- масива, на който ще се търси максималната стойност;
- размера на масива;
- адресът на променливата, в която ще се запише индекса на максималния елемент;
- адресът на променливата, в която ще се запише максималния елемент.
Функцията трябва да върне две стойности, а в езикът С функциите могат да връщат само по 1 стойност, подаваме двата последни аргумента чрез техните адреси. При това положение промените се отразяват директно върху фактическата променлива. Блоковата схема на функцията е показана на фиг.1.
void GetMin(float *a,int n, int *Imin, float *min) – за намиране на минималния елемент на масива и неговият индекс. Функцията получава 4 аргумента:
- масива, на който ще се търси минималната стойност;
- размера на масива;
- адресът на променливата, в която ще се запише индекса на минималния елемент;
- адресът на променливата, в която ще се запише минималния елемент.
Т.к. функцията трябва да върне две стойности, а в езикът С функциите могат да връщат само по 1 стойност, подаваме двата последни аргумента чрез техните адреси. При това положение промените се отразяват директно върху фактическата променлива. Блоковата схема на функцията е показана на фиг.2.
В главната функция дефинирам още 2 променливи:
- extr - за екстремната стойност (min, max);
- Iextr - за индекса на екстремната стойност.
- Структурата на главната функция е линейна. В нея се извикват последователно гореописаните функции и се извеждат стойностите за extr и Iextr, които се получават след изпълнението на функциите GetMax() и GetMin().


СОРС КОД НА ПРОГРАМАТА

#include
#define MAXIND 35

//въвеждане на дължината на масива
//връща въведения размер
int GetN(void)
{
       int n;
       do{
       printf("Въведете броя на елементите на отсечките n (1<=n<=%d). n=",MAXIND);
           scanf("%d",&n);
          }while (n<1 || n>MAXIND);
        return n;
}

//въвеждане на масива
//получава като аргументи масива(адреса на първия му елемент) и неговия размер
void GetA(float *a,int n)
{
        int i;
       printf("Въведете стойности за дължините на отсечките в сm \n");
               for(i=0;i<n;i++)
               {
               printf("a[%d]=",i);
                scanf("%f",&a[i]);
               }
}

//извеждане на масива
//получава като аргументи масива(адреса на първия му елемент) и неговия размер
void OutA(float *a,int n)
{         int i;
       printf("Въведете дължините на отсечките в сm\n");
               for(i=0;i<n;i++)
              printf("a[%d]=%10.2f\n",i,a[i]);
}

//намира максималния елемент и неговият индекс
//получава като аргументи масива(адреса на първия му елемент) и неговия размер
//адресът на променливата, в която ще се запише индекса на максималния елемент и
//адресът на променливата, в която ще се запише максималния елемент
void GetMax(float *a,int n,int *Imax, float *max)
{
        int i;
        *max=a[0];
        *Imax=0;
                for(i=1;i<n;i++)
                        if (*max<a[i])
                       { *max=a[i];
                       *Imax=i;
                       }
}

//намира минималния елемент и неговият индекс
//получава като аргументи масива(адреса на първия му елемент) и неговия размер,
//адресът на променливата, в която ще се запише индекса на минималния елемент и
//адресът на променливата, в която ще се запише минималния елемент
void GetMin(float *a,int n, int *Imin, float *min)
{
       int i;
       *min=a[0];
       *Imin=0;
              for(i=1;i&n;i++)
                      if (*min>a[i])
                     { *min=a[i];
                      *Imin=i;
                      }
}

void main(void)
{
       float a[MAXIND];              
//масив с дължините на отсечките
        int n;              
//размер на масива
        float extr;              
//за екстремната стойност (min, max)
       int Iextr;              
//за индекса на екстремната стойност
       n=GetN();              
//въвеждане на дължината на масива
       GetA(a,n);              
//въвеждане на масива
       OutA(a,n);               
//извеждане на масива
        GetMax(a,n,&Iextr, &extr);
        printf("max=a[%d]=%10.2f\n",Iextr,extr);
        GetMin(a,n,&Iextr, &extr);
       printf("min=a[%d]=%10.2f\n",Iextr,extr);
}

РАЗПЕЧАТКА НА ИЗПЪЛНЕНИЕТО

© Copyrigt 2006 UTC. All rights reserved.