[C] Funkcja wyliczajaca pewna sume macierzy


(niesuszek) #1

Witam. Mam za zadanie napisać program, który wczytuje macierz, każdy jej element podnosi do potęgi, liczy sumę elementów w poszczególnych wierszach, a na koniec sumę wszystkich wierszy.

Mój kod wygląda następująco:

#include 

#include 

#include 

#include 

#include 


void wczytajMacierz(int n, int tab[100][100])

{

	int i, j;


	for(i=0; i
		for(j=0; j
		{

			printf("Podaj element tab[%d][%d]: ", i, j);

			scanf("%d", &tab[i][j]);

		}

}


void wypiszMacierz(int n, int tab[100][100])

{

	int i, j;

	for(i=0; i
	{

		for(j=0; j
			printf("%4d", tab[i][j]);

		printf("\n");

	}

}


int sumka(int n, int tab[100][100])

{

	printf("Suma poszczegolnych wierszy:\n");

	int max=0;

	int i, j, sum, sum2=0;


	for(i=0; i
	{	

		sum=0;


		for(j=0;j
		{

			sum+=tab[i][j]*tab[i][j];

			sum2+=sum;

		}

		printf("%d\n", sum);

	}


	printf("Wynik: %d\n", sum2);


	return 0;

}


int main()

{

	int tab1[100][100];

	int n;

	printf("Podaj wielkosc macierzy: ");

	if(!(scanf("%d", &n)==1 && getchar()=='\n'))

		printf("Zle dane!!");

	printf("\n");


	wczytajMacierz(n, tab1);

	printf("\n");

	wypiszMacierz(n, tab1);

	printf("\n");

	sumka(n, tab1);



	getch();

	return 0;


}

Problem w tym, że nie mam pojęcia dlaczego funkcja niepoprawnie sumuje sumy wszystkich wierszy macierzy.

Byłbym bardzo wdzięczny za pomoc z tym problemem.


(kostek135) #2

Obie sumy zwiększasz co obrót wewnętrznej pętli. sum2 (wnioskuje, że to suma całościowa) powinno być na zewnątrz tej pętli. Wiersz dodaje się tylko raz, jak zsumuje się wszystkie elementy znajdujące się w nim.


(niesuszek) #3

Dzięki wielkie za pomoc.

Oto kod programu:

#include 

#include 

#include 

#include 

#include 


void wczytajMacierz(int n, int tab[100][100])

{

	int i, j;


	for(i=0; i
		for(j=0; j
		{

			printf("Podaj element tab[%d][%d]: ", i, j);

			scanf("%d", &tab[i][j]);

		}

}


void wypiszMacierz(int n, int tab[100][100])

{

	int i, j;

	for(i=0; i
	{

		for(j=0; j
			printf("%4d", tab[i][j]);

		printf("\n");

	}

}


int sumka(int n, int tab[100][100])

{

	printf("Suma poszczegolnych wierszy:\n");

	int max=0;

	int i, j, sum, sum2=0;


	for(i=0; i
	{	

		sum=0;


		for(j=0;j
			sum+=tab[i][j]*tab[i][j];

		sum2+=sum;

		printf("%d\n", sum);

	}


	printf("Wynik: %d\n", sum2);


	return 0;

}


int main()

{

	int tab1[100][100];

	int n;

	printf("Podaj wielkosc macierzy: ");

	if(!(scanf("%d", &n)==1 && getchar()=='\n'))

		printf("Zle dane!!");

	printf("\n");


	wczytajMacierz(n, tab1);

	printf("\n");

	wypiszMacierz(n, tab1);

	printf("\n");

	sumka(n, tab1);



	getch();

	return 0;


}

(system) #4

Akurat dzisiaj trochę się mi nudziło, więc może dla spojrzenia z innego kąta załączam kod :

#include 

#include 

#include 


const int r = 100;


void wczytaj_macierze(int n, int tab[r][r]){

	int i,j;

	printf("Podaj elementy : \n");

	for(i = 0; i < n; i++){

		for(j = 0; j < n; j++){

			printf("Podaj element [%d][%d] = ",i,j);

			scanf("%d",&tab[i][j]);

		}

	}

}


void wyswietl_macierze(int n, int tab[r][r]){

   printf("TABLICA : \n");

   int i, j;

   for(i=0; i
      for(j=0; j
         printf("%4d", tab[i][j]);

      printf("\n");

   }

}


int potega(int p, int w){

    int podst = p, i;

    for (i = 0; i < w - 1; i++)

        podst *= p;

    return podst;

}


void do_potegi_n_plus_suma_wszystkich_wierszy(int n,int p, int tab[r][r]){

   int i, j,suma = 0;

   for(i=0; i
      for(j=0; j
        suma += potega(tab[i][j], p);

   }

   printf("Suma wszystkich rekordow po podniesieniu do potegi %d wynosi : %d \n", p,suma);

}


void suma(int n, int rec, int tab[r][r]){

    int i = rec , j, suma = 0;

        for (j = 0; j < n; j++)

            suma += tab[i][j];

    printf("Suma z podanego rekordu wynosi : %d \n", suma);

}


int main(void){

	int tab[100][100];

	int n;

	printf("Podaj liczbe elementow : ");

	scanf("%d", &n);

	if (n <= 1){

		printf("Zle dane!");

		return 1;

	}

	printf("Jakiego rekordu chcesz z sumowac liczy : ");

	int rec;

	scanf("%d", &rec);

	if (rec > n || rec < 0){

        printf("Blad !");

        return 1;

	}

	printf("Do, ktorej potegi chcesz podniesc liczby w tablicy ? : ");

	int a;

	scanf("%d",&a);

	wczytaj_macierze(n,tab);

	wyswietl_macierze(n,tab);

	suma(n,rec,tab);

	do_potegi_n_plus_suma_wszystkich_wierszy(n,a,tab);

	getch();

	return 0;

}

(kostek135) #5
int potega(int p, int w){

    int podst = p, i;

    for (i = 0; i < w - 1; i++)

        podst *= p;

    return podst;

}

Można lepiej:

http://pl.wikipedia.org/wiki/Algorytm_s ... %99gowania