Poblem z funkcją (nie wyświetla wyniku)

0

No więc tak mam napisać programik wykonujący działania na macierzach 2x2 i 3x3 w języku C( w zależności co sobie wybierze użytkownik) niby nie ma nic trudnego a jednak... . W mojej konwencji program miał by wypełniać tablice(macierze) w osobnych funkcjach (ze względu na objętość kodu) i na podanych macierzach wykonywać działania, również zdefiniowane jako osobne funkcje. Tyle tytułem wstępu a problem jest następujący a mianowicie funkcja DODAJ nie (działa, działa ale nie wyświetla wartości) nie wiem sami ocenicie i pdpowiedzcie co jest nie tak :P.Poniżej kod (PÓKI CO JEST TYLKO DODWANIE 2x2(nie działające..) reszta kodu to szablon).

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

int WTNR1(int x, int y) //wypełnianie pierwszej tablicy
{
	int A[x][y];
 	int i,j;

    //czytamy pierwszą tablice
    for(i=0;i<x;i++)
	{
     for(j=0;j<y;j++)
     {
	 printf("PODAJ ELEMENT MACIERZY A O INDEKSACH [%d][%d]",i,j);
     scanf("%d",&A[i][j]); //wczytanie pierwszej macierzy
     }
    }
 printf("ZAWARTOSC MACIERZY A:\n");
     for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
      printf("%d",A[i][j]);
      printf("\n");
    }

	return A[x][y];
}
int WTNR2(int x, int y) //wypełnianie 2 tablicy
{
	int B[x][y];
 	int i,j;

    //czytamy druga tablice
    for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
	 {
     printf("PODAJ ELEMENT MACIERZY B O INDEKSACH [%d][%d]",i,j);
     scanf("%d",&B[i][j]); //wczytanie drugiej macierzy
     }
    }
    printf("ZAWARTOSC MACIERZY B:\n");
     for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
      printf("%d",B[i][j]);
      printf("\n");
    }

    return B[x][y];
}
int DODAJ (int A, int B)
{
int x,y=2;
int W[x][y];
int i, j;
 for(i = 0; i <x; i++)
 {
   for(j = 0; j <y; j++)
   {
    W[i][j] = A + B;
    printf("%d",W[i][j]);
      printf("\n");
   }
 }
    //wyswietlamy wynik
for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
     {
      printf("%d",W[i][j]);
      printf("\n");
     }
    }
return W[x][y];
}



int main()
{
    int menu_pom, podmenu,x,y,i,j;



        printf("MENU\n");
        printf("1-MACIERZE 2x2\n");
        printf("2-MACIERZE 3x3\n");
        printf("3-WYJSCIE\n");
        scanf("%d",&menu_pom);

        if(menu_pom == 1)
            {
            	x = 2;
            	y = 2;
                printf("1-DODAWANIE MACIERZY 2x2 (A+B)\n");
                printf("2-ODEJMOWANIE MACIERZY 2x2 (A-B)\n");
                printf("3-MNOZENIENIE MACIERZY 2x2 (A*B)\n");
                printf("4-ODWROTNOŚĆ MACIERZY 2x2 (A^-1)\n");
                printf("5-POWROT DO MENU GŁOWNEGO\n");
                scanf("%d",&podmenu);
                switch (podmenu)
                {
                	case 1:
                		{
						  printf("DODAWANIE MACIERZY 2x2 (A+B)\n");
        				   WTNR1 (x,y);
						   WTNR2 (x,y);
						   printf("MACIERZ WYNIKOWA=\n");
						   DODAJ;



						}
					break;

					case 2:
						{

						}
					break;

					case 3:
						{

						}
					break;

					case 4:
						{

						}
					break;

					case 5:
						{

						}
					break;
					default :
					break;
				}

            }
        else if (menu_pom == 2)
            {
            	x == 3;
            	y == 3;
                printf("1-DODAWANIE MACIERZY 3x3 (A+B)\n");
                printf("2-ODEJMOWANIE MACIERZY 3x3 (A-B)\n");
                printf("3-MNOZENIENIE MACIERZY 3x3 (A*B)\n");
                printf("4-ODWROTNOSC MACIERZY 3x3 (A^-1)\n");
                printf("5-POWROT DO MENU GŁÓWNEGO\n");
                scanf("%d",&podmenu);
                switch (podmenu)
                {
                	case 1:
                		{

						}
					break;

					case 2:
						{

						}
					break;

					case 3:
						{

						}
					break;

					case 4:
						{

						}
					break;

					case 5:
						{

						}
					break;
					default :
					break;
				}
            }


        else if(menu_pom == 3)
            {
                printf ("KONIEC\n");
            }
        else
            {
                printf("ZLA OPCJA! WYBIERZ OPCJE Z MENU!");
            }




    return 0;
}
0

Spróbuj:

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

int WTNR1(int x, int y) //wypełnianie pierwszej tablicy
{
    int A[x][y];
     int i,j;

    //czytamy pierwszą tablice
    for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
     {
     printf("PODAJ ELEMENT MACIERZY A O INDEKSACH [%d][%d]",i,j);
     scanf("%d",&A[i][j]); //wczytanie pierwszej macierzy
     }
    }
 printf("ZAWARTOSC MACIERZY A:\n");
     for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
      printf("%d",A[i][j]);
      printf("\n");
    }

    return A[x][y];
}
int WTNR2(int x, int y) //wypełnianie 2 tablicy
{
    int B[x][y];
     int i,j;

    //czytamy druga tablice
    for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
     {
     printf("PODAJ ELEMENT MACIERZY B O INDEKSACH [%d][%d]",i,j);
     scanf("%d",&B[i][j]); //wczytanie drugiej macierzy
     }
    }
    printf("ZAWARTOSC MACIERZY B:\n");
     for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
      printf("%d",B[i][j]);
      printf("\n");
    }

    return B[x][y];
}
int DODAJ (int A, int B)
{
int x,y=2;
int W[x][y];
int i, j;
 for(i = 0; i <x; i++)
 {
   for(j = 0; j <y; j++)
   {
    W[i][j] = A + B;
    printf("%d",W[i][j]);
      printf("\n");
   }
 }
    //wyswietlamy wynik
for(i=0;i<x;i++)
    {
     for(j=0;j<y;j++)
     {
      printf("%d",W[i][j]);
      printf("\n");
     }
    }
return W[x][y];
}



int main()
{
    int menu_pom, podmenu,x,y,i,j;



        printf("MENU\n");
        printf("1-MACIERZE 2x2\n");
        printf("2-MACIERZE 3x3\n");
        printf("3-WYJSCIE\n");
        scanf("%d",&menu_pom);

        if(menu_pom == 1)
            {
                x = 2;
                y = 2;
                printf("1-DODAWANIE MACIERZY 2x2 (A+B)\n");
                printf("2-ODEJMOWANIE MACIERZY 2x2 (A-B)\n");
                printf("3-MNOZENIENIE MACIERZY 2x2 (A*B)\n");
                printf("4-ODWROTNOŚĆ MACIERZY 2x2 (A^-1)\n");
                printf("5-POWROT DO MENU GŁOWNEGO\n");
                scanf("%d",&podmenu);
                switch (podmenu)
                {
                    case 1:
                        {
                          printf("DODAWANIE MACIERZY 2x2 (A+B)\n");
                           WTNR1 (x,y);
                           WTNR2 (x,y);
                           printf("MACIERZ WYNIKOWA=\n");
                           DODAJ(x,y);



                        }
                    break;

                    case 2:
                        {

                        }
                    break;

                    case 3:
                        {

                        }
                    break;

                    case 4:
                        {

                        }
                    break;

                    case 5:
                        {

                        }
                    break;
                    default :
                    break;
                }

            }
        else if (menu_pom == 2)
            {
                x == 3;
                y == 3;
                printf("1-DODAWANIE MACIERZY 3x3 (A+B)\n");
                printf("2-ODEJMOWANIE MACIERZY 3x3 (A-B)\n");
                printf("3-MNOZENIENIE MACIERZY 3x3 (A*B)\n");
                printf("4-ODWROTNOSC MACIERZY 3x3 (A^-1)\n");
                printf("5-POWROT DO MENU GŁÓWNEGO\n");
                scanf("%d",&podmenu);
                switch (podmenu)
                {
                    case 1:
                        {

                        }
                    break;

                    case 2:
                        {

                        }
                    break;

                    case 3:
                        {

                        }
                    break;

                    case 4:
                        {

                        }
                    break;

                    case 5:
                        {

                        }
                    break;
                    default :
                    break;
                }
            }


        else if(menu_pom == 3)
            {
                printf ("KONIEC\n");
            }
        else
            {
                printf("ZLA OPCJA! WYBIERZ OPCJE Z MENU!");
            }




    return 0;
}
4
  1. tragiczne formatowanie kodu, jak sam nie umiesz ⟶ http://format.krzaq.cc
  2. łamiesz SRP. Funkcja odpowiedzialna za dodawanie nie powinna nic wyświetlać, tylko dodawać.
  3. Funkcja DODAJ jest zadeklarowana jako przyjmująca dwie liczby i zwracająca liczbę. Można to bronić, że liczba to macierz 1x1, ale to dość słabe.
  4. W kodzie pełno masz UB (użycie niezainicjalizowanych zmiennych, wychodzenie poza zakres tablicy)
  5. DODAJ; co ty tutaj robisz?
  6. Dlaczego masz dwie funkcje odpowiedzialne za wypełnianie macierzy? Jak będziesz miał wypełnić tysiąc to napiszesz tysiąc funkcji?
1

Wiesz, że w funkcji DODAJ dodajesz 2 zmienne, a nie tablice?

0

No oki to wytłumaczy ktoś jak to poprawić ? :)

1

Wróć do kursu.

Gdybym ja miał działać na macierzach w C to bym zaczął od zdefiniowania sobie struktury opisującej macierz dowolnego rozmiaru (wskaźnik na dane, wymiary).

1
typedef struct { size_t rows,cols; double *data; } Matrix;

Matrix MatrixAlloc(size_t rows,size_t cols)
  {
   Matrix ret={rows,cols,malloc(rows*cols*sizeof(double))};
   return ret;
  }

void MatrixFree(Matrix m) { free(m.data); }
double *MatrixAt(Matrix m,size_t y,size_t x) { return m.data+y*m.cols+x; }
double MatrixGet(Matrix m,size_t y,size_t x) { return *MatrixAt(m,y,x); }
void MatrixSet(Matrix m,size_t y,size_t x,double value) { *MatrixAt(m,y,x)=value; }

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