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

R. 43 - prośba o sprawdzenie zadania domowego

Ostatnio zmodyfikowano 2019-03-31 21:25
Autor Wiadomość
pekfos
» 2019-03-20 00:26:32
To nie wywołanie jest błędne, tylko implementacja.
P-174227
rottingham
Temat założony przez niniejszego użytkownika
» 2019-03-20 00:51:48
@pekfos - a czy mógłbyś mi dać jakąś wskazówkę, gdzie szukać błędu?

Dlaczego kod nr 1 działa poprawnie, a kod nr 2, gdzie dodałem tylko linijkę
int i = 0;
 już nie?

W pierwszym przypadku otrzymuję poprawne dane:
-303 -22 2 101
.

A w drugim już mi się wkradło zero:
-303 -22 0 2
.

Kod nr 1
C/C++
#include <iostream>

using namespace std;

void nWartosc( int * pT, int * kT )
{
    int * nWartosc = pT;
    int a;
    for( int * wskaznik = pT; pT != kT; wskaznik++ )
    {
       
        if( * wskaznik < * nWartosc )
        {
            nWartosc = wskaznik;
        }
       
        if( wskaznik == kT )
        {
            a = * pT;
            * pT = * nWartosc;
            * nWartosc = a;
            pT++;
            wskaznik = pT;
            nWartosc = pT;
           
        }
       
    }
   
}

int main()
{
    int tablica[ 4 ] = { - 303, - 22, 2, 101 };
   
   
    nWartosc( tablica, tablica + 5 );
   
    for( int i = 0; i < 4; i++ )
         cout << tablica[ i ] << " ";
   
}

Kod nr 2
C/C++
#include <iostream>

using namespace std;

void nWartosc( int * pT, int * kT )
{
    int * nWartosc = pT;
    int a;
    for( int * wskaznik = pT; pT != kT; wskaznik++ )
    {
       
        if( * wskaznik < * nWartosc )
        {
            nWartosc = wskaznik;
        }
       
        if( wskaznik == kT )
        {
            a = * pT;
            * pT = * nWartosc;
            * nWartosc = a;
            pT++;
            wskaznik = pT;
            nWartosc = pT;
           
        }
       
    }
   
}

int main()
{
    int tablica[ 4 ] = { - 303, - 22, 2, 101 };
    int i = 0;
   
    nWartosc( tablica, tablica + 5 );
   
    for( int i = 0; i < 4; i++ )
         cout << tablica[ i ] << " ";
   
}
P-174228
pekfos
» 2019-03-20 11:02:09
» Kurs C++ » Poziom 5Wskaźniki lekcja
Użyj maina danego w zadaniu.
P-174229
rottingham
Temat założony przez niniejszego użytkownika
» 2019-03-20 19:27:23
Wszystko zdaje się działać jak trzeba. Czy dobrze rozwiązałem zadanie?

C/C++
#include <iostream>

using namespace std;

void sortuj( int * pT, int * kT )
{
    int * nWartosc = pT;
    int a;
    for( int * wskaznik = pT; pT != kT; wskaznik++ )
    {
       
        if( * wskaznik < * nWartosc )
        {
            nWartosc = wskaznik;
        }
       
        if( wskaznik == kT )
        {
            a = * pT;
            * pT = * nWartosc;
            * nWartosc = a;
            pT++;
            wskaznik = pT;
            nWartosc = pT;
           
        }
       
    }
   
}

void wypisz( int posT[], int j )
{
    for( int i = 0; i < j; i++ )
         cout << posT[ i ] << " ";
   
}

int main()
{
    int tab[ 10 ] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sortuj( tab, tab + 10 );
    wypisz( tab, 10 );
   
    std::cout << '\n';
   
    int tab2[ 15 ] = { 9, 7, 8, 6, 5, 4, 4, 0, 9, 6, 7, 1, 6, 3, 1 };
    sortuj( tab2, tab2 + 15 );
    wypisz( tab2, 15 );
}
P-174230
pekfos
» 2019-03-20 19:58:56
Użyj aktualnego maina danego w zadaniu.
P-174231
rottingham
Temat założony przez niniejszego użytkownika
» 2019-03-20 20:44:26
Fragment aktualnego maina wygląda tak:

