minsec Funktion

minsec Funktion

Beitragvon nomihoudai » 05.06.2010 10:50

Hallo, ich habe zwar jetzt die Aufgabe soweit in einer main funktion kann das Ganze aber nicht auf 3 einzelfunktionen aufteilen , wo liegt der Fehler ??

Also alles in einer main:

Code: Alles auswählen
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>

using namespace std;

const int aa=2; // Anzahl der Abfragen

struct minsec {
  char name[10];
  int min;
  int sec;
} times [aa];

int main ()
{
//Funktion abfragen von hier...
    for (int n=0; n<aa; n++)
    {
    cout << "Enter name: ";
    cin >> times[n].name;
    cout << "Enter min: ";
    cin >> times[n].min;
    cout << "Enter sec: ";
    cin >> times[n].sec;
    }
//...bis hier

//Funktion addieren...
cout << "Bitte geben Sie ein welche beiden Zeiten addiert werden sollen";
int a;
int b;
cin >> a;
cin >> b;
int zss = times[a].sec + times[b].sec; //zwischenspeciher für beide Sekundenwerte
int newsec = zss%60;
double newmin = floor (zss/60) + times[a].min + times[b].min;
cout << newmin <<":"<< newsec <<endl;
//...geht bis hier

//Funktion printen von hier...
cout << "\n You have entered these times: \n\n";
for (int n=0; n<aa; n++)
{
    cout << times[n].name << endl;
    cout << times[n].min;
    cout << ":" << times[n].sec << "\n\n";
}
//...bis hier
system("pause");
}


und so wollte ich es aufspalten, das programm verliert aber die gespeicherten Werte nach ausführen der eingabefunktion:

Code: Alles auswählen
#include <iostream>
#include <string>
#include <sstream>
#include <cmath>

using namespace std;

const int aa=2; // Anzahl der Abfragen

struct minsec {
  char name[10];
  int min;
  int sec;
} times [aa];

void abfragentimes (minsec time)
{
    {
    cout << "Enter name: ";
    cin >> time.name;
    cout << "Enter min: ";
    cin >> time.min;
    cout << "Enter sec: ";
    cin >> time.sec;
    }
}

void printtimes (minsec time)
{
    cout << time.name << endl;
    cout << time.min;
    cout << ":" << time.sec << "\n\n";
}

void addtimes ( int a, int b)
{
    int zss = times[a].sec + times[b].sec; //zwischenspeciher für beide Sekundenwerte
    int newsec = zss%60;
    double newmin = floor (zss/60) + times[a].min + times[b].min;
    cout << newmin <<":"<< newsec <<endl;
}

int main ()
{



    for (int n=0; n<aa; n++)
    {
        abfragentimes (times[n]);
    }
   
    cout << "Bitte geben Sie ein welche beiden Zeiten addiert werden sollen";
    int a;
    int b;
    cin >> a;
    cin >> b;
    addtimes (a , b);
       
    cout << "\n You have entered these times: \n\n";
   
    for (int n=0; n<aa; n++)
    {
        printtimes (times[n]);
    }
   
    system("pause");
}


Vielen Dank falls Jemand den Fehler sieht!
nomihoudai
 
Beiträge: 14
Registriert: 09.12.2009 22:52

Re: minsec Funktion

Beitragvon CommanderTomalak » 05.06.2010 17:40

Keine Ahnung, wo bei dir der Fehler ist o0 ich würde das aber tendenziell sowieso ganz anders machen (wenn man davon absieht, dass ich das mit ner Klasse und nicht mit nem Struct gelöst hab^^). Ich würde in der Main-Schleife zwei Instanzen von deinem Typ anlegen und die von den Funktionen dann bearbeiten lassen. Also ungefähr so:

Code: Alles auswählen
typedef struct {
  int min;
  int sek;
} minsek;

int main()
{
  minsek time1, time2, time3;
 
  // Zeiten Einlesen
  cin >> min1 >> sek1 >> min2 >> sek2;
 
  time1 = einlesen(min1, sek1);
  time2 = einlesen(min2, sek2);
 
  ausgeben(time1);
  ausgeben(time2);
 
  time3 = addiere(time1, time2);
 
  ausgeben(time3);
 
  return 0;
}


minsek einlesen(int min, int sek)
{
  minsek time;
 
  time.min = min;
  time.sek = sek;
 
  return time;
}

void ausgeben(minsek time)
{
  cout << time.min << ":" << time.sek;
}

minsek addiere(minsek time1, minsek time2)
{
  minsek ret;
 
  int minR = time1.min + time2.min;
  int sekR = time1.sek + time2.sek;
 
  if(sekR <= 60)
  {
    minR += sekR / 60; // Bei Int-Division wird automatisch abgerundet ;)
    sekR = sekR % 60;
  }
 
  ret.min = minR;
  ret.sek = sekR;
 
  return ret;
}




falls jemand motiviert ist und wissen will, wie man das mit ner Klasse geschickt umsetzen kann:

main.cpp
Code: Alles auswählen
/**
* Programmieren für Physiker, SS2010
* Kevin Edelmann
*
* Blatt 8, minsek-Struktur
*/

#include <iostream>
#include <string>
#include <string.h>
#include "minsek.h"

using namespace std;

int main()
{
    int min1, sek1, min2, sek2;
   
    // Get data from user
    cout << endl << "Adding of two given times" << endl;
   
    cout << "Time 1 (Min, Sek):" << endl;
    cin >> min1;
    cin >> sek1;
   
    cout << endl << "Time 2 (Min, Sek):" << endl;
    cin >> min2;
    cin >> sek2;
   
    cout << endl;
   
    // Write data to objects
    minsek time1(min1, sek1), time2(min2, sek2), time3;
   
    // Add the times
    time3 = time1 + time2;
   
    // Output result
    cout << "The sum of " << time1 << " and " << time2 << " is: " << time3 << endl;
   
    return 0;
}


minsek.h
Code: Alles auswählen
#include <iostream>

using namespace std;

class minsek
{
    public:
        // Constructors
        minsek();
        minsek(int min, int sek);
       
        // Member methods
        void setTime(int min, int sek);
        void doOut();
       
        // Overloading
        friend minsek operator+(const minsek& time1, const minsek& time2);
        friend ostream& operator<<(ostream& Stream, const minsek& time);
       
    private:
        // Membervars
        int min;
        int sek;
};



minsek.cpp
Code: Alles auswählen
#include <iostream>
#include <string>
#include <string.h>
#include <sstream>
#include "minsek.h"

using namespace std;

/**
* Constructors
*/
minsek::minsek() : min(0), sek(0) { }
minsek::minsek(int min1, int sek1)
{
    setTime(min1, sek1);
}

/**
* Set time
*/
void minsek::setTime(int min, int sek)
{
    // Handle too big seconds
    if(sek >= 60)
    {
        min += sek / 60;
        sek = sek % 60;
    }
   
    // Write data to member vars
    this -> min = min;
    this -> sek = sek;
}

/**
* Output content directly to console
*/
void minsek::doOut()
{
    cout << *this << endl;
}

/**
* Overloads the + operator
*/
minsek operator+(const minsek& time1, const minsek& time2)
{
    int min = time1.min + time2.min;
    int sek = time1.sek + time2.sek;
   
    min += sek / 60;
    sek = sek % 60;
   
    minsek ret(min, sek);
   
    return ret;
}

/**
* Overloads the stream output operator
* Generate formatted output
*/
ostream& operator<<(ostream& Stream, const minsek& time)
{
    stringstream str;
    string ret;
   
    // Write data to stream
    str << time.min << ":";
   
    // Leading zero if minutes are less then 10
    if(time.sek < 10) str << "0";
   
    str << time.sek;
   
    // Get string from stream
    str >> ret;
   
    return Stream << ret;
}
"Das Volk hat das Vertrauen der Regierung verscherzt. Wäre es da nicht doch einfacher, die Regierung löste das Volk auf und wählte ein anderes?"
- Bertolt Brecht
CommanderTomalak
 
Beiträge: 204
Registriert: 19.01.2009 00:42
Wohnort: Karlsruhe

Re: minsec Funktion

Beitragvon moggi » 06.06.2010 22:20

Hi,

das Problem ist, das du keine Referenzen verwendest. Änderst du deine Funktionen so ab das dort steht:

Code: Alles auswählen
struct minsec {
  char name[10];
  int min;
  int sec;
} times [aa];

void abfragentimes (minsec& time)
{
    {
    cout << "Enter name: ";
    cin >> time.name;
    cout << "Enter min: ";
    cin >> time.min;
    cout << "Enter sec: ";
    cin >> time.sec;
    }
}


Ansonsten arbeitest du mit lokalen Kopien, daher wird der Wert in eine neue Variable kopiert, die jedoch am Ende der Funktion verschwindet. Benutzt du eine Referenz, so wird mit der Variable aus deinem Hauptprogramm gearbeitet. Generell empfiehlt es sich vor allem bei komplexeren Typen Referenzen zu übergeben, da dadurch nur ein Zeiger kopiert wird. Will man nicht das die Funktion die Daten maipuliert so setzt man noch ein const davor.
moggi
 
Beiträge: 60
Registriert: 10.11.2008 01:16

Re: minsec Funktion

Beitragvon nomihoudai » 13.06.2010 11:55

Vielen Dank !! ( Sorry für die späte Antwort aber ich war ein paar Tage weg ;) )
nomihoudai
 
Beiträge: 14
Registriert: 09.12.2009 22:52


Zurück zu Programmieren

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron