Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C Programm springender Ball dringend Hilfe gesucht.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.06.2008, 14:40 Uhr
hatmax1



hallo leute,
ich muss für meinen informatikschein ein programm mit dem lcc compiler schreiben. es soll einen springenden ball simulieren und in einer bmp automatisch speichern. ich habe nun die physikalischen gleichungen mit if bedingungen aufgestellt im hauptprogramm. werte einlesen funktioniert, jedoch sagt der compiler mir zwei fehler in zeile 88. einmal "found double expecting a function" und "operands of / have illegal types 'void' and 'double' ".
hier der text des programms. derjenige, der es schafft, dass das dingen läuft und in der grafik abspeichert kriegt von mir 20euro, da es bis montag klappen muss.


code:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "bmp.h"


#define name
#define PATH "g:\\name.bmp"


// Groesse des Bildes
#define XDIM 640
#define YDIM 960

// Farbe fuer Koordinatensystem
#define COLOR_C 0,0,0

// Farbe fuer Geschwindigkeit
#define COLOR_V 255,0,0

// Farbe fuer Hoehe
#define COLOR_H 0,255,0

// Erdanziehung
#define G (-9.81)

/* Prototypen */


double einlesend(char * ausgabe);
void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b);
void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b);
double mind(double c, double * vec);
double maxd(double c, double * vec);

int h;
int main(int argc, char * argv[])
{
    /* Parameter fuer Simulation */
    double bmass = 1;            // Ballmasse in kg
    double brad  = 0.05;        // Ballradius in m
    double feder = 1000;        // Federkonstante in N/m
    double tstep = 0.001;        // Schrittweite der Simulation
    double tend = 50;            // Simulationszeit in s

    double h = 5;                // Fallhoehe in m
    double v = 0;                // Anfangsgeschwindigkeit in m/s


    int veclength = (int) tend / tstep;
    double * vvec;                    // Dynamisches Array fuer Geschwindigkeit
    double * hvec;                    // Dynamisches Array fuer Hoehe

    int i;

    /*---- Eingabe ----*/

    puts("Simulation eines Balls");
    puts("Eingabe der Parameter fuer den Ball:");
    puts("name der datei eingeben:");
    puts("Parameter fuer Simulation");


    bmass = einlesend("Masse (kg): ");
    brad  = einlesend("Radius (m): ");
    feder = einlesend("Federkonstante in N/m: ");
    h     = einlesend("Fallhoehe (m): ");
    v     = 0;
    tend  = einlesend("Dauer der Simulation (s): ");


    /*---- Verarbeitung ----*/
    // Speicher fuer Ergebnisvectoren besorgen
    vvec = (double *) malloc(veclength * sizeof(double));
    hvec = (double *) malloc(veclength * sizeof(double));
    vvec[0] = v;
    hvec[0] = h;

    for(i=1; i<veclength; ++i){
        double dh,dv;
        if(dh>=brad)
    {
        vvec[i] = G * tstep;
        hvec[i] = h+0.5*G*tstep*tstep;
    }
        if(dh<=brad)
    {

ZEILE 88 ------------------>
vvec[i]=vvec[i-1]+tstep*(G+(feder(brad-hvec[i-1]))/bmass);
        hvec[i]=hvec[i-1]+vvec[i]+tstep+(0.5*G+(feder*(brad-hvec[i-1]))/bmass)*tstep*tstep;

    }
        if(dh>=brad)
    {
        vvec[i]=vvec[i-1]+G*tstep;
        hvec[i]=hvec[i-1]+vvec[i-1]*tstep+0.5*G*tstep*tstep;
    }

        vvec[i] = dv;
        hvec[i] = dh;
    }

    /*---- Ausgabe (Bild) ----*/

    /* Neue Grafikdatei erzeugen */
    bmpNew(XDIM,YDIM);

    //bmpLine(0,0,10,10, 0,0,0);

    /* Hoehe einzeichnen */
    plot(veclength, hvec, 20, 520, 600, 420, COLOR_H);
    koordsys(20, 520,600,420,COLOR_C);

    plot(veclength, vvec, 20, 20, 600, 420, COLOR_V);
    koordsys(20, 20,600,420,COLOR_V);


    printf("Bild nach %s gespeichert\n",PATH);
    puts("Info:");
    puts("Oben im Bild: Hoehe");
    bmpSave(PATH);

    free(vvec);
    free(hvec);

    return 0;
}


/*
* Zeichnet die Punkte in y mit linien verbunden auf ein Bild
* Parameter
*     c        : Anzahl der Werte im Array y
*     y        : Array mit den Zu plottenden Werten
*     xn        : Beginn des Plottens x-Wert
*  yn        : Beginn des Plottens y-Wert
*  dimx    : Breite des Plottfeldes
*  dimy    : H?he des Plottfeldes
*  r,g,b    : Farbwert mit denen der Graph geplottet wird
*/

void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b){
    int ynull, scalex;
    double ymin, ymax, scaley;
    double oldy,newy;
    int   oldx,newx, i;

    // Minimaler und Maximaler Wert die zu Plotten sind
    ymin = 0; ymax = h;

    // Skalierung in x und y Richtung (ceil aufrunden)
    scaley = (double) dimy / (ymax - ymin);
    scalex = ((double)c / (double)dimx);

    // Nullpunkt fuer Koordinatensystem
    ynull = yn;        // Unterster Punkt des Zeichenbereichs
    if(ymin < 0){
        ynull += (-ymin) * (dimy/(ymax-ymin));    // Nullpunkt fuer Koordinatensystem => (xn,ynull)
    }

    // Nulllinie Zeichnen
    bmpLine(xn,ynull,xn+dimx,ynull, r, g, b);

    oldx = xn;            // Beginn des Zeichnens
    oldy = (double)ynull + (y[0] * scaley);

    for(i = 1; i < c; i++ ){

        if((i%(scalex)) == 0){        // jeden scalex-ten wert zeichnen
            newx = oldx+1;
            newy = (double) ynull + (y[i] * scaley);

            // Linie Zeichnen
            bmpLine(oldx,oldy,newx,newy, r,g,b);

            oldx = newx;
            oldy = newy;
        }

    }
}



/*
* Maximalwert im Array ermitteln
* Parameter
* c    : Anzal der Felder in vec
* vec    : Array
*
* Rueckgabe
* Groesster Wert im Array
*/

double maxd(double c, double * vec){
    int i;                // laufvariable
    int max=0xffffffff;    // kleine moegliche Zahl (32bit)
    for(i=0; i<c; ++i){
        if(vec[i] > max)
            max = vec[i];
    }
    return max;
}

/*
* Minimalwert im Array ermitteln
* Parameter
* c    : Anzal der Felder in vec
* vec    : Array
*
* R?ckgabe
* Kleinster Wert im Array
*/

double mind(double c, double * vec) {
    int i;                    // laufvariable
        int min=0x7fffffff;    // groesste moegliche Zahl
        for(i=0; i<c; ++i){
            if(vec[i] < min)
                min = vec[i];
        }
        return min;
}


/*
* Zeichnet Abzisse und Ordinate mit Pfeilspitzen
* Paramerter
*     xn    : x-Ursprung
*  yn    : y-Ursprung
*     dimx: Breite
*  dimy: Hoehe
*     r,g,b: Farbwerte
*/

void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b) {
    // Abzisse
    bmpLine(xn,yn, xn+dimx,yn,r,g,b);
    // Ordinate
    bmpLine(xn,dimy+yn,xn,yn, r,g,b);

    // Pfeilspitzen
    // Abzisse
    bmpLine(xn+dimx, yn, xn+dimx-10, yn+5, r, g, b);
    bmpLine(xn+dimx, yn, xn+dimx-10, yn-5, r, g, b);

    // Ordinate
    bmpLine(xn,yn+dimy, xn-5, yn+dimy-10, r, g, b);
    bmpLine(xn,yn+dimy, xn+5, yn+dimy-10, r, g, b);
}

/*
* Liest von der Tastatur einen Double wert ein
* Gelingt die Eingabe nicht so wird zur erneuten Eingabe aufgefordert.
* Parameter
*     ausgabe    : Info die dem Benutzer praesentiert wird
* Rueckgabe
*     eingelesener Double-Wert
*/

double einlesend(char * ausgabe) {
    double d;

    // Benutzerinfo ausgeben
    printf("%s",ausgabe);

    // Wert von der Tastatur einlesen
    while(scanf("%lf",&d) != 1) {
        printf("Fehler beim Einlesen, bitte nocheinmal: ");
        while('\n' != getchar()){}
    }

    // Wert zurueckliefern
    return d;
}



Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt, nächstes mal selbst machen.


Dieser Post wurde am 21.06.2008 um 15:38 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.06.2008, 15:40 Uhr
0xdeadbeef
Gott
(Operator)


Mit

C++:
double feder = 1000;


wird

C++:
feder(brad-hvec[i-1])


nichts.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.06.2008, 16:09 Uhr
hatmax1



so vielen dank schonmal dafür.jetzt geht es ohne fehler, aber leider zeichnet es noch nix gescheites. zum compilieren braucht man die
folgenden datein:
bmp.h


C++:
/*****************************************************************************
bmp.h

TASK
header-file for bmp routines

STATUS
06/05/14   gi   new
*****************************************************************************/


int  bmpRead (char*);
int  bmpNew (int,int);
int  bmpSave (char*);
void bmpGetParameters (double*,double*,int*,int*,int*);
void bmpGetPixel (int,int,int*,int*,int*);
void bmpSetPixel (int,int,int,int,int);
void bmpLine (int,int,int,int,int,int,int);
void bmpBoldLine (int,int,int,int,int,int,int);
void bmpPolyLine (int,int*,int*,int,int,int);
void bmpBoldPolyLine (int,int*,int*,int,int,int);
void bmpShow (void);



und bmp.lib: die ich hier leider nicht einfügen kann..

mein code sieht bisher so aus:

main.c


C++:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "bmp.h"


#define name
#define PATH "g:\\name.bmp"


// Groesse des Bildes
#define XDIM 640
#define YDIM 960

// Farbe fuer Koordinatensystem
#define COLOR_C 0,0,0

// Farbe fuer Geschwindigkeit
#define COLOR_V 255,0,0

// Farbe fuer Hoehe
#define COLOR_H 0,255,0

// Erdanziehung
#define G (-9.81)

/* Prototypen */


double einlesend(char * ausgabe);
void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b);
void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b);
double mind(double c, double * vec);
double maxd(double c, double * vec);
void zeichnen(void);

int main(int argc, char * argv[])
{
    /* Parameter fuer Simulation */
    double bmass=10;            // Ballmasse in kg
    double brad=0.1;        // Ballradius in m
    double feder=1000;        // Federkonstante in N/m
    double tstep = 0.001;        // Schrittweite der Simulation
    double tend=10;            // Simulationszeit in s
    double tmom;
    double tges;
    double h=8;                // Fallhoehe in m
    double v = 0;                // Anfangsgeschwindigkeit in m/s


    int veclength = (int) tend / tstep;
    double * vvec;                    // Dynamisches Array fuer Geschwindigkeit
    double * hvec;                    // Dynamisches Array fuer Hoehe

    int i;
    int j;

    /*---- Eingabe ----*/

    puts("Simulation eines Balls");
    puts("Eingabe der Parameter fuer den Ball:");

    puts("Parameter fuer Simulation");


    //bmass = einlesend("Masse (kg): ");
    //brad  = einlesend("Radius (m): ");
    //feder = einlesend("Federkonstante in N/m: ");
    //h     = einlesend("Fallhoehe (m): ");
    v     = 0;
    //tend  = einlesend("Dauer der Simulation (s): ");


    /*---- Verarbeitung ----*/
    // Speicher fuer Ergebnisvectoren besorgen
    vvec = (double *) malloc(veclength * sizeof(double));
    hvec = (double *) malloc(veclength * sizeof(double));
    vvec[0] = v;
    hvec[0] = h;

    for(i=j+1;tges+tstep<tend; ++i){
        double dh,dv;

        tmom=0;
        tmom+=tstep;
        do
    {
        dv = G*tmom;
        dh = h+0.5*G*tmom*tmom;

    }    while(dh>=brad);

        do
    {
        vvec[i]=vvec[i-1]+tstep*(G+(feder*(brad-hvec[i-1]))/bmass);
        hvec[i]=hvec[i-1]+vvec[i]+tstep+(0.5*G+(feder*(brad-hvec[i-1]))/bmass)*tstep*tstep;

    }    while(dh<=brad);

        do
    {
        vvec[i]=vvec[i-1]+G*tstep;
        hvec[i]=hvec[i-1]+vvec[i-1]*tstep+0.5*G*tstep*tstep;
    }    while(dh>=brad);

        vvec[i] = dv;
        hvec[i] = dh;


    }



    /*---- Ausgabe (Bild) ----*/

    /* Neue Grafikdatei erzeugen */
    bmpNew(XDIM,YDIM);

    //bmpLine(0,0,10,10, 0,0,0);

    /* Hoehe einzeichnen */
    plot(veclength, hvec, 20, 520, 600, 420, COLOR_H);
    koordsys(20, 520,600,420,COLOR_C);

    plot(veclength, vvec, 20, 20, 600, 420, COLOR_V);
    koordsys(20, 20,600,420,COLOR_V);


    printf("Bild nach %s gespeichert\n",PATH);
    puts("Info:");
    puts("Oben im Bild: Hoehe");
    bmpSave(PATH);

    free(vvec);
    free(hvec);

    return 0;
}


/*
* Zeichnet die Punkte in y mit linien verbunden auf ein Bild
* Parameter
*     c        : Anzahl der Werte im Array y
*     y        : Array mit den Zu plottenden Werten
*     xn        : Beginn des Plottens x-Wert
*  yn        : Beginn des Plottens y-Wert
*  dimx    : Breite des Plottfeldes
*  dimy    : H?he des Plottfeldes
*  r,g,b    : Farbwert mit denen der Graph geplottet wird
*/

void plot(int c, double * y, int xn, int yn, int dimx, int dimy, int r, int g, int b){
    int ynull, scalex;
    double ymin, ymax, scaley;
    double oldy,newy;
    int   oldx,newx, i;

    // Minimaler und Maximaler Wert die zu Plotten sind

    ymin = mind(c,y); ymax = maxd(c,y);

    // Skalierung in x und y Richtung (ceil aufrunden)
    scaley = (double) dimy / (ymax - ymin);
    scalex = ((double)c / (double)dimx);

    // Nullpunkt fuer Koordinatensystem
    ynull = yn;        // Unterster Punkt des Zeichenbereichs
    if(ymin < 0){
        ynull += (-ymin) * (dimy/(ymax-ymin));    // Nullpunkt fuer Koordinatensystem => (xn,ynull)
    }

    // Nulllinie Zeichnen
    bmpLine(xn,ynull,xn+dimx,ynull, r, g, b);

    oldx = xn;            // Beginn des Zeichnens
    oldy = (double)ynull + (y[0] * scaley);

    for(i = 1; i < c; i++ ){

        if((i%(scalex)) == 0){        // jeden scalex-ten wert zeichnen
            newx = oldx+1;
            newy = (double) ynull + (y[i] * scaley);

            // Linie Zeichnen
            bmpLine(oldx,oldy,newx,newy, r,g,b);

            oldx = newx;
            oldy = newy;
        }

    }
}



/*
* Maximalwert im Array ermitteln
* Parameter
* c    : Anzal der Felder in vec
* vec    : Array
*
* Rueckgabe
* Groesster Wert im Array
*/

double maxd(double c, double * vec){
    int i;                // laufvariable
    int max=0xffffffff;    // kleine moegliche Zahl (32bit)
    for(i=0; i<c; ++i){
        if(vec[i] > max)
            max = vec[i];
    }
    return max;
}

/*
* Minimalwert im Array ermitteln
* Parameter
* c    : Anzal der Felder in vec
* vec    : Array
*
* R?ckgabe
* Kleinster Wert im Array
*/

double mind(double c, double * vec) {
    int i;                    // laufvariable
        int min=0x7fffffff;    // groesste moegliche Zahl
        for(i=0; i<c; ++i){
            if(vec[i] < min)
                min = vec[i];
        }
        return min;
}


/*
* Zeichnet Abzisse und Ordinate mit Pfeilspitzen
* Paramerter
*     xn    : x-Ursprung
*  yn    : y-Ursprung
*     dimx: Breite
*  dimy: Hoehe
*     r,g,b: Farbwerte
*/

void koordsys(int xn, int yn,int dimx,int dimy, int r, int g, int b) {
    // Abzisse
    bmpLine(xn,yn, xn+dimx,yn,r,g,b);
    // Ordinate
    bmpLine(xn,dimy+yn,xn,yn, r,g,b);

    // Pfeilspitzen
    // Abzisse
    bmpLine(xn+dimx, yn, xn+dimx-10, yn+5, r, g, b);
    bmpLine(xn+dimx, yn, xn+dimx-10, yn-5, r, g, b);

    // Ordinate
    bmpLine(xn,yn+dimy, xn-5, yn+dimy-10, r, g, b);
    bmpLine(xn,yn+dimy, xn+5, yn+dimy-10, r, g, b);
}

/*
* Liest von der Tastatur einen Double wert ein
* Gelingt die Eingabe nicht so wird zur erneuten Eingabe aufgefordert.
* Parameter
*     ausgabe    : Info die dem Benutzer praesentiert wird
* Rueckgabe
*     eingelesener Double-Wert
*/

double einlesend(char * ausgabe) {
    double d;

    // Benutzerinfo ausgeben
    printf("%s",ausgabe);

    // Wert von der Tastatur einlesen
    while(scanf("%lf",&d) != 1) {
        printf("Fehler beim Einlesen, bitte nocheinmal: ");
        while('\n' != getchar()){}
    }

    // Wert zurueckliefern
    return d;
}



 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.06.2008, 16:16 Uhr
0xdeadbeef
Gott
(Operator)


Junge, wir werden deine Hausaufgabe nicht für dich machen. "Hier ist mein Code, jetzt repariert den mal" funktioniert nicht.

Mindestens eine gute Fehlerbeschreibung muss schon drin sein; und "zeichnet nichts vernünftiges" zählt da nicht. Geh mit nem Debugger ran, finde raus, wo die Dinge schiefgehen, beschreibe, wie sie schiefgehen, dann sehen wir weiter.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.06.2008, 16:19 Uhr
hatmax1



also er zeichnet mir den höhenverlauf als linie vom startpunkt der höhe entlang der y-achse runter und dann entlang der x-achse bis ins unendliche. im geschwindigkeitsdiagramm tut sich gar nichts. das problem ist, dass ich einfach mal null plan von programmieren habe aber den schein brauche um nicht geext zu werden und ich durchaus auch was springen lassen würde.
der debugger aus lcc is mir unklar was der überhaupt machen soll. der zeigt nur immer ne zeile gelb an und dann sagt er mir was über die werte der variablen. is halt wirklich verschickt. bin ja schon froh so weit gekommen zu sein, aber es fehlt jetzt halt noch, dass er richtig rechnet.

gruß max
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.06.2008, 16:27 Uhr
0xdeadbeef
Gott
(Operator)


Um Geld geht's hier nicht. Erstens ist sowas übers Internet ziemlich schwer abzuwickeln, zweitens stehst du da einer Summe von deutlich mehr als 20 Euro gegenüber, und drittens habe ich ernsthafte Zweifel daran, dass auch gegen Bezahlung jemand hier deine Hausaufgaben für dich machen würde.

Wenn du Verständnisprobleme hast, damit helfen wir gerne, aber nicht auf diese Art. Und um den Schein zu kriegen, solltest du eigentlich mehr als "null Plan" von Programmierung haben, oder?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.06.2008, 16:33 Uhr
hatmax1



null plan triffts vielleicht nicht wirklich aber ich weiß einfach gerad gar nicht weiter, warum er mir keine verläufe zeichnet. ich habe die bewegung des balls ja in drei teilbewegungen aufgeteilt. einmal der freie fall, dann der bodenkontakt, wo er sich wie eine feder verhält und dann die erneute aufwärtsbewegung. allerdings schafft er es ja noch ncihtmal zu plotten, wie der freie fall verläuft.das müsste ja eine schräge nach unten sein.ebenso weiß ich nciht warum die geschwindkeit fehlt. das arry hvec und vvec müssten ja beschrieben werden. ich weiß halt auch nicht wie ich zB zwischndrin werte auslese oder den debugger benutze..

gruß max
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: