Задача. Даны действительные числа [latex]x_{1},\ldots,x_{n}[/latex], [latex]y_{1},\ldots,y_{n}[/latex]. Получить [latex]x’_{1},\ldots,x’_{n}[/latex],[latex]y’_{1},\ldots,y’_{n}[/latex], преобразовав для получения [latex]x’_{i},y’_{i}[/latex] члены [latex]x_{i},y_{i}[/latex] по правилу: если они оба отрицательны, то каждый из них увеличить на 0.5; если отрицательно только одно число, то отрицательное число заменить его квадратом; если оба числа неотрицательны, то каждое из них заменить на среднее арифметическое исходных значений.
Тесты
n | [latex]x_{1},\ldots,x_{n}[/latex] [latex]y_{1},\ldots,y_{n}[/latex] | [latex]x’_{1},\ldots,x’_{n}[/latex][latex]y’_{1},\ldots,y’_{n}[/latex] | Комментарий |
4 | 1 4 -3 8
3 -2 -4 2 |
2 4 -2.5 5
2 4 -3.5 5 |
Пройдено |
5 | 0 -0.5 4 -9 0.35
0 -0.5 11 0.247 1.650 |
0 0 7.5 81 1
0 0 7.5 0.247 1 |
Пройдено |
3 | 0 3 -0.14942
-3 0 793 |
0 1.5 0.0223263
9 1.5 793 |
Пройдено |
Реализация (массив структур)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <iostream> using namespace std; struct okay { double a,b; }; int main() { int numb; cin>>numb; okay x[numb]; for(int i=0;i<numb;i++){ cin>>x[i].a; } for(int i=0;i<numb;i++){ cin>>x[i].b; } for(int i=0;i<numb;i++){ if(x[i].a<0 && x[i].b<0){ x[i].a=x[i].a+0.5; x[i].b=x[i].b+0.5; } else if(x[i].a<0 && x[i].b>=0){ x[i].a=x[i].a*x[i].a; } else if(x[i].a>=0 && x[i].b<0){ x[i].b=x[i].b*x[i].b; } else { x[i].a=(x[i].a+x[i].b)/2; x[i].b=x[i].a; } } for(int i=0;i<numb;i++){ cout<<x[i].a<<" "; } cout<<endl; for(int i=0;i<numb;i++){ cout<<x[i].b<<" "; } return 0; } |
Алгоритм решения (массив структур)
Для выполнения данной задачи, воспользуемся массивом структур. Каждый [latex]i[/latex]-ый элемент такого массива заполняем двумя действительными числами [latex]x_{i}[/latex] и [latex]y_{i}[/latex]. После этого мы выполняем проверку и преобразование этих чисел по заданным в условии правилам. Затем их выводим.
Реализация (класс vector)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <iostream> #include <vector> using namespace std; int main() { double a,b; vector<double> c; vector<double> d; while(cin>>a && cin>>b){ c.push_back(a); d.push_back(b); } for(int i=0;i<c.size();i++){ if(c[i]<0 && d[i]<0){ c[i]=c[i]+0.5; d[i]=d[i]+0.5; } else if(c[i]<0 && d[i]>=0){ c[i]=c[i]*c[i]; } else if(c[i]>=0 && d[i]<0){ d[i]=d[i]*d[i]; } else { c[i]=(c[i]+d[i])/2; d[i]=c[i]; } } for(int i=0;i<c.size();i++){ cout<<c[i]<<" "; } cout<<endl; for(int i=0;i<d.size();i++){ cout<<d[i]<<" "; } return 0; } |
Алгоритм решения (класс vector)
Данный способ реализации помогает решить задачу преобразования чисел [latex]x_{1},\ldots,x_{n}[/latex], [latex]y_{1},\ldots, y_{n}[/latex] для неизвестного значения [latex]n[/latex] — количества элементов [latex]x_{i}[/latex] и [latex]y_{i}[/latex]. Их количество будет зависить от количества введенных элементов. Программа считывает элементы [latex]x_{i}[/latex] и [latex]y_{i}[/latex] поочередно, т.е. [latex]x_{1}\rightarrow y_{1}\rightarrow x_{2} \rightarrow y_{2} \rightarrow\ldots\rightarrow x_{n}\rightarrow y_{n}[/latex]. В остальном алгоритм такой же как с массивом структур.
Ссылка на код (массив структур)
Ссылка на код (класс vector)
— Расставьте правильно отступы в первом коде.
— Пожалуйста, не называйте пару значений array. Найдите какое-то более удачное название.
— Вы в конце правильно написали «массив-структур». А раньше везде какое-то непонятное «массив-структура».
— Проверки d[i]>=0 и c[i]>=0 во вложенных условных операторах излишни.