Chyba dziwna sprawa ( mechanizm obliczający)

dział ogólny

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Witold » piątek, 18 grudnia 2009, 13:24

pitek3010 napisał(a): A druga sprawa to właśnie wtedy gdy mam nie pełną tabele np. 6 osób to wyskakuje mi błąd "Invalid floating point operation" kompletnie nie wiem co robić !


http://forum.4programmers.net/viewtopic.php?id=114204

To wywala: "Invalid floating point operation"
Kod: Zaznacz cały
float a=0.0f;
float b=0.0f;
float c = a/b;
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Pitek » piątek, 18 grudnia 2009, 13:25

:lol: :lol: :lol: HAHAHA :lol: :lol: :lol: Załatwione !
Kod: Zaznacz cały
void __fastcall TForm1::Button51Click(TObject *Sender)
{
float wagi;
float wynik;
float waga[41];
float ocena[41];
int p;
try
{
for(p=1;p<39;p++)
{
for(int x2=0;x2<41;x2++)
{
   ocena[x2]=0,00;
}
for(int z2=0;z2<41;z2++)
{
   waga[z2]=0,00;
}


   for(int i=1;i<41;i++)
   {
      if(Form1->StringGrid1->Cells[i+1][0]!="")
      {
      waga[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][0]);
      }
      else if(Form1->StringGrid1->Cells[i+1][0]=="")
      {
      waga[i]=0,00;
      }
   }

   for(int i=1;i<41;i++)
   {
      if(Form1->StringGrid1->Cells[i+1][p]!="")
      {
      ocena[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][p]);
      }
      else if(Form1->StringGrid1->Cells[i+1][p]=="")
      {
      ocena[i]=0,00;
      }
   }

//funkcja licząca !!!!!!!!
wagi=0;
wynik=0;

for(int w=1;w<41;w++)
{
   wagi=wagi+waga[w];
}

for(int i=1;i<41;i++)
{
   if(ocena[i]==0)
   {
   wagi=wagi-waga[i];
   }
}
//funkcja wyniku 3.12.2009 około 19:50 !!!!!!!!!
wynik=(ocena[1]*waga[1]+ocena[2]*waga[2]+ocena[3]*waga[3]+ocena[4]*waga[4]+ocena[5]*waga[5]+ocena[6]*waga[6]+ocena[7]*waga[7]+ocena[8]*waga[8]+ocena[9]*waga[9]+ocena[10]*waga[10]+ocena[11]*waga[11]+ocena[12]*waga[12]+ocena[13]*waga[13]+ocena[14]*waga[14]+ocena[15]*waga[15]+ocena[16]*waga[16]+ocena[17]*waga[17]+ocena[18]*waga[18]+ocena[19]*waga[19]+ocena[20]*waga[20]+ocena[21]*waga[21]+ocena[22]*waga[22]+ocena[23]*waga[23]+ocena[24]*waga[24]+ocena[25]*waga[25]+ocena[26]*waga[26]+ocena[27]*waga[27]+ocena[28]*waga[28]+ocena[29]*waga[29]+ocena[30]*waga[30]+ocena[31]*waga[31]+ocena[32]*waga[32]+ocena[33]*waga[33]+ocena[34]*waga[34]+ocena[35]*waga[35]+ocena[36]*waga[36]+ocena[37]*waga[37]+ocena[38]*waga[38]+ocena[39]*waga[39]+ocena[40]*waga[40])/wagi;

if(wynik!=0)
{
if(wynik<1.6)
{
   Form1->StringGrid1->Cells[46][p]="niedostateczny";
}
if(wynik>=1.6)
{
   Form1->StringGrid1->Cells[46][p]="dopuszczający";
}
if(wynik>2.5)
{
   Form1->StringGrid1->Cells[46][p]="dostateczny";
}
if(wynik>3.5)
{
   Form1->StringGrid1->Cells[46][p]="dobry";
}
if(wynik>4.5)
{
   Form1->StringGrid1->Cells[46][p]="bardzo dobry";
}
if(wynik>5.5)
{
   Form1->StringGrid1->Cells[46][p]="celujący";
}
Form1->StringGrid1->Cells[45][p]=CurrToStrF(wynik,ffFixed,2);
}
else if (wynik==0)
{
String a;
a="0,00";
Form1->StringGrid1->Cells[45][p]=a;
}
}
}
catch(...)
{
MessageBox(NULL,"Obliczone !","Informacja", MB_ICONINFORMATION | MB_OK);
}
}

Bardzo dziękuję wszystkim za ogromną pomoc !
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Cyfrowy Baron » piątek, 18 grudnia 2009, 13:44

Twój błąd od początku polegał na tym, że miałeś niezsynchronizowane tablice float z tabelą StringGrid. Po pierwsze źle liczyłeś tablice bo od 1, a gdy to poprawiłeś, to nie poprawiłeś odwołania do tabeli StringGrid i błąd dalej występował. a wystarczyło liczyć tablice float od zero i przesunąć odwołanie do StringGrid z I + 1 na i + 2 i wszystko byłoby dobrze.

ale ty tymczasem tworzysz coś takiego i myślisz, że już jest dobrze:

pitek3010 napisał(a)::lol: :lol: :lol: HAHAHA :lol: :lol: :lol: Załatwione !
Kod: Zaznacz cały
   for(int i=1;i<41;i++)
   {
      if(Form1->StringGrid1->Cells[i+1][0]!="")
      {
      waga[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][0]);
      }
      else if(Form1->StringGrid1->Cells[i+1][0]=="")
      {
      waga[i]=0,00;
      }
   }

   for(int i=1;i<41;i++)
   {
      if(Form1->StringGrid1->Cells[i+1][p]!="")
      {
      ocena[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][p]);
      }
      else if(Form1->StringGrid1->Cells[i+1][p]=="")
      {
      ocena[i]=0,00;
      }
   }

//funkcja licząca !!!!!!!!
wagi=0;
wynik=0;

for(int w=1;w<41;w++)
{
   wagi=wagi+waga[w];
}

for(int i=1;i<41;i++)
{
   if(ocena[i]==0)
   {
   wagi=wagi-waga[i];
   }
}
//funkcja wyniku 3.12.2009 około 19:50 !!!!!!!!!
wynik=(ocena[1]*waga[1]+ocena[2]*waga[2]+ocena[3]*waga[3]+ocena[4]*waga[4]+ocena[5]*waga[5]+ocena[6]*waga[6]+ocena[7]*waga[7]+ocena[8]*waga[8]+ocena[9]*waga[9]+ocena[10]*waga[10]+ocena[11]*waga[11]+ocena[12]*waga[12]+ocena[13]*waga[13]+ocena[14]*waga[14]+ocena[15]*waga[15]+ocena[16]*waga[16]+ocena[17]*waga[17]+ocena[18]*waga[18]+ocena[19]*waga[19]+ocena[20]*waga[20]+ocena[21]*waga[21]+ocena[22]*waga[22]+ocena[23]*waga[23]+ocena[24]*waga[24]+ocena[25]*waga[25]+ocena[26]*waga[26]+ocena[27]*waga[27]+ocena[28]*waga[28]+ocena[29]*waga[29]+ocena[30]*waga[30]+ocena[31]*waga[31]+ocena[32]*waga[32]+ocena[33]*waga[33]+ocena[34]*waga[34]+ocena[35]*waga[35]+ocena[36]*waga[36]+ocena[37]*waga[37]+ocena[38]*waga[38]+ocena[39]*waga[39]+ocena[40]*waga[40])/wagi;

if(wynik!=0)
{
if(wynik<1.6)
{
   Form1->StringGrid1->Cells[46][p]="niedostateczny";
}
if(wynik>=1.6)
{
   Form1->StringGrid1->Cells[46][p]="dopuszczający";
}
if(wynik>2.5)
{
   Form1->StringGrid1->Cells[46][p]="dostateczny";
}
if(wynik>3.5)
{
   Form1->StringGrid1->Cells[46][p]="dobry";
}
if(wynik>4.5)
{
   Form1->StringGrid1->Cells[46][p]="bardzo dobry";
}
if(wynik>5.5)
{
   Form1->StringGrid1->Cells[46][p]="celujący";
}
Form1->StringGrid1->Cells[45][p]=CurrToStrF(wynik,ffFixed,2);
}
else if (wynik==0)
{
String a;
a="0,00";
Form1->StringGrid1->Cells[45][p]=a;
}
}
}
catch(...)
{
MessageBox(NULL,"Obliczone !","Informacja", MB_ICONINFORMATION | MB_OK);
}
}



A guzik tam załatwione!

to:
Kod: Zaznacz cały
for(int i=1;i<41;i++)
   {

i to:
Kod: Zaznacz cały
waga[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][0]);


tablica waga[x] przyjmuje na początku wartość 1 gdyż int na starcie równa się 1. Pętla liczy do 40 (i < 41) nie przekracza rozmiaru tablicy, ale też nie liczy od pierwszego elementu, który pozostaje niewypełniony, gdyż tablica waga może zawierać się tylko w zakresie od 0 do 40, a ty tymczasem liczysz ją od 1 do 40, czyli 1 element tablicy jest nadmiarowy, pusty, niewykorzystany. Potrzebujesz tablicy zawierającej 40 elementów a zadeklarowałeś tablicę zawierającą 41 elementów.

ten fragment kodu powinien wyglądać tak:
Kod: Zaznacz cały
for(int i = 0; i < 40; i++)
{
  if(Form1->StringGrid1->Cells[i + 2][0] != "") // i + 2
  {
    waga[i] = StrToFloat(Form1->StringGrid1->Cells[i + 2][0]);
  }
else // ten fragment jest zbędny gdyż else jest przeciwieństwem if: if(Form1->StringGrid1->Cells[i + 2][0] == "")
/* if else moze mieć tylko dwa stany w tym przypadku albo jest tekst albo go nie ma */
{
  waga[i]=0,00;
}
}


w dalszej części kodu popełniasz te same błędy.

A co to ma być:

Kod: Zaznacz cały
wynik=(ocena[1]*waga[1]+ocena[2]*waga[2]+ocena[3]*waga[3]+ocena[4]*waga[4]+ocena[5]*waga[5]+ocena[6]*waga[6]+ocena[7]*waga[7]+ocena[8]*waga[8]+ocena[9]*waga[9]+ocena[10]*waga[10]+ocena[11]*waga[11]+ocena[12]*waga[12]+ocena[13]*waga[13]+ocena[14]*waga[14]+ocena[15]*waga[15]+ocena[16]*waga[16]+ocena[17]*waga[17]+ocena[18]*waga[18]+ocena[19]*waga[19]+ocena[20]*waga[20]+ocena[21]*waga[21]+ocena[22]*waga[22]+ocena[23]*waga[23]+ocena[24]*waga[24]+ocena[25]*waga[25]+ocena[26]*waga[26]+ocena[27]*waga[27]+ocena[28]*waga[28]+ocena[29]*waga[29]+ocena[30]*waga[30]+ocena[31]*waga[31]+ocena[32]*waga[32]+ocena[33]*waga[33]+ocena[34]*waga[34]+ocena[35]*waga[35]+ocena[36]*waga[36]+ocena[37]*waga[37]+ocena[38]*waga[38]+ocena[39]*waga[39]+ocena[40]*waga[40])/wagi;


Należy zastosować pętle tak jak podał polymorphism. Po jaką cholerę tworzysz taki ciąg?! :shock: :shock: :shock:

Nie tak:

Kod: Zaznacz cały
Form1->StringGrid1->Cells[45][p]=CurrToStrF(wynik,ffFixed,2);


lecz tak:

Kod: Zaznacz cały
Form1->StringGrid1->Cells[45][p] = FloatToStrF(wynik, ffFixed, 2);


Prosisz o pomoc, a gdy udzielamy Tobie wskazówek i pokazujemy błędy, które powinieneś poprawić, to Ty dalej robisz po swojemu. Po co wiec pytasz?

Twój kod jest niepoprawny i wszyscy, którzy mają o tym pojęcie widzą to na pierwszy rzut oka. Za chwile, znów coś nie będzie działało, a Ty znów będziesz się dziwił i pytał dlaczego nie działa.

