Operacie s maticami – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Operacie s maticami – C / C++ – Fórum – Programujte.comOperacie s maticami – C / C++ – Fórum – Programujte.com

 

11. 12. 2012   #1
-
0
-

Potreboval by som to pomoct skompilovat aby mi to islo a pripadne ci mam dobre spravenie nasobenie matic dakujem.

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


void scitanie(int *ma,int *mb, int *mc, int r,int s) //Funkcia pre scitanie
{
    int g,j,z=0;                                       //Deklaracie premennych pre cykly + nulovanie premenej "z"
    for(g=0;g<r;g++)                                   //Cyklus bude pracovat kym i<r a j<s
    {                                                  //"r"-pocet riadkov, "s"- pocet stlpcov
        for(j=0;j<s;j++)
        {
        *(mc+z)=*(mb+z)+*(ma+z);                      //vypocet,ktory funkcia vykona
        z++;                                          //zvysovanie premennej "z" o 1
        }
    }
}
void odcitanie(int *ma,int *mb, int *mc, int r, int s) // Funkcia pre odcitanie
{
    int g,j,z=0;
      for(g=0;g<r;g++)
    {
        for(j=0;j<s;j++)
        {
        *(mc+z)=*(ma+z)-*(mb+z);                      //vypocet,ktory funkcia vykona
        z++;                                          //zvysovanie premennu "z" o 1
        }
     }


void nasob(int *ma,int *mb, int *mc, int r, int s)
{
   int i,j,g,k,m,n,x;

   for (g=0; g<m+1;g++)
      for (j=0; j<n+1; j++)
         *mc = 0;

   for (i=0; i<m; i++)
      for (j=0; j<x; j++)
         for (k=0; k<x; k++)
            *mc+=*ma * *mb;

   printf("Sucin matic m.1 a m.2 je v matici m.3\n");

          printf ("\n");

}
int main()
{
int g,j;                                              //Deklaracia premennych pre cykly
int m,n;
int y,x;                                             //Deklaracia premennych pre pocet riadkov a stlpcov
int moznost;                                         //deklaracia premennej pri funkcii switch


FILE *subor;                                         //deklaracia suboru

subor=fopen("vypis.txt","w");                        //otvorenie suboru s parametrom write

printf("\nToto je program na scitovanie a odcitovanie dvoch matic.\n"); //vypis na obbrazovku
printf("\n\n Matica A a matica B sa zapisu do suboru vypis.TXT)");
printf("\n\n Zadajte pocet riadkov v matici A = ");
scanf("%d",&m);                                                         //zadavanie rozmeru matice z klavesnice
printf("\n Zadajte pocet stlpcov v matici A = ");
scanf("%d",&n);
printf("\n Zadajte pocet riadkov v matici B  = ");
scanf("%d",&y);
printf("\n Zadajte pocet stlpcov v matici B  = ");
scanf("%d",&x);

printf("\n Zadajte cisla matice A :\n");
int a[m][n],b[y][x];                                                    //Deklaracia matic so zadanymi rozmermi
for (g=1;g<m+1;g++)                                                     //cyklus pre plnenie matice
{
    for (j=1;j<n+1;j++)                                                 //cyklus pre plnenie matice
    {
    printf("\n Matica A: [%d,%d] = ",g,j);                              //vypis na obbrazovku suradnice prvkov matice A
    scanf("%d",&a[g][j]);                                               //cita cisla z klavesnice

    }
}
printf("\n\n");                                                        //vypis na obbrazovku
printf("\n Zadajte cisla matice B: \n");                               //vypis na obbrazovku
for (g=1;g<y+1;g++)                                                    //cyklus pre plnenie matice
{
    for (j=1;j<x+1;j++)                                                //cyklus pre plnenie matice
    {
    printf("\n Matica B: [%d,%d] = ",g,j);                             //vypis na obrazovku suradnice prvku pola
    scanf("%d",&b[g][j]);                                              //citanie z klaves. cislo prvku pola
    }
}
printf("\n Matica A = \n\n");                                          //vypis na obrazovku
fprintf(subor,"\n Matica A = \n\n");                                   //vypis do suboru
for (g=1;g<m;g++)                                                    //cykly pre vypis vybranych cisel na obrazovku
{
    for (j=1;j<n;j++)
    {
    printf("   [%d]",a[g][j]);                                         //vypise zvolene cisla
    fprintf(subor,"   [%d]",a[g][j]);                                  //vypise do suboru zvolene cisla
    }
    printf("\n");                                                      //vynecha riadok
    fprintf(subor,"\n");                                               //vynecha riadok
}

printf("\n Matica B = \n\n");                                          //obdobne ako pri matici A
fprintf(subor,"\n Matica B = \n\n");                                   //Vypis zvolenych prvkov
for (g=1;g<y;g++)
{
    for (j=1;j<x;j++)
    {
    printf("   [%d]",b[g][j]);
    fprintf(subor,"   [%d]",b[g][j]);
    }
    printf("\n");
    fprintf(subor,"\n");
}
printf("\n Prosim vyberte si matematicku operaciu\n\n");           //vypis na obrazovku
printf("\n***...citanie matic...*** [1]\n");                       //vypis na obrazovku
printf("\n***...odcitanie matic...*** [2]\n");                     //vypis na obrazovku
scanf("%d",&moznost);                                              //nacitanie cisla
switch(moznost){                                                   //switch v tejto casti preskuma zvolene cislo
              case 1:
                   {
                   int c[m][n];                                    //pri zvoleni 1 sa vykona nasledovne
                      if ((m == y)&&(n == x))                      //porovna ci je rovnaky pocet riadkov a stlpcov matic
                      {
                      printf("\n Scitanie matic A,B:\n\n");
                      fprintf(subor,"\n Scitane matice A,B:\n\n");
                      scitanie(&a[1][1],&b[1][1],&c[1][1],m,n);    //volanie funkcie scitanie
                           for (g=1;g<m+1;g++){                    //cykly pre vypis vyslednej matice na obrazovku
                                 for (j=1;j<n+1;j++){
                                  printf("   [%d]",c[g][j]);
                                  fprintf(subor,"   [%d]",c[g][j]);
                                  }
                              printf("\n");
                              fprintf(subor,"\n");
                              }
                              }
                      else{                                        //V pripade ze nie su rovnake matice tak vypise nasledovne
                      printf("\n Nemozem scitat matice!!! ");      //Vypis na obrazovku
                      printf("\n Stlacte akukolvek klavesu pre koniec programu!");
                           }
                      break;                                       //Ukoncenie tejto casti / klaves 1
                       }
              case 2:{int c[m][n];                                 //Deklaracia vyslednej matice
                           if ((m == y)&&(n == x))                 //Porovnanie riadkov a stlpcov
                           {
                              printf("\n Odcitanie matic A,B:\n\n");
                              fprintf(subor,"\n Odcitane matice A,B:\n\n");

                              odcitanie(&a[1][1],&b[1][1],&c[1][1],m,n);         // zavola funkciu s nazvom odcitanie
                                for (g=1;g<m+1;g++)                              //cykly pre vypis
                                  {
                                  for (j=1;j<n+1;j++)
                                  {
                                      printf("   [%d]",c[g][j]);                 //vypis  vyslednej matice na obrazovku
                                      fprintf(subor,"    [%d]",c[g][j]);         //zapis vyslednej matice do suboru vypis.txt
                                  }
                              printf("\n");
                              fprintf(subor,"\n");
                              }
                           }
                           else                                                  //ak nie su rovnake pocty stlpcov a riadkov v maticiach
                           {                                                     //tak vypise nasledovne
                               printf("\n Taketo rozmery matic sa nedaju odcitat!!! ");
                               printf ("\n Po stlaceni lubovolnej klavesy sa program ukonci!");
                           }
                       break;                                                   //Ukoncenie tejto casti / klaves 2
                       }
              case 3:
              {
                        int m,x,c[m][x];                                 //Deklaracia vyslednej matice
                           if ((n == x))                             //Porovnanie riadkov a stlpcov
                           {
                              printf("\n Nasobenie matic A,B:\n\n");
                              fprintf(subor,"\n Nasobenie matic A,B:\n\n");

                              nasob(&a[1][1],&b[1][1],&c[1][1],n,x);         // zavola funkciu s nazvom odcitanie
                                for (g=1;g<m+1;g++)                              //cykly pre vypis
                                  {
                                  for (j=1;j<y+1;j++)
                                  {
                                      printf("   [%d]",c[m][y]);                 //vypis  vyslednej matice na obrazovku
                                      fprintf(subor,"    [%d]",c[m][y]);         //zapis vyslednej matice do suboru vypis.txt
                                  }
                              printf("\n");
                              fprintf(subor,"\n");
                              }
                           }

                           else                                                  //ak nie su rovnake pocty stlpcov a riadkov v maticiach
                           {                                                     //tak vypise nasledovne
                               printf("\n Taketo rozmery matic sa nedaju odcitat!!! ");
                               printf ("\n Po stlaceni lubovolnej klavesy sa program ukonci!");
                           }
                       break;

              }
              default:
                      {                                                         //V pripade, ze bola zvolena zla moznost
                       printf("\n Zadali ste nespravnu volbu!!!");              //vypise tento text na obrazovku
                       printf("\n Po stlaceni lubovolnej klavesy sa program ukonci!");
                        }
      }

fclose(subor);                                                                  //Uzavrie otvoreny subor vypis.txt
getch();                                                                        //Ukoncenie programu lubovolnym klavesom
return 0;
}
}
Nahlásit jako SPAM
IP: 158.193.98.–
vitamin+8
Grafoman
11. 12. 2012   #2
-
+1
-
Zajímavé

Mas tam chybne dane zatvorku  '}'

Nekontrolujes rozmery matice, zaroven alokujes maticu na stacku a to nie je vobec dobry napad.

  Mas tam dost vela chyb na ktre prides hned ako si precitas warningy. napr:

int m = 3, n = 3;
{ 
	int m,x,c[m][x];	//ake rozmeri bude mat matica c? :) 
}

A samozrejme tie funkcie na scitanie a pod maju ako parameter len pointer na int, cize tam dostanes len 1 riadok matice.

zaujimalo by ma co cakas ze spravi tento kod? :

void scitanie(int *ma,int *mb, int *mc, int r,int s) //Funkcia pre scitanie
{
    int g,j,z=0;                                       //Deklaracie premennych pre cykly + nulovanie premenej "z"
    for(g=0;g<r;g++)                                   //Cyklus bude pracovat kym i<r a j<s
    {                                                  //"r"-pocet riadkov, "s"- pocet stlpcov
        for(j=0;j<s;j++)
        {
        *(mc+z)=*(mb+z)+*(ma+z);                      //vypocet,ktory funkcia vykona
        z++;                                          //zvysovanie premennej "z" o 1
        }
    }
}

edit:

vzhladom na to ze alokujes vsetko na stacku, tak ti program nebude padat pri pristupe do "nealokovanej pamete", takze ladit to bude pre teba horror.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý