20.2.2006
Voisiko joku antaa neuvoa seuraavaan: Matemaattisten funk-
tioiden käsittely windouws-ohjelmoinnissa kuten C++Builerissä. Kun tehdään ohjelma vaikka fysiikan mekaniikan alaan kuuluvasta helposta kappaleen loppunopeuden laskemisesta juuri ennen sen törmäämistä maan pinnalle (vapaasti putoava, ilmanvastusta ei huomioida) kaava on vl = sqrt(2*g*h) jossa vl on loppunopeus, g on putoamiskiihtyvyys = 9.81m/s^2
ja h on putoamiskorkeus metreinä. Tämä on helppo ohjelmoida
riviohjelmana vaikka C++Builderin konsolisovelluksena.
Mutta windows-ohjelmointina luotuun edit-tekstikenttään,
johon korkeus kirjoitetaan, "luku" on merkkijonotyyppiä.
Esimerkki on Eurolaskuri-ohjelma jossa markat muutetaan
euroiksi tai päinvastoin eurot muutetaan markoiksi. Tämän
tyyppisissä tehtävissä on kyseessä vakiolla jakaminen
tai kertominen, kuten eurokurssi = 5.94573 joka sijoitetaan
const double-tyyppisenä vakiona lähdetekstiin ennen laskemista.
Lähdetekstitiedostoon kirjoitetaan sitten muunnos sopivaan kohtaan aaltosulkeiden väliin johon kursori automaattisesti siirtyy:
EditEuro->Text = FloatToStr(
StrToFloat(EditMarkka->Text) / eurokurssi); // tässä teksti
kentän merkkijono muunnetaan desimaaliluvuksi, tehdään jakolasku, saadaan markat euroiksi ja muunnetaan desimaali-
luku takaisin merkkijonoksi joka näytetään toisessa lomakkeelle luodussa edit-tekstikentässä.Tehtävä on valmis. Vakiotekstiä voi helmposti muotoilla haluamakseen.
EditMarkka->Text = FloatToStr(
StrToFloat(EditEuro->Text) * eurokurssi); //kertolasku
jossa eurot muutetaan markoiksi samalla tavalla kuin edellä.
E.o. fysiikan tehtävässä muuttuja h on juurrettavan "sisäl-
lä" vakioiden 2 ja g kanssa. Mitenkähän näiden tyyppimuunoskaa-
vojen kanssa pitäisi menetellä että ohjelmasta saa toimivan.
terveisin arep
Ota ihmeessä muuttujat käyttöön. Ensin laitat muuttujiin tekstikentistä arvot (StrToFloat jne), sitten laskeskelet muuttujilla kaikessa rauhassa, ei ole pakko edes laittaa kaikkea samaan lausekkeeseen. Ja lopuksi vasta laitat saadut arvot sinne, minne tarvitsee. Ei pidä tehdä asioista hankalampia kuin ne ovat :)
Eli eurolaskuri menisi näin:
const double eurokurssi = 5.94573; double Eurot, Markat; Eurot = StrToFloat(EuroText->Text); Markat = Eurot / eurokurssi; MarkkaText->Text = FloatToStr(Markat);
{Ei rivitetä tekstiä textarean mukaan, eihän? Ja käytetäänhän jatkossa kooditageja tai edes tasalevyistä tekstiä noissa koodinpätkissä?}
22.2.2006
Kiitokset Metabolixille vastauksesta 21.2.06 arepin viestiin. Ilmaisin asiani huonosti. Eurolaskuri-ohjelma
toimii aivan hyvin C++Builderin windows-ohjelmointina.
Siinä on muuttujat ja vakiot käytössä.Esimerkki on kirjasta
C++Builder5 peruskurssi, Pekka Malmirae,Teknolit v.2000(nykyisin lienee Docend Finland Oy-niminen kustantaja).
Lomakkeelle luotuun "EditEuro"-tekstikenttään näpätään
eurot, klikataan hiirellä niinikään itse luotua paino- nappia "Muunna markoiksi", jolloin toiseen lomakkeelle itse luotuun "EditMarkka"-tekstikenttään ilmestyy "EditEuro"-kentän luku muunnettuna markoiksi.
Luku jaetaan tai kerrotaan määritellyllä vakiolla eurokurssi = 5.94573. Vastaavan koodin olen kirjoittanut otsikkotiedoston editoriin.
Varsinainen asia nyt on kuitenkin fysiikan mekaniikan yhtälöstä vl=sqrt(2*g*h) laskettava vl. Muuttujana on juurrettavan sisällä oleva korkeus h, kahden vakion 2 ja g kolmantena tekijänä. Muuttujalla ei siis voida laskea mitään, ennen
kuin se näpätään(annetaan) tekstikenttään lomakkelle.
Tavanomaisella riviohjelmoinnilla tehtävä on enemmänkin
kuin varsin helppo. Olkoon ohjelmointikieli QBasic, Pascal,
C++, tai vaikka Lisp (jota viimeistä en kylläkään vielä osaa).
Mutta tämä on windows-ohjelmointia(Borlandin C++Builder5), jossa lomakkeelle poimitaan komponentteja hiirellä komponenttipaletista.
Suurin osa koodauksesta tapahtuu automaattisesti, joten ohjelmoinnin
pitäisi olla helpompaa kuin riviohjelmointi. Niinkuin se onkin, niin
kauan kuin on kyse, yhtään vähättelemättä, kerto- tai jakolaskusta
vakiokertoimella.
terveisin arep
En tiedä mitään C++ Builderista, mutta sikäli, kun asialla on jotain tekemistä C++:n kanssa, niin voit varmaan käyttää stringstreameja.
Entä mikset voi vain tehdä näin:
EditNopeus->Text = FloatToStr(sqrt(StrToFloat(EditKorkeus->Text) * 2.0 * 9.81));
Niin, et nyt millään onnistu selittämään, mikä siinä on varsinaisesti ongelma. Osaat laittaa formille komponentteja, poimia textboxista luvun floatiksi, laskea lausekkeen ja laittaa vastauksen takaisin boksiin. Mikä siis on ongelma?
Ymmärsin kyllä, että eurolaskin toimii. Tuon esimerkin annoin, jotta ymmärtäisit sellaisen perusajatuksen, että ei ole pakko tunkea kaikkea yhteen lauseeseen.
const double g = 9.81; double h = StrToFloat(Korkeus->Text); double v = sqrt(2.0 * g * h); Nopeus->Text = FloatToStr(v);
os:n antama vinkki 22.2.2006 toimii täysin! Siis
{ EditNopeus->Text = FloatToStr(sqrt(StrToFloat( EditKorkeus->Text)* 2.0 * 9.81)); }
on täysin toiminva. Tässä voi tietysti käyttää alussa määriteltävää vakiota const double = 9.81, varsinkin yleisemmin mutkikkaammissa projekteissa, jos vakiota tarvitaan useissa jäsenfunktioissa. Vaikkapa vain samassa jäsenfunktiossa, kun tehtävä asetetaan toisin päin: annetaan loppunopeus ja kysytään putoamiskorkeutta. Oma yritelmäni oli melko lähellä saamaani neuvoa.
Sori vaan tätä huonoa tekstinkäsittelyäni, en saa tämän laatikon sisään tasaisia pitkiä rivejä. Jokin asetus lienee koneessanani puutteellinen. Mutta itse ohjelmointihan on tärkeintä, eikö vain.
Terveisin
arep
Aihe on jo aika vanha, joten et voi enää vastata siihen.