Problem z ilorazem wierszy.

0

Dlaczego gdy mnoży elementy wierszy to mnoży tylko po dwa kolejne składniki i zapisuje je jeden pod drugim? Chcę tak zrobić, żeby mi wymnożyło cały pierwszy wiersz i wyświetliło wynik, następnie cały drugi i wyświetliło wynik, itd.. Później muszę obliczyć sumę tych iloczynów, ale to już chyba będę wiedział.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define w 10
#define k 10

void sort( int *d, int size ) //sortowanie bąbelkowe
{
   int r=size,tmp,i,j;
   for( i = 0; i < r-1; ++i )
       for( j = 0; j < r-1; ++j )
           if( d[ j ] < d[ i + 1 ] )
           {
               tmp = d[ j ];
               d[ j ] = d[ i + 1 ];
               d[ i + 1 ] = tmp;
           }
}

int main()
{


   int i,j,r,d[w][k];
   FILE *da, *wy;

   da=fopen("macierz.txt", "r");
   wy=fopen("posortowane.txt","w");

   for (i=0; i<w; i++)
   {
       for (j=0; j<k; j++)
       {
           fscanf(da, "%d", &d[i][j]); 
           printf("%5d", d[i][j]);

       }
       printf("\n");
   }

   fclose(da);
   printf("\n");

   //sortowanie

   sort( d, r=w*k ); //wywołanie funkcji sort; w*k macierz jednowymiarowa


   for(i=0; i<w; i++)
   {
       for(j=0; j<k; j++)
       {
           fprintf(wy,"%5d",d[j][i]); 
           printf( "%5d", d[j][i]); 
       }
       fprintf(wy,"\n");
       printf("\n");
   }
   printf("\n");

   //iloczzyn elementów wierszy
double ilo=1.0;
   for(i=0; i<w; i++)
   {
       for (j=0; j<k; j++)
       {
           ilo=ilo*d[j][i];
           printf("\nwynnik %f", ilo);
   }}

   fclose(wy);


   return 0;
}

0
void sort( int *d, int size ) //sortowanie bąbelkowe
{
    int r=size,tmp,i,j;
    for( i = 0; i < r-1; ++i )
        for( j = 0; j < r-1; ++j )
            if( d[ j ] < d[ i + 1 ] )
            {
                tmp = d[ j ];
                d[ j ] = d[ i + 1 ];
                d[ i + 1 ] = tmp;
            }
}

Masz tablice dwuwymiarową prawda? Nie możesz się odnosić do niej tylko jednym indexem.

sort( d, r=w*k );

Wysyłasz tablice dwuwymiarową do funkcji, więc działasz na tablicy dwuwymiarowej. Nie możesz z niej tak o po prostu zrobić jednowymiarowej.

Musiałbyś w funkcji utworzyć tablice jednowymiarową przepisać elementy z tablicy dwuwymiarowej i tą powstała tablice jednowymiarową zwrócić.

A co do Twojego problemu, to wystarczy dać for wyżej wyświetlanie i będzie dobrze :)

    for(i=0; i<w; i++)
    {
        for (j=0; j<k; j++)
        {
            ilo=ilo*d[j][i];
            
        }   
        printf("\nwynnik %f", ilo);
    }
0

Tak, dwuwymiarowa. Poprawiłem void sort i teraz jest okej?

void sort( int *d, int size ) //sortowanie bąbelkowe
{
    int r=size,tmp,i,j,p;

    for( i=0; i<r-1; ++i)
    {
        for(j=0; j<r-1; ++j)
        {
            if(d[j]<d[i+1])
            {
                tmp=d[j];
                d[j]=d[i+1];
                d[i+1]=tmp;

            }
        }
        if(d[i]<d[j+1])
        {
            tmp=d[i];
            d[i]=d[j+1];
            d[j+1]=tmp;
        }
    }
}

Nad utworzeniem tablicy jednowymiarowej i przepisaniem elementów z dwuwymiarowej jeszcze myślę.

0

To wytłumaczę Ci co robisz nie tak:

  • Tworzysz sobie tablice dwuwymiarową, która ma np. 2 wiersze i 2 kolumny.

Twoja macierz:

1 2
3 4

Chciałbyś wyświetlić powiedzmy tą trójkę, która jest w zerowej kolumnie(bo liczymy od zera)) i pierwszym wierszu, więc wyświetlamy tak:

printf("%d", tablica[ 0 ][ 1 ]);

Jeżeli napisałbym tak:

printf("%d", tablica[0]);

To po prostu nie zadziała, bo nie mam drugiego indexu, kompilator nie wiem sam ile on wynosi, więc wyświetli błąd.


Teraz analizujemy Twój kod:

  • Masz tablice dwuwymiarową d.
  • Wysyłasz tą tablicę do funkcji tą dwuwymiarową.
  • Próbujesz operować tylko jednym indexem w tej funkcji.

I jeszcze pojawia się pytanie, jak Ty to chcesz sortować? Jeżeli chcesz przesortować całą tablicę dwuwymiarową to źle się do tego zabierasz.
Możesz chcieć np. sortować od najmniejszej do największej kolumnami albo wierszami.

0

Okej, to rozumiem. Nie bardzo wiem, w którym miejscu operuje tym jednym ideksem. Wziąłem się teraz, żeby zrobić tablice jednowymiarową z dwuwymiarowej. Dobrze robię? Posortuje mi tablice jednowymiarową, później zwrócę jej wartość do dwuwymiarowej?

0

W całej tej funkcji operujesz na jednym indeksie :D.
To, że chcesz zrobić tablice jednowymiarową z dwuwymiarowej i zwracanie wartości... To jest spoko, ale można to zrobić łatwiej bez zabawy w jakieś zwracanie albo wyłuskiwanie elementów z tej tablicy dwuwymiarowej.

Chcesz posortować wierszami? Czy kolumnami? To jest pierwsze pytanie, które sobie zadajesz.
W tej funkcji co tam kombinowałeś, ja proponuje Ci takie podejście:

void sort( int d[w][k], int pierwszyWymiar, int drugiWymiar ) //sortowanie bąbelkowe
{
    for( i=0; i<pierwszyWymiar-1; ++i)
    {
        for(j=0; j<drugiWymiar-1; ++j){
            if(d[i][j]<d[i][j+1]){
              //TO-DO bubbleSort
            }
        }

    }
}
0

Jak zamienię na to, to w ogóle nie sortuje przecież.

0
Smiley75 napisał(a):

Jak zamienię na to, to w ogóle nie sortuje przecież.

Czyli do tego mam wymyślić resztę kodu?

0

Ja Ci daje tylko porady, możesz zupełnie z tego zrezygnować.
Faktem jest, że dałem Ci prawie gotową funkcje i napisałem dokładnie w którym miejscu masz wykonać sortowanie, czyli tylko uzupełnić if`a.

0

Po to napisałem post, żeby mi ktoś właśnie doradził. Poradziłem sobie już z całym zadaniem. Dzięki wielkie za pomoc!.
Temat do zamkniecia.

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