Loading...
NinessonC avatar NinessonC 4 Точки

Въпрос за първа задача от второ домашно - Compare arrays

Здравейте, от няколко часа се опитвам да реша задачата по всевъзможни начини, но на тестовете винаги ми изкарва 80/100. По условието на задачата разбирам, че трябва да създадем два едномерни масива, без първоначално зададени размер и стойности на елементите. След известно проучване започвам да си мисля, че това не е възможно и единственото ми решение остава да използвам динамичен масив, но не искам, тъй като все още не сме взели материала и предполагам, че има и друг вариант. Прикачвам кода, който съм написал до момента, за да видите къде може би греша. Предварително съм задал размер на масивите, тъй като не знам как да го направя с user input. На VS работи, но в джъджа 80/100.  Благодаря ви предварително :)

 

код: https://pastebin.com/CZDnSSSs

Тагове:
1
C++ Fundamentals
galin_kostadinov avatar galin_kostadinov 166 Точки
Best Answer

Привет! Прегладах кода ти и искам да отбележа няколко неща.

1. В случая е трябва да използваш вектор, както казва колегата, вариянт за това е следният:

int firstArrSize = 0;
cin >> firstArrSize;

vector<int> firstArr(firstArrSize);
read(firstArr, firstArrSize);

2. След като провериш дължините на двата вектора, то следва да провериш елемент по елемет по съответстващите им индекси дали векторите съдържат еднакви стойности.

if (firstArr[i] != secondArr[i]) {
    return false;//върни, че са различни, като това в случая съм го направил във функция.
}

3. Варианта, който си написал if (arr1 == arr2)  сравнява масивите по референция, т.е. дали се намират на едно и също място в паметта. И в случая ако е вярно това означава, че масива е един и същ, а не че масивите са два, които са на различно място в паментта, но са с едвакви стойности, което се иска в задачата.

Поздрави!

0
kolioi avatar kolioi 641 Точки

Операторите за сравнение (==,!=,<,<=,>,>=) са предефинирани за почти всички STL контейнери

https://en.cppreference.com/w/cpp/container/vector/operator_cmp

Така че колегата, случайно или не, го е направил много добре.

0
NinessonC avatar NinessonC 4 Точки

Интересното е, че като сменя размера на единия масив ми иска да предефинирам оператора за сравнение, за да може да сравни масив с 4 елемента и с 5 елемента. Не знаех, че не може без предефиниране :D

0
NinessonC avatar NinessonC 4 Точки

Благодаря ти за изчерпателния отговор. Ще го направя с вектори, а това което каза за сравнението на на arr1 == arr2, в стака прочетох, че ако масивите са създадени от хедър <array> , сравнява елементите, а като е създаден без хедъра, сравнява адресите на първите елементи. 

0
kolioi avatar kolioi 641 Точки

Ако използваш std::array задължително трябва да имаш хедъра <array>. Иначе програмата ти просто няма да се компилира във VS :) Не знам защо всички използвате std::array. Направете го така

const int size = 100;
int arr[size];

или с std::vector

vector<int> arr;

както са ви казали на лекциите.

0
trabaxo avatar trabaxo 0 Точки

#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

0
kolioi avatar kolioi 641 Точки

Ако махнеш функциите и сложиш целия код в main() може и да стане :)

0
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, колега, 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".

Поздрави,
Живко

1
RaUndreundre avatar RaUndreundre 54 Точки

Здравейте, Опитах се да реша задачата като модулизирам всичко във функции, но "ударих на камък". От прочетеното разбрах че C++ не позволява директното връщане на цял масив от функция, и че това може да стане само като се ползва указател (pointer).
Правилно ли съм схванал "ситуацията"?

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.