nie wiem co robić wskazniki

0

nie wiem czemu nie działa mi transponowanie macierzy. Jeśli ktoś spojrzałby na to byłbym wdzieczny

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

long int a,b,i,j;


void wczytaj(long int *a, long int *b)
{
long int x,y;
printf("\tWprowadz liczbe kolumn  \t");
scanf("%d",&x);
printf("\tWprowadz liczbe wierszy  \t");
scanf("%d",&y);
(*a)=x;
(*b)=y;
}

void losuj(long int a, long int b, long int *tab)
{
srand(time(NULL));
    long int i,j;
    for(i=0;i<=a;i++)
    {
        for(j=0;j<=b;j++)
        {
            tab[i*a+j]=rand()%39;
        }
    }
}

void wyswietl(long int a, long int b,  long int *tab)
{
    int i,j;
    for(i=1;i<=a;i++)
    {
        for(j=1;j<=b;j++)
        {
            printf("\t%.3d   ", tab[i*a+j]);
        }
            printf("\t\n");
    }
}

void odstep()
{
	printf("\n");
}
       
void transponowanie( long int a,long int b, long int *tab, long int *tab2)	     
{
 int i,j;

   // macierz po transponowaniu
	
printf("\n");

for(i=0;i<=a-1;i++){
printf("");

for(j=0;j<=b-1;j++){
tab2[j+a*i]=tab[i+b*j];
}
}
for(i=0;i<=b-1;i++){
printf("\n");
for(j=0;j<=a-1;j++){
printf("%.3d ", tab2[a*i+j]);
} 
}
getch();	
	
}      
			   
			    
int main(){
	
naglowek();	


wczytaj(&a,&b);
odstep();
long int tab[a][b];
long int tab2[b][a];
losuj(a,b,&tab[0][0]);
wyswietl(a,b,&tab[0][0]);
odstep();
wyswietl(a,b,&tab[0][0]);
transponowanie(a,b,&tab[0][0],&tab2[0][0]); 



return 0;
}
1

Co to znaczy nie działa?

4
  1. Używasz zmiennych globalnych...
  2. Robisz wszędzie off-by-one. Twoje tablice mają np. a kolumn a potem robisz pętlę dla indeksów od 0 do a podczas gdy indeksy są tlyko od 0 do a-1
1

Oraz co znaczy Jeśli ktoś spojrzałby na to byłbym wdzieczny? Bo spojrzałam i co teraz?

0

nie do końca czaje jak się poruszać tymi wskaznikami po tablicy

3

Te chamy wstrętne... Pewnie będę żałował tego posta za parenascie godzin ale... Jest wigilia wiec wypadałoby byc miłym.

Panie autorze... Te
Twoje nazwy z d**y cię zgubiły do tego nie inicjializujesz je i zapisujesz dane do losowej pamięci Isię dziwisz ze nie działa.... Moja rada na najbardzej leniwe rozwiazanie.

1 bez zmiennych globalnych
2 sensowne zmienne które sa ustawione na sensowne wartości
3 napisać w miarę sensownie w main.
4 Oddzielić to na funkcje

I wesołych świat wszystkim i więcej uprzejmości tym leniwym autorom którym nie chce sie spędzić dodAtkowych 5 min by pomoc była bardziej wartosciowa

1

To rób to po ludzku za pomocą tab[i][[j] a nie tak jak teraz robisz.

1

W sumie odpowiedzi są, ale: nie wiem co robić wskazniki

Twojego kodu nie idzie czytać...

1

Może w związku ze świętami ...

  1. Nie używać i++ dopóki nie jest to konieczne. http://4programmers.net/Forum/1101404
  2. Naucz się formatowania kodu: http://4programmers.net/Forum/998482
  3. Nie używaj zmiennych globalnych, bokiem to wyjdzie.
  4. Nadawaj sensowne nazwy przy a, b za chwile nie będziesz pamiętał co jest pionem a co poziomem.
  5. Nie nadawaj polskich nazw, jak nie znasz słowa po angielsku to zajrzyj do słownika, przy okazji kolejne słówko zapamiętasz.
  6. Pamiętaj o indeksowaniu tablic od zera (dziwne, przy losuj pamiętasz zaś przy wyswietl już nie?)
  7. Jeżeli wartość w zmiennej nie może być ujemnej (np rozmiar tablicy) to używaj bez znakowych typów, dla wymiarów tablic unsigned lub size_t, long totalnie bez sensu.
  8. Jeżeli wiesz że wartość będzie w przedziałach 0..38 to nadaj odpowiedni typ unsigned short, long totalnie bez sensu.
  9. Nie musisz fizycznie transponować tablice aby wyświetlić ją w postaci transponowanej.
    Po uwzględnieniu powyższego powinno wyjść coś na kształt:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
 
void readSize(unsigned *xSize,unsigned *ySize)
  {
   printf("Wprowadz liczbe kolumn: ");
   scanf("%u",xSize);
   printf("Wprowadz liczbe wierszy: ");
   scanf("%u",ySize);
  }
  
void randTable2D(unsigned xSize,unsigned ySize,unsigned short *tab)
  {
   unsigned x,y;
   for(y=0;y<ySize;++y) for(x=0;x<xSize;++x) tab[y*xSize+x]=rand()%39;
  }
 
void showTable2D(unsigned xSize,unsigned ySize,unsigned short *tab)
  {
   unsigned x,y;
   for(y=0;y<ySize;++y,printf("\n")) for(x=0;x<xSize;++x) printf("%3d",tab[y*xSize+x]);
  }
 
void showTable2Dtr(unsigned xSize,unsigned ySize,unsigned short *tab)
  {
   unsigned x,y;
   for(x=0;x<xSize;++x,printf("\n")) for(y=0;y<ySize;++y) printf("%3d",tab[y*xSize+x]);
  }
 
void transpositionTable2D(unsigned xSize,unsigned ySize,unsigned short *dst,unsigned short *src)
  {
   unsigned x,y;
   for(y=0;y<ySize;++y) for(x=0;x<xSize;++x) dst[x*ySize+y]=src[y*xSize+x];
  } 
 
int main()
  {
   unsigned xSize,ySize;
   unsigned short *tab,*bat;   
   srand(time(NULL));
   readSize(&xSize,&ySize);
   tab=malloc(xSize*ySize*sizeof(unsigned short));
   randTable2D(xSize,ySize,tab);
   puts("Wylosowano:");
   showTable2D(xSize,ySize,tab);
   puts("W postaci transponowanej:");
   showTable2Dtr(xSize,ySize,tab);
   bat=malloc(xSize*ySize*sizeof(unsigned short));
   transpositionTable2D(xSize,ySize,bat,tab);
   puts("Po transpozycji:");
   showTable2D(ySize,xSize,bat);
   puts("Ale mozemy wyswietlic jako:");
   showTable2Dtr(ySize,xSize,bat);
   free(tab);
   free(bat);
   /*while(getchar()!='\n') {} // to zamiast getch() ale jeżeli to potrzebujesz to zmień środowisko na jakieś z tego tysiąclecia.*/
   return 0;
  }

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