[C] Sumowanie po przekątnej

lubiejapka
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 8 lut 2014, o 18:05
Płeć: Mężczyzna
Lokalizacja: pkow
Podziękował: 13 razy

[C] Sumowanie po przekątnej

Post autor: lubiejapka »

Witam,
Proszę o pomoc z wyznaczeniem przekątnych.
Program pyta użytkownika jakiej wielkości mają być tablice, później pyta o punkt przecięcia się przekątnych. Następnie ma wyznaczyć przekątne tak jak na rysunku. Jedną przekątną udało mi się wyznaczyć, ale nie mam pojęcia jak wyznaczyć drugą.

Tutaj mój kod:

Kod: Zaznacz cały

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

void losuj(int tab[10][10],int m, int n)
{
	int i,j;
    srand(time(NULL));
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
			tab[i][j]=rand() % 10 + 1;
}
void wyswietl(int tab[10][10],int m, int n)
{
    int i,j;
	for(i=0;i<m;i++)
		for(j=0;j<n;j++)
	printf("
Tab[%d][%d]=%d",i,j,tab[i][j]);
}	

int main(int argc, char *argv[])
{
	int tab[10][10],m,n,i,j,x,y,suma=0;
	do{
	printf("Podaj rozmiar m: ");
	scanf("%d",&m);
	printf("Podaj rozmiar n: ");
	scanf("%d",&n);
	}while(n>10 || m>10 );

	losuj(tab,m,n);
    wyswietl(tab,m,n);

	printf("

Podaj wspolrzedne x: ");
	scanf("%d",&x);
	printf("Podaj wspolrzedne y: ");
	scanf("%d",&y);
	
	//suma
    for(i=0;i<m;i++)
	for(j=0;j<n;j++){
    if(x+i==y+j){
    printf("
TAB[%d][%d],",i,j);
    suma+=tab[i][j];
}}
	printf("

");
	getch();
	return 0;
}

Pozdrawiam
Awatar użytkownika
kropka+
Użytkownik
Użytkownik
Posty: 4389
Rejestracja: 16 wrz 2010, o 14:54
Płeć: Kobieta
Lokalizacja: Łódź
Podziękował: 1 raz
Pomógł: 787 razy

[C] Sumowanie po przekątnej

Post autor: kropka+ »

Co oznacza warunek w sumie

Kod: Zaznacz cały

if(x+i==y+j)
- bo jakoś nie widzę związku z przekątną?
lubiejapka
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 8 lut 2014, o 18:05
Płeć: Mężczyzna
Lokalizacja: pkow
Podziękował: 13 razy

[C] Sumowanie po przekątnej

Post autor: lubiejapka »

Jeśli dodamy/odejmiemy do punktu (x,y) po 1 to wyjdzie nam przekątna.
Awatar użytkownika
kropka+
Użytkownik
Użytkownik
Posty: 4389
Rejestracja: 16 wrz 2010, o 14:54
Płeć: Kobieta
Lokalizacja: Łódź
Podziękował: 1 raz
Pomógł: 787 razy

[C] Sumowanie po przekątnej

Post autor: kropka+ »

Tu akurat jest dodawanie, ale dlaczego lewa równa się prawej?
Poza tym z tym dodawaniem wychodzisz poza rozmiar tablicy. Przez dodawanie dostajesz tylko dolną część jednej z przekątnych.
lubiejapka
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 8 lut 2014, o 18:05
Płeć: Mężczyzna
Lokalizacja: pkow
Podziękował: 13 razy

[C] Sumowanie po przekątnej

Post autor: lubiejapka »

Dla przekątnych lewo w skos spełniona jest równość m-n == x-y, a dla przekątnej prawo skos
równość m+n == x+y. Lecz nie wiem jak to zapisać w warunku.
Awatar użytkownika
kropka+
Użytkownik
Użytkownik
Posty: 4389
Rejestracja: 16 wrz 2010, o 14:54
Płeć: Kobieta
Lokalizacja: Łódź
Podziękował: 1 raz
Pomógł: 787 razy

[C] Sumowanie po przekątnej

Post autor: kropka+ »

Po prostu zamiast jednego if masz dwa. W jednym warunek to

Kod: Zaznacz cały

i+j==x+y
a w drugim

Kod: Zaznacz cały

i-j==x-y
. Po wyjściu z pętli musisz od sumy odjąć element \(\displaystyle{ tab[x][y]}\), bo został dodany do sumy dwukrotnie.
Gouranga
Użytkownik
Użytkownik
Posty: 1594
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 247 razy

[C] Sumowanie po przekątnej

Post autor: Gouranga »

ja bym to zrobił na while, jak masz ten punkt x,y i zakres tablicy do m i n to można tak:

Kod: Zaznacz cały

int suma = tab[x][y];
int a=x-1,b=y-1;
while (a >= 0 && b >= 0){ //dopóki nie wyjdziesz poza tablice
    suma += tab[a--][b--];
}
int a=x-1,b=y+1;
while (a >= 0 && b < n){ //dopóki nie wyjdziesz poza tablice
    suma += tab[a--][b++];
}
int a=x+1,b=y-1;
while (a < m && b >= 0){ //dopóki nie wyjdziesz poza tablice
    suma += tab[a++][b--];
}
int a=x+1,b=y+1;
while (a < m && b < n){ //dopóki nie wyjdziesz poza tablice
    suma += tab[a++][b++];
}
ODPOWIEDZ