Svigermors drøm Skrevet 28. april 2013 Del Skrevet 28. april 2013 Skal testes, takk Lenke til kommentar
Gjest Gjest slettet-ld9eg7s96q Skrevet 28. april 2013 Del Skrevet 28. april 2013 Senere når du føler for å bevege deg over til et litt mer avansert oppsett kan du eksperimentere litt med GUI programmering. Jeg har snekret sammen en dialogboks for deg med bruk av QT rammeverk: mainwindow.h: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <cmath> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushKalkuler_clicked(); private: Ui::MainWindow *ui; double kalkulerBMI(double lengde, double vekt); QString hentResultatText(double bmi); }; #endif // MAINWINDOW_H mainwindow.cpp: #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->labelResultat->hide(); ui->labelResultatData->hide(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushKalkuler_clicked() { ui->labelResultatData->setText( hentResultatText( kalkulerBMI( ui->lineLength->text().toDouble(), ui->lineWeigth->text().toDouble() ))); ui->labelResultat->show(); ui->labelResultatData->show(); } double MainWindow::kalkulerBMI(double lengde, double vekt) { return vekt / pow(lengde / 100, 2); } QString MainWindow::hentResultatText(double bmi) { if (bmi < 18.5) { return "Du er undervektig"; } else if (bmi > 18.5 && bmi < 24.9) { return "Du har normalvekt"; } else if (bmi > 24.9 && bmi < 29.9) { return "Du er overvektig"; } else if (bmi > 29.9 && bmi < 34.9) { return "Du faller under kategorien fedme"; } else if (bmi > 34.9 && bmi < 39.9) { return "Du faller under kategorien diger"; } else { return "Ditt fleskeberg!!"; } } main.cpp: #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } Kildekoden kan du laste ned her: https://dl.dropboxus...ikalkulator.zip QT kan du laste ned her: http://qt-project.org/downloads Lenke til kommentar
Svigermors drøm Skrevet 29. april 2013 Del Skrevet 29. april 2013 Det må jeg få til Skal gjøre ferdig kalkulatoren først, er ikke helt fornøyd enda. Finnes det andre programmer for å lage 2D-programmer? Lenke til kommentar
Gjest Gjest slettet-ld9eg7s96q Skrevet 29. april 2013 Del Skrevet 29. april 2013 (endret) Det må jeg få til Skal gjøre ferdig kalkulatoren først, er ikke helt fornøyd enda. Finnes det andre programmer for å lage 2D-programmer? QT er ikke et program, det er et rammeverk - en samling biblioteker du bruker som et verktøy for å kode GUI applikasjoner i C++. Det finnes mange andre rammeverk i C++, deriblant GTK+, WxWindows og MSFC, men QT er etter min mening det beste, enkleste og mest komplette alternativet. QT har også en del 3D rutiner og fungerer utmerket sammen med OpenGL. Endret 29. april 2013 av Gjest slettet-ld9eg7s96q Lenke til kommentar
Svigermors drøm Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 (endret) Da var det klasser som står for tur.. Noen som er gode på å forklare det? Tanken er at siden mitt begynnerprosjekt er en kalkulator, så burde jeg få "classes and objects" in her. Jeg sliter med å få funksjoner til å bli godkjent i int main(). #include <iostream> #include <string> using namespace std; class minklasse{ public: int getrart(){ return rart; } private: int rart(){ int a; int b; int sum; cout << "Hva er a?" << endl; cin >> a; cout << "Hva er b?" << endl; cin >> b; sum = a+b; cout << "Til sammen blir dette " << sum << endl; return 0; }; }; int main(){ minklasse meg; meg.getrart; cout << meg.getrart(); cin.get(); return 0; } Veldig enkelt bygd, men hvor bør jeg skrive inn funksjonen/utregningen, osv. Hvordan bør slikt gjøres? Dette er altså ikke kalkulatoren min, men jeg tester i dette vedlegget før jeg gjør det videre i kalkulatoren min. Endret 1. mai 2013 av Svigermors drøm Lenke til kommentar
Lycantrophe Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 (endret) rart er en metode, ikke en variabel. Prøv int getrart() { return rart(); } Endret 1. mai 2013 av Lycantrophe Lenke til kommentar
Svigermors drøm Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Det funket, men jeg fikk en loop slik at jeg måtte skrive inn dataene 2 ganger, altså at funskjonen gikk 2 ganger. Noen som vet hvorfor ? Lenke til kommentar
Lycantrophe Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Du kaller den to ganger: meg.getrart; cout << meg.getrart(); Du bør også jobbe med navnegivningen din. Lenke til kommentar
Svigermors drøm Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Takker for hjelpen Angående navnegivningen min så er dette bare noe jeg samlet sammen raskt sammen for test, blir ikke slik på det skikkelige prosjektet mitt Lenke til kommentar
Jaffe Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Jeg vet ikke hvordan kalkulatoren din skal bli, men slik det er nå så er det ingen spesiell grunn til å legge den i en klasse (dette er da ikke Java ). Det er heller ingen grunn til at du har kalkulatormetoden privat når det eneste getrart gjør er å kalle den uansett. Lenke til kommentar
Svigermors drøm Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Det kan stemme, dette er mest for å lære meg klasser. Hva er grunnen til dette med private og public? Lenke til kommentar
Nickless Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 (endret) Det kan stemme, dette er mest for å lære meg klasser. Hva er grunnen til dette med private og public? Public funksjoner brukes dersom du tillater at en bruker gjør endringer på et objekt/instanse av klassen. Dersom du har private funksjoner har ikke brukeren tilgang til funksjonen. Private funksjoner kan bare kalles innad i klassen. En private funksjon kan forsåvidt kalles av alle andre funksjoner innenfor samme klasse. Så: Dersom du ikke vil at en bruker skal ha tilgang på en funksjon settes den som private. Et dårlig psuedokode-eksempel, men håper du skjønner tegningen //HOVEDFUNKSJONEN main() { Klassenavn instance; //instanse av klassen Klassaenavn instance.eksempel(); //Dette er lov siden funksjonen er public. instance.something() //Compile-error siden funksjonen er private. } //EN KLASSE MED NAVN Klassenavn public Klassenavn::eksempel() { this.something(); //Dette er lov siden funksjonen something() er under samme klasse som eksempel() } private Klassenavn::something() { } Med tanke på klasse-medlemmer som f.eks int, char, arrays osv så settes de private slik at en bruker ikke kan sette dem direkte. Anta at integeren myInteger under er private. myInteger = 1; //Ikke lov siden den er private. public void Class::set_my_integer(int newValue) { myInteger = newValue //Dette er lov siden set_my_integer() er public og myInteger (liksom) er en klasse-medlem av denne klassen. } Står masse om dette rundt omkring, f.eks her http://uk.answers.yahoo.com/question/index?qid=20120123081148AAxdgeG Endret 1. mai 2013 av Nickless Lenke til kommentar
Svigermors drøm Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Kay, godt fortalt Er dette riktig bruk av public og private? #include <iostream> #include <string> using namespace std; class hurtighet{ public: int getfart(){ return fart(); } private: int fart(){ int valg2; int valg3; cout <<"Hvilken enhet har du?" << endl; cout <<"Knop = 1" << endl; cout <<"Miles per hour = 2" << endl; cout <<"Kilometer i timen = 3" << endl; cin >> valg2; cout <<"Hvilken enhet vil du ha?" << endl; cout <<"Knop = 1" << endl; cout <<"Miles per hour = 2" << endl; cout <<"Kilometer i timen = 3" << endl; cin >> valg3; if(valg2 == 1 && valg3 == 2){ double valg4; cout <<"Hvor mange knop?" << endl; cin >> valg4; cout << valg4 << " Knop, er: " << valg4 * 1.1507784 <<" Miles per hour" << endl; } else if(valg2 == 1 && valg3 == 3){ double valg5; cout <<"Hvor mange knop?" << endl; cin >> valg5; cout << valg5 << " Knop, er: " << valg5 * 1.8519984 <<" Kilometer i timen" << endl; } else if(valg2 == 2 && valg3 == 1){ double valg6; cout <<"Hvor mange Mp/h?" << endl; cin >> valg6; cout << valg6 <<" Mp/h, er: " << valg6 * 0.8689769 <<" Knop" << endl; } else if(valg2 == 2 && valg3 == 3){ double valg7; cout <<"Hvor mange Mp/h?" << endl; cin >> valg7; cout << valg7 <<" Mp/h, er: " << valg7 * 1.609344 <<" Kilometer i timen" << endl; } else if(valg2 == 3 && valg3 == 1){ double valg8; cout <<"Hvor mange Km/t?" << endl; cin >> valg8; cout << valg8 <<" Km/t, er: " << valg8 * 0.6213711 <<" Knop" << endl; } else if(valg2 == 3 && valg3 == 2){ double valg9; cout <<"Hvor mange Km/t?" << endl; cin >> valg9; cout << valg9 <<" Km/t, er: " << valg9 * 0.6213711 <<" Miles per hour" << endl; } return 0; }; }; int main(){ hurtighet speed; cout << speed.getfart(); cin.get(); return 0; } Som sagt er dette bare en test for å lære klasser 1 Lenke til kommentar
Nickless Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Som sagt er dette bare en test for å lære klasser Yes, tankegangen din ser rett ut Siden du bare trikser og mikser for å lære nå så anbefaler jeg deg å bruke constructor når du lager instanser. Pluss at du burde alltid legge til en else{} i if-setninger. Man vet aldri når noe går galt, dvs dersom ingen av else if() slår til så vil programmet bare terminere. Derfor kan det være lurt med else{}. Med andre ord dersom ingen av testene slår til vil den gå inn i else{}. else if(valg2 == 3 && valg3 == 2){ double valg9; cout <<"Hvor mange Km/t?" << endl; cin >> valg9; cout << valg9 <<" Km/t, er: " << valg9 * 0.6213711 <<" Miles per hour" << endl; } else{ cout << "Dette skulle egentlig ikke skje, men det skjedde uansett " << endl; } Lenke til kommentar
Svigermors drøm Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Skal gjøre ! Men, er instanser eit opplegg i C++ eller eit vanlegt norsk ord? Har ikkje høyrt om det. Lenke til kommentar
Nickless Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Instanse (instance) er et vanlig ord innen objektorientert programmering Dvs f.eks C++, Java, Python etc. http://en.wikipedia.org/wiki/Instance_(computer_science) Lenke til kommentar
Jaffe Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Da var det klasser som står for tur.. Noen som er gode på å forklare det? Tanken er at siden mitt begynnerprosjekt er en kalkulator, så burde jeg få "classes and objects" in her. (...) Vet ikke om jeg er så god på å forklare det, men hovedideen med objektorientering er at du samler data og metoder som hører sammen til ett objekt. La oss si at du f.eks. skal lage et enkelt 2D-spill. En hver ting/figur/etc. som beveger seg i det spillet vil da ha en x-koordinat og en y-koordinat, en høyde og en bredde, en hastighet i henholdsvis x- og y-retning, og for eksempel en array med pikslene som den består av (og sikkert mye mer). Det er da helt naturlig å linke alle disse størrelsene sammen til ett objekt. Da har du én ting å forholde deg til i stedet for at du selv må huske hvilken x-koordinat som hører til hvilken y-koordinat og så videre. I tillegg skal objektet kanskje gjøre forskjellige ting, det kan f.eks. være at det skal gå an å rotere det, få det til å gjøre en eller annen animasjon, osv. Dette er operasjoner som er spesifikke for objektet og som gjør ting med det. Slike operasjoner er det også naturlig at er en del av objektet selv, og vi kaller dem for metoder. Så kort sagt: et objekt består av variabler og metoder som gjør et eller annet relatert til objektet. En klasse kan du tenke på som "malen" for hvordan et objekt skal se ut. Klassen beskriver variablene og metodene som et objekt skal bestå av. En klasse som beskriver de objektene jeg snakket om ovenfor vil f.eks. kunne se slik ut: class Figur { private: int x, y, b, h; // koordinater og bredde, høyde float hx, hy; // hastigheter char* piksler; public: void plasser(int ny_x, ny_y); void roter(blabla); void animer(blabla); void flytt(int dx, int dy); } Når vi da skriver Figur a; Figur b; vil vi opprette to separate figurer (vi kaller disse instanser av klassen Figur), a og b, som begge har de bestanddelene som var definert i klassen. De vil ha hver sine x-, y-koordinater og så videre, og hvis vi kaller a.roter() så vil a roteres, uten at det skjer noe med b. Dette er hovedideen, men objektorientering dreier seg om mye mer. Jeg syns det er ok oppsummert på disse sidene her. Lenke til kommentar
Lycantrophe Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Vet ikke om jeg er så god på å forklare det, men hovedideen med objektorientering er at du samler data og metoder som hører sammen til ett objekt. Nei. OO handler om message passing. Lenke til kommentar
Jaffe Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Nei. OO handler om message passing. Ja, objektorientering er mer enn "objekter med variabler og metoder", men motivasjonen (for nybegynnere) for å benytte klasser er vel nettopp å samle data og kode som hører sammen på den måten. Lenke til kommentar
Lycantrophe Skrevet 1. mai 2013 Del Skrevet 1. mai 2013 Det er jeg uenig i, og det gir oss en endeløs strøm av middelmådige Java-programmere. Objektorientering er vanskelig. Motivasjonene for å gjøre det er mange og gevinstene er tidvis utrolig store. Men klassene/objektene har aldri vært hovedidéen i OO (ironisk nok :>). Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå