15. januar 2002 - 11:38Der 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)
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...
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.
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)
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
Synes godt om
Ny brugerNybegynder
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.