Błąd przy dodawaniu wszystkich wartości tablicy dwuwymiarowej do zmiennej


(A Lis1970) #1

Pisze program w języku c(kompilator MinGW )mający za zadanie wypisać średnie wartości wierszy tablicy dwuwymiarowej wypełnionej przez użytkownika

#include <stdio.h>
#define WIERSZE 3
#define KOLUMNY 5

void srednia_poj(double (*wsk)[5]);
void pobierz(double tab[]);

int main(void)
{
	double liczby[WIERSZE][KOLUMNY]; // Tablica dwuwymiarowa
	int j; // Licznik w pętli
	
	printf("Podaj trzy zbiory po 5 liczb:"); 
	printf("\n\nWpisz pierwszy zbior:"); // Pętal pobierająca 
	for(j = 0; j < KOLUMNY; j++) // pięć pierwszych liczb 
		scanf("%lf", &liczby[0][j]);     
	printf("\nPodaj drugi zbior:"); // Pobranie kolejnego
	for(j = 0;j < KOLUMNY; j++) // zbioru
		scanf("%lf", &liczby[1][j]);     
	printf("\nPodaj ostatni zbior:"); // Pobrannie ostatnigo zbioru
	for(j = 0; j < KOLUMNY; j++)
		scanf("%lf", &liczby[2][j]);
	
	for(j = 0; j<WIERSZE; j++) // Wyświetlenie tablicy
	for(int i = 0; i<KOLUMNY; i++) //
	printf(" %lf ", liczby[j][i] ); //
        
        printf("%\n%p\n", liczby); //Wskaźnik przydał się podczas
	srednia_poj(liczby); //debugowania(nic nie dało)
	
	return 0;
}



void srednia_poj(double tab[][KOLUMNY])
{
	double suma = 0;
	double srednia;
	int wiersz = 1;
	
	for(int i = 0; i < WIERSZE; i++, wiersz++)
	{
		for(int j = 0, suma = 0; j < KOLUMNY; j++)
		{
			suma += tab[i][j]; // Dodanie wsystkich wartości do zminnej
			printf("\ni :%d j: %d suma: %lf", i , j,(double)suma); //Wyświetlenie wartości zmiennych
		}
		srednia = suma / (double)KOLUMNY;
		printf("\nSrednia wiersza %d wynosi %lf: \n", wiersz, srednia);
	}
	for(int j = 0; j<WIERSZE; j++) // Wy
	for(int i = 0; i<KOLUMNY; i++)
	printf(" %lf ", tab[j][i] );
}

Program przy wyświetlaniu tablicy wyświetla same zera, suma też jest równa zero, średnia również. Według gdb tablica jest wypełniona danymi podanymi przez użytkownika i funkcja otrzymuje poprawny wskaźnik.


(Fizyda) #2

Błąd pierwszy:

for(int i = 0; i < WIERSZE; i++, wiersz++)

Błąd drugi:

printf("\ni :%d j: %d suma: %lf", i , j,(double)suma);

po co rzutujesz double do double?

Błąd trzeci:

srednia = suma / (double)KOLUMNY;

po co rzutujesz do double? jak dzielisz double przez int wynik jest double.

Czwarty błąd:

for(int j = 0; j<WIERSZE; j++) // Wy
	for(int i = 0; i<KOLUMNY; i++)
	printf(" %lf ", tab[j][i] );

zamieniłeś nazwy zmiennych, wcześniej miałeś i/j, aż się prosi o pomyłkę w nazwach zmiennych przy wyświetlaniu. Poza tym jak raz ustalasz że i to wiersze to się tego trzymaj, a nie co chwila zmieniaj zdanie bo to negatywnie wpływa na czytelność kodu.

EDIT:

Błąd piąty:

void srednia_poj(double (*wsk)[5]);

void srednia_poj(double tab[][KOLUMNY])
{
}

Inna definicja funkcji od jej deklaracji - masz 2 różne funkcje, jedna jeszcze niezadeklarowana a druga zdefiniowana i zadeklarowana za późno. Wywołanie funkcji o tej nazwie w funkcji main, nie wywołuje żadnego kodu, dlatego pewnie nic nie jest zwracane. Dziwie się że program nie sypnął jakimś błędem.


(A Lis1970) #3

Zedytowałem ten kod i teraz wygląda tak:

#include <stdio.h>
#define WIERSZE 3
#define KOLUMNY 5

void srednia_poj(double tab[][KOLUMNY]);

int main(void)
{
	double liczby[WIERSZE][KOLUMNY]; // Tablica dwuwymiarowa
	int j; // Licznik w pętli
	
	printf("Podaj trzy zbiory po 5 liczb:"); 
	printf("\n\nWpisz pierwszy zbior:"); // Pętal pobierająca 
	for(j = 0; j < KOLUMNY; j++) // pięć pierwszych liczb 
		scanf("%lf", &liczby[0][j]);     
	printf("\nPodaj drugi zbior:"); // Pobranie kolejnego
	for(j = 0;j < KOLUMNY; j++) // zbioru
		scanf("%lf", &liczby[1][j]);     
	printf("\nPodaj ostatni zbior:"); // Pobrannie ostatnigo zbioru
	for(j = 0; j < KOLUMNY; j++)
		scanf("%lf", &liczby[2][j]);
	
	for(int i = 0; j<WIERSZE; j++) // Wyświetlenie tablicy
	for(j = 0; i<KOLUMNY; i++) //
	printf(" %lf ", liczby[i][j] ); //
        
        printf("%\n%p\n", liczby); //Wskaźnik przydał się podczas
	srednia_poj(liczby); //debugowania(nic nie dało)
	
	return 0;
}



void srednia_poj(double tab[][KOLUMNY])
{
	double suma = 0;
	double srednia;
	int wiersz = 1;
	
	for(int i = 0; i < WIERSZE; i++, wiersz++)
	{
		for(int j = 0, suma = 0; j < KOLUMNY; j++)
		{
			suma += tab[i][j]; // Dodanie wsystkich wartości do zminnej
			printf("\ni :%d j: %d suma: %lf", i , j,suma); // Wyświetlenie wartości zmiennych
		}
		srednia = suma / KOLUMNY;
		printf("\nSrednia wiersza %d wynosi %lf: \n", wiersz, srednia);
	}
	for(int j = 0; j<WIERSZE; j++) // Wy
	for(int i = 0; i<KOLUMNY; i++)
	printf(" %lf ", tab[j][i] );
}

Ale nie zedytowałem błędu pierwszego, bo nie wiem o co chodzi( zmienna wiersze służy do numeracji w funkcji printf())


(Rolek0) #4

%lf to niestandardowy format dla long double (standardowy to %Lf)

Natomiast format dla double to %f

http://www.cplusplus.com/reference/cstdio/printf/


(Fizyda) #5

Błąd pierwszy polega na tym że masz 2 zmienne które inkrementujesz w pętli. Wystarczy ci zmienna i, a gdy chcesz wyświetlić numer wiersza robisz i+1 i to wszystko.


(A Lis1970) #6

 

Po zedytowaniu wszystkich błędów w instrukcjach printf() program nadal nie działa, ale dostaje według mnie dziwny wynik działania programu przy podanych samych dwójkach:

Podaj trzy zbiory po 5 liczb:

 

Wpisz pierwszy zbior:2 2 2 2 2

 

Podaj drugi zbior:2 2 2 2 2

 

Podaj ostatni zbior:2 2 2 2 2

 

i :0  j: 0  suma:  0.000000


(kostek135) #7

Nie chce mi się analizować twojego kodu, bo dłużej się zejdzie niż napisanie go poprawnie:


(A Lis1970) #8

Dziękuje za ten kod, wszystko od razu inaczej wygląda. Teraz spróbuje dopisać do niego kilka potrzebnych mi funkcji