Tablica dynamiczna - sumowanie kwadratów elementów

Tablica dynamiczna - sumowanie kwadratów elementów
W0
  • Rejestracja:około 3 lata
  • Ostatnio:około 2 lata
  • Postów:17
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.

Kopiuj
#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;
}
edytowany 2x, ostatnio: Riddle
Robert Karpiński
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:133
1

Popraw na:

Kopiuj
    for (int i = 0 ; i < wymiar; i++)
    {
        tablica[i] = pow(2,tablica[i]);
    }
W0
  • Rejestracja:około 3 lata
  • Ostatnio:około 2 lata
  • Postów:17
0
Robert Karpiński napisał(a):

Popraw na:

Kopiuj
    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.

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
W0
To jeszcze zapytam bo program już działa jak należy. To rozumiem że jeżeli chcę podnieć elementy tablicy funkcją pow to musi to wyglądać tak? pow(tablica[i],2) a nie pow(2,tablica[i])
_13th_Dragon
Doprawdy prościej ci ten komentarz naskrobać niż wpisać w google C++ pow? Tu jest właściwie błędem użycie pow( ponieważ ta funkcja jest mocno skomplikowana, normalni ludzi używają tablica[i]*tablica[i] lub piszą funkcje int pow2(int x) { return x*x; }
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 5 godzin
  • Postów:4928
2

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


edytowany 1x, ostatnio: lion137
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
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ć.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
Robert Karpiński
Oczywiście macie rację !
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
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


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
RE
  • Rejestracja:ponad 2 lata
  • Ostatnio:ponad 2 lata
  • Postów:41
1
Kopiuj
#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);
}

edytowany 1x, ostatnio: reich
MA
Możesz jeszcze zmienić t[i] => i[t]
RE
_13th_Dragon
Tak się zastanawiam po kiego tu tablica? Jaka jest suma dla szeregu 3 elementowego 0,1,2 ?
MA
Wydaje mi się, że chodzi tutaj bardziej o formę niż logikę rozwiązania. Tak jak używanie inicjatorów można dalej skrócić do użycia defaultowego {} dla inta i tego typu rzeczy :)
_13th_Dragon
Ja nie rozumiem sensu podawania kodu który nie działa. Jak chce przekazać formę to może nie działać zaś ma przekazać zalety formy. Jak chce przekazać krótki sposób zapisu to kod musi przynajmniej działać. Rozumiem lekkie zagmatwanie kodu (wyłącznie dla początkujących) w celach skrócenia tegoż kodu, zaś wydłużenia kodu w celach zagmatwania (nawet mizernego) - tego to nie rozumiem.
MA
:D domyślam się, że nikt tu nikomu nic nie chce pokazywać. W mojej ocenie jest to pewna forma zabawy intelektualnej, a niżeli trolling. Inaczej, można traktować to jako odskocznie od tego co się widzi w kodzie - w pracy.
_13th_Dragon
Jak nie działa oraz nie pokazuje jakiś formy klarownie - czyli nie niesie żadnego przekazu - to zwyczajny trolling bo nikomu niczego nie daje.
RE
poprawione
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
#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;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
RE
  • Rejestracja:ponad 2 lata
  • Ostatnio:ponad 2 lata
  • Postów:41
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
Zobacz pozostałe 5 komentarzy
_13th_Dragon
Zabezpieczenie int'a jest, jak dasz ujemny rozmiar to nie zrobi żadnego kroku - logicznie.
RE
wpisz literkę
_13th_Dragon
to program zostanie przerwany &&(cin>>v)&&
RE
Ja mówię o programie Wikt0r'a w pętli do{}while(
_13th_Dragon
No racja to zabezpieczanie przed liczbą ujemną powoduje jeszcze gorszy błąd
Robert Karpiński
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:133
1

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

SI
  • Rejestracja:ponad 2 lata
  • Ostatnio:ponad 2 lata
  • Postów:2
0

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

Kopiuj
#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;
}

Robert Karpiński
Jak mam szukać "dziury w całym" to nie widzę sensu wykorzystywania dynamicznej tablicy kiedy zna się z "góry" liczbę elementów.
SI
Przecież dynamicznie wpisujesz liczbę elementów w moim kodzie
Robert Karpiński
Kod jest OK, tyle że "bawimy się" sytuacjami ekstremalnymi. Przy dużej ilości elementów zacznie się "magia" dynamicznej tablicy, czyli kopiowanie elementów między blokami.
SI
@Robert Karpiński: ale o czym my piszemy? Pierw piszesz, że dynamiczna tablica jest niepotrzebna gdy zna się jej rozmiar (gdzie op i ja ewidentnie podajemy rozmiar dynamicznie) a teraz o magii dynamicznej tablicy. Przecież to jest zwyczajnie, prosty kod, którym chciałem pokazać alternatywę dla autora postu. To tak jakby ktoś używał unsigned int w kodzie a ty napisałbyś, że to 'ekstremalne ryzyko', ponieważ ktoś może podać liczbę -10. Raczej podczas nauki zakładamy, że użytkownik jest 'mądry'.
_13th_Dragon
@Robert Karpiński, pisze o tym że Waść nie słyszał o reserve() więc Wąść chrzani.
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
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.


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
Robert Karpiński
Bomba na elektrownie ??? Taaa ... to ma sens :)
_13th_Dragon
Jak na zwykłą elektrownie to nie tak wielki problem jak na elektrownie atomową ... :D
_13th_Dragon
Ray Bradbury, napisał taką opowieść o pewnej obcej rasie która miała paranoję na punkcie bezpieczeństwa, więc całe rzeszy ministerstw badali bezpieczność wynalazków każde pod różnym kątem. Więc w sumie ta cywilizacja zatrzymała się na wynalezieniu koła bo nie mogli zaakceptować wszystkich niebezpieczeństw z nim związanych. No w sumie racja, zobaczcie ile osób ginie pod kolami samochodów lub za kierownicą - a wszystko wina kola!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.