12. Подпрограми в С++

12.1. Подпрограми функции
• Дефиниране на функция
• Извикване на функция за изпълнение. Примери и задачи с функции

12.2. Подпрограми процедури
• Дефиниране на процедура
• Извикване на процедурата за изпълнение. Пример

12.3. Предаване на параметри между подпрограмите
• Предаване на параметри по стойност. Пример
• Предаване на параметри чрез адрес. Примери
• Едномерните масиви като формални параметри на подпрограмите. Пример
• Многомерните масиви като формални параметри на подпрограми. Пример

12.4. Понятие за прототип / декларация на подпрограма/. Пример

преди план следва
 
 

• Едномерните масиви като формални параметри на подпрограмите. Пример


Едномерните масиви се задават като формални параметри на подпрограмите по следните начини:
- обикновен начин:

тип_на_елементите аа име_на_масив[]

int x[], double y[]

- задаване на масив като формален параметър чрез указател:

тип_на_елементите а * p

int * p, double *z

И в двата случая фактическият параметър е име на едномерен масив с елементи от същия тип. Необходимо е още като формален параметър да се подаде и размерността на масива.

Пример:
Зададен е едномерен масив. Да се намери най-голям общ делител на елементите на масива. Въвеждането и извеждането на елементите на масива да се извърши с процедури. Да се дефинира функция gcd за намиране на най-голям общ делител на елементите на масива.
#include < iostream.h >

// функция gcd
int gcd(int a, int b)
{
  while(a!=b)
     if(a > b) a = a-b;
     else b = b-a;
  return a;
}

// процедура readArr
void readArr(int m, int arr[])
{
      for (int i=0;I < m;i++)
         {
	       cout<<"arr["<< i <<"] = ";
	       cin>> arr[i];
         }
}

// процедура writeArr
void writeArr(int m, int arr[])
  {   for(int i=0;i < m;i++)
	     cout<<"arr["<< i <<"] = "<< arr[i]<< endl;
  }
int main()
{
  int n, a[100];
  cout<<" Въведете размерността на масива  n : ";
  cin>> n;
  readArr(n,a);
  cout<<"Въведен е масив: "<< endl;
  writeArr(n, a);
  int x = a[0];
  for (int i=1;i < n;i++)
       x = gcd(x, a[i]);
  cout<<" gcd = "<< x<< endl;
  return 0;
}
Примерът показва, че процедурите readArr и writeArr работят направо с масива a, а не с негово копие. Промяната на елементите на масива след въвеждане на елементите се запазва и след излизане от процедурите. Друга важна особеност е това, че броят на елементите на масива не може да се разбере от неговото описание. Затова се налага използването на допълнителен формален параметър m в списъка на формалните параметри. Последното не се отнася за масивите, представляващи символни низове, тъй като те завършват със символ за край на низ '\n'.

Пример. Следващата процедура демонстрира задаването на масив като формален параметър чрез използване на указател:
void readArr(int m, int *p)
{
	for(int i=0;i < m;i++)
	  {
	         cout<<"arr["<< i <<"] = ";
	         cin>> *p++;
	  }
Извикването на процедурата става по същия начин: readArr(n,a);.
 
 
 
 
преди план следва