Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Duża liczba - nie powinno jej być
Forum PHP.pl > Inne > Hydepark
artgrus
Witam. Jako że mamy niedzielę, to nudziło mi się. Proszę o napisanie w czym jest błąd. Jest to program w C++ (wiadomo, wiadomo - większość z was lovit ten język, mi on wydaje się jednym z trudniejszych do nauczenia, lecz nie taki diabeł straszny, kiedy się pracuje nad mniejszymi programami).

Napisałem sortowanie przez wstawianie (plus porównywanie ze sobą elementów z tablicy), Niema tu main() ani nagłówków. Oto kod:
  1. int l; // male L: licznik wstawiajacy liczby do tablicy
  2. int j; // licznik petli sortujacej
  3. int n; // ilosc elementow
  4. int p; // element sortowanego ciagu
  5. int i; // zapomnialem biggrin.gif
  6. int lp; // liczenie porownan
  7.  
  8. cout << "Ile elementow do posortowania? ";
  9. cin >> n;
  10.  
  11. int a['n']; // tablica n-elementowa
  12.  
  13. cout << "\n";
  14.  
  15. for (l=0; l<n; l++)
  16. {
  17. cout << (l+1) << "z" << n << ": ";
  18. cin >> a[l];
  19. }
  20.  
  21. cout << "\nPorownania:\n";
  22.  
  23. // Zamiast j=2 ustawilem na j=0.
  24. // Gdyby j=2, to dla dwoch elementow nie posortuje
  25. for (j=1; j<n; j++)
  26. {
  27. p = a[j];
  28. i = j-1;
  29. // Zamiast i>0 ustawilem na j>=0
  30. while ((i>=0) && (a[i]>p))
  31. {
  32. a[i+1]=a[i];
  33. i=i-1;
  34. }
  35. a[i+1]=p;
  36.  
  37. // Pierwsze porownanie
  38. if (a[i] < a[j])
  39. {
  40. lp++;
  41. cout << a[i] << " < " << a[j] << endl;
  42. }
  43. else if (a[i] > a[j])
  44. {
  45. lp++;
  46. cout << a[i] << " > " << a[j] << endl;
  47. }
  48. else
  49. {
  50. lp++;
  51. cout << a[i] << " = " << a[j] << endl;
  52. }
  53. // Drugie porownanie
  54. if (a[j] < p)
  55. {
  56. lp++;
  57. cout << a[j] << " < " << p << endl;
  58. }
  59. else if (a[j] > p)
  60. {
  61. lp++;
  62. cout << a[j] << " > " << p << endl;
  63. }
  64. else
  65. {
  66. lp++;
  67. cout << a[j] << " = " << p << endl;
  68. }
  69. }
  70.  
  71. cout << "---------------------" << endl;
  72.  
  73. cout << "\nPo sortowaniu:" << endl;
  74. for (int x=0; x<n; x++)
  75. {
  76. cout << a[x];
  77. cout << endl;
  78. }
  79. getch();
  80. return 0;


Program działa. Teraz napiszę poniżej co robię a co mi pokazuje - od razu dodam że pokazuje mi baaardzo duże liczby których teoretycznie (niewiem jak to praktycznie) - nie powinno być. Dobra.

Przykład 1:
Uruchamiam program. Pokazuje mi się: Ile elementow do posortowania? Wpisuję 3. Enter. Kolejno podaję 3 elementy aby je zapisać do tablicy a tablicę potem posortować:
1z3: 9
2z3: 5
3z3: -1

Enter.
Pojawia się taki tekścik:
Porownania:
1306224 > 9
9 > 5
1306224 > 9
9 > -1



Przykład 2:
Uruchamiam program. Pokazuje mi się: Ile elementow do posortowania? Wpisuję 3. Enter. Kolejno podaję 3 elementy aby je zapisać do tablicy a tablicę potem posortować:
1z3: 9
2z3: 4
3z3: 8

Enter.
Pojawia się taki tekścik:
Porownania:
1306224 > 9
9 > 4
4 < 9
9 > 8



Przykład 3:
Uruchamiam program. Pokazuje mi się: Ile elementow do posortowania? Wpisuję 3. Enter. Kolejno podaję 3 elementy aby je zapisać do tablicy a tablicę potem posortować:
1z3: 9
2z3: 15
3z3: 7

Enter.
Pojawia się taki tekścik:
Porownania:
9 < 15
15 = 15
1306224 > 15
15 > 7




Pytanie:

Dlaczego w porównaniach pokazuje mi te duże liczby, kiedy to ja ich nie wpisywałem?

Czy jest jakiś sposób na wykluczenie takich problemów?
yevaud
int a['n']; // tablica n-elementowa

'' na pewno jest tutaj nie na miejscu
flashdev
Tak jak pisze @yevaud. Musisz utworzyć tablicę dynamicznie, bo w tej chwili deklarujesz tablicę 110-cio elementową (kod ascii znaku 'n' to 110).
Możesz też dla uproszczenia zadeklarować statyczną tablicę np 1e3 elementową pod warunkiem, że specyfikacja programu nie zezwala na utworzenie większej.
yevaud
while ((i>=0) && (a[i]>p))
{
a[i+1]=a[i];
i=i-1;
}

z jaka wartoscia konczy zmienna i po wyjsciu z tej petli i jak to sie ma do pozniejszych porownan a[i]
artgrus
ok, dzięki za posty. Będę się musiał zaopatrzyć w jakaś Biblię do C++. laugh.gif biggrin.gif tongue.gif happy.gif

Co do programu to poprawiłem błędy. rolleyes.gif
Tablica dynamiczna:
Kod
...
int *a;
a = new int[n];
...


i te duże liczby
Kod
...
a[i+1] = p;
if (i < '0') i = '0';
...


Teraz śmiga jak należy. rolleyes.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.