[c++]quadratische gleichungen fehlersuche

Ich glaub ich gib's auf. Ich hab alles so gemacht wie du es gesagt hast, aber mein DOS-Fenster streikt ;).
Hier Screenshot:
 

Anhänge

  • screenshot.jpg
    screenshot.jpg
    39,1 KB · Aufrufe: 182
Hihi. Um das Laufwerk zu wechseln mußt du nur den Laufwerksbuchstaben mit Doppelpunkt eintippen. Das cd funktionert schon, nur getrennt nach Laufwerk, d.h. du hast auf dem Laufwerk e: das Verzeichnis gewechselt, befindest dich aber auf Laufwerk c: Also daran hatte ich wirklich nicht gedacht... ;)

Code:
<Laufwerk>:
cd \
cd mapm_4.9.2
make -f makefile.unx
So sollte es jedenfalls funktionieren.

Gruß
 
muss ich denn noch irgendeine spezielle headerdatei in meinen code einbiden, denn bis jetzt zegt mein programm das gleiche ergebnis wie zuvor an.
 
Ja, sicher mußt du das.

Außerdem kannst du natürlich nicht mehr die Standard-Typen benutzen sondern die MAPM Klasse.

Du hättest ja auch ruhig mal die Beispielprogramme anschauen können die schon dabei sind.

Hier nochmal ein kleines Beispiel:
Code:
#include <cstdlib>
#include <iostream>
#include <locale>

#include <m_apm.h>

using namespace std;

ostream& operator<< (ostream& out, const MAPM& mapm_var) {
    const int digits = mapm_var.significant_digits();

    char* buffer = new char[digits + 12];
    
    if (out.flags() & ios::fixed) {
      mapm_var.toFixPtString(buffer, digits);
    } else {
      mapm_var.toString(buffer, digits);
    }
    out << buffer;

    delete[] buffer;
    
    return out;
}

istream& operator>> (istream& in, MAPM& mapm_var) {
    // parse a floating point or integer number, if successful
    // assign it to mapm_var.
    // 
    // note: the parsing is somewhat redundant since operator= 
    //       of the MAPM class just calls the mapm_set_string
    //       function which parses the string AGAIN into a
    //       number, but since the function just returns void and
    //       hence does not indicate an error (except printing an
    //       error message on the console) this seems necessary.

    enum  { start,     /* initial state / skip whitespace */
            sign,      /* seen a minus / plus sign */
            integer,   /* read an integer value */
            point,     /* encountered a decimal point */
            floatnum,  /* read a floating point number */
            floateE,   /* floating point number with [eE] suffix */
            floatexp } /* floating point number with exponent and optional plus/minus sign */
          state = start;
    int c;
    string num; 

    const char decimal_point = use_facet<numpunct<char> >(in.getloc()).decimal_point();

    while(in && (c = in.get()) != EOF) {
      if (isspace(c)) {
         if (state == start) continue;
         else break;
      } else if (isdigit(c)) {
         switch (state) {
         case start:                      /* fall through */
         case sign:     state = integer;  /* fall through */
         case integer:  break;

         case point:    state = floatnum; /* fall through */
         case floatnum: break;

         case floateE:  state = floatexp; /* fall through */
         case floatexp: break;
         }
      } else if (c == decimal_point) {
         bool exit_loop = false;

         switch (state) {
         case start:
         case sign:     state = point; break;

         case integer:  state = floatnum; break;

         default:
             exit_loop = true;
         }
         if (exit_loop) break;
      } else if (c == '+' || c == '-') {
         if (state == start) state = sign;
         else if (state == floateE) state = floatexp;
         else break;
      } else if (c == 'e' || c == 'E') {
         if (state == integer || state == floatnum) state = floateE;
         else break;
      } else {
         break;
      }
      num += static_cast<char>(c);
    }
    switch (state) {
    /* accept states. */
    case integer:
    case floatnum:
    case floateE:
    case floatexp:
         mapm_var = num.c_str(); break;
    default:
         in.setstate (ios::failbit);
    }
    return in;
}

int main(int argc, char *argv[])
{
    MAPM a = 5, p = 14, q = "9.8", d;
    
    p /= a;
    q /= a;
    
    d = pow(p/2, 2) - q;
    
    cout << "Diskriminante = " << d << " = " << fixed << d << endl;
           
    system("PAUSE");
    return EXIT_SUCCESS;
}

Gruß
 
Super, jetzt funktioniert es. Eine Frage noch, wie kann ich überflüssige Nullen im fixed-Format abschneiden? Außerdem möchte ich die Zahlen nur mit einer bestimmten Anzahl von Stellen angezeigt bekommen, wobei die letzte Ziffer gerundet wird. Wie geht das?
 
Du kannst einfach auf eine bestimmte Genauigkeit (sprich: bestimmte Anzahl von Nachkommastellen) runden. Dazu besitzt die MAPM Klasse eine round() Mehtode.

Die Dokumentation der vorhandenen C Funktionen befindet sich übrigens in der Datei function.ref. Die sollteste dir mal anschauen. Die MAPM Klasse ist einfach in der m_apm.h Datei definiert, so das du da einfach schauen kannst welche Methoden die Klasse sonst noch besitzt. Meist kannst du zu jeder Operation eine Genauigkeit angeben.

Du kannst ja evtl. den Ausgabeoperator weiter anpassen:
Code:
#include <algorithm>

ostream& operator<< (ostream& out, const MAPM& mapm_var) {
    const int digits = mapm_var.significant_digits();

    char* buffer = new char[digits + 12];
    
    if (mapm_var.is_integer()) {
      mapm_var.toIntegerString(buffer);
    } else if (out.flags() & ios::fixed) {
      mapm_var.toFixPtStringEx(buffer, min(out.precision(), digits));
    } else {
      mapm_var.toString(buffer, min(out.precision(), digits));
    }
    out << buffer;

    delete[] buffer;
    
    return out;
}
Ansonsten kannst du die Nullen ja auch selbst noch abschneiden wenn da welche übrig bleiben.

Gruß
 
Zurück