[C++]Wortel probleem

Pagina: 1
Acties:
  • 374 views sinds 30-01-2008
  • Reageer

  • Drazzic
  • Registratie: Juni 2001
  • Laatst online: 11-03-2025
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>                //Wiskunde bestand inladen
#pragma hdrstop

#include "opdrach12_U.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BerekenClick(TObject *Sender)
//Pre:
//Post:
//Maker(s): Bas van Dijk & Egbert Polak         Datum: 15-01-2004
{
//Declaraties:
float som, aantalgeg, geg;               //Tel & rekenwaardes
int regel;                              //Aantal regels
int uit;                                //Uiteindelijke uitkomst
int g;                                  //g controleerd of ingevoerde gelijk is aan -1 of niet
bool goed;                              //Foutcontrole

vali (invoer->Lines->Strings[0],g,goed);
 if ((g > 0) && (goed))
  {
   som=0;                  //Register wordt op 0 gezet
   uit=0;                  //Register wordt op 0 gezet
   regel=0;                //Register wordt op 0 gezet
   geg=0;                  //Register wordt op 0 gezet
  }
   do
   {
   regel=regel+1;
    vali(invoer->Lines->Strings[regel],g,goed);
    if ((g < -1)  || (!goed))                      // controle of -1 is ingevoerd
     {
      ShowMessage(" U heeft op regel  " + IntToStr(regel+1) + " geen geldige geheel getal ingevuld of -1");
      goed=false;
     }
   }
   while ((g != -1) && (goed));
    if (goed)
     {
      for (regel=0; regel <invoer->Lines->Count ;      
      regel=regel+1)                                             //Regelteller
       {
        aantalgeg = (invoer->Lines->Strings[regel]).ToDouble();
        geg = sqrt(abs(aantalgeg));                        //Wortel van de gegevens
        som = som + geg;                        //Som van de wortel van de gegevens
       }
      uit = cos(som);                         //cos sinus van de som van de wortels
      uitvoer->Text=FloatToStrF(uit,ffFixed,10,2);             // uitkomst weergeven
     }
}

//---------------------------------------------------------------------------


Dit is onze opdracht: Ontwerp en implementeer een applicatie waarmee in een object Memo een rij met positieve gehele getallen g1 t/m gn wordt ingevoerd. Het aantal gegevens n, n>=1, is onbekend, de rij gegevens wordt afgesloten met –1. Op basis van de gegevens g1 t/m gn, moet cosinus van de som van de wortels van deze gegevens bepaald en afgedrukt worden.

Nu ben ik al heel ver alleen ik krijg steeds deze foutmelding als ik op bereken knal: "sqrt: DOMAIN error" nu snap ik niet wat ik fout doe, ik kom er helemaal uit behalve dus op het einde om dat te berekenen, zit nu al 2 uur alles om te gooien maar beter wordt het niet, hebben misschien een idee waar het aan ligt?

