Домашние задание №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