Въпрос за първа задача от второ домашно - Compare arrays
Здравейте, от няколко часа се опитвам да реша задачата по всевъзможни начини, но на тестовете винаги ми изкарва 80/100. По условието на задачата разбирам, че трябва да създадем два едномерни масива, без първоначално зададени размер и стойности на елементите. След известно проучване започвам да си мисля, че това не е възможно и единственото ми решение остава да използвам динамичен масив, но не искам, тъй като все още не сме взели материала и предполагам, че има и друг вариант. Прикачвам кода, който съм написал до момента, за да видите къде може би греша. Предварително съм задал размер на масивите, тъй като не знам как да го направя с user input. На VS работи, но в джъджа 80/100. Благодаря ви предварително :)
Операторите за сравнение (==,!=,<,<=,>,>=) са предефинирани за почти всички STL контейнери
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
Така че колегата, случайно или не, го е направил много добре.
Интересното е, че като сменя размера на единия масив ми иска да предефинирам оператора за сравнение, за да може да сравни масив с 4 елемента и с 5 елемента. Не знаех, че не може без предефиниране :D
Благодаря ти за изчерпателния отговор. Ще го направя с вектори, а това което каза за сравнението на на arr1 == arr2, в стака прочетох, че ако масивите са създадени от хедър <array> , сравнява елементите, а като е създаден без хедъра, сравнява адресите на първите елементи.
Ако използваш std::array задължително трябва да имаш хедъра <array>. Иначе програмата ти просто няма да се компилира във VS :) Не знам защо всички използвате std::array. Направете го така
или с std::vector
както са ви казали на лекциите.
#include<iostream>
#include<cmath>
#include<array>
#include<vector>
using namespace std;
void first() {
int firstArrSize = 0;
cin >> firstArrSize;
vector <int> firstArr(firstArrSize);
for (int i = 0; i < firstArrSize; i++) {
cin >> firstArr[i];
}
}
void second() {
int secondArrSize = 0;
cin >> secondArrSize;
vector <int> secondArr(secondArrSize);
for (int j = 0; j < secondArrSize; j++) {
cin >> secondArr[j];
}
}
bool notEqual() {
if (first != second) {
return false;
}
}
int main() {
first();
second();
if (notEqual) {
cout << "not equal" << endl;
}
else {
cout << "equal" << endl;
}
return 0;
}
Представа си нямам какво правя и какво става!!! джъджа ми дава 60 от 100
Ако махнеш функциите и сложиш целия код в main() може и да стане :)
Привет, колега, trabaxo.
Харесва ми как си модуризирал задачата на функции. Точно така трябва.
Дотук с хубавите думи :D
Шегувам се - споделям какви са ти грешките, за да можеш да се коригираш:
1) функция се извиква като след името и се сложат скоби (). Ако функцията приема параметри те се подават в скобите.
Ти пишейки "first", "second" и "notEqual" реално не извикваш самите функции (защото не си сложил скобите).
Защо тогава кодът ти се компилира и работи? Отговорът е: извадил си късмет.
Извиквайки име на функция без скоби ти извикваш нейното място в паметта (за това ще учим в следващия курс C++Advanced).
Защо Judge ти дава 60/100 - защото задачата е проста и има само 2 възможни решения "equal" или "not equal". Просто си "нацелил" 3 от 5те верни решения.
2) Да приемем, че все пак извикаш функциите по правилния начин:
Функцията "first" ти създала вектор, би го прочела от конзолата и след това би го унищожила. Т.е. ти този вектор след изпълнение на функцията вече го нямаш и не можеш да по ползваш.
Ситуацията със "second" е идентична.
Най-вероятно искаш да запазиш резултатите от тези 2 функции (или веткорите, които създаваш в тях).
Това най-лесно би станало, ако като резултат от функцията връщаш този вектор.
Накрая, но не на последно място - функцията "notEqual" трябва да приема какво да сравнява - сигурно ще са тези 2 вектора.
3) Много лошо наименоване на функциите си избрал. Името на функцията трябва да подсказка какво прави тя без даже да гледаш какъв код има в нея.
"notEqual" най-вероятно би станала "compare".
Отделно функциите "first" и "second" са крайно неописателни. Помниш ли едно време ни казваха в училище - "2, 3, 4...какво са това круши ли са...ябълки ли са". Та тук същото.
"readFirstArray" и "readSecondArray".
Даже, ако трябва да сме честни - тъй като функциите правят абсолютно едно и също - то те не трябва да се 2, а да е само една "readArray".
Поздрави,
Живко
Здравейте, Опитах се да реша задачата като модулизирам всичко във функции, но "ударих на камък". От прочетеното разбрах че C++ не позволява директното връщане на цял масив от функция, и че това може да стане само като се ползва указател (pointer).
Правилно ли съм схванал "ситуацията"?