ДЪРЖАВЕН ИЗПИТ
ОТК-ТУ-София 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); }
РАЗПЕЧАТКА НА ИЗПЪЛНЕНИЕТО
|