Ik snap dus niet hoe ik de som van de wortels van de ingevoerde gegevens krijg, als ik dat heb is de cosinus nemen natuurlijk niet zo moeilijk maar dat eerste stuk lukt niet :(

Alvast bedankt!

[ Voor 6% gewijzigd door Drazzic op 16-01-2004 02:15 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Lijkt me dat je de wortel van negatieve getallen probeert uit te rekenen, of een NAN (not-a-number) of IND (indefinite)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Drazzic
  • Registratie: Juni 2001
  • Laatst online: 11-03-2025
.oisyn schreef op 16 januari 2004 @ 01:35:
Lijkt me dat je de wortel van negatieve getallen probeert uit te rekenen, of een NAN (not-a-number) of IND (indefinite)
Nee dat is juist het rare er zit fout afvanging in dat je alleen positiefe gehele getallen kan invoeren. Ik heb ook gewoon positieve gehele getallen ingevoerd afgesloten met -1 maar toch krijg ik die error steeds :(

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Heb je al met de debugger gekeken wat de waarde was vlak voor het moment dat je sqrt aanroept?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Viva Vince
  • Registratie: Oktober 2002
  • Laatst online: 07-11-2024
Probeer dit voor de grap eens
code:
1
get=sqrt(abs(aantalgeg));


Want hij bedoelt met DOMAIN error dat de input van de SQRT buiten zijn domein zit, en het domein van de wortel functie is 0.....infty

Zou het bevoorbeeld kunnen zijn dat je de -1 ook nog door de wortel gooit?

Je zou misschien
code:
1
uit = sin(som);

Buiten je loop kunnen zetten, of zie ik dat fout? Dat zou je best vaak het uitrekenen van die sinus schelen

[ Voor 3% gewijzigd door Viva Vince op 16-01-2004 02:10 ]


  • Drazzic
  • Registratie: Juni 2001
  • Laatst online: 11-03-2025
Hmm nee om heel eerlijk te zijn heb ik niet eens een idee hoe dat moet, dat hebben we nog niet gehad en in de code zelf snap ik ook niet wat er fout zal kunnen zijn.

Hoe kan ik die debugger aanroepen?

Viva Vince thanks error is nu weg, maar het rare is dat ik nu bij wat ik ook maar in voer de uitkomst 0 krijg, net of hij niks weg schrijft naar het register, strange.

[ Voor 30% gewijzigd door Drazzic op 16-01-2004 02:13 ]


  • benoni
  • Registratie: November 2003
  • Niet online
Inderdaad..

en tis ook wel makkelijk om alle variabelen naar de uitvoer te sturen, kun je 't proces een beetje volgen.

Edit: :X was een beetje te laat

[ Voor 15% gewijzigd door benoni op 16-01-2004 02:15 ]


  • Viva Vince
  • Registratie: Oktober 2002
  • Laatst online: 07-11-2024
Okee print ff alles wat er gebeurt(dit kan ook met debugger, en ff een halt op die regel te zetten. Is best handig :) moet je maar ff een keertje opzoeken hoe dat werkt.)
Maar zo kan ook:
code:
1
2
3
4
5
6
{
        aantalgeg = (invoer->Lines->Strings[regel]).ToDouble();
         cout<<aantalgeg<<endl;
        geg = sqrt(abs(aantalgeg));                       
        som = som + geg;                        
}


Ik heb die << 50% van de tijd fout, let er ff op. Waarschijnlijk zal je ook nog wel een #include er bij moeten zetten. Ziet er uit alsof je in Builer bezig bent, moet je hem ff aan zijn verstand peuteren dat hij die cout naar een dosvenstertje doet of je GUI ff aanpassen.

Moraal, je wilt zien wat die wortel als input krijgt. Die abs() is geen fix, alleen maar ff checken dat het idd daar aan lag.

[ Voor 35% gewijzigd door Viva Vince op 16-01-2004 02:37 ]


  • Drazzic
  • Registratie: Juni 2001
  • Laatst online: 11-03-2025
Viva Vince schreef op 16 januari 2004 @ 02:19:
Okee print ff alles wat er gebeurt(dit kan ook met debugger, en ff een halt op die regel te zetten. Is best handig :) maar zo kan ook)

code:
1
2
3
4
5
6
{
        aantalgeg = (invoer->Lines->Strings[regel]).ToDouble();
         cout<<aantalgeg<<endl;
        geg = sqrt(abs(aantalgeg));                       
        som = som + geg;                        
}


Ik heb die << 50% van de tijd fout, let er ff op. Ziet er uit alsof je in Builer bezig bent, moet je hem ff aan zijn verstand peuteren dat hij die cout naar een dosvenstertje doet of je GUI ff aanpassen.

Moraal, je wilt zien wat die wortel als input krijgt. Die abs() is geen fix, alleen maar ff checken dat het idd daar aan lag
Sorry dit gaat me even te snel, nee maar lijkt er dus wel op dat hij een negatieve waarde binnen kreeg.

Die laatste code krijg ik wat error's bij cout & endl herkend ie niet.

Ja we werken met Borland C++ Builder 6, hoe kan ik die debugger starten na een fout?

  • benoni
  • Registratie: November 2003
  • Niet online
Ik zit nog ff naar de code te kijken:

Volgens mij blijven fout ingevoerde gegevensregels en de afsluitende -1 regel in het rijtje zitten, en is er binnen de while lus geen if-je die even checkt of de betreffende regel goed was. De if (goed) doet niks.

Tis laat hoor misschien heb ik niet goed gelezen.

  • TjardE
  • Registratie: September 2002
  • Niet online
*QUOTE
if ((g < -1) || (!goed)) // controle of -1 is ingevoerd

8) Of je commentaar klopt niet, of je regel code

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Drazzic schreef op 16 januari 2004 @ 02:22:
[...]
Ja we werken met Borland C++ Builder 6, hoe kan ik die debugger starten na een fout?
In een debugbuild gaat dat automatisch en zo? En je kunt gewoon in de linkerbalk klikken, verschijnt er zo'n rood bolletje (Breakpoint).

Professionele website nodig?


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

wrom tel je een aantal met een float???
krijg je enkel last van afrondingsfouten volgens mij:
eerst converteer je die regel(int waarschijnlijk) naar een double, steek je'm in een float
en dan pak je van die float nog ns een sqrt?? maar dit doe je met abs() en niet fabs() ??

dis een hele linke boel met datatypes, en daarbij double is volgens mij nog steeds gemakkelijker en beter in gebruik dan floats...

* H!GHGuY kent enkel C++, geen builder

ASSUME makes an ASS out of U and ME


  • Drazzic
  • Registratie: Juni 2001
  • Laatst online: 11-03-2025
HIGHGuY schreef op 17 januari 2004 @ 00:10:
wrom tel je een aantal met een float???
krijg je enkel last van afrondingsfouten volgens mij:
eerst converteer je die regel(int waarschijnlijk) naar een double, steek je'm in een float
en dan pak je van die float nog ns een sqrt?? maar dit doe je met abs() en niet fabs() ??

dis een hele linke boel met datatypes, en daarbij double is volgens mij nog steeds gemakkelijker en beter in gebruik dan floats...

* Drazzic kent enkel C++, geen builder
Ik ben er uit gekomen, ik heb via dat rode bolletje gedaan en kwam er achter dat hij dus ook die -1 mee nam.

code:
1
for (regel=0; regel <invoer->Lines->Count -1;


moet het worden

en de uit moest een float worden. Bedankt mensen!
Pagina: 1