Avatar billede nfssister Forsker
15. januar 2002 - 11:38 Der er 6 kommentarer og
1 løsning

Er der nogle der kan

har fået en opgave i skolen der lyder sådan her:

Lav et program, som finder rødderne i et andengradspolynomium og tegner et passende udsnit af polynomiets graf. Brugeren skal selvfølgelig også kunne zoome og aflæse funktionsværdier. Suppler eventuelt med muligheden for at finde skæringspunkter mellem et andengradspolynomium og et førstegradspolynomium (ret linie).

Og det hele skal laves i delphi. (plus forklaring til)
Avatar billede dkn Nybegynder
15. januar 2002 - 12:21 #1
lyder da meget sjovt...
Lavede engang  en der kunne udregne dem - desværre mistede jeg den pga af en virus :<
Du skal vel bare i gang med en masse string functions så du kan få værdierne ud.
Der efter skal du have fat i et component til at tegne grafer med, sådan en havde jeg også nu kan jeg sku ikke lige huske hvad den hedder.

Jeg skal selv til at lave noget lignende det du snakker om, også som en opgave i skolen...

dkn
Avatar billede martinlind Nybegynder
15. januar 2002 - 14:14 #2
Prøv at kig her http://www.efg2.com/Lab/

/Martin
Avatar billede hreiff Nybegynder
16. januar 2002 - 17:13 #3
Andengradspolynomier er alle på formen:
a * x^2 + b * x + c
så det nemmeste er at bruge 3 editbox\'e til henholdsvis a, b og c
Man kan så sætte det pænt op med 2 labels med hhv. x² og x.
Der kan så være 0, 1 eller 2 løsninger, som man finder efter formen:
  rod1 := -b+sqrt(sqr(b)-4*a*c)/(2*a);
og
  rod2 := -b-sqrt(sqr(b)-4*a*c)/(2*a);
(Man skal selvfølgelig først checke om sqr(b)-4*a*c er større end 0 (2 løsninger), =0 (1 løsning) eller <0 (ingen løsninger)
a, b og  c finder du med
a := StrToFloat(Edit1.text);
osv.
Man kan også udvide med en fejldialog hvis det ikke er et tal.

Vedr. graftegning: Der findes garanteret masser af færdige componenter, men det er nok ikke det som øvelsen går ud på, så brug en image eller lign. Det er nemmest hvis den har en fast størrelse, f. eks 120*120 punkter. Hvis man skal have lidt kant på, har man et areal på 100*100 tilbage, som er nemt at dele med.
Brug 4 editbox\'e til minx, maxx, miny og maxy (brug heltal og
minx := StrToInt(edit4.text);
osv.
Så skal der tegnes:
  With image1.canvas do
  begin
    moveto(10,10);
    lineto(10,110);
    lineto(110,110);
  end;
giver et forsimplet koordinatsystem - du kan altid udvide med pile og streger.
Husk at y vender modsat - y=0 er den øverste.
Kurven tegner du med en løkke og nogle linjestykker, f.eks:
  With image1.canvas do
  begin
    x := minx;
    xdel := (maxx-minx)/10;  {ændring i x pr. 10 punkter}
    ydel := (maxy-miny)/100;  {ændring i y pr. punkt}
    moveto(10,    );
    for i := 1 to 10 do
    begin
      ximage := round(10*i+10);
      y :=
      lineto(ximage,y);
    end;
  end;

Jeg har ikke lige tid til at gøre det færdigt - fortsætter senere.
Der mangler sådan set kun beregningen af y og omsætning til pixels.
Ellers kan du nok selv finde ud af det herfra.

//hreiff
Avatar billede hreiff Nybegynder
17. januar 2002 - 09:26 #4
Fortsat svar, vedr. graf - fra tegning af koordinatsystem.

    {finder forhold}
  xdel := (maxx-minx)/10;  {ændring i x pr. 10 punkter}
  ydel := (maxy-miny)/100; {ændring i y pr. punkt}
    {finder startpunkt}
  x := minx;
  y := a*sqr(x)+b*x+c;
  ximage := 10;
  yimage := 110-round((y-miny)/ydel);
    {tegner}
  With image1.canvas do
  begin
    moveto(x,y);
    for i := 1 to 10 do
    begin
      x := i*xdel+minx;          {aktuel x værdi}
      ximage := round(10*i+10);  {aktuel x koordinat}
      y := a*sqr(x)+b*x+c;        {aktuel y-værdi}
      yimage := 110-round((y-miny)/ydel);  {y-koordinat}
      lineto(ximage,y);          {tegner en linje}
    end;
  end;

Der vil være nogle problemer hvis kurven går uden for skalaen, men så må man undlade at tegne hvis ximage eller yimage er uden for intervallet 0-100.
Man kan også lave en autoscale på y, ved at starte med at finde den minimale og maksimale y-værdier og bruge dem som miny og maxy.
Hvis du synes at kurven er for hakket, må du dele den op i flere linjestykker.


Hvis du vil udvide programmet lidt, kan du differentiere polynomiet - det giver:  2*a*x+b;
Når det er 0 har du et max/min punkt, alt efter om a er positiv eller negativ. dvs der er en top ved:
xtop := -b/(2*a)
(Kan f.eks bruges ved en autoscale af x sammen med nulpunkterne)

//hreiff
Avatar billede hreiff Nybegynder
17. januar 2002 - 14:38 #5
Hvis du vil finde skæringspunkter mellem 2.grads og 1.grads polynomier gør du som følger:

a*x²+b*x+c = d*x+e
(2.grad)  = (1.grad)

ensbetydende med

a*x²+(b-d)*x+(c-e)=0

og så finder du rødder som før, altså

(-(b-d) + sqrt(sqr(b-d)-4*a*(c-e)))/(2*a);

(-(b-d) - sqrt(sqr(b-d)-4*a*(c-e)))/(2*a);


//hreiff
Avatar billede hreiff Nybegynder
17. januar 2002 - 14:40 #6
Der mangler en parantes ved 0-punktsfinding (1. svar)

  rod1 := (-b+sqrt(sqr(b)-4*a*c))/(2*a);
og
  rod2 := (-b-sqrt(sqr(b)-4*a*c))/(2*a);

ellers bliver resultateg forkert. Undskyld.
Avatar billede solrac Nybegynder
17. januar 2002 - 18:30 #7
Borrisholt her ! Jeg har lige lånt en internet frobindelse .. Anyway. Du kan finde svar på dit spørgsmål ved at gå ind på http://torry.net og download en af de lomme regnere der er Source code med til .... Den kan det hele !

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester