Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

odwzorowanie macierzy

Ostatnio zmodyfikowano 2015-12-16 10:47
Autor Wiadomość
Filippo9669
Temat założony przez niniejszego użytkownika
odwzorowanie macierzy
» 2015-12-16 03:10:46
cześć.
piszę taki oto program: tworzy on "płytkę" trapezową (równoramienną) w oparciu o dane użytkownika - liczbę elementów m w pierwszym wierszu oraz liczbę k wierszy. na tej płytce rozmieszczone są punkty, np dla m = 3 i k = 4.
          1  2  3
       4  5  6  7  8
    9 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24

i teraz tak. użytkownik wybiera dowolny punkt na tej płytce. następnie tworzona jest macierz kwadratowa o wierszach (tutaj) od 1 do 24. wybrany punkt, powiedzmy 12, "styka się" z punktami: 6, 11, 13, 20 - w kolumnach odpowiadających tym punktom wpisujemy liczby 1 (w wierszu numer 12), natomiast w kolumnie z 12 wartość -4.
dla dowolnego punktu zadanego przez użytkownika, dowolnego m i k program ma wyświetlić wiersz macierzy z punktem podanym przez użytkownika. program działa mi połowicznie, wyświetla dla większości, ale np. dla 1, 3, 4, 8, czyli tych będącymi ramionami trapezu - już nie. wklejam kod poniżej. z góry ogromne dzięki za pomoc.

C/C++
#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

//tworzenie plytki
void utwplytka( int k, int m, int ** plytka )
{
    int i;
    //przydzielenie dla każdego wiersza po m komórek
    for( i = 0; i < k; i++ )
    {
        plytka[ i ] = new int[ m ];
        m += 2;
    }
    cout << endl;
}

//funkcja wyswietlajaca plytke
void wysplytka( int i, int j, int k, int m, int ** plytka )
{
    int ile;
    int poz = 0;
    for( i = 0; i < k; i++ )
    {
       
        for( ile = k - i; ile > 0; ile-- )
        {
            cout << "    ";
        }
        for( j = 0; j < m; j++ )
        {
            poz++;
            plytka[ i ][ j ] = poz;
            cout << plytka[ i ][ j ] << "   ";
        }
        m += 2;
        cout << endl;
    }
}

//funkcja zliczajaca liczbe elementow na plytce
int zliczanie( int m, int k )
{
    int i, suma = 0;
    for( i = 0; i < k; i++ )
    {
        suma = suma + m;
        m = m + 2;
    }
    return suma;
}

//funkcja tworzaca macierz
void utwmacierz( int suma, int ** macierz )
{
    int i;
    for( i = 0; i < suma; i++ )
    {
        macierz[ i ] = new int[ suma ];
    }
    cout << endl;
}

//funkcja zerujaca macierz
void zermacierz( int suma, int ** macierz )
{
    int i, j;
    for( i = 0; i < suma; i++ )
    {
        for( j = 0; j < suma; j++ )
        {
            macierz[ i ][ j ] = 0;
        }
        cout << endl;
    }
}


//szukanie w ktorym wierszu jest punkt
int punkt( int nr, int m, int m1, int ** plytka )
{
    int wi = 0;
   
    if( nr <= m )
    {
        wi = 0;
    }
   
    while( nr > m )
    {
       
        if( m1 % 2 != 0 );
       
        {
            m = m + 2 * wi - 1;
            //w ktorym wierszu jest ten punkt
           
        }
        if( m1 % 2 == 0 );
       
        {
            m = m + 2 * wi;
        }
        wi++;
    }
   
    return wi;
}

//funkcja obliczajaca roznice miedzy punktami w kolumnach
int oblroznica( int nr, int m1, int wi, int ** plytka )
{
    int roznica;
    int sum = 0;
   
    sum =( wi - 1 ) * 2 + m1;
   
    roznica = sum - 1;
   
   
    return roznica;
}

//funkcja wypelniajaca macierz odpowiednio dla plytki
void uzumacierz( int m, int ** macierz, int roznica, int nr )
{
    macierz[ nr - 1 ][ nr - 2 ] = 1;
    macierz[ nr - 1 ][ nr - 1 ] = 4;
    macierz[ nr - 1 ][ nr ] = 1;
    macierz[ nr - 1 ][ nr - roznica - 1 ] = 1;
    macierz[ nr - 1 ][ nr + roznica + 1 ] = 1;
}


