Task 1 Pipes
#include <iostream>
#include <cmath>
#include <array>
using namespace std;
int main()
{
int numberOfPipes = 0;
int lifetimes = 0;
array<int, 100> checkup = {0};
array<int, 100> installation = {0};
cin >> numberOfPipes;
if(numberOfPipes > 0 && numberOfPipes <= 500)
{
for(int i = 0; i < numberOfPipes; ++i)
{
cin >> checkup[i];
}
for(int n = 0; n < numberOfPipes; ++n)
{
cin >> installation[n];
}
if(installation.size() > 0 && installation.size() <= 500)
{
for(int i = 0; i < numberOfPipes; ++i)
{
if(checkup[i] < installation[i])
{
lifetimes = abs(checkup[i] - installation[i]);
}
else
{
lifetimes = installation[i];
}
cout << lifetimes << " ";
}
}
}
return 0;
}
От задачата разбирам че годините се намират като се извадят всички checkup от installation. Или бъркам логиката за изчисляването на годините?
Благодаря за отговора. Реших я но Judge даде 60/100 и 4 Runtime Errors. Нямам идея къде греша :/
EDIT: Промених масивите с големина 500 и мина. Явно това са имали в предвид в условието.
В случая по-удачно е да използваш vector вместо array, тъй като размерът му може да се променя динамично (т.е. по време на изпълнение на програмата), а не е фиксиран:
Здравейте!
Аз нещо не разбрах.. Следното работи:
Обаче ето така не става:
Защо?
@zzerro
Благодаря, @ MartinBG !
А, това изглежда ли ти безопасно?
@zzerro
Зависи как точно си дефинирал inArr. Ако това е масив с 10 елемента
тогава трябва да прочетеш точно 10 числа от тип int. Ако inArr е вектор дефиниран така
тогава размера му е 0 и няма да прочетеш нищо. Затова трябва да зададеш размер на вектора и този код ще върви без проблем
или така
Значи range-based for loop за който питаш обхожда всички елементи на масива (или друг контейнер, напр. map, set, list и т.н.) и обикновено се използва при печатане например, а при въвеждане трябва или да използваш обикновен for loop, или да зададеш предварително размера на контейнера за да знаеш колко числа да прочетеш от входа.
zzero, Възприемаш малко погрешно for range цикъла. Тук "i" е стойност, а не номер на итерация. Не можеш да го използваш за да се добереш директно до индекса на вектора или масива. За да го направиш трябва да вкараш брояч да речем. Т.е тук "i" може да е float или double или char , bооlean или дори string. Просто C++ вижда следното: имам вектор с размер 0-10 и стойности от някакъв тип: "изведи ми тези стойности една по една". За да не се бъркаш не си кръщавай във фор-рейндж цикъл променливата i (iterator). Ако искаш ще ти дам решение на - "3.Problem 3 – Remove" със местене, запис, триене във фор-рейндж. Но не знам дали няма да те объркам повече. Затова ето нещо по лесно. Сравенение между рейндж и нормален цикъл:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main (){
vector<string> vec = {"asdf", "qwert", "zxcv"} ;
for (string n : vec){
cout<<n<<endl;
}
for (int i=0 ;i<3;i++){
cout<<vec[i]<<" ";
}
}
Етро ти горното, допълнено с въвеждане вътре във фор-рейндж. И последващия му печат.
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main (){
int remove_number;
vector<string> vec = {"asdf", "qwert", "zxcv"} ;
for (string n : vec){
cout<<n<<endl;
}
for (int i=0 ;i<3;i++){
cout<<vec[i]<<" ";
}
cout<<"Molia vuvedete 3 dumi"<<endl;
int i = 0;
for (string n : vec){
cin>>n;
vec[i]=n;
i++;
}
for (string n : vec){
cout<<n<<endl;
}
}
Да, @ kolioi, искам да ползвам вектор като динамичен масив с размер, определен по време на изпълнението. Благодаря за добрия отговор!
Не ме объркваш, @ spasimira25. Но ако ще трябва да правим това:
То май е по-добре да си ползваме обикновен.
Да, за въвеждане и според мен е по-добре обикновен цикъл. Винаги можеш да си извлечеш размера на вектора ( и капацитета ). Но пък рейндж цикъла ми изглежда удобен за вадене на инфо. Сигурно има и други удобства де.
@ zzerro
Мисля, че е защото, когато използваш втория тип итериране
цикъла обикаля по такъв начин елементите, че не можеш да позлваш индексите им и не можеш да намериш кой е
елемента. А при първия начин обикаляш, като пазиш в промеливата i самия индекс, до който си стигнал.
Също така, когато използваш този for
ти можеш да запълваш масива като викаш всяко място по индекса, до който си стигнал. Но при другия for, работиш директно със самия елемент и няма как да го запълниш със cin, ами получаваш каквото вече има във масива. Например ако пробваш това:
for(int var : inArr){
cin >> var;
inArr.push_back(var);
}
for(int i : inArr){
cout << i;
}
ако си си занулил вектора в началото и въведеш 1 2 3, програмата, ще ти даде 000123, защото за всеки съществуващ елемент във вектора (трите нули, които вече имаме), добавяш към вектора нова стойност въведена от конзолата (1 2 3) към вече съществуващите, стойности.
Привет!
Тук итерираш, вървеш последователно по елементите на вектрора.
Да речем, че вече си напълни вектора с елементи {17, 5, 7, 13}.
Тръгвайки итератора ти дава първия елемент, който в случая е равен на i = 17.
Тук ти му казвай, запиши ми на инекс i = 17 -> inArr[17] нещо прочетено от конзолния вход.
Ако има индек 17 в твоя масив ще стане, но това не е желания резултат в случая.
Тук вървиш последователно по индексите, първо i = 0, после i=1... и записваш на тази позиция нещо прочетено от конзолата.
Поздрави!