Suma elmentow powyzej glownej przekatnej talicy dwuwymiarowe

0

Witam, zadanko domowe z ktorym nie moge sobie poradzic... przyznam sie ze programowanie nie jest moja mocna strona ale cwicznia trzeba niestety zaliczyc:(

Napisac program obliczjacy sume elmentow powyzej glownej przekatnej talicy dwuwymiarowej (macierzy). Elementy tablicy wylosowac funkcja rand. Tablica sklada sie z 10 wierszy i 10 kolumn.

Mam tyle:

#include <cstdlib>
#include <iostream>
#include <ctime>

using namespace std;

int main(int argc, char *argv[])
{
    const unsigned short A=10;
    const unsigned short B=10;
    int suma=0;
    srand(time(NULL));
        
    std::cout<<"Wylosowano nastepujace liczby: \n";
        
    for(int i=0; i<A; ++i)
    for(int j=0; j<A; ++j)
    {
    
    std::cout<<"["<<i+1<<"],["<<j+1<<"]: "<<rand() % 100<<"\n";
    
            }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Nie wiem jak zrobic sume:( Pomozecie??

0

Weź to sobie na kartce rozrysuj, na prostej tablicy 5x5 na przykład, wyznacz sobie główną przekątną i sprawdź, które elementy masz dodawać. A potem na spokojnie przeanalizuj jak zmieniają się współrzędne poszczególnych elementów macierzy i na pewno wpadniesz na rozwiązanie. Zakodowanie go nie powinno już być takie trudne, dwa, góra trzy fory i powinno śmigać :)

Grunt to spokojnie przeanalizować problem, bo nie jest ciężki, a wiedza przyda ci się może na jakimś egzaminie albo przy innym programie :)

Edit:
a wylosowanych liczb nie pisz prosto na ekran, machnij je sobie najpierw do tablicy.
int macierz[A][B];
a potem jak losujesz
macierz[i][j] = rand() czy jak to tam masz ;)
Potem operuj już na tej macierzy, będzie ci prościej ideę załapać. Chociaż w sumie można tak jak ty, pisać na ekran i w trakcie pisania zliczać, ale na początek z macierzą wydaje mi się prościej, tak naturalniej ;)

0

Kurde ciemna masa jestem :( Nie wiem jak okreslic w petli ktore ma elemety sumowac:( Tzn wiem, ale ich nie sumuje... nie wiem czy to przez zle okreslenie elm. czy przez to ze sumowanie nie dziala :( Moze jakas podpowiedz?;> Bo chyba sam tego nie zrobie :( Kodu nie wrzucam bo i tak go prawie sie nie zmienil :(

Udalo mi sie zrobic sume wszystkich elm. ale nie o to chodzilo :(

0

Pomyśl trochę. Np taka tablica 5x5. Co sumujemy ? (bede indeksował od 0)
wiersz 0 kolumny od 0 do 3
wiersz 1 kolumny od 0 do 2
wiersz 2 kolumny od 0 do 1
wiersz 3 kolumny od 0 do 0
Za wiersz odpowiedzialny jest indeks zewnętrznej pętli. Za kolumnę indeks wewnętrznej pętli.
No nie trudno wymyślić, że przy tablicy AxA zewnętrzna pętla będzie for(i = 0; i < A-1; i++).
Wewnętrzną postaraj się wymyślić sam. Jak widać, zawsze zaczyna się od zera. A na czym sie kończy ? :> (podpowiedz -> skorzystaj z indeksu zewnętrznej pętli).

0

hmm ale glowna przekatna przebiega od lewego gornego rogu do prawego dolnego? Czy sie myle? Z tego co napisales wynika chyba ze przkatna przebiegalaby od prawego gornego do lewego dolnego? Pozna godzina... powiem szczerze ze zalamalem sie... niby to rozumiem, ale nie potrafie tego przeniesc na petle ;/

0

No tak, mój błąd, zła przekątna. Ale popatrz na godzinę o jakiej to pisałem ;)
Ale nic straconego, spróbuj najpierw policzyć elementy nad niegłówną przekątną.
A tak w ogóle napisałeś chociaż program sumujący wszystkie elementy ? Jeśli nie to należy ci się opieprz za lenia. Jak już będziesz miał program sumujący wszystkie elementy to potrzebne będą 2 drobne zamiany, konkretnie zmienią się zakresy pętli. Rozwiązanie masz prawie na tacy, wystarczy "podgrzać". :)

0

Dokładnie. Spokojnie na kartce przeanalizuj to i porównuj ze sobą indeksy pętli zewnętrznej (przelatującej przez wiersze) z indeksem pętli wewnętrznej (która ma zliczać elementy nad przekątną).
Zobaczysz, że zmienia się tylko pierwsza wartość, druga zawsze będzie taka sama (zawsze liczysz do końca wiersza, tylko przy pierwszym wierszu od pierwszego elementu... a przy drugim wierszu od którego elementu będziesz liczyl? Przy trzecim? A przy n-tym wierszu od której kolumny zaczniesz liczenie?)
Dodatkowo zastanów się, czy masz liczyć tylko powyżej głównej przekątnej, czy głowna przekątna + powyżej, to w sumie róznica niewielka, jak nie masz dokładnie w zadaniu sformułowane to sobie wybierz.
Jestem pewny, zę jak rozrysujesz sobie macierz 5x5 na kartce i będziesz liczył jak algorytm, pierwszy wiersz, drugi, trzeci... i sprawdzał, jak mają się współrzędne liczonych elementów do współrzędnych przekątnej głownej, to wpadniesz na relację między indeksem pętli lecącej po wierszach a startem pętli zliczającej elementy nad przekątną.

0

Dobrze... wydaje mi sie ze jest dobrze ale nie dziala tak jak powninno wiec dobrze nie jest :D Co zrobilem zle? Bo juz nie mam sily :( Dla jasnosci.. chodzi o sume elem. nad przekatna.

#include <cstdlib>
#include <iostream>
#include <ctime>

using namespace std;

int main(int argc, char *argv[])
{
    const unsigned short A=3;
    const unsigned short B=3;
    int CalaSuma=0;
    int MalaSuma=0;
    int tablica[A][B];
    srand(time(NULL));
        
    std::cout<<"Wylosowano nastepujace liczby: \n";
        
    for(int i=0; i<A; ++i)
    for(int j=0; j<B; ++j)
    {
    tablica[A][B] = rand() % 100;
    std::cout<<"["<<i<<"],["<<j<<"]: "<<tablica[A][B]<<"\n";
    CalaSuma+=tablica[A][B];
            }

for (int i=0; i<A-1; i++)
for (int j=1; j<B; j++)
{
MalaSuma += tablica[A][B];
}
            
    std::cout<<"Suma wszystkich elem. wynosi: "<<CalaSuma<<"\n";
    
    std::cout<<"Suma elem. powyzej glownej przekatnej wynosi: "<<MalaSuma<<"\n";
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
0

for (int i=0; i<A-1; i++)
for (int j=1; j<B; j++)
W ten sposób sumujesz po prostokącie, bo dałeś stałe granice dla pętli. A wewnętrzna pętla nie może zawsze się zaczynać od drugiej kolumny. Jej początek powinien być różny - zależy w którym wierszu jesteśmy. A o numerze wiersza mówi nam licznik 'i', skorzystaj z niego przy określaniu początku wewnętrznej pętli ;) Rozrysowanie przykładu na kartce pomoże ci określić tą relacje.

0

Dokładnie.
I na kratce weź większą tablicę. I zapisuj potem po kolei sobie w rządku koło pierwszego wiersza wspłłrzędne elementów, które liczyłes.
Koło drugiego wiersza współrzędne drugiego wiersza, które liczyłeś itd.
I potem szukaj zależności między numerem kolumny a numerem wiersza. I potem w forze ładnie tę zależność wyraź. Jak pisze Adf88, drugi for musi być uzależniony od licznika pierwszego fora. Pierwszy wyraża wiersze, drugi kolumny. Jesteś już całkiem blisko od rozwiązania :)

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