Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Přetipování hodnot

Aktivity
Avatar
Jan Michálek:26.11.2018 19:13

Zdravím,

mám úkol do školy, kde mám napsat program pro výpočet kosinovy míry podobnosti. Potřebuji ale hodnotu, kterou zadám pro jednotlivé hodnoty vektorů (poleA, pole B) přetipovat z intu na double. Jediné na co jsem přišel co mi nevyhazuje chybovou hlášku je toto, ale pokud si necham vypsat jednotlivé hodnoty v poliA tak mi to napíše 0 0

#include <iostream>

using namespace std;

int main()
{
    int vstup;
    cin >> vstup;
    if (cin.fail() || vstup <0 ){
        cout << "Nespravny vstup." << endl;
        return 0;
    }

    int * poleA = new int [vstup];
    for ( int i=0; i<vstup; i++){
        double poleA[i];
        cin >> poleA[i];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }

    int * poleB = new int [vstup];
    for (int j=0; j<vstup; j++){
        double poleB[j];
        cin >> poleB[j];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }
    for (int x=0; x<vstup; x++){
        cout << poleA[x] << " ";
    }
    return 0;
}

Vůbec si už nevím rady jak to dobře přetipovat. :-S

Mohl by mi někdo poradit? Děkuji

Odpovědět
26.11.2018 19:13
Nemá cenu nic programovat, pokud se to neprogramuje geniálně.
Avatar
wgamez101
Člen
Avatar
wgamez101:26.11.2018 23:37

Ahoj, problém je tu.

int * poleA = new int [vstup];
for ( int i=0; i<vstup; i++){
    double poleA[i];
    ...

Všimni si že máš dva krát zadefinovanú premennú poleA. Pred for cyklom definuješ pole intov poleA, pričom vo for cykle definuješ neinicializované double pole s rovnakým názvom. To znamená že keď ukladáš štandartný vstup do prvku v poli poleA, tak sa to uloží iba do double poľa definovaného vo for cykle (ktoré sa aj tak vždy po načítaní vstupu vymaže keď sa spustí nová iterácia for cyklu) a int poleA, ktoré na konci programu vypisuješ, zostane prázdne (viď. Variable shadowing ).

Ak chceš načítavať zo vstupu reálne čísla, tak ich stačí načítať ako typ double a nemusíš nič pretypovávať. Napr. nejako takto.

double * poleA = new double [vstup];            // z int na double
for ( int i=0; i<vstup; i++){
    // uz ziadne double poleA ktore zakryvalo pole definovane pred for cyklom
    cin >> poleA[i];
    if (cin.fail()){
        cout << "Nespravny vstup." << endl;
        return 0;
    }
}

Samozrejme to platí analogicky aj pre poleB.

Mimochodom je tiež veľmi dobrým zvykom uvoľniť pamäť pri používaní operatóra new aj v takomto malom programe. Toto stačí pridať na koniec programu.

delete[] poleA;
delete[] poleB;

Ak používaš C++11 alebo vyššie, tak by bolo ešte lepšie použiť smart pointre , pri ktorých sa nemusíš starať o dealokovanie pamäte. Príklad:

// tento include treba pridať na začiatok súboru
#include <memory>
auto poleA = make_unique<double[]>(vstup);

Po úpravach by mal kód vyzerať nasledovne:

#include <iostream>
#include <memory>

using namespace std;

int main()
{
    int vstup;
    cin >> vstup;
    if (cin.fail() || vstup <0 ){
        cout << "Nespravny vstup." << endl;
        return 0;
    }

    auto poleA = make_unique<double[]>(vstup);
    for ( int i=0; i<vstup; i++){
        cin >> poleA[i];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }

    auto poleB = make_unique<double[]>(vstup);
    for (int j=0; j<vstup; j++){
        cin >> poleB[j];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }
    for (int x=0; x<vstup; x++){
        cout << poleA[x] << " ";
    }
    return 0;
}
Nahoru Odpovědět
26.11.2018 23:37
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Avatar
Odpovídá na wgamez101
Jan Michálek:27.11.2018 14:46

Pokud napíšu

double * poleA = new double [vstup];

Vyhodí mi to chybovou hlášku error expected primary-expression before 'double'

Takže takhle to podle mne asi nepůjde a nebo je ještě něco špatně a na to se mi zatím nedaří přijít :-@

Nahoru Odpovědět
27.11.2018 14:46
Nemá cenu nic programovat, pokud se to neprogramuje geniálně.
Avatar
Odpovídá na Jan Michálek
Jan Michálek:27.11.2018 17:37

Tak nakonec jsem si myslel, že se mi to podařilo napsat. Když si svůj program spustím v CodeBlocks tak jede bez problému. Zde můj kod.

#include <iostream>
#include <math.h>
#include <iomanip>

using namespace std;

int main()
{
    double n,y, vektorovySoucin;
    vektorovySoucin = 0;
    int vstup;
    cin >> vstup;
    cout << fixed << showpoint << setprecision(3);
    if (cin.fail() || vstup <0 ){
        cout << "Nespravny vstup." << endl;
        return 0;
    }
    //Naplneni pole A a B
    double * poleA = new double [vstup];
    for ( int i=0; i<vstup; i++){
        cin >> poleA[i];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }
    double * poleB = new double [vstup];
    for ( int i=0; i<vstup; i++){
        cin >> poleB[i];
        if (cin.fail()){
            cout << "Nespravny vstup." << endl;
            return 0;
        }
    }
    // vektorovy soucin
    for (int i=0; i<vstup; i++){
        double hodnota = poleA[i] * poleB[i];
        vektorovySoucin = vektorovySoucin + hodnota;
    }

    // vektor1
    for (int i=0; i<vstup; i++){
        double hodnota;
        hodnota = pow (poleA[i],2);
        n = n + hodnota;
    }

    //vektor2
    for (int i=0; i<vstup; i++){
        double hodnota;
        hodnota = pow (poleB[i],2);
        y = y + hodnota;
    }
    double V1 = sqrt(n);
    double V2 = sqrt(y);

    //Vypocet CSM
    double CSM = ((vektorovySoucin)/(V1*V2));
    cout << "CSM: " << CSM << endl;

    delete[] poleA;
    delete[] poleB;

    return 0;
}

Pokud, ale odevzdám program do progtestu. Tak mi vyhlásí chybu Test 'Test náhodnými daty + test práce s pamětí': Program provedl neplatnou operaci a byl ukončen (Segmentation fault/Bus error/Memory limit exceeded/Stack limit exceeded)

Budu asi muset hodně googlit, abych přišel na problém. :-D

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
27.11.2018 17:37
Nemá cenu nic programovat, pokud se to neprogramuje geniálně.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.