Działania na macierzach

0

Witam,mam problem z pewnym zadaniem,otóż mam napisać program który wykona podstawowe działania na macierzach zainicjalizowanych liczbami podanymi przez użytkownika.Przy kompilacji tego programu wyskakuje mi miliard błędów o brakujących średnikach,oraz o niezadeklarowanych zmiennych.Sprawdzałem kod wielokrotnie,ale nie potrafię dociec co jest przyczyną problemów.
Proszę o pomoc :)

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

int main()
{
    int w;
    do
     {
    printf("Wybierz rodzaj macierzy: 1.2x2,2.3x3");
      scanf("%d",&w);
    }while(w!=1 || w!=2);


    switch(w)
    {
    case 1:
        int z,t,w2;
        int m1[2][2];
        int m2[2][2];
      printf("Wypelnij tablice(podaj 4 liczby): ");
      int i;
      int j;
      for(i=0;i<2;i++)
      {
          for(j=0;j<2;j++)
          {
          scanf("%d",&z);
          m1[i][j]=z;
          }
      }
      int o;
      printf("Wypelnij 2 tablice(podaj 4 liczby): ");
      int m;
      int n;
      for(m=0;m<2;m++)
      {
          for(n=0;n<2;n++)
          {
          scanf("%d",&o);
          m2[m][n]=o;
          }
      }
      while(z!=1||z!=2||z!=3||z!=4)
      {
          printf("Wybierz dzialanie: 1.Dodawanie,2.Odejmowanie,3.Mnozenie,4.Odwrotnosc: ");
           scanf("d",&z);
      }
      switch(z)
      {
      case 1:
          int suma[2][2];
          int i1;
          int j1;
          for(i1=0;i1<2;i1++)
          {
              for(j1=0;j1<2;j1++)
              {
                  suma[i1][j1]=m1[i1][j1]+m2[i1][j1];
              }
          }
          printf("Suma macierzy wynosi: ");
          int h;
          int h1;
          for(h=0;h<2;h++)
          {
              for(h1=0;h1<2;h1++)
              {
                  printf("%d",suma[h][h1]);
              }
          }
        break;
      case 2:
           int roznica[2][2];
           int i2;
           int j2;
          for(i2=0;i2<2;i2++)
          {
              for(j2=0;j2<2;j2++)
              {
                  roznica[i2][j2]=m1[i2][j2]-m2[i2][j2];
              }
          }
          printf("Roznica macierzy wynosi: ");
          int h;
          int h1;
          for(h=0;h<2;h++)
          {
              for(h1=0;h1<2;h1++)
              {
                  printf("%d",roznica[h][h1]);
              }
          }
        break;
      case 3:

        break;
      case 4:
        break;
      default:
        break;
      }

        break;

    case 2:
        int m1[3][3];
        int m2[3][3];
        break;

    default:
      break;
    }



    return 0;
}
 
4
  1. Wydzielaj kod do funkcji.
  2. formatuj poprawnie kod (jak sam nie umiesz ⟶ http://format.krzaq.cc )
  3. "Wybierz rodzaj macierzy: 1.2x2,2.3x3" ⟵ mało czytelne dla użytkownika
  4. case nie tworzy nowego scope'a dla zmiennych. Chcesz w nim zadeklarować nowe? polecam {}.
  5. nie sprawdzasz wyniku scanf, więc możesz mieć UB jeśli sprawdzisz niezainicjalizowaną zmienną.
0

1.To jest tylko wersja testowa dla mnie(ogólny koncept programu chciałem przetestować),więc przejrzystość i optymalność na razie jest dla mnie sprawą drugorzędną :)
2.J.W.
3.J.W.
4.Czyli w case'ach zamiast : pisać {}?
5.Co to jest UB?

Dzięki za odpowiedź :)

2

1,2,3: oczekujesz pomocy. Nikt nie będzie się wgryzał w ohydny kod żeby szukać komuś błędów.

4: {} wprowadzają nowy scope

case 3: int x; // zle
case 4: { int x; } // lepiej
0

Ok,dzięki przetestuję.

0

Dodałem te case'y,nadal to samo:

 ||=== Build: Debug in macierze2 (compiler: Microsoft Visual C++ 2010) ===|
main.c|9|warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.|
main.c|18|error C2143: syntax error : missing ';' before 'type'|
main.c|19|error C2143: syntax error : missing ';' before 'type'|
main.c|20|error C2065: 'i' : undeclared identifier|
main.c|20|error C2065: 'i' : undeclared identifier|
main.c|20|error C2065: 'i' : undeclared identifier|
main.c|21|error C2065: 'j' : undeclared identifier|
main.c|21|error C2065: 'j' : undeclared identifier|
main.c|21|error C2065: 'j' : undeclared identifier|
main.c|23|error C2065: 'i' : undeclared identifier|
main.c|23|error C2065: 'j' : undeclared identifier|
main.c|26|error C2143: syntax error : missing ';' before 'type'|
main.c|28|error C2143: syntax error : missing ';' before 'type'|
main.c|29|error C2143: syntax error : missing ';' before 'type'|
main.c|30|error C2065: 'm' : undeclared identifier|
main.c|30|error C2065: 'm' : undeclared identifier|
main.c|30|error C2065: 'm' : undeclared identifier|
main.c|31|error C2065: 'n' : undeclared identifier|
main.c|31|error C2065: 'n' : undeclared identifier|
main.c|31|error C2065: 'n' : undeclared identifier|
main.c|32|error C2065: 'o' : undeclared identifier|
main.c|33|error C2065: 'm' : undeclared identifier|
main.c|33|error C2065: 'n' : undeclared identifier|
main.c|33|error C2065: 'o' : undeclared identifier|
main.c|52|error C2143: syntax error : missing ';' before 'type'|
main.c|53|error C2143: syntax error : missing ';' before 'type'|
main.c|54|error C2065: 'h' : undeclared identifier|
main.c|54|error C2065: 'h' : undeclared identifier|
main.c|54|error C2065: 'h' : undeclared identifier|
main.c|55|error C2065: 'h1' : undeclared identifier|
main.c|55|error C2065: 'h1' : undeclared identifier|
main.c|55|error C2065: 'h1' : undeclared identifier|
main.c|56|error C2065: 'h' : undeclared identifier|
main.c|56|error C2065: 'h1' : undeclared identifier|
main.c|71|error C2143: syntax error : missing ';' before 'type'|
main.c|72|error C2143: syntax error : missing ';' before 'type'|
main.c|73|error C2065: 'h' : undeclared identifier|
main.c|73|error C2065: 'h' : undeclared identifier|
main.c|73|error C2065: 'h' : undeclared identifier|
main.c|74|error C2065: 'h1' : undeclared identifier|
main.c|74|error C2065: 'h1' : undeclared identifier|
main.c|74|error C2065: 'h1' : undeclared identifier|
main.c|75|error C2065: 'h' : undeclared identifier|
main.c|75|error C2065: 'h1' : undeclared identifier|
main.c|91|error C2143: syntax error : missing ';' before 'type'|
main.c|92|error C2143: syntax error : missing ';' before 'type'|
||=== Build failed: 45 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

Sformatowany kod:

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

int main()
{
    int w;
    do {
        printf("Wybierz rodzaj macierzy: 1.2x2,2.3x3: ");
        scanf("%d", &w);
    } while (w != 1 || w != 2);

    switch (w) {
    case 1: {
        int z, t, w2;
        int m1[2][2];
        int m2[2][2];
        printf("Wypelnij tablice(podaj 4 liczby): ");
        int i;
        int j;
        for (i = 0; i < 2; i++) {
            for (j = 0; j < 2; j++) {
                scanf("%d", &z);
                m1[i][j] = z;
            }
        }
        int o;
        printf("Wypelnij 2 tablice(podaj 4 liczy): ");
        int m;
        int n;
        for (m = 0; m < 2; m++) {
            for (n = 0; n < 2; n++) {
                scanf("%d", &o);
                m2[m][n] = o;
            }
        }
        while (z != 1 || z != 2 || z != 3 || z != 4) {
            printf("Wybierz dzialanie: 1.Dodawanie,2.Odejmowanie,3.Mnozenie,4.Odwrotnosc: ");
            scanf("d", &z);
        }
        switch (z) {
        case 1: {

            int suma[2][2];
            int i1;
            int j1;
            for (i1 = 0; i1 < 2; i1++) {
                for (j1 = 0; j1 < 2; j1++) {
                    suma[i1][j1] = m1[i1][j1] + m2[i1][j1];
                }
            }
            printf("Suma macierzy wynosi: ");
            int h;
            int h1;
            for (h = 0; h < 2; h++) {
                for (h1 = 0; h1 < 2; h1++) {
                    printf("%d", suma[h][h1]);
                }
            }
        } break;
        case 2: {

            int roznica[2][2];
            int i2;
            int j2;
            for (i2 = 0; i2 < 2; i2++) {
                for (j2 = 0; j2 < 2; j2++) {
                    roznica[i2][j2] = m1[i2][j2] - m2[i2][j2];
                }
            }
            printf("Roznica macierzy wynosi: ");
            int h;
            int h1;
            for (h = 0; h < 2; h++) {
                for (h1 = 0; h1 < 2; h1++) {
                    printf("%d", roznica[h][h1]);
                }
            }
        } break;
        case 3:

            break;
        case 4:
            break;
        default:
            break;
        }

        break;
    }
    case 2:
        int m1[3][3];
        int m2[3][3];
        break;

    default:
        break;
    }

    return 0;
}
1
  1. Wydaje mi si ze nie do końca zrozumiałeś o co biega z tymi {} oraz case bo widzę nadal to samo.
  2. Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Jeżeli ci każą zrobić ten program dla dowolnego rozmiaru od 2 do 1000 to nadal będziesz się bawić w metodę Kopiego Pejsta?
  4. scanf("d",&z); to nie to samo co: scanf("%d",&z);
0

Wydaje mi si ze nie do końca zrozumiałeś o co biega z tymi {} oraz case bo widzę nadal to samo.
Zapoznaj się z inkrementacją, bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
Jeżeli ci każą zrobić ten program dla dowolnego rozmiaru od 2 do 1000 to nadal będziesz się bawić w metodę Kopiego Pejsta?
scanf("d",&z); to nie to samo co: scanf("%d",&z);

  1. Jeżeli nie ma być tak np.:
case 1:
{
  typ zmienna;
    jakas_instrukcja;
    jakas instrukcja;
 

itd.

To jak?

3.Mam to napisać tylko dla tablic 2x2 i 3x3.
4.Literówka

1

Ad 1. Właśnie tak ma być tylko że przy case 2: wciąż masz źle.
Ad 3. Rób maksymalnie uniwersalnie jak to tylko możliwe, aby nie naruszać zasady DRY

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