Tablica dynamiczna - sumowanie kwadratów elementów

0

Witam mam napisać program który pobierze od użytkownika jakiego rozmiaru mam być tablica, następnie użytkownik ma ją uzupełnić a na koniec program wyświetlić sumę kwadratów elementów tej tablicy. Program napisałem w poniższy sposób tylko powiedzmy dla tablicy 3 elementowej nie zależnie jakie liczy wprowadzę suma zawsze wynosi 7.
Proszę o nakierowanie mnie na błąd który popełniłem.

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    int wymiar;
    do{
        cout << "Podaj wymiar tablicy. " << endl;
        cin >> wymiar;
    }while(wymiar <= 0);

    int *tablica = new int[wymiar];

    for (int i = 0; i < wymiar; i++)
    {
        cout << "Podaj element nr: " << i + 1<< ": " << endl;
        cin >> tablica[i];
    }

    cout << "Obliczam sume kwadratow elementow tablicy: " << endl;

    for (int i = 0 ; i < wymiar; i++)
    {
        tablica[i] = pow(2,i);
    }

    int suma = 0;
    for (int i = 0; i < wymiar; i++)
    {
        suma += tablica[i];
    }

    cout << suma << endl;

    delete [] tablica;

    return 0;
}
1

Popraw na:

    for (int i = 0 ; i < wymiar; i++)
    {
        tablica[i] = pow(2,tablica[i]);
    }
0
Robert Karpiński napisał(a):

Popraw na:

    for (int i = 0 ; i < wymiar; i++)
    {
        tablica[i] = pow(2,tablica[i]);
    }

Poprawiłem ale nadal nie ma oczekiwanego efektu bo wynika nadal są niepoprawne.

0
Wikt0r napisał(a):

Poprawiłem ale nadal nie ma oczekiwanego efektu bo wynika nadal są niepoprawne.

Po poprawieniu potrzebna ponowna kompilacja, jeżeli nadal nie działa to poprawiłeś albo nie to albo nie tam.

2

pow(tablica[i], 2) działa poprawnie.
Przed użyciem funkcji dobrze jest przeczytać dokumentację:
https://cplusplus.com/reference/cmath/pow/

3
lion137 napisał(a):

pow(tablica[i], 2) działa poprawnie.
Przed użyciem funkcji dobrze jest przeczytać dokumentację:
https://cplusplus.com/reference/cmath/pow/

Uprzedziłeś mnie :)

Nie jestem zwolennikiem używania tej funkcji do "zwykłych" szkolnych potęg, zwłaszcza liczb całkowitych.
Jej istota, to potęgowania o współczynnikach niecałkowitych (matematyka (trochę)wyższa)
A zmiennoprzecinkowa wobec liczb całkowitych może dać pow(21,2) -> 440,99999908 -> 440

A po kolejne, zadanie nie mówi, że tablicę tzreba wypełniać kwadratem, tylko że zwrócić sumę. Więc nie

@Robert Karpiński:
tablica[i] = pow(2,tablica[i]);

tylko
sum += tablica[i]*tablica[i]

To w szkolnym zadaniu zamiecie się pod dywan, ale to jest błąd. Po tej operacji masz tablicę wartości zniszczoną, jakby chcieć jeszcze jakiś algorytm na niej wykonać.

4
ZrobieDobrze napisał(a):

To w szkolnym zadaniu zamiecie się pod dywan, ale to jest błąd. Po tej operacji masz tablicę wartości zniszczoną, jakby chcieć jeszcze jakiś algorytm na niej wykonać.

GDYBYŚ sumował w funkcji (o dobrej nazwie oczywiście) a nie w main()i GDYBY funkcja miała argument const to kompilator by cię od tego obronił. Zobacz jak w bibliotece standardowej szeroko jest używany const

1
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int s{0}, c{0};
    cout<<"Enter size arr: "; cin>>s;
    int *t = new int [s];
    for(int i=log10(0.1);(++i<s)&&(cout<<"Enter t["<<i<<"]"<<(char)0x20)&&(cin>>i[t])&&((c+=i[t]*i[t])>=0);(i<s-1?(cout<<""):(cout<<"Sum = "<<c<<(char)0x0A))){}

    delete [] t;
    return log10(1);
}

1
#include <iostream>
using namespace std;

int main()
{
    int size,v,sum{0},i{0};
    for((cout<<"Enter size arr: ")&&(cin>>size);(++i<=size)&&(cout<<"Enter t["<<i<<"] ")&&(cin>>v)&&((sum+=v*v)>=0);) if(i>=size) cout<<"Sum = "<<sum<<endl;
    return 0;
}
1

@Wikt0r
pomimo uwag i wprowadzenia poprawek żaden z moich przedmówców
nie dostrzegł, że zachowanie twojego programu jest niezdefiniowane "overflow"
możesz poradzić sobie z przepełnieniem na kilka sposobów

  • dobierz odpowiednie typy danych
  • napisz sobie funkcję, która będzie wykrywać przepełnienie zanim się coś doda, odejmie, pomnoży
  • skorzystaj std::accumulate
1

Nikt też nie dostrzegł :), że ten kod może zaallokować krytyczną ilość pamięci !

0

Cześć. Zapoznaj się z biblioteką vectors. Jest to bardzo przyjazna biblioteka do tworzenia dynamicznych tablic i działania na niej.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    cout << "Podaj ilosc elementow" << endl;
    int ilosc;
    cin>>ilosc;
    vector<int> tablica;
    int suma = 0;
    int liczba;
    for(int i = 0; i < ilosc; ++i)
    {
        cin>>liczba;
        tablica.push_back(liczba);
        suma += tablica[i] * tablica[i];

    }
    cout<<suma<<endl;

    return 0;
}

1
sizeof napisał(a):

Cześć. Zapoznaj się z biblioteką vectors. Jest to bardzo przyjazna biblioteka do tworzenia dynamicznych tablic i działania na niej.

Zupełna zmian paradygmatu (tak, użyję tego słowa) z C ze strumieniami na (w miare) pełne C++, gdy zerkniecie w dokumentację jednej funkcji jest problemem?

Robert Karpiński napisał(a):

Nikt też nie dostrzegł :), że ten kod może zaallokować krytyczną ilość pamięci !

Albo na elektrownię mogła spaść bomba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1