Домашние задание №3
(В помощь подготовке ко 2-ой контрольной)
1. Схема решения некоторых заданий.
Все следующие задания одинаковы:
Два фрагмента нижеприведенной программы, выделенные жирным курсивом, представляют собой решение одной и той же подзадачи для различных исходных данных – параметров этой подзадачи. Для подходящей подзадачи опишите процедуру (функцию) с параметрами и без глобальных переменных. Перепишите нижеприведенную программу в более компактной форме, используя операторы (этой) процедуры (вызовы функции) для реализации выделенных фрагментов.
Задание 1.1
int main()
{
int i,j,k,s;
const n = 10;
int a[n],b[n],c[n];
for (i = 0;i<n;i++)
cin>>a[i];
for (i = 0;i<n;i++)
cin>>b[i];
for (i = 0;i<n;i++)
cin>>c[i];
s = 0;
for(i = 0;i<n; i++)
s = s+a[i];
s = s+1;
for(j = 0;j<n; j++)
s = s+b[j];
s = s+1;
for(k = 0;k<n; k++)
s = s+c[k];
cout<<s;
return 0;
}
Решение:
Сначала обрабатываем первую строчку, в ней переменная i, причем она используется только в выделенном фрагменте(аналогично j,k) Значит это должна быть локальная переменная тогда обозначим ее за l1 и сразу же заменим ее во всем фрагменте  | 
		Вторая строка отличается массивом a(b и c), он зависит от предыдущей программы, поэтому мы передаем его в качестве аргумента a1. Важно, что это массив и в кавадратных скобках надо указывать константу, поэтому укажем само число 10 в качестве размерности массива.  | 
	||
l1 = i  | 
		for(l1 = 0; l1<n; l1++) s = s+a[l1];  | 
		l1 = i a1=a  | 
		for(l1 = 0; l1<n; l1++) s = s+a1[l1];  | 
	
l1 = j  | 
		for(l1 = 0; l1<n; l1++) s = s+b[l1];  | 
		l1 = j a1=b  | 
		for(l1 = 0; l1<n; l1++) s = s+a1[l1];  | 
	
l1 = k  | 
		for(l1 = 0; l1<n; l1++) s = s+c[l1];  | 
		l1 = k a1=c  | 
		for(l1 = 0; l1<n; l1++) s = s+a1[l1];  | 
	
  | 
		____ sum (______________) { int l1; for(l1 = 0;l1<n; l1++) … }  | 
		
  | 
		____ sum (int a1[10],_______) { int l1; for(l1 = 0;l1<n; l1++) s = s+a1[l1]; … }  | 
	
Все различия устранены, теперь можно все оставшиеся переменные передавать как переменные параметры(ставя впереди “&”), т.к. их значения передаются из вне, а изменения важны для последующей программы. Внимание перед n “&” не ставится, т.к. она константа. А возвращаемый тип указывать void.  | 
		Другой вариант. Учитывая специфику задачи. А точнее то, что результат хранится в s, то можно написать так, хотя это не подходит под универсальный способ, поэтому если сомневаетесь, то лучше так не делать!!!!!  | 
	||
l1 = i a1=a  | 
		for(l1 = 0; l1<n; l1++) s = s+a[l1];  | 
		l1 = i a1=a  | 
		for(l1 = 0; l1<n; l1++) s = s+a[l1];  | 
	
l1 = j a1=b  | 
		for(l1 = 0; l1<n; l1++) s = s+a[l1];  | 
		l1 = j a1=b  | 
		for(l1 = 0; l1<n; l1++) s = s+a[l1];  | 
	
l1 = k a1=c  | 
		for(l1 = 0; l1<n; l1++) s = s+a[l1];  | 
		l1 = k a1=c  | 
		for(l1 = 0; l1<n; l1++) s = s+a[l1];  | 
	
  | 
		void sum (int a1[10],int n, int&s) { int l1; for(l1 = 0;l1<n; l1++) s = s+a1[l1]; }  | 
		
  | 
		int sum (int a1[10],int n, int s) { int l1; for(l1 = 0;l1<n; l1++) s = s+a1[l1]; return s; }  | 
	
Тогда main() будет следующим:
Для первого случая  | 
		Или второго  | 
	
int main(int argc, char* argv[]) { int i,j,k,s; const n = 10; int a[n],b[n],c[n]; for (i = 0;i<n;i++) cin>>a[i]; for (i = 0;i<n;i++) cin>>b[i]; for (i = 0;i<n;i++) cin>>c[i]; s = 0; sum(a,n,s); s = s+1; sum(b,n,s); s = s+1; sum(c,n,s); cout<<s; 
 return 0; }  | 
		int main(int argc, char* argv[]) { int i,j,k,s; const n = 10; int a[n],b[n],c[n]; for (i = 0;i<n;i++) cin>>a[i]; for (i = 0;i<n;i++) cin>>b[i]; for (i = 0;i<n;i++) cin>>c[i]; s = 0; s = sum(a,n,s); s = s+1; s = sum(b,n,s); s = s+1; s = sum(c,n,s); cout<<s; 
 return 0; }  | 
	
Задание 1.2
