Suma z przekątnej tablica 2-wymiarowa

0

Witam

Robię tablicę dwuwymiarową wymiary 5x5, potrafię wyliczyć sumę lewego boku, prawego boku, dolnego, górnego, ale przekątne mi w ogóle nie wychodzą, wychodzi mi jedna przekątna (i==j), ale ja nie chce na if'ach, jak to zrobić nie na if'ach ? Przeszukałem fora i wszędzie na tym if'ie jest :/

Chce zrobić takie przekątne : jak ?

http://img215.imageshack.us/img215/9859/prz2.png

http://img836.imageshack.us/img836/4676/prz1.png

Tu kawałek kodu do eksperymentowania :

//Suma przekatnej !  

        for(i=0;i<5;i++) {                
         for(j=0;j<5;j++) 
         sumprz=sumprz+tab[i][j];
         }    

POMÓŻCIE :)

1

user image

for(i=0;i<5;i++)
 sumprz=sumprz+tab[i][i];

user image

for(i=0;i<5;i++)
 sumprz=sumprz+tab[5-i][i];

Np.tak bez if'a.
Powinno działać.

0

Nie da się

0

a pod przekątna i nad przekątna ? :)

0

Jeżeli chodzi Ci o to,
user image
to dokładnie tak samo, jak pozazał Ci wcześniej kolega.

inline int abs(int a)
{
    return a < 0 ? -a : a;
}

if(nad_lub_pod > 0)
     for(int i = 0; i < ROZMIAR - abs(nad_lub_pod); ++i)
    sumaprz += tab[i][i + nad_lub_pod];
else
     for(int i = 0; i < ROZMIAR - abs(nad_lub_pod); ++i)
    sumaprz += tab[i + abs(nad_lub_pod)][i];
0
        //Suma pod przekatna !
        for(i=0;i<4;i++) {            
         sumpp=sumpp+tab[i][i-1];
         } 

         //Suma nad przekatna !
        for(i=0;i<4;i++){              
         sumnp=sumnp+tab[i][i+1];
         }    

??

0

Mój kod robi to samo, tylko, nie jest wstawiany na sztywno.
nad_lub_pod to zmienna która jest typu int i może przyjmować wartości dodatnie i ujemne
ROZMIAR - to rozmiar tablicy, zakładam, że jest kwadratowa
funkcja abs zwraca wartość bezwzględną

jeżeli nad_lub_pod == -1
to wykona się twoja druga pętla

jeżeli nad_lub_pod == 1
to wykona się twoja pierwsza pętla

0

tylko czemu to moje

  //Suma pod przekatna !
        for(i=0;i<4;i++) {            
         pp=pp+tab[i][i-1];
         } 

         //Suma nad przekatna !
        for(i=0;i<4;i++){              
         np=np+tab[i][i+1];
         }       

nie działa ?

1

user image

dlatego, że wychodzisz poza zakres tablicy:
i = 0
tab[i][i - 1] = tab[0][-1] // czegoś takiego nie ma

dlatego jeżeli liczysz podprzekątną tak jak na zamieszczonym obrazku, musisz wartość dodawać do pierwszego argumentu tablicy, a nie odejmować od drugiego
for(int i = 0; i < 4; ++i)
pp = pp + tab[i + 1][i];

lub zastosuj mój wzór, który jest uniwersalny nawet jeśli chciałbyś policzyć podpodprzekątną lub nadnadprzekątną.

1

Jakby komuś było potrzebne :)

Nie patrzcie na optymalizację kodu, tylko oto chodzi, żeby wszystko było działające ;)

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

main(){
     int tab[5][5],i,j,sum,sumg,sumlb,sumprz,sumprze,max,min,sumd,sumpb;
     int tabs[10][10],x,y;
     int np,pp;
     float srednia;

     srand((int)time(NULL));

     sum=0;
     sumg=0;
     sumd=0;
     sumpb=0;
     sumlb=0;
     sumprz=0;
     sumprze=0;
     max=0;
     min=0;
     np=0;
     pp=0;

     // Tablica + Suma calej !     
     for(i=0;i<5;i++) {                
        for(j=0;j<5;j++){          
          tab[j][i]=rand()%5-2;
          printf("%3d",tab[j][i]);
          sum=sum+tab[j][i];
          }
          printf("\n");
          }

     //Suma gornej !     
      for(i=0;i<1;i++) {                
        for(j=0;j<5;j++)    
        sumg=sumg+tab[j][i];
        }

      //Suma dolnej !     
      for(i=4;i<5;i++)       
        for(j=0;j<5;j++){    
        sumd=sumd+tab[j][i];
        }   

     //Suma lewy bok !  
       for(i=0;i<5;i++) {                
        for(j=0;j<1;j++)    
        sumlb=sumlb+tab[j][i];
        } 

       //Suma prawy bok !  
       for(i=0;i<5;i++) {                
        for(j=4;j<5;j++)    
        sumpb=sumpb+tab[j][i];
        }     

       //Suma przekatnej !  
       for(i=0;i<5;i++) {                
        sumprz=sumprz+tab[i][i];
        }    

       //Suma drugiej przekatnej !  
       for(i=0;i<5;i++) {
       sumprze=sumprze+tab[i][4-i];
      }   

       //Max i min
       for(i=0;i<5;i++) {                
        for(j=0;j<5;j++) 

        if (tab[j][i]>max)
         max=tab[j][i]; else
        if (tab[j][i]<min) 
         min=tab[j][i];  
        }

      //Suma pod przekatna !
        for(i=0;i<4;i++) {            
         pp=pp+tab[i][i+1];
         } 

         //Suma nad przekatna !
        for(i=0;i<4;i++){              
         np=np+tab[i+1][i];
         }       

     // Srednia calej !
     srednia=float(sum)/25;

     printf("\nSuma calej tablicy to: %d\n",sum);    
     printf("Srednia calej tablicy to: %2.2f\n\n",srednia);

     printf("Suma gory to: %d\n",sumg);
     printf("Suma dolu to: %d\n",sumd);
     printf("Suma prawego boku to: %d\n",sumpb);
     printf("Suma lewego boku to: %d\n\n",sumlb);

     printf("Suma przekatnej: %d\n",sumprz);
     printf("Suma drugiej przekatnej: %d\n",sumprze);
     printf("Suma nad przekatna %d\n",np);
     printf("Suma pod przekatna %d\n\n",pp);

     printf("Max tablicy: %d\n",max);
     printf("Min tablicy: %d\n\n",min);

       //Tabliczka mnozenia

      for(x=1;x<11;x++) {                
        for(y=1;y<11;y++){
          tabs[x][y]=x*y;             
          printf("%4d",tabs[x][y]);
          } 
          printf("\n");
          }

     getchar();
     getchar();    

     }

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