//funkcja wyswietlajaca macierz
void wysmacierz( int suma, int ** macierz, int nr )
{
    int i, j;
    cout << "    ";
    for( i = 0; i < suma; i++ )
    {
        if( i < 8 )
             cout << i + 1 << "  ";
        else
             cout << i + 1 << " ";
       
    }
    cout << endl << endl;
   
    cout << nr << "  ";
    for( i = 0; i < suma; i++ )
    {
        cout << macierz[ nr - 1 ][ i ] << "  ";
    }
   
}



int main()
{
    int k, m, i, j, nr, ilew, roznica, m1;
    int ** plytka;
    int ** macierz;
   
    cout << "Witaj! przedstawiam program przedstawiajacy objecie plytki. " << endl;
    cout << "Podaj liczbe wierszy: ";
    cin >> k;
   
    plytka = new int *[ k ]; //przydzielenie pamięci na k wierszy
   
   
   
    cout << "Podaj liczbe komorek w pierwszym wierszu: ";
    cin >> m;
   
    m1 = m;
   
    utwplytka( k, m, plytka );
    wysplytka( i, j, k, m, plytka ); //wyswietlanie plytki
   
    int ile = zliczanie( m, k );
    macierz = new int *[ ile ];
   
    cout << "Podaj prosze numer punktu: ";
    cin >> nr;
   
    utwmacierz( ile, macierz );
    zermacierz( ile, macierz );
    punkt( nr, m, m1, plytka );
    oblroznica( nr, m, punkt( nr, m, m1, plytka ), plytka );
    uzumacierz( m, macierz, oblroznica( nr, m, punkt( nr, m, m1, plytka ), plytka ), nr );
    wysmacierz( ile, macierz, nr ); //wyswietlanie macierzy
   
   
   
    for( int i = 0; i < k; i++ )
    {
        delete[] plytka[ i ];
        delete[] macierz[ i ];
    }
   
   
   
    getch();
    return 0;
}
P-142027
darko202
» 2015-12-16 09:01:30
1.
  zapoznaj się z techniką debugowania programów - ułatwi ci to prace nad takimi problemami
https://www.google.pl/​?gws_rd=ssl#q=debugowanie+c%2B%2B

2.

w funkcji uzumacierz nie uwzględnia sytuacji, ze niektóre punkty są ramionami trapezu (o czym sam piszesz)
P-142030
Filippo9669
Temat założony przez niniejszego użytkownika
» 2015-12-16 09:27:15
czy byłbyś w stanie jakoś skorygować mój kod?
P-142032
darko202
» 2015-12-16 10:47:20
przyznam się że nie czuję Twojego kodu
ale mamy

C/C++
//funkcja wypelniajaca macierz odpowiednio dla plytki
void uzumacierz( int m, int ** macierz, int roznica, int nr )
{
    macierz[ nr - 1 ][ nr - 2 ] = 1; // <--tu   
    macierz[ nr - 1 ][ nr - 1 ] = 4;
    macierz[ nr - 1 ][ nr ] = 1; // <--tu
    macierz[ nr - 1 ][ nr - roznica - 1 ] = 1; // <--tu
    macierz[ nr - 1 ][ nr + roznica + 1 ] = 1; // <--tu
}

/// w miejscach gdzie masz "<--tu"
//  wstawić warunek sprawdzający czy punkt nie leży poza macierzą

- - 1 - 2 - 3
4 - 5 - 6 - 7 - 8

np.dla punktu 2
macierz[ nr - 1 ][ nr - roznica - 1 ] = 1; // <--tego nie wykonujemy

prawdopodobnie wystarczylby warunek
if( !(( nr - roznica - 1 ) < 0 ) )
     macierz[ nr - 1 ][ nr - roznica - 1 ] = 1;

// dla innych wskazanych punktów programu podobnie
oczywicie w zaleznosci od kontekstu
P-142033
« 1 »
  Strona 1 z 1