Sumowanie elementów nad i pod przekątną tablicy

0

Witam wszystkich,

Mam do wykonania następujące zadanie:

Proszę napisać algorytm, który dla tablicy dwuwymiarowej sprawdza czy minimalna wartość elementów tablicy nad główną przekątną jest równa maksymalnej wartości elementów pod główną przekątną. Jeśli warunek jest spełniony to wynikiem jest ta wartość. W przeciwnym wypadku wynikiem jest suma elementów z głównej przekątnej.

Np. dla tablicy o 4 wierszach i 4 kolumnach
1 5 1 1
2 3 3 2
2 2 2 2
4 3 5 2

wynikiem jest wartość 1+3+2+2 ponieważ minimum nad przekątną wynosi 1, a maksimum pod przekątną wynosi 5.

Stworzyłem już do tego zadania diagram:

http://www.filedropper.com/algorytm2

Gdy zacząłem sprawdzać poprawność, pojawiły się pewne wątpliwości. Powiedzmy, że macierz ma wymiary WxK = 3x3. Mówimy o macierzy kwadratowej, żeby była przekątna geometryczna.

  1. Ustawiam się na i = 1 i j = 1 (na przekątnej, górna lewa komórka)

  2. Pytam czy i <= W - tak

  3. j <= K - tak

  4. i = j - tak

  5. dodaj do suma

  6. zwiększ j o jeden

  7. j <= K - tak

  8. i = j - nie

  9. i > j - nie

  10. A [i, j] < min - nie

  11. Zwiększ j o jeden.

  12. j <= K - tak (jestem w trzeciej komórce macierzy)

  13. i = j - nie

  14. i > j - nie

  15. A [i, j] < min - nie

  16. Zwiększ j o jeden.

  17. j <= K - nie

  18. Zwiększ i o jeden.

  19. ...

I w tym momencie zwiększam i o jeden i zastanawiam się w której tak naprawdę ląduję komórce? i = 2, j =1 czy i = 2, j =3 ?

Bardzo proszę o pomoc.

0

Może zacznij pisać w jakimś konkretnym języku wtedy nie będzie problemów z takimi dziwolągami na 19 pkt:

if(size<2) return size?T[0][0]:0;
double sum=0,up=T[0][1],dn=T[1][0];
for(int y=0;y<size;++y) for(int x=0;x<size;++x) if(x<y) dn=min(dn,T[y][x]); else if(x>y) up=max(up,T[y][x]); else sum+=T[y][x];
return min!=max?sum:min;
0

Problem w tym, że nie znam żadnego języka. Jestem na pierwszym semestrze. Projekt zaliczeniowy ma zawierać pseudokod, gdzie po prostu opiszę własnymi słowami co się dzieje...

To co napisałeś jest w Pascalu?

Możesz odpowiedzieć czy jak zwiększam i o jeden, to w której tak naprawdę ląduję komórce? i = 2, j =1 czy i = 2, j =3 ?

0

Cześć. Napisałem coś takiego:

 

1.	var (SUMA=0; MAX=A[i2, j1]; MIN=A[i1, j2]

2.	for (i=1; i<W; i++)

   2.1.	 for (j=1; j<K; j++)

        2.1.1.	if (i=j) SUMA+
        2.1.2.	else if (i>j) 

             2.1.2.1.	 if (A[i,j]>MAX) A:=MAX
             2.1.2.2.	 else if (A[i,j]<MIN) A:=MIN

3.	if (MAX=MIN) return MIN
4.	else return SUMA	

Czy to jest poprawne i zrozumiałe? Tak, jak powiedziałem, nie piszę w żadnym konkretnym języku tylko w pseudokodzie. Tak zostało sformułowane zadanie.

Napiszę jak to rozumiem:

  1. Ustawiam zmienne.
  2. Ustawiam pętle for, która wykonuje się dopóki nie dojdę do końca macierzy.
    2.1. Ustawiam pętle for, która wykonuje się dopóki nie dojdę do końca macierzy.
    2.1.1. Jeśli współrzędne są takie same dodaję do zmiennej SUMA.
    2.1.2. W przeciwnym wypadku sprawdzam czy wpółrzędna i jest większa od j.
    2.1.2.1. Jeśli komórka jest większa od mojego MAX to ustawiam nowy MAX
    2.1.2.2. Jeśli komórka jest mniejsza od mojego MIN to ustawiam nowy MIN
  3. Po skończeniu pętli sprawdzam czy MIN=MAX. Jeśli tak zwracam MIN
  4. W przeciwnym wypadku zwracam SUMA.

Powiedzcie czy trzyma się to kupy :)