C/C++
int tab2[ 16 ] = { 9, 7, 8, 6, 5, 4, 4, 0, 9, 6, 7, 1, 6, 3, 1, - 100 };
sortuj( tab2, tab2 + 15 );
wypisz( tab2, 15 );

i przy takim mainie wszystko działa. Jednak ten fragment chyba powinien wyglądać tak:    ?
C/C++
int tab2[ 16 ] = { 9, 7, 8, 6, 5, 4, 4, 0, 9, 6, 7, 1, 6, 3, 1, - 100 };
sortuj( tab2, tab2 + 16 );
wypisz( tab2, 16 );

C/C++
#include <iostream>

using namespace std;

void sortuj( int * pT, int * kT )
{
    int * nWartosc = pT;
    int a;
    for( int * wskaznik = pT; pT != kT; wskaznik++ )
    {
       
        if( * wskaznik < * nWartosc )
        {
            nWartosc = wskaznik;
        }
       
        if( wskaznik == kT )
        {
            a = * pT;
            * pT = * nWartosc;
            * nWartosc = a;
            pT++;
            wskaznik = pT;
            nWartosc = pT;
           
        }
       
    }
   
}

void wypisz( int posT[], int j )
{
    for( int i = 0; i < j; i++ )
         cout << posT[ i ] << " ";
   
}

int main()
{
    int tab[ 10 ] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sortuj( tab, tab + 10 );
    wypisz( tab, 10 );
   
    std::cout << '\n';
   
    int tab2[ 16 ] = { 9, 7, 8, 6, 5, 4, 4, 0, 9, 6, 7, 1, 6, 3, 1, - 101 };
    sortuj( tab2, tab2 + 16 );
    wypisz( tab2, 16 );
}

No i rzeczywiście przy takim układzie kod zachowuje się wbrew moim oczekiwaniom, bo otrzymuję
0 1 2 3 4 5 6 7 8 9
-101 0 0 1 1 3 4 4 5 6 6 6 7 7 8 9
Nie wiem skąd w drugim rzędzie dodatkowe zero, ale wiem, że kod jest niepoprawny.
P-174232
pekfos
» 2019-03-20 23:30:43
Kod w kursie jest dokładnie taki, jaki ma być. Podane tam wyjście programu jest też dokładnie takie, jakie ma być. Rozwiązanie zadania jest błędne, jeśli nie użyjesz kodu narzuconego w zadaniu, lub nie otrzymasz wyniku narzuconego w zadaniu.
P-174233
rottingham
Temat założony przez niniejszego użytkownika
» 2019-03-21 17:22:27
Zrobiłem kod, który działa. Rozwiązałem je dokonując dekrementacji wskaźnika
int * kT
.

Czy to dobre rozwiązanie?

C/C++
#include <iostream>

using namespace std;

void sortuj( int * pT, int * kT )
{
   
    int * nWartosc = pT;
    kT--;
    int a;
   
   
    for( int * wskaznik = pT; pT != kT; wskaznik++ )
    {
       
        if( * wskaznik < * nWartosc )
        {
            nWartosc = wskaznik;
        }
       
        if( wskaznik == kT )
        {
            a = * pT;
            * pT = * nWartosc;
            * nWartosc = a;
            pT++;
            wskaznik = pT;
            nWartosc = pT;
        }
       
    }
   
}

void wypisz( int * begin, int size )
{
    while( size > 0 )
    {
        std::cout << * begin << ' ';
        ++begin;
        --size;
    }
}

int main()
{
    int tab[ 10 ] = { 0, 9, 1, 3, 8, 2, 6, 7, 5, 4 };
    sortuj( tab, tab + 10 );
    wypisz( tab, 10 );
   
    std::cout << '\n';
   
    int tab2[ 16 ] = { 9, 7, 8, 6, 5, 4, 4, 0, 9, 6, 7, 1, 6, 3, 1, - 100 };
    sortuj( tab2, tab2 + 15 );
    wypisz( tab2, 15 );
}
P-174234
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona