Napisz funkcję sumującą i-tą kolumnę i i-ty wiersz macierzy NxN

0

Napisz funkcję sumującą i-tą kolumnę i i-ty wiersz macierzy NxN
(N to stała), element i,i ma być sumowany tylko raz.
Wskaźnik do tablicy oraz numer wiersza i kolumny jako parametry funkcji

 
#include<stdio.h>
#include<cstdlib>

void suma2(int *tab,int kolumna,int wiersz)
{
int sumakolumny=0;
int sumawiersza=0;
int i=0;
int j=0;

    while(i<kolumna)
    {
     while(j<wiersz)
     {
      if(tab[i][j]==tab[kolumna][j])
      {
     sumawiersza=sumawiersza+tab[i][j];
 
      
      //}
     j++;
     }
      if(i==kolumna)
      {
           sumakolumny=sumakolumny+tab[i][j];
      }
    i++;
    }
    printf("Suma wiersza %d wynosi:  %d",wiersz,sumawiersza);    
}
int main()
{
int macierz[3][4] = {
                      { 1, 4, 2, 6 },
                      { 2, 5, 3, 3 },
                      { 8, 7, 4, 6 } 
                      };

suma2(&macierz[0][0],1,2);
system("pause");
}

Nie bardzo mi to wychodzi mógłby ktoś pomóc?

0
  1. Źle przekazujesz tablicę do funkcji. Powinno być:
suma2(macierz,1,2) ;

A w deklaracji funkcji musisz podać wymiary tablicy oprócz pierwszego:

void suma2(int tab[][4],int kolumna,int wiersz)
  1. Brakuje Ci zamknięcia nawiasu klamrowego przy definicji funkcji.
0

Użyj:

  1. for zamiast while
  2. y/x zamiast i/j
  3. jakiegoś formatowania
    wszystko samo zadziała.
4

@Elles, ludzie tu są różni, ale:

a) @_13th_Dragon jest tutaj liderem w liczbie wypowiedzi, spędza tu sporo czasu pomagając innym i choćby dlatego ma prawo zwracać Ci uwagę

b) Twój program w ogóle nie jest na temat, z kilku powodów:

  • nie liczy jednej sumy
  • nie sumuje elementu a(i,i) tylko raz
  • za to sumuje całą tablicę (?)

Chciałeś się wykazać, ale Twój program nadaje się do kosza.

Edit:
Zwykle nie rozwiązuje zadań domowych, ale to specjalnie dla @Elles-a, żeby zobaczył gdzie miał źle:

http://ideone.com/iUq7fb

0

@vpiotr, wybacz ale da się jeszcze lepiej, piszę tylko fragment:

int suma(int a[][ARRAY_SIZE],size_t pos)
  {
   int sum=0;
   for(size_t i=0;i<ARRAY_SIZE;++i) sum+=a[i][pos]+a[pos][i];
   return sum-a[pos][pos];
  }

Ewentualnie w przypadku tablicy w konwencji od @Elles:

int suma(int *t,size_t rowCount,size_t columnCount,size_t pos)
  {
   int sum=-t[pos*(columnCount+1)];
   for(int *y=t+pos;rowCount--;y+=columnCount) sum+=*y;
   for(int *x=t+pos*columnCount;columnCount--;++x) sum+=*x;
   return sum;
  }
0
_13th_Dragon napisał(a):

@vpiotr, wybacz ale da się jeszcze lepiej, piszę tylko fragment:

int suma(int a[][ARRAY_SIZE],size_t pos)
  {
   int sum=0;
   for(size_t i=0;i<ARRAY_SIZE;++i) sum+=a[i][pos]+a[pos][i];
   return sum-a[pos][pos];
  }

Nie wybaczę :) (bo odpisuję)

"lepiej" to pojęcie względne.
Zależy od tego jakie są aktualne priorytety.

Dla mnie osobiście w tym wypadku, gdybym oceniał rozwiązanie jako nauczyciel, ważne byłyby:
a) zgodność z treścią zadania
b) czytelność kodu

Wydajność - nie.
Ale skoro już szukasz wydajniejszego rozwiązania to w podobny sposób, ale inaczej zapisałbym to tak:

int suma(int a[][ARRAY_SIZE],size_t pos)
{
   // nie dodawaj a[i][i] dwa razy
   int sum = -a[pos][pos]; 

   for(size_t i=0; i < ARRAY_SIZE; ++i) 
     sum += a[i][pos] + a[pos][i];

   return sum;
}

Rozwiązanie niewydajne, ale czytelne i poprawne jest wystarczające.
Zwykle też służy jako baza do zabaw w optymalizację, dlatego ma wartość edukacyjną.

Uwaga: jeśli ktoś chce dalej to optymalizować, to droga wolna, można np. wziąć pod uwagę linie adresowe w cache'u, loop unrolling itd.

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