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

Nie mogę znaleźć błędu :(

Ostatnio zmodyfikowano 2008-11-14 11:55
Autor Wiadomość
Ush
Temat założony przez niniejszego użytkownika
Nie mogę znaleźć błędu :(
» 2008-11-12 17:59:52
Po skompilowaniu program się uruchamia a potem wyskakuje błąd :( Pomocy


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

using namespace std;

int main()
{
    cout << "Program dzieli elementy zbioru liczb calkowitych na liczby parzyste i nieparzyste" << endl << endl;
   
   
    cout << "Podaj dolna granice zbioru:" << endl;
    int a;
    cin >> a;
   
    cout << "Podaj gorna granice zbioru:" << endl;
    int b;
    cin >> b;
   
   
    int n, parz[ b - a ], nparz[ b - a ];
    for( int i = a; i < b + 1; i++ )
    {
        if(( i % 2 ) == 0 ) parz[ n ] = i;
       
        if((( i % 2 ) == - 1 ) ||(( i % 2 ) == 1 ) ) nparz[ n ] = i;
       
        n++;
    }
   
   
    cout << "Liczby parzyste to:" << endl;
    for( int j = 0; j < n + 1; j++ )
    {
        cout << parz[ j ] << "  " << endl;
    }
   
    cout << "Liczby nieparzyste to:" << endl;
    for( int j = 0; j < n + 1; j++ )
    {
        cout << nparz[ j ] << "  " << endl;
    }
   
   
    getch();
   
}
P-2519
DeBugger
» 2008-11-12 20:34:01
Błąd jest gdzieś w tej linice.
Nie mam zbytnio czasu żeby to oglądać.
C/C++
for( int i = a; i < b + 1; i++ )
{
    if(( i % 2 ) == 0 ) parz[ n ] = i;
   
    if((( i % 2 ) == - 1 ) ||(( i % 2 ) == 1 ) ) nparz[ n ] = i;
   
    n++;
}
P-2521
lynx
» 2008-11-12 20:46:06
Ja bym proponował zamienić ten kod:
if (((i % 2)== -1)||((i % 2)== 1)) nparz[n] = i;

na ten:
if ((i%2)!=0) npatrz[n] = i;

Nie wiem wprawdzie czy to coś zmieni w działaniu twojego programu, ale napewno kod będzie łatwiejszy do zrozumienia. ;)


/edit:
Powiedz w której części programu kod się rozwala, będzie łatwiej znaleźć błąd. :)
P-2522
DejaVu
» 2008-11-12 22:02:36
Podam Ci prosty przykład dla którego program się wywali:
a=1
b=1
Co dalej się stanie:
int parz[ b - a ];
Dokładniej sprawę rozpatrując:
C/C++
int parz[ 0 ]; //oczywisty błąd
Moim zdaniem rozwiązaniem będzie:
int parz[ b - a + 1 ];
Tak samo trzeba postąpić z drugą tablicą. Nie przyglądałem się reszcie kodu, jednak proszę o stwierdzenie, czy problem występuje czy też nie po wykonaniu powyższej operacji dla dwóch tablic.

/edit:
Dodatkowa informacja: reszta z dzielenia nie może być ujemna.
P-2523
Ush
Temat założony przez niniejszego użytkownika
» 2008-11-13 17:51:07
Niestety, problem wciąż występuje ;(

PS: Reszta z dzielenia może być ujemna ;) Przyjmuje zawsze znak dzielnika. Chyba, że chodzi o jakieś normy w C++...
P-2528
DejaVu
» 2008-11-13 17:59:57
Jeśli mówię, że nie może być ujemna to znaczy, że nie może być ujemna. Wklej wiersze które poprawiłeś.

/edit:
Rozpatrujemy tylko i wyłącznie C++. Matematyka rządzi się własnymi prawami i jest znacznie bardziej rozwinięta niż to co warto używać w programowaniu. Jeśli chcesz uzyskać ujemną wartość modulo musisz wykonać operację:
int wynikUjemnyModulo =( liczba % wartosc ) - wartosc;

/edit2:
Hm... faktycznie reszta z dzielenia może być ujemna...
P-2529
Ush
Temat założony przez niniejszego użytkownika
» 2008-11-13 18:42:58
C/C++
int n, parz[ b - a + 1 ], nparz[ b - a + 1 ];
for( int i = a; i < b + 1; i++ )
{
    if(( i % 2 ) == 0 ) parz[ n ] = i;
   
    if(( i % 2 ) != 0 ) nparz[ n ] = i;
   
    n++;
}
P-2531
lynx
» 2008-11-13 22:42:07
Ja chyba jeszcze znalazłem jeden błąd.
int n, int npatrz...
Deklarując zmienne w 'środku' programu, czyli zmienne nie globalne, nie są zapisywane zerem. Zawierają jakieś tam śmieci. Więc powinieneś zrobić:
int n = 0;...


Powiedz, jak teraz działa program. :)
P-2533
« 1 » 2
  Strona 1 z 2 Następna strona