Popraw ten kod, bo to co napisałeś to czysta H E R E Z J A.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez polymorphism » piątek, 18 grudnia 2009, 14:08

Dodam jeszcze to:
Kod: Zaznacz cały
void __fastcall TForm1::Button51Click(TObject *Sender)
{
   ...

   try
   {
      
      /* tu właściwy kod */

   }
   catch(...)
   {
      MessageBox(NULL,"Obliczone !","Informacja", MB_ICONINFORMATION | MB_OK);
   }
}

Jak rozumiem rzucenie wyjątku oznacza, że wszystko wykonało się poprawnie, tak? To trochę dziwne, bo wyjątki służą do sygnalizowania sytuacji wyjątkowych, a nie sytuacji, które idą zgodnie z planem. A co jeśli kod nie rzuci wyjątkiem? To będzie obliczone, czy nie?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Cyfrowy Baron » piątek, 18 grudnia 2009, 15:37

Trochę uporządkowałem i zoptymalizowałem Twój kod. Metoda try-catch na którą zwrócił uwagę polymorphizm jest absolutnie nie na miejscu, gdyż decyduje ona tylko o jednym, wykonaj obliczenia jeżeli to możliwe, jeżeli nie możliwe nie licz tylko zwróć komunikat, dlatego usunąłem ją z kodu.

Kod: Zaznacz cały
void __fastcall TForm1::Button51Click(TObject *Sender)
{
  double wagi;
  double wynik;
  double waga[40];
  double ocena[40];
   
  for(int p = 1; p < 41; p++)
  {
   for(int x2 = 0; x2 < 40; x2++)
   {
    ocena[x2] = 0,00;
    waga[x2]  = 0,00;
   }

   for(int i = 0; i < 40; i++)
   {
     if(!Form1->StringGrid1->Cells[i + 2][0].IsEmpty())
     {
       waga[i] = Form1->StringGrid1->Cells[i + 2][0].ToDouble();
     }
     else waga[i] = 0,00;

     if(!Form1->StringGrid1->Cells[i + 2][p].IsEmpty())
     {
       ocena[i] = Form1->StringGrid1->Cells[i + 2][p].ToDouble();
     }
     else ocena[i] = 0,00;
   }

   //funkcja licząca !!!!!!!!
   wagi  = 0.00;
   wynik = 0.00;

   for(int w = 0; w < 40; w++) wagi = wagi + waga[w];

   for(int i = 0; i < 40; i++)
   {
     if(ocena[i] == 0) wagi = wagi - waga[i];
   }
   
   //funkcja wyniku 3.12.2009 około 19:50 !!!!!!!!!
   wynik = 0;
   
   for(int i = 0; i < 40; ++i) wynik += ocena[i] * waga[i];

   wynik /= wagi;

   if(wynik != 0)
   {
     if(wynik <  1.6) Form1->StringGrid1->Cells[46][p] = "niedostateczny";
     if(wynik >= 1.6) Form1->StringGrid1->Cells[46][p] = "dopuszczający";
     if(wynik >  2.5) Form1->StringGrid1->Cells[46][p] = "dostateczny";
     if(wynik >  3.5) Form1->StringGrid1->Cells[46][p] = "dobry";
     if(wynik >  4.5) Form1->StringGrid1->Cells[46][p] = "bardzo dobry";
     if(wynik >  5.5) Form1->StringGrid1->Cells[46][p] = "celujący";

     Form1->StringGrid1->Cells[45][p] = FloatToStrF(wynik, ffFixed, 2);
   }
   else Form1->StringGrid1->Cells[45][p] = "0.00";
  }
}


Tak powinno działać. Kod jest poprawny, ale o tym czy będzie działał decyduje już konstrukcja programu. Miałeś kilka błędów na które zwracaliśmy Tobie uwagę, a których nie poprawiłeś, jednak wcześniej czy później i tak będziesz musiał te błędy usunąć, więc lepiej wcześniej.