Dzieny :D

0
  1. Co to jest i1, i2, j1 oraz j2?
    2.1.1. Co oznacza wyrażenie SUMA+?
    Niezłą hybrydę stworzyłeś, część symboli jest z Pascala, duża część z C.
0

i - indeks wiersza
j - indeks kolumny

Chodziło mi o to, że na początku ustawiam zmienną MAX na komórkę A o indeksie [i2, j1], a MIN na komórkę A o indeksie [i1, j2].

SUMA+ - dodaj do wartości "na boku" o nazwie SUMA.

Hybryda, hybrydą, ale czy poprawna? :)

0

To nawet blisko z poprawnością nie leżało.

0

Dlaczego?

0

Bo zepsułeś algorytm zmianami.
Generalnie źle zrozumiałeś zadanie, trzeba na to zbudować algorytm a ty próbujesz wykombinować algorytm - rozumiesz różnicę?
Jeżeli już próbujesz coś zmieniać to zrozum algorytm po czym dopiero przerabiaj.

0

Przerabiam, bo nie rozumiem. Nie mogę przekopiować czegoś, czego nie rozumiem, bo wykładowca mnie spyta dlaczego tak, a ja nie będę potrafił odpowiedzieć. Co w mojej interpretacji jest nie tak?

0

Dragon, a możesz zapisać swój kod w punktach tak, żeby było widoczne co następuje po czym?

if(size<2) return size?T[0][0]:0; ---> Tutaj chodzi o rozmiar macierzy?

return min!=max?sum:min; ---> To jest moje
if (MAX=MIN) return MIN
else return SUMA

0

Mogę: - 25 zł.

0

Serio? Ile Ty masz lat?

0

Chcesz pomocy - świetnie dostaniesz ją jak tylko zadasz sensowne pytanie.
Chcesz odwalenia pracy za ciebie - też świetnie ale również płatne.
Zapamiętaj sobie: - głupota to najdroższa rzecz na świecie za nią się płaci wielokrotnie i przez całe życie, zastanów się dobrze czy cię na nią stać.

0

Nie rozumiem na jakiej podstawie twierdzisz, że jestem głupi. Przecież próbuję stworzyć własny "kod". Powiedziałeś, że jest niepoprawny. Zapytałem dlaczego, a ty od razu, że jestem głupi...

Próbuję poprawić to, co napisałem wcześniej:

1.    var (SUMA=0; MAX=A[i2, j1]; MIN=A[i1, j2] // ustawiam zmiennne. **Czy tu powinienem uwzględnić indeksy i i j?**
 
2.    for (i=1; i<=W; i++) // pętla zewnętrzna FOR, zmienna i=1, powinna się zakończyć, gdy i przekroczy wartość W. **Czy zapis i<=W jest odpowiedni?**
 
   2.1.     for (j=1; j<W; j++) // pętla wewnętrzna FOR, zmienna j=1, koniec pętli, gdy j osiągnie wartość W. **Czy zapis j<W jest odpowiedni?**
 
        2.1.1.    if (i=j) SUMA+ // jeśli i=j dodaj wartość do zmiennej "na boku" o nazwie SUMA **Tutaj nie wiem jak to zapisać. Za dużo tych ifów i else'ów**
        2.1.2.    else if (i>j) (A[i,j]>MAX) // jeśli (i!=j) sprawdź czy i>j
                    2.1.2.1 A:=MAX
        2.1.3.    else if (A[i,j]<MIN) 
                    2.1.2.1 A:=MIN
 
3.    if (MAX=MIN) return MIN 
4.    else return SUMA 
0
1. double sum=0,up=T[0][1],dn=T[1][0];
2. for(int y=0;y<size;++y) 
      2.1. for(int x=0;x<size;++x) 
            2.1.1. if(x<y) dn=min(dn,T[y][x]); 
            2.1.2. else if(x>y) up=max(up,T[y][x]); 
            2.1.3. else sum+=T[y][x];
3. return min!=max?sum:min;

Czy tak to będzie przebiegało u Ciebie?

0

Czy ktoś może potwierdzić poprawność powyższych zapisów?

0

Trudne pytanie. Moim zdaniem jest to poprawny opis algorytmu, ale czy taki opis zaaprobuje autor zadania, to nie wiem.

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