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[xySize+y]=src[yxSize+x];
}

int main()
{
unsigned xSize,ySize;
unsigned short tab,bat;
srand(time(NULL));
readSize(&xSize,&ySize);
tab=malloc(xSizeySizesizeof(unsigned short));
randTable2D(xSize,ySize,tab);
puts("Wylosowano:");
showTable2D(xSize,ySize,tab);
puts("W postaci transponowanej:");
showTable2Dtr(xSize,ySize,tab);
bat=malloc(xSizeySizesizeof(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, botów: 0