Potęgowanie macierzy

0

Witam, jestem początkujący, jeśli chodzi o c. Mój program powinien(musi być w c):

  1. Stworzyć macierz a[4][4], wypełniając ją samodzielnie.
  2. Podnieść macierz a do potęgi n (takżej podanej przez ze mnie) i przedstawić jako macierz c[4][4]
  3. Zrobić coś, żeby użytkownik nie mógł wpisać innej wartości niż integer.
    trochę się pogubiłem, wiem jak zrobić 1 punkt ale reszty nie. pomóżcie!
0
Ben-adder napisał(a)

Witam, jestem początkujący, jeśli chodzi o c. Mój program powinien(musi być w c):

  1. Stworzyć macierz a[4][4], wypełniając ją samodzielnie.
  2. Podnieść macierz a do potęgi n (takżej podanej przez ze mnie) i przedstawić jako macierz c[4][4]
  3. Zrobić coś, żeby użytkownik nie mógł wpisać innej wartości niż integer.
    trochę się pogubiłem, wiem jak zrobić 1 punkt ale reszty nie. pomóżcie!
  1. Tworzysz tablicę [4][4], następnie wypełniasz ją przy pomocy for`a, w którym pytasz użytkownika jaka liczba ma być wstawiona do tego i tego pola.
    2..Jedziesz forem po każdym elemencie i robisz "tablica[i][j]=tablica[i][j]*tablica[i][j]".
  2. Jak to nie mógł? Wpisać może co chcę, ty masz za to poinformować, gdy nadejdzie błąd. Nie mam pojęcia, czy w tym przypadku ustawia się jakaś flaga (zapewne jakaś się ustawia), ale możesz to sprawdzać na milion domowych sposobów.
0

Ad.2 Napisz po prostu funkcje mnożącą macierz przez samą siebie n razy. Jeśli nie umiesz mnożyć macierzy to:
Mnożenie macierzy
Ad.3 Zabezpieczenie przed wpisywaniem liter

0

oki, powiedzmy, że mam napisać program, który podnosi macierz a[4][4] do kwadratu, więc oto on:

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

int main (void) 
{
int i,j, (*a)[4], (*c)[4];
   for (i=0; i<4; i++){
      for (j=0; j<4; j++)
      {
      printf("give integer number for matrix a[%d][%d]: \n",i+1,j+1);
      scanf("%d",&(*a+i)[j]);
      }
   }
   for (i=0; i<4; i++){
      for (j=0; j<4; j++)
      {
      printf("%d ",(*a+i)[j]);
      }
   printf("\n");
   }
   for (i=0; i<4; i++){
      for (j=0; j<4; j++)
      {
      (*c+i)[j]=(*a+i)[j]*(*a+i)[j];
      printf("%d", (*c+i)[j]);
      }
   printf("\n");
   }
}

tylko, że coś tu jest nie tak. program z samym wyświetlaniem macierzy a[4][4] działa spoko, ale jak tylko dodaję część z mnożeniem( w ogóle, jak dodaję cokolwiek) to od razu coś się chrzani i po wpisaniu pierwszej liczby program się zamyka. co jest?!

0

Stworzyłeś tablicę WSKAŹNIKÓW i indeksujesz te wskaźniki wpisując tam inty? Nie zapmniałeś czasem o alokacji pamięci? Zresztą skoro to ma być [4][4] to czemu nie napisałeś:

int a[4][4];

? A już pisanie *(a+i) to terroryzm. Nie da się po ludzku a[i] ?

0

Niestety, musi być na wskaźnikach, takie mam polecenie... czyli co jest źle, tak ogólnie?

0

Tak ogólnie to nie zaalokowałes pamięci i piszesz po niej.
Doczytaj moze co to jest malloc() i jak się korzysta ze wskaźników.

0

ok, tak powinien wyglądać mój program, bazując na tym, czego się nauczyłem, i co powinienem umieć (nie mówiliśmy na kursie nic o malloc(), więc nie użyłem tego, bo bym wzbudzał podejrzenia) tylko, że jako wynik c[4][4] wyświetla mi liczby nie wiadomo skąd :( ktoś wie o co chodzi?

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

double pow(double x, double y);

int main (void) 
{
int i,j,n,k,l, (*a)[4], (*c)[4];
   for (i=0; i<4; i++){
      for (j=0; j<4; j++)
      {
      printf("give integer number for matrix a[%d][%d]: \n",i+1,j+1);
      if (scanf("%d",&k)==1) 
      { 
      (*a+i)[j]=k; 
      } 
      else 
      { 
      printf("ERROR\n"); 
      return 0; 
      }
      }
   }
printf("give value of n: ");
if (scanf("%d",&l)==1) 
   { 
   n=l; 
   } 
      else 
      { 
      printf("ERROR\n"); 
      return 0; 
      }
printf("matrix a: \n");
   for (i=0; i<4; i++){
      for (j=0; j<4; j++)
      {
      printf("%d ", (*a+i)[j]);
      }
   printf("\n");
   }
printf("matrix c: \n");
   for (i=0; i<4; i++){
      for (j=0; j<4; j++)
      {
      (*c+i)[j]+=pow((*a+i)[j], n);
      printf("%d ", (*c+i)[j]);
      }
   printf("\n");
   } 
}
0
#include<stdio.h>
#include<math.h>

int main ()
{
  int i,j,n,k,l, a[4][4], c[4][4]={};

  for (i=0; i<4; i++) /*wczytanie danych*/
    for (j=0; j<4; j++)
      {
        printf("give integer number for matrix a[%d][%d]: \n",i+1,j+1);
        if (scanf("%d",&k)==1)
          *(*(a+i)+j)=k; /*a[i][j] = k*/
          else
            {
              fprintf(stderr,"ERROR\n");
              return 1;
            }
      }

  printf("give value of n: ");
  if (scanf("%d",&n)!=1)
    {
      fprintf(stderr,"ERROR\n");
      return 1;
    }

  printf("matrix a: \n");
  for (i=0; i<4; i++)
    {
      for (j=0; j<4; j++)
        printf("%d ", *(*(a+i)+j)); //wypisanie a[i][j]
      printf("\n");
    }

  printf("matrix c: \n");
  for (i=0; i<4; i++)
    {
      for (j=0; j<4; j++)
        {
          //tak się nie potęguje macierzy, poczytaj jak sie mnoży macierze...
          printf("%d ", *((*c+i)+j));
        }
      printf("\n");
    }
  return 0;
}

Musisz chyba douczyć się troszkę matematyki, bo twój sposób potęgowania macierzy niszczy ;]
Poza tym zamieniłem ci te odwołania do tablicy na jeszcze bardziej wskaźnikowe. Jak szaleć, to szaleć ;]

0

Mnożenie macierzy i algortym szybkiego potęgowania są na wikipedii.

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