Chyba dziwna sprawa ( mechanizm obliczający)

dział ogólny

Chyba dziwna sprawa ( mechanizm obliczający)

Nowy postprzez Pitek » piątek, 18 grudnia 2009, 00:48

Siedzę nad tym któryś dzień. Mam tabelę z danymi liczbowymi obliczonymi w/g ustalonego algorytmu. Kiedy obliczę dane dla jednej części (I semestr) i powielę to do drugiej części ( II semestr) logicznie srednia z obliczń jest taka sama. Ale kiedy obliczę łącznie wszystkie dane z I i II semestru średnia wychodzi inna o jedną lub nawet 0,9 dziesiątych ale w sytuacji kiedy ostatnia liczba w II semestrze jest równa "0" obliczenie jest prawidłowe! Sprawdzałem co się da w projekcie i nie umiem na to sobie odpowiedzić Czy jest na to jakaś rada ?
Oto mój kod obliczający :
Kod: Zaznacz cały
float wagi;
float wynik;
float waga[40];
float ocena[40];
for(int x2=0;x2<41;x2++)
{
   ocena[x2]=0;
}
for(int z2=0;z2<41;z2++)
{
   waga[z2]=0;
}
int p;
   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;
      }
   }
for(p=1;p<39;p++)
{
   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;
      }
   }

//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)
{
Form1->StringGrid1->Cells[45][p]=CurrToStrF(wynik,ffFixed,2);

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";
}
}
else
{
Form1->StringGrid1->Cells[45][p]=wynik;
}
}
}
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 Pitek » piątek, 18 grudnia 2009, 09:35

Problem rozwiązałem. Kod po poprawkach :
Kod: Zaznacz cały
void __fastcall TForm1::Button51Click(TObject *Sender)
{
float wagi;
float wynik;
float waga[40];
float ocena[40];
int p;
for(p=1;p<39;p++)
{
for(int x2=0;x2<41;x2++)
{
   ocena[x2]=0;
}
for(int z2=0;z2<41;z2++)
{
   waga[z2]=0;
}

   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;
      }
   }

   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;
      }
   }

//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;
}
}
}

Oczywiście to by było zbyt piękne żeby mogło działać w 100% nie :(( ?
Problem jest taki że program oblicza ale jeżeli obliczenia kończą się np. na 6 osobie to reszta ma średnią roczną 0 a powinna mieć 0,00. 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ć !
Bardzo proszę o możliwie szybką pomoc już prawie kończe i jest to dla mnie bardzo ważne. Z góry wszystkim bardzo dziękuję !
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, 10:45

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"


"Invalid floating point operation" oznacza, że nie można dokonać operacji konwersji wartości do typu float, czyli komórka z której pobierasz wartość zamiast tekstu w formie liczby zawiera tekst nie będący liczbą, ale to co jest bardziej prawdopodobne, że nie pełna tabala oznacz, że ta komórka niczego nie zawiera, a niczego nie można skonwertować na float. Dlatego powinieneś niepełne komórki wypełnić jakąś wartością np. 0.00, lub przy próbie konwersji dodać metodę try-catch, lub jakiś warunek.
Warunek jednak już masz: if(Form1->StringGrid1->Cells[i+1][0]!=""). więc teoretycznie powinno działać. Pozostaje więc metoda:

Kod: Zaznacz cały
if(Form1->StringGrid1->Cells[i+1][0]!="")
{
  waga[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][0]);
}
else {waga[i] = 0.00;}


Problemem jest prawdopodobnie to, że w przypadku, gdy warunek nie zostaje spełniony element tabeli waga[x] pozostaje niewypełniony, co w dalszej części powoduje błędy, dlatego należy wypełnić wszystkie elementy tabeli waga[x[ i ocena[x]. dla pominiętych wartości 0.00.



Klika uwag.

Gdy podajesz jakiś komunikat błędu podawaj również do której linii kodu on się odnosi. Kompilatora zaznacza taka linię.

Nie pisz wszystkiego na kupie, gdyż kod jest nieczytelny, zamiast:

Kod: Zaznacz cały
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;
}


pisz tak:

Kod: Zaznacz cały
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;
}


zauważ, że kod jest czytelniejszy i łatwiej się w nim zorientować.
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 » piątek, 18 grudnia 2009, 11:20

Instrukcja try...catch nie działa już próbowałem. Wstawiłem przy moich warunkach 0.00 ale też nic nie dało. Problem w tym że błąd nawet z debugerem jest generowany zewnętrznie przez system co mnie zdziwiło nie ma odniesienia do żadnej lini lub czego kolwiek w środowisku a program się kompiluje myśle że dlatego że błąd pojawia się dopiero wtrakcie pracy i nie koliduje z kompilatorem.Dobrze będę starał się pisać kod czytelnie :) Czy ma pan jeszcze jakiś pomysł na to jak to zrobić żeby działało ?
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 polymorphism » piątek, 18 grudnia 2009, 11:57

Bardziej rozlazłego kodu to się nie dało napisać?

Zamiast:
Kod: Zaznacz cały
for(int x2=0;x2<41;x2++)
{
   ocena[x2] = 0;
}
      
for(int z2=0;z2<41;z2++)
{
   waga[z2] = 0;
}

można przecież:
Kod: Zaznacz cały
for(int i = 0; i < 40; ++i) ocena[i] = waga[i] = 0;

albo po prostu użyć memset.

Zamiast:
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;
   }
}

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;
   }
}

można:
Kod: Zaznacz cały
for(int i = 0; i < 40; ++i)
{
   if(Form1->StringGrid1->Cells[i+2][0]!="")
   {
      waga[i]=StrToFloat(Form1->StringGrid1->Cells[i+2][0]);
   }
   else waga[i] = 0;

   if(Form1->StringGrid1->Cells[i+2][p]!="")
   {
      ocena[i]=StrToFloat(Form1->StringGrid1->Cells[i+2][p]);
   }
   else ocena[i] = 0;
}


Zamiast tego potworka:
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;

można, a nawet trzeba, tak:
Kod: Zaznacz cały
wynik = 0;
   
for(int i = 0; i < 40; ++i)
   wynik += ocena[i] * waga[i];

wynik /= wagi;

Prawda, że prościej i czytelniej?

Poza tym we wszystkich pętlach masz błąd. Indeksujesz tablice 40-elementowe indeksem 40, co jest wyjściem poza zakres. W C/C++ indeksujesz od 0, a nie od 1. To nie Delphi, po którym VCL niestety odziedziczył tą złą cechę.

____
p.s. oczywiście nie wymieniłem wszystkich fragmentów, które można by (a nawet powinno się) poprawić.
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 » piątek, 18 grudnia 2009, 12:03

Nie ma wyjścia po za zakres tablica jest od 0 do 40 czyli 41 komórek a ja używam 40 od 1.
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 polymorphism » piątek, 18 grudnia 2009, 12:11

Deklarując:
Kod: Zaznacz cały
float waga[40];

deklarujesz tablicę 40-elementową, gdzie dopuszczalny przedział indeksów to TeX: <0,39>.

Podstawy C/C++ się kłaniają...
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 » piątek, 18 grudnia 2009, 12:20

Ciekawe że mi dobrze liczy po za tym to nic nie pomogło.
Cały czas jest Invalid floating point operation.
Co jeszcze moge poprawić ?
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 polymorphism » piątek, 18 grudnia 2009, 12:30

To, że ci dobrze liczy, nie zmienia faktu, że masz tam błędy. I tu nie ma z czym polemizować...

A że nie pomogło... no cóż, żeby coś poprawić, trzeba najpierw pousuwać ewidentne błędy.

--- DODANE ---

Co jeszcze moge poprawić ?

Pokaż poprawiony kod.
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, 12:39

Poza tym we wszystkich pętlach masz błąd. Indeksujesz tablice 40-elementowe indeksem 40,


Nie ma błędu, gdyż pętla liczy tylk w zakresie od 0 do 39, czyli wylicza 40 elementów tablicy.

Kod: Zaznacz cały
for(int i = 0; i < 40; ++i)


dla i równego 0, zwiększaj i o jeden dopóki i jest mniejsze od 40, czyli 39 spełnia warunek, ale 40 nie, więc pętla nie wykracza poza 39, gdyby było tak:

Kod: Zaznacz cały
for(int i = 0; i <= 40; ++i)


dla i równego 0, zwiększaj i o jeden dopóki i jest mniejsze lub równe 40, czyli 40 spełniałoby warunek.
By uniknąć błędu najlepiej jest użyć metody sizeof by program sam pobrał rozmiar tablicy:

Kod: Zaznacz cały
for(int i = 0; i < sizeof(waga); ++i)


Instrukcja try...catch nie działa już próbowałem.


Ja ten kod potem edytowałem i poprawiłem, nie ma w nim metody try-catch, gdyż nie była potrzebna, zamiast tego podałem:

Kod: Zaznacz cały
if(Form1->StringGrid1->Cells[i+1][0]!="")
{
  waga[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][0]);
}
else {waga[i] = 0.00;}


Komunikat błędu w trakcie działania programu wskazuje, nie na błąd w kodzie, lecz na jakiś wyjątek zwracany przez program w wyniku działania użytkownika. Kod mimo błędnej konstrukcji w zasadzie jest poprawny na tyle, by nie generować błędu "Invalid floating point operation". Tylko, że rozmiar tablicy jest liczony od 0 a nie od 1. Za błąd odpowiedzialne są jakieś działania w tabeli. Ten komunikat oznacza błąd konwersji tekstu z tabeli do zmiennej float, więc na tym musisz się skupić. Przeanalizuj cały kod programu i sprawdź w nim wszystkie konwersje i ustal w którym momencie może wystąpić błąd konwersji.
Pamiętaj! By konwersja była możliwa, komórka tabeli z której pobierasz tekst nie może być pusta i musi zawierać tekst będący liczbą.
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 » piątek, 18 grudnia 2009, 12:47

Ten kod :
Kod: Zaznacz cały
if(Form1->StringGrid1->Cells[i+1][0]!="")
{
  waga[i]=StrToFloat(Form1->StringGrid1->Cells[i+1][0]);
}
else {waga[i] = 0.00;}

Też nie daje efektu dałem nawet wszędzie gdzie w kodzie zeruje zmienne 0.00 i też nic.
Jestem pewien za to że wszędzie w tabeli są wartości typu String.
Czy jest jeszcze jakiś sposób do przetestowania ?
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, 12:50

Wrzuć ten program jeżeli możesz wraz z kodem, tylko skompiluj go razem z bibliotekami, a z katalogu projektu usuń pliki tymczasowe.

Plik do usuwania plików tymczasowych, umieścić w katalogu projektu i stamtąd uruchomić:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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, 12:53

Nie ma błędy, gdyż pętla liczy tylk w zakresie od 0 do 39, czyli wylicza 40 elementów tablicy.
Kod: Zaznacz cały
for(int i = 0; i < 40; ++i)

Hmm, chyba zacytowałeś moją, poprawioną pętlę, a nie jedną z pętli pitka:
Kod: Zaznacz cały
for(int i=1;i<41;i++)
{
      ...
      ocena[i] = StrToFloat(Form1->StringGrid1->Cells[i+1][p]);
      ...
      ocena[i] = 0;
}

A tu, jakby nie patrzeć, mamy indeksowanie od 1 do 40, czyli błąd 8-)
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, 12:56

Tak zauważyłem. Wcześniej nie zwróciłem uwagi na pętlę pitek3010. Przeglądając kod, często nie zwracam uwagi na kwestie oczywiste, a liczenie tablicy od 0 wydaje się po prostu oczywiste.
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 » piątek, 18 grudnia 2009, 13:13

Liczę od 1 ze względu na zapis i+1 dla kolumn w tabeli ale już poprawiłem dałem tablece 41 a nie 40.
Zauważyłem że błąd pojawia się tylko wtedy gdy używam CurrToStrF więc może tu jest problem potrzebuje tej konwersji ale może da się to jakoś ograć ?
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

Następna 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 5 gości