Twój kod wciąż zawiera błędy, poprawiłem np. to: for(p=1;p<39;p++), liczysz w pętli od 1 do 38, czy to oznacza, że Twoja tabela StringGrid ma tylko 37 elementów? Tabela StringGrid też liczy kolumny i wiersze od 0 a nie od 1. Powinno więc chyba być: for(p = 0; p < 40; p++) zakładając, że tabela ma 40 wierszy i liczona jest od pierwszego wiersza, pierwszy wiersz ma numer 0. Jeżeli jest liczona od drugiego wiersza i ma tych wierszy 41 to pętla powinna wyglądać tak: for(p = 1; p < 41; p++).

Przemyśl to wszystko co tutaj Tobie wszyscy napisali, albo wciąż będziesz natykał się na pozornie nierozwiązywalne problemy.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez polymorphism » piątek, 18 grudnia 2009, 16:10

Kod: Zaznacz cały
if(!Form1->StringGrid1->Cells[i + 2][p].IsEmpty())

Minus tego rozwiązania jest taki, że nie chroni on przed stringami, które nie są poprawną liczbą. Program może rzucić wyjątkiem, który wyłoży całą aplikację, jeśli nie zostanie poprawnie przechwycony. Problem ten powinna rozwiązać funkcja StrToFloatDef. Czyli zamiast:
Kod: Zaznacz cały
if(!Form1->StringGrid1->Cells[i + 2][0].IsEmpty())
{
      waga[i] = Form1->StringGrid1->Cells[i + 2][0].ToDouble();
}
else waga[i] = 0.00;

można zrobić prościej i pewniej:
Kod: Zaznacz cały
waga[i]  = StrToFloatDef(StringGrid1->Cells[i + 2][0], 0.0);

Choć z drugiej strony to rozwiązanie (i poprzednie) jest o tyle niedobre, że użytkownik powinien zostać poinformowany przez aplikację, gdzie wpisał niepoprawne dane, a całą operacja powinna zostać przerwana.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Pitek » sobota, 19 grudnia 2009, 01:22

Rozumie wszystko co jest tu napisane do postu wcześniej wpisałem kod przed wszystkimi poprawkami ale sens był tego try i tak to zostawie bo nawet po wklejeniu kodu od Barona z poprawką od Polimorphism i tak to nie działa błąd jest przy FloatToStrF a jak dam Curr to i tak błąd jest więć ten try jest poto że jeżeli będzie mniej niż max ucznów w klasie czyli będzie gdzieś 0,00 w wyniku to jest ten błąd więc ja sobie tam napisze że Obliczono i gotowe. Przy moich półsamoukowatych umiejętnościach nie bedę filozofował czemu to nie działa mi wystarczy narazie że to działa i liczy dobrze. Prezpraszam jeżeli kogoś takie myślenie denerwuje ale dla mnie to narazie wystarczy.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Cyfrowy Baron » sobota, 19 grudnia 2009, 10:44

Błąd prawdopodobnie powstaje tutaj:

Kod: Zaznacz cały
    wynik=(ocena[1]*waga[1]+ocena[2]*waga[2]+ocena[3]*waga[3]+ocena[4]*waga[4]+ocena[5]*waga[5]+ocena[6]*waga[6]+ocena[7]*waga[7]+ocena[8]*waga[8]+ocena[9]*waga[9]+ocena[10]*waga[10]+ocena[11]*waga[11]+ocena[12]*waga[12]+ocena[13]*waga[13]+ocena[14]*waga[14]+ocena[15]*waga[15]+ocena[16]*waga[16]+ocena[17]*waga[17]+ocena[18]*waga[18]+ocena[19]*waga[19]+ocena[20]*waga[20]+ocena[21]*waga[21]+ocena[22]*waga[22]+ocena[23]*waga[23]+ocena[24]*waga[24]+ocena[25]*waga[25]+ocena[26]*waga[26]+ocena[27]*waga[27]+ocena[28]*waga[28]+ocena[29]*waga[29]+ocena[30]*waga[30]+ocena[31]*waga[31]+ocena[32]*waga[32]+ocena[33]*waga[33]+ocena[34]*waga[34]+ocena[35]*waga[35]+ocena[36]*waga[36]+ocena[37]*waga[37]+ocena[38]*waga[38]+ocena[39]*waga[39]+ocena[40]*waga[40])/wagi;


lub tutaj, zależy którego kodu użyjesz:

Kod: Zaznacz cały
wynik /= wagi;


jeżeli wagi ma wartość 0, to wyskoczy błąd, gdyż nie można dzielić przez 0, czyli rozwiązanie polega na dodaniu warunku:

Kod: Zaznacz cały
  for(int i = 0; i < 40; ++i) wynik += ocena[i] * waga[i];
 
  if(wagi > 0)
  {
    wynik /= wagi;
  }
  else
  {
    ShowMessage("dzielenie przez 0"); // zbędny komunikat, ale może posłużyć do sprawdzenia, czy to właśnie to wywołuje błąd.
    wynik = 0;
  }


To powinno rozwiązać problem i metoda try-catch nie będzie potrzebna.

Jeżeli zakończyłeś prace nad programem i nie zamierzasz nic więcej z nim robić, to oczywiście możesz to tak zostawić, ale jeżeli zamierzasz rozwijać program to nie masz innego wyjścia, musisz znaleźć przyczynę błędu w przeciwnym razie program posypie się w najmniej oczekiwanym momencie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez polymorphism » sobota, 19 grudnia 2009, 11:44

Prezpraszam jeżeli kogoś takie myślenie denerwuje ale dla mnie to narazie wystarczy.

Twój program, twoja sprawa. Problem będzie jeśli za parę dni wbijesz na forum pytając o to samo, może w innym kontekście, ale z grubsza istota problemu będzie ta sama. I co wtedy? Znowu wątek na dwie strony, wybijający Ci z głowy te same rzeczy? Bezsens zupełny...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Pitek » niedziela, 20 grudnia 2009, 17:03

OK Bardzo dziękuję za wszelką pomoc mi udzieloną postaram się w miare wzrostu mojej wiedzy z tej pomocy kożystać narazie to tak zostawie bo nie potrafie znajeźć przyczyny, jeszcze nie. A próbowałem na wszystkie strony i nic z tego co pisało w tym temacie. Jeżeli to naprowadzi na błąd to po wprowadzeniu tego powyższego kodu od barona wyskakuje "dzielenie przez 0".
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Cyfrowy Baron » niedziela, 20 grudnia 2009, 18:40

I to jest właśnie przyczyna błędu. Nie czytasz uważnie, w ostatni poście podałem Tobie rozwiązanie:

Kod: Zaznacz cały
  for(int i = 0; i < 40; ++i) wynik += ocena[i] * waga[i];

  if(wagi > 0)
  {
    wynik /= wagi;
  }
  else
  {
    ShowMessage("dzielenie przez 0"); // zbędny komunikat, ale może posłużyć do sprawdzenia, czy to właśnie to wywołuje błąd.
    wynik = 0;
  }


Komunikat: ShowMessage("dzielenie przez 0"); z powyższego kodu możesz usunąć i masz gotowe rozwiązanie problemu. Nie wyskoczy już opisany wcześniej przez Ciebie błąd. gdyż od początku problemem było to, że w pewnej sytuacji następuje dzielenie przez 0, a to jest niedopuszczalne, gdyż nie można dzielić przez 0.

narazie to tak zostawie bo nie potrafie znajeźć przyczyny, jeszcze nie.


Już masz rozwiązanie problemu, więc możesz zrezygnować z metody try-catch, gdyż z podanym przeze mnie kodem nie zwróci wyjątku. Jak widzisz w powyższym kodzie, jeżeli wagi jest równa 0, to dzielenie nie jest wykonywane, gdyż nie można dzielić przez 0, tylko wynik od razu przyjmuje wartość 0.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Pitek » niedziela, 20 grudnia 2009, 22:13

No faktycznie! Jeszcze raz bardzo dziękuję!!!
Ostatnio edytowano poniedziałek, 21 grudnia 2009, 08:49 przez Cyfrowy Baron, łącznie edytowano 2 razy
Powód: Między tekstem a znakami interpunkcyjnymi nie wstawia się spacji. Chcesz bardziej zaakcentować wypowiedź - użyj uśmieszków. Do podziękowań służy rączka.
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    NieznanyNieznana

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość