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

Jeden blad na ok sto prob

Ostatnio zmodyfikowano 2013-05-19 20:27
Autor Wiadomość
usmiech
Temat założony przez niniejszego użytkownika
Jeden blad na ok sto prob
» 2013-05-18 23:03:57
Witam, napisalem w sumie nietrudny program. Generalnie sa to operacje na tablicy. Program kompiluje sie oki, nie pokazuje zadnych ostrzezen. Dziala rowniez , no generalnie, ok. Ale jak napisalem w tytule tamatu, popelnil jeden blad. Pomylil jedna z liczb z sortowaniu tablicy. Niby tylko jedna i tylko raz na pewnie ok 100 prob /nie liczylem :)/. Czy taki blad moze sie zdarzyc pomimo poprawnego kodu, czy tez to raczej jakis blad w programie ?

Nie chodzi o kod, pewnie , ze bede mogl go pokazac, ale ja nie mam duzego doswiadczenia dlatego to pytanie kieruje do bardziej doswiadczonych osob... czy zdarza sie pomylka kompowi :)
P-83260
dambo
» 2013-05-18 23:07:53
bez kodu raczej Ci nie pomożemy, ale takie coś to na pewno jakieś małe przeoczenie w algorytmie
P-83261
usmiech
Temat założony przez niniejszego użytkownika
» 2013-05-18 23:29:29
To, ze kompy sie myla to wie kazdy /chociaz to pewnie moga byc bledy programistow/, ale te pomylki sa raczej w duzych projektach... wiec czy w tak malym tez moze to byc tylko blad kompa ?
P-83263
ison
» 2013-05-18 23:35:08
na 100% wina kodu

To, ze kompy sie myla to wie kazdy
kompy się nie mylą, mylą się programiści piszący programy
P-83264
usmiech
Temat założony przez niniejszego użytkownika
» 2013-05-18 23:40:06
Pokaze kod. Pomylka nastapila w eortowaniu tablicy wg sum skladnikow danej liczby / np suma 123 to 6/. Sorki za tak szczegolowe wyjasnienie, ale chcialem byc dobrze zrozumiany :)
Kod:
C/C++
#include "stdafx.h"

#include <iostream>

using namespace std;
int sumaDigits( int tablica );
void selectionSort( int tablica[], int rozmiar );
void selectionSortDigits( int tablica[], int rozmiar );
void selectionSortDigitsNajmniejszyNumer( int tablica[], int rozmiar );

/**************************************************************************************/

int main()
{
    const int tablica_rozmiar = 5;
    int tablica[ tablica_rozmiar ];
   
    cout << "Wprowadz " << tablica_rozmiar << " liczb/y/ : \n\n";
    for( int i = 0; i < tablica_rozmiar; ++i )
    {
        cout << "Podaj liczbe #[" << i << "]: ";
        while( !( cin >> tablica[ i ] ) )
        {
            cout << "\nPrzykro mi... ale oczekiwana byla liczba."
            << "  Sprobuj jeszcze raz!\n" << endl;
            cin.clear();
            cin.ignore( 10000, '\n' );
            cout << "Podaj liczbe #[" << i << "]: ";
        }
    }
   
    cout << "\nWprowadzone przez Ciebie liczby to: \n";
   
    for( int i = 0; i < tablica_rozmiar; ++i )
    {
        cout << tablica[ i ] << ", ";
    }
    cout << endl;
   
    selectionSort( tablica, tablica_rozmiar );
   
    cout << "\nPosortowana tablica od liczby najmniejszej do najwiekszej to: \n";
   
    for( int i = 0; i < tablica_rozmiar; ++i )
    {
        cout << tablica[ i ] << ", ";
    }
    cout << endl;
   
    selectionSortDigits( tablica, tablica_rozmiar );
   
    cout << "\nPosortowana tablica od najmniejszej sumy  skladnikow liczb to: \n";
   
    for( int i = 0; i < tablica_rozmiar; ++i )
    {
        cout << tablica[ i ] << ", ";
    }
   
    cout << endl;
   
    cout << "\nLiczba/y/ z najmniejsza suma jej skladnikow to: \n";
    selectionSortDigitsNajmniejszyNumer( tablica, tablica_rozmiar );
   
   
    cout << endl;
   
    system( "pause" );
    return 0;
}

/********************************************************************************************/

int sumaDigits( int tablica )
{
    int suma = 0;
    while( tablica > 0 )
    {
        suma += tablica % 10;
        tablica /= 10;
    }
    return suma;
}
/*************************************************/
void selectionSort( int tablica[], int rozmiar )
{
    int index;
    int najmniejszyIndex;
    int location;
    int temp;
    for( index = 0; index < rozmiar - 1; index++ )
    {
        najmniejszyIndex = index;
       
        for( location = index + 1; location < rozmiar; location++ )
        {
            if( tablica[ location ] < tablica[ najmniejszyIndex ] )
                 najmniejszyIndex = location;
           
            temp = tablica[ najmniejszyIndex ];
            tablica[ najmniejszyIndex ] = tablica[ index ];
            tablica[ index ] = temp;
        }
    }
}
/**************************************************/
void selectionSortDigits( int tablica[], int rozmiar )
{
    int index;
    int najmniejszyIndex;
    int location;
    int temp;
    for( index = 0; index < rozmiar - 1; index++ )
    {
       
        najmniejszyIndex = index;
       
        for( location = index + 1; location < rozmiar; location++ )
        {
            if( sumaDigits( tablica[ location ] ) < sumaDigits( tablica[ najmniejszyIndex ] ) )
                 najmniejszyIndex = location;
           
            temp = tablica[ najmniejszyIndex ];
            tablica[ najmniejszyIndex ] = tablica[ index ];
            tablica[ index ] = temp;
        }
    }
}
/******************************************************/
void selectionSortDigitsNajmniejszyNumer( int tablica[], int rozmiar )
{
    int minIndex = 0;
    int najmniejszyNumer = 0;
   
    for( int index = 0; index < rozmiar; ++index )
    {
        if( sumaDigits( tablica[ minIndex ] ) > sumaDigits( tablica[ index ] ) )
        {
            minIndex = index;
            tablica[ najmniejszyNumer ] = tablica[ index ];
        }
    }
    for( int i = 0; i < rozmiar; ++i )
    {
        if( sumaDigits( tablica[ i ] ) <= sumaDigits( tablica[ najmniejszyNumer ] ) )
        {
            cout << tablica[ i ] << ", ";
        }
    }
}

//przy pisaniu kodu kompilator nie pozwolil mi na uzycie tablicy jako argumentu funkcji sumaDigits (w selectionSortDigits).. sorki
//za nieprofesjonalne slownictwo, programuje generalnie po angielsku :)
P-83265
usmiech
Temat założony przez niniejszego użytkownika
» 2013-05-19 00:31:15
Znalazles jakis blad ison ?

Juz chyba wiem w czym tkwi problem... ten  najprostszy sposob sortowania nie jest najlepszy... no tak napisali w ksiazkach ;-)
P-83268
ison
» 2013-05-19 19:05:04
Wprowadz 5 liczb/y/ :

Podaj liczbe #[0]: 8
Podaj liczbe #[1]: 9
Podaj liczbe #[2]: 40
Podaj liczbe #[3]: 2
Podaj liczbe #[4]: 4

Wprowadzone przez Ciebie liczby to:
8, 9, 40, 2, 4,

Posortowana tablica od liczby najmniejszej do najwiekszej to:
4, 2, 8, 9, 40,

Posortowana tablica od najmniejszej sumy  skladnikow liczb to:
4, 2, 40, 8, 9,

Liczba/y/ z najmniejsza suma jej skladnikow to:
2, 2,
Press any key to continue . . .

masz konkretne liczby, dla których nie działa

przeanalizuj kod i sprawdź dlaczego dostajesz zły wynik

//edit
C/C++
void selectionSort( int tablica[], int rozmiar )
{
    int index;
    int najmniejszyIndex;
    int location;
    int temp;
    for( index = 0; index < rozmiar - 1; index++ )
    {
        najmniejszyIndex = index;
       
        for( location = index + 1; location < rozmiar; location++ )
        {
            if( tablica[ location ] < tablica[ najmniejszyIndex ] )
                 najmniejszyIndex = location;
           
            temp = tablica[ najmniejszyIndex ]; /////////////////
            tablica[ najmniejszyIndex ] = tablica[ index ]; ///// to powinno sie znalezc poza tym forem
            tablica[ index ] = temp; ////////////////////////////
        }
    }
}
P-83330
usmiech
Temat założony przez niniejszego użytkownika
» 2013-05-19 19:37:02
A to ciekawe, bo uzylem klasycznego wzoru na sortowanie tablicy I ten wiersz, ktory wskazales do wystawienia poza for powinien tam wlasnie byc , znaczy w for :) (swap) pojde na kompa, wkleje kod z ksiazki ;)
P-83332
« 1 » 2
  Strona 1 z 2 Następna strona