Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ich verstehe das nicht...

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
19.12.2015, 00:48 Uhr
Yadgar



Hi(gh)!

Es hat bis gestern funktioniert: für jeden Monat das korrekte Monats-Temperaturmittel und am Ende das Jahres-Temperaturmittel.

Dann muss ich irgendetwas verändert haben (leider weiß ich nicht mehr, was), und seither wird für alle Monate wie auch für das ganze Jahr der Monatsmittelwert für Januar angezeigt. Warum?!?

Hier ist der Code:


C++:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <sstream>
#include <math.h>

using namespace std;


int main()
{
  // READING IN ORIGINAL DATA

  string station;
  string jahr;
  ifstream Quelle;
  string QuelleName, zeile, subzeile;
  string monate[] = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
  char zahl;
  unsigned short monat, messtemp = 0, messnied, tag = 0, pos1, pos2, eistage = 0, frosttage = 0, warmtage = 0, sommertage = 0, tropentage = 0, kalendertag, jahrzahl=0, i;
  unsigned short messtemp_monat[12];
  unsigned short monlaengen[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  float temp, jahrsumm_temp = 0, jahrmitt_temp;
  float monsummen_temp[12];
  float monmittel_temp[12];
  stringstream conv;  

  cout << "Station: ";
  cin >> station;
  cout << "Jahr: ";
  cin >> jahr;
  
  for (i=0; i<4; i++)
    jahrzahl += (jahr[i]-48)*pow(10, 3-i);
  
  
  cout << jahrzahl << endl;
  if (jahrzahl % 4 == 0) // Berücksichtigung von Schaltjahren
    monlaengen[1] = 29;
  
  
  
  for (monat = 1; monat <= 12; monat++)
  {
    monsummen_temp[monat-1] = 0;
    messtemp_monat[monat-1] = 0;
    conv << jahr << "-" << setw (2) << setfill ('0') << monat << setw (0) << "_Temperatur.txt";
    conv >> QuelleName;
    Quelle.open(QuelleName.c_str());

    if (!Quelle)
    {
      cerr << QuelleName << " kann nicht geöffnet werden!\n";
      return 1;
    }

    while (getline(Quelle, zeile))
    {
      pos1 = zeile.find("\t");
      pos2 = zeile.rfind("°");
      subzeile = zeile.substr(pos1+1, pos2-pos1-1);
      if (subzeile.find("--") == 0) // fehlende Messdaten
    continue;
      pos1 = subzeile.find(",");
      subzeile.replace(pos1, 1, ".");
      temp = stof(subzeile);
      jahrsumm_temp += temp;
      monsummen_temp[monat-1] += temp;
      messtemp++;
      messtemp_monat[monat-1]++;
      pos1 = zeile.find(".");
      /* subzeile = zeile.substr(0, pos1);
      cout << subzeile << endl; */

    }  
    Quelle.close();
    monmittel_temp[monat-1] = monsummen_temp[monat-1]/messtemp_monat[monat-1];
    cout << "Monatsmittel " << monate[monat-1] << ": " << monmittel_temp[monat-1] << endl;
  }  
  
  jahrmitt_temp = jahrsumm_temp/messtemp;
  cout << jahrsumm_temp << endl;
  cout << messtemp << endl;
  cout << "Jahres-Temperaturmittel von " << station << " für " << jahr << ": " << jahrmitt_temp << " °C" << endl;

  return 0;
}



Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.12.2015, 05:30 Uhr
Hans
Library Walker
(Operator)


Hi,

hast Du auch einen Testdatensatz dazu, womit man das überprüfen kann?
Ich denke da an eine Textdatei, die man mittels Eingabeumlenkung an das Programm übergibt, also etwa so:

Code:
programmname < Eingabedatei > Ausgabedatei



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.12.2015, 05:43 Uhr
Yadgar



Hi(gh)!


Zitat von Hans:

hast Du auch einen Testdatensatz dazu, womit man das überprüfen kann?
Ich denke da an eine Textdatei, die man mittels Eingabeumlenkung an das Programm übergibt, also etwa so:

Code:
programmname < Eingabedatei > Ausgabedatei



Hans


Datensätze zum Testen habe ich - aber die sind zu lang, um sie hier als Text zu posten, und mit der Verlinkungsfunktion scheint hier etwas nicht zu funktionieren (siehe mein Posting zum Thema "Höhenlinien-Interpolation")...

Oder kannst du mir da auf die Sprünge helfen?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 19.12.2015 um 05:43 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.12.2015, 21:30 Uhr
Hans
Library Walker
(Operator)


Hi,

zum verlinken hast Du zwei Möglichkeiten: Entweder Du schreibst eine komplette www-Adresse hin. Die wandelt die Forensoftware dann die automatisch in einen Link um, sofern der Haken an der Option unten gesetzt ist. Oder Du nutzt die BB-Codes "url" und "/url" in eckigen Klammern. Ein link zu einem Buch sieht dann z.B. so aus:

Code:
[ url=https://www.buchhandel.de/buch/Algorithmen-9783868941845 ]Algorithmen von Robert Sedgewick [ /url ]


Hier hab ich die Leerzeichen nach den eckigen Klammern gesetzt, damit die erhalten bleiben, und der BB-Code nicht ausgewertet wird. Im Text könnte das dann so aussehen: "Zum Thema Algorithmen finde ich u.a. das Buch Algorithmen von Robert Sedgewick ganz brauchbar, die in dieser Auflage in Java präsentiert werden."

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 19.12.2015 um 21:31 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.12.2015, 01:08 Uhr
Yadgar



Hi(gh)!


Zitat von Hans:

zum verlinken hast Du zwei Möglichkeiten: Entweder Du schreibst eine komplette www-Adresse hin. Die wandelt die Forensoftware dann die automatisch in einen Link um, sofern der Haken an der Option unten gesetzt ist. Oder Du nutzt die BB-Codes "url" und "/url" in eckigen Klammern. Ein link zu einem Buch sieht dann z.B. so aus:

Code:
[url=https://www.buchhandel.de/buch/Algorithmen-9783868941845 ]Algorithmen von Robert Sedgewick [/url]





O.k., dann bin ich ja mal gespannt, ob das hier funktioniert:

Wetterdaten zum Testen

O.k., das funktioniert! Danke, Hans!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 20.12.2015 um 01:56 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.12.2015, 01:54 Uhr
Hans
Library Walker
(Operator)


Hi,

kleines Missgeschick, hab ich wohl nicht richtig deutlich gemacht: Wenn Du so einen Link einbaust, musst Du die Leerzeichen hinter den eckigen Klammer weglassen. Dann wird der BB-Code auch ausgewertet, also aus

Zitat:

[ url=http://www.rock-o-data.de/khyberspace/c++/2014.tar.gz ]Wetterdaten zum Testen[ /url ]


wird: Wetterdaten zum Testen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 20.12.2015 um 01:57 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.12.2015, 02:06 Uhr
Hans
Library Walker
(Operator)


Hi,

es wäre sinnvoller gewesen, den neuen Versuch in einem neuen Kommentar zu schreiben, anstatt den Kommentar Nr. 004 zu ändern. Denn so wie es jetzt dasteht, wird mein Kommentar Nr. 005 samt Zitat unverständlich bzw. unlogisch für jene, die das irgendwann mal am Stück lesen...

Ansonsten: Keine Ursache.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 20.12.2015 um 02:09 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.01.2016, 00:45 Uhr
Yadgar



Hi(gh)!

Nachdem ich mich die letzten Wochen mit yip (dem im Moment noch extrem embryonalen Kommandozeilen-Bildbearbeitungsprogramm) beschäftigt habe, komme ich jetzt wieder zu meteo, dem Wetterdaten-Auswertungsprogramm.

Und ich habe herausgefunden, woran der eingangs beschriebene Fehler liegt: es muss mit dem stringstream-Objekt conv zu tun haben! Obwohl monat mit jedem Durchlauf der Schleife inkrementiert wird, hat das aus conv "zurückfließende" Stringobjekt immer den Wert des ersten Durchlaufs, nämlich "2014-01_temperatur.txt"! Folglich wird 12 mal hintereinander dieselbe Datei geladen, so dass die eingelesenen Temperaturwerte natürlich immer gleich sind...

Hier der Code-Ausschnitt:


C++:
  for (monat = 1; monat <= 3; monat++)
  {
    monsummen_temp[monat-1] = 0;
    messtemp_monat[monat-1] = 0;
    conv << jahr << "-" << setw (2) << setfill ('0') << monat << setw (0) << "_Temperatur.txt";
    conv >> QuelleName;
    Quelle.open(QuelleName.c_str());

[...]
  }



Was mache ich bei der Verwendung von conv falsch?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.01.2016, 09:17 Uhr
ao

(Operator)


Es funktioniert, wenn der stringstream im Schleifenkörper deklariert ist, so dass er bei jedem Durchlauf neu erzeugt wird, also so:


C++:
#include <iostream>
#include <iomanip>
#include <sstream>

using namespace std;

int main ()
{
    string QuelleName;
    int jahr = 2016;
    
    for (int monat = 1; monat <= 3; monat++)
    {
        stringstream conv;
        //~ monsummen_temp[monat-1] = 0;
        //~ messtemp_monat[monat-1] = 0;
        conv << jahr << "-" << setw (2) << setfill ('0') << monat << setw (0) << "_Temperatur.txt";
        conv >> QuelleName;
        //~ Quelle.open(QuelleName.c_str());
        
        cout << "monat = " << monat << " QuelleName = " << QuelleName << endl;
    }
    
    return 0;
}



Warum deine Lösung nicht geht, weiß ich grad auch nicht. Vielleicht hat es damit zu tun, dass der stringstream mehrfach abwechselnd in In- und Out-Richtung benutzt wird. Vielleicht muss man dazu besondere Vorkehrungen treffen. Dass das überhaupt nicht geht, glaube ich nicht. Such mal selber nach der Erklärung, und wenn du sie findest, dann poste sie hier.
 
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: