PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Anfängerprojekt [BELOHNUNG vorhanden]



zulu1336
28.02.2009, 14:27
hi,ich brauche leider hilfe bei einem c++ anfänger schulprojekt.
Zur Aufgabe:
Es sollen 3 Werte eingelesen werden:
-Luftdruck
-Temperatur
-Niederschlag
Der Benutzer gibt fuer jeden Tag einen Wert an es sollen insgesammt Werte fuer ein Jahr gespeichert werden können.Das ganze soll in einem Menue dargestellt werden.
Darüber hinaus soll der Benutzer die Möglichkeit haben einen Durchschnittswert errechnen zu lassen(jeweils fuer alle 3 Variablen).
Wer Interesse hat mir bei dieser Aufgabe zu helfen kann in den Thread posten oder mich per icq kontaktieren.
Mein Lösungsansatz:

#include <iostream>
using namespace std;
int main()
{
double Niederschlag[367],Temperatur[367],Luftdruck[367];
int menue0, menue1,menue2,tag;
char check1,check2,check3;
do
{
cout << "Herzlich Willkommen,was moechten sie tun?" <<endl;
cout << "Wenn sie neue Werte eingeben moechten druecken sie die 1" << endl;
cout << "Wenn sie alte Werte ausgeben lassen moechten druecken sie die 2" << endl;
cout << "Wenn sie einen alten Wert bearbeiten wollen druecken sie die 3" << endl;
cout << "Beenden = 0" << endl;
cout << endl;
cin >> menue0;

if (menue0==1)
{
cout << "Wenn sie einen neuen Niederschlagswert eingeben moechten druecken sie die 1"<< endl;
cout << "Wenn sie einen neuen Temperaturwert eingeben moechten druecken sie die 2"<< endl;
cout << "Wenn sie einen neuen Luftdruckwert eingeben moechten druecken sie die 3"<< endl;
cin >> menue1;
}



if (menue0==2)
{
cout << "Wenn sie einen alten Niederschlagswert ausgeben moechten druecken sie die 1"<< endl;
cout << "Wenn sie einen alten Temperaturwert ausgeben moechten druecken sie die 2"<< endl;
cout << "Wenn sie einen alten Luftdruckwert ausgeben moechten druecken sie die 3"<< endl;
cin >> menue2;
}


if (menue0==3)
{
cout << "Moechten sie einen Niederschlagswert bearbeiten?J/N " << endl;
cin >> check1;
cout << "Moechten sie einen Temperaturwert bearbeiten?J/N? " << endl;
cin >> check2;
cout << "Moechten sie einen Luftdruckwert bearbeiten?J/N " << endl;
cin >> check3;

}

if (menue1==1)
{
cout << "Geben sie bitte ein den wievielten Tag dieses Jahres wir heute haben" << endl;
cin >> tag;
cout << "Gib den Niederschlagswert fuer den heutigen Tag ein " << endl; // Eingabe von neuen Niederschlagswerten
cin >> Niederschlag[tag] ;
system("pause");

}
if (menue1==2)
{
cout << "Geben sie bitte ein den wievielten Tag dieses Jahres wir heute haben" << endl;
cin >> tag;
cout << "Gib den Temperaturwert fuer den heutigen Tag ein" << endl; //Eingabe von neuen Temperaturwerten
cin >> Temperatur[tag];
system("pause");

}

if (menue1==3)
{
cout << "Geben sie bitte ein den wievielten Tag dieses Jahres wir heute haben" << endl;
cin >> tag;
cout << "Gib den Luftdruckwert fuer den heutigen Tag ein" << endl; //Eingabe von neuen Luftdruckwerten
cin >> Luftdruck[tag];
system("pause");
}




if (menue2==1)
{
cout << "Geben sie bitte den Tag an den sie ausgeben moechten" << endl;
cin >> tag;
cout << "Der Niederschlag fuer diesen Tag betraegt:" << Niederschlag[tag] << endl; //Augsgabe von alten Niederschlagswerten
}
if (menue2==2)
{
cout << "Geben sie bitte den Tag an den sie ausgeben moechten" << endl;
cin >> tag;
cout << "Der Temperaturwert fuer diesen Tag betraegt:" << Temperatur[tag] << endl; //Ausgabe von alten Temperaturwerten
}

if (menue2==3)
{
cout << "Geben sie bitte den Tag an den sie ausgeben moechten" << endl;
cin >> tag;
cout << "Der Luftdruck fuer den Tag betraegt:" <<Luftdruck[tag] <<endl; //Ausgabe von alten Luftdruckwerten
}




if (check1=='J')
cout << "Welchen Tag wollen sie ueberpruefen?" << endl; //Bearbeitung der Niederschlagswerte
cin >> tag;
cout << "Geben sie einen neuen Wert fuer diesen Tag ein" << endl;
cin >> Niederschlag[tag];

if (check2=='J')
cout << "Welchen Tag wollen sie ueberpruefen?" << endl; //Bearbeitung der Temperaturwerte
cin >> tag;
cout << "Geben sie einen neuen Wert fuer diesen Tag ein" << endl;
cin >> Temperatur[tag];
if (check3=='J')
cout << "Welchen Tag wollen sie ueberpruefen?" << endl; //Bearbeitung der Luftdruckwerte
cin >> tag;
cout << "Geben sie einen neuen Wert fuer diesen Tag ein" << endl;
cin >>Luftdruck[tag];

} while (menue0 != 0);


system("pause");
return 0;
}
Würde mich auch über komplett neue Lösungsansätze freuen allerdings bitte ich darum nicht allzuviele neue Befehle zu verwenden.

Fab
28.02.2009, 14:32
Du fragst hier zwar nach Hilfe, aber ich finde, das man das auch alleine schaffen kann.
Dafür brauchste nicht groß wen anders und dann kannste dir auch deine Belohnung sparen. Das ist doch ne tolle Sache. Man kann super Lösungen erarbeiten, indem man einfach mal die Referenzen etwas durchsucht ... wie wärs mit MSDN oder für C++ vll besser: cplusplus.com
http://cplusplus.com/

Glaub mir ... wenn man sich selbst einen Erfolg erarbeitet macht das viel mehr Spaß
... und man lernt mehr ... außerdem ist Teamerbeit nicht immer das Gelbe vom Ei (Kommentierung die beide verstehen, Versionen tauschen (evt. Module dann zusammen fügen), Arbeit aufteilen usw.)

MFG
Fab
;)

eRaSeR!
28.02.2009, 14:35
wenn du noch bissle wartest könnt ich dir auch ohne psc helfen^^ außerdem is der psc handel eh verboten
also ma sehn wann ich zeit hab... mal sehn ob ichs mir heut noch anguck geht aber schnell

Pekel
01.03.2009, 11:26
Ich würde das Menü vielleicht in eine switch-case Abfrage einbauen, würde den Code übersichtlicher gestalten.

blackberry
01.03.2009, 13:39
Schau dir das mal an:
http://rapidshare.com/files/203991151/apt.rar.html
(1x .C-Datei, 1x .H-Datei)

Das ganze ist in C geschreiben, ist aber auch C++ kompatibel.
Ich habe den Sourcecode ausreichend kommentiert - es sollte also gut verständlich sein.

Man könnte jetzt noch ein paar extra Funktionen hinzufügen (zB. Monat und Tag werden mit eingetragen um doppelte Werte verhindern zu können)

Ein (Zeit-)Fehler könnte noch auftreten, wenn TM_YEAR_BASE von System zu System unterschiedlich ist.
Ich habe das mal wie dieser Programmierer hier: http://www.jbox.dk/sanos/source/lib/strftime.c.html
als 1900 definiert.

Mein time.h sagt:

struct tm
{
[...]
int tm_year; /* Years since 1900 */
[...]

Falls das also bei deinem System anders ist musst du das Makro eben anpassen.

Ansonsten:
Des Programm hat zwei Optionen:
1) Einen neuen Datensatz einfügen
2) Eine Statistik für ein Jahr anzeigen

Bei 1 werden Druck, Temperatur und Niederschalg eingelesen und sammt Jahr in einer Datei (values.dat) gespeichert

Bei 2 wird eine Statistik für ein vom Benutzer gewähltes Jahr erzeugt. Die Statistik enthält die Durchschnittswerte für die einzelnen Werte. Falls keine Werte für das gewählte Jahr vorhanden sind wird ein Fehler ausgegeben.


mfG. BlackBerry

zulu1336
01.03.2009, 20:20
danke für eure Hilfe und Ratschläge eraser konnte mir sehr gut weiterhelfen allerdings müsste das feauture mit dem speichern + laden auch noch rein.Hab mir das Programm von dir mal angeschaut blackberry .Allerdings hatten wir viele Befehle nochnicht und mit deutschen kommentaren wäre es vllt auch ein wenig besser nachvollziehbar gewesen
Ich hab mal das momentane programm geupped: http://rapidshare.com/files/204130752/werte2.cpp.html

Vllt kann mir ja noch jmd erklären wie man einen dateispeicher anlegt und diesen läd;)
also mit fstream fin etc
Würde mich auch über Kontakt per icq(796-134) oder pm freuen falls ihr eine ggl wollt wäre ich natürlich auch bereit euch bei guter Hilfe eine anzubieten

blackberry
01.03.2009, 23:59
Allerdings hatten wir viele Befehle nochnicht und mit deutschen kommentaren wäre es vllt auch ein wenig besser nachvollziehbar gewesen

Ich kann mich dabei nur auf folgenden Satz beziehen: "Die Sprache für Source-Code ist Englisch. Dies gilt für alle Teile eines Programms, von Variablennamen über Funktionsnamen bis zu Kommentaren im Source-Code." ( siehe Sticky: http://free-hack.com/showthread.php?t=4759 ).

Zudem lernt man in Deutschland doch schon teilweise ab der 4. Klasse Englisch, also sollte das kein so großes Problem sein ;)

Zum Thema fstream kann ich auch nur auf Cplusplus.com verweisen: http://www.cplusplus.com/reference/iostream/fstream/
Bei jeder Methode/Funktion wirst du ein Beispiel finden, also klick dich einfach mal durch.

Falls du noch mehr Fragen hast kannst du sie ja einfach hier stellen oder mich in ICQ adden (Nummer ist im Profil; Gegenleistung brauche ich nicht).


mfG. BlackBerry

EDIT:
Ich habe mir mal deinen Sourcecode durchgelesen und ein paar Verbesserungsvorschläge in Form von Kommentaren (diesmal auf Deutch ;) ) eingefügt.
Download:
http://rapidshare.com/files/204209163/werte2_mit_korrektur.cpp.html

AlterHacker
02.03.2009, 05:01
Habe auch mal eine Lösung gemacht.

#include <iostream>
#include <fstream>

using namespace std;

struct sTag{
double niederschlag;
double temperatur;
double luftdruck;
};

sTag Tage[367];
int tagePos = 0; //Aktuelle Position im Tage-Struct-Array
int werteGesamt = 0;//Wie viele Werte gespeichert sind
bool load();//return true => error
bool save();//return true => error
void menu();
void neueEinfuegen();
void ausgeben();
void bearbeiten();
void durchschnitt();
int main()
{
cout << "http://free-hack.com/showthread.php?p=254524 solution^^ by AlterHacker\n";
load();
menu();
return 0;
}

bool load(){
/*Lade aus der Datei*/
fstream o;
o.open( "dateiname.bin", ios::binary | ios::in );
if(!o) return 1;
int pos = 0; //Struct-Pos
while(!o.eof()){//Nicht am Ende der Datei, lese Struct ein
o.read((char*) &Tage[pos++], sizeof(sTag));//Lese ein Struct ein. (char*) damit der Compiler nicht meckert
}
tagePos = pos;
werteGesamt = pos-1;
return 0;
}
bool save(){
/*Speichert*/
fstream o;
o.open( "dateiname.bin", ios::binary | ios::out );
if(!o) return 1;
int pos = 0; //Struct-Pos
while(pos <= werteGesamt){//Nicht am Ende der Datei, lese Struct ein
o.write((char*) &Tage[pos++], sizeof(sTag));//Schreibe ein Struct. (char*) damit der Compiler nicht meckert
}
tagePos = pos-1;
return 0;
}
void menu(){
int auswahl;
cout << "Neue Werte eingeben: 1\nAlte Werte ausgeben: 2\nAlte Werte bearbeiten: 3\nDurchschnitt anzeigen: 4\nBeenden: 5\n"; //\n -> endl
cin >> auswahl;
switch(auswahl){
case 1:
neueEinfuegen();
break;
case 2:
ausgeben();
break;
case 3:
bearbeiten();
break;
case 4:
durchschnitt();
break;
case 5:
return;
break;
default:
cout << "Ungueltige Auswahl!\n"; menu();
}
cout << "***********************************\n";
cout << "***********************************\n";
cout << "***********************************\n";
cout << "***********************************\n";
cout << "***********************************\n";
menu();
}

void neueEinfuegen(){
cout << "Tag " << (tagePos+1) << "\n";
cout << "Niederschlag: ";
cin >> Tage[tagePos].niederschlag;
cout << "Temperatur: ";
cin >> Tage[tagePos].temperatur;
cout << "Luftdruck: ";
cin >> Tage[tagePos].luftdruck;
cout << "Ist das richtig?(J/N)";
char eingabe[3];
cin >> eingabe;
if(eingabe[0]=='J' || eingabe[0]=='j'){
werteGesamt++;
tagePos++;
cout << "Ihre Werte wurden editiert!\n";
if(save()){
cout << "Speichern fehlgeschlagen.";
} else {
cout << "Gespeichert!\n";
}
return;
} else {
neueEinfuegen();
}
}
void ausgeben(){//Wie ich printf() jetzt vermisse^^
int myTag = 0;
while(myTag < (tagePos-1)){
cout << "Tag " << (myTag+1) << "\tNiederschlag:\t"<<Tage[myTag].niederschlag<<"\tTemperatur:\t"<<Tage[myTag].temperatur<<"\tLuftdruck:\t"<<Tage[myTag].luftdruck<<"\n";
myTag++;
}
}
void bearbeiten(){
int zielTag;
cout << "Welchen Tag wollen sie bearbeiten?\n";
cin >> zielTag;
zielTag--;
cout << "Niederschlag: "<<Tage[zielTag].niederschlag<<" Temperatur: "<<Tage[zielTag].temperatur<<"Luftdruck:"<<Tage[zielTag].luftdruck<<"\n";
cout << "Neuer Werte eingeben:\n";
cout << "Niederschlag: ";
cin >> Tage[zielTag].niederschlag;
cout << "Temperatur: ";
cin >> Tage[zielTag].temperatur;
cout << "Luftdruck: ";
cin >> Tage[zielTag].luftdruck;
cout << "Ist das richtig?(J/N)";
char eingabe[3];
cin >> eingabe;
if(eingabe[0]=='J' || eingabe[0]=='j'){
cout << "Ihre Werte wurden editiert!\n";
if(save()){
cout << "Speichern fehlgeschlagen.";
} else {
cout << "Gespeichert!\n";
}
return;
} else {
neueEinfuegen();
}
}

void durchschnitt(){
double nied = 0;
double temp = 0;
double luft = 0;
for(int myPos = 0; myPos <= werteGesamt; myPos++){
nied+=Tage[myPos].niederschlag;//a += b ist das gleiche wie a = a + b
temp+=Tage[myPos].temperatur;
luft+=Tage[myPos].luftdruck;
}
nied/=(werteGesamt+1);// a/=b ist das gleiche wie a = a / b
temp/=(werteGesamt+1);
luft/=(werteGesamt+1);
cout << "Durchschnittliche Werte:\n";
cout << "Niederschlag:\t"<<nied << "\n";
cout << "Temperatur:\t"<<temp << "\n";
cout << "Luftdruck:\t"<<luft << "\n";
}

Ansonsten ist es halt ziemlich unübersichtlich^^

Wenn du keine Structs benutzen kannst, kannst du auch halt die drei Werte überall eintragen, nur beim lesen/speichern muss dann statt
o.read((char*) &Tage[pos++], sizeof(sTag)); bzw o.write
da stehen:
o.read((char*) &niederschlag[pos], sizeof(double));//das gleiche dann natürlich auch beim saven() mit write ;)
o.read((char*) &temperatur[pos], sizeof(double));
o.read((char*) &luftdruck[pos++], sizeof(double));

und dann halt beim speichern auch.
Kommt halt drauf an, wie deine Variabeln heißen.
irgendwas++; Erhöht irgendwas um 1 und
irgendwas --; Vermindert irgendwas um 1

Hoffe habs ausreichend Kommentiert und sowas halt^^

EDIT:

Jetzt tote Hose?

Dachte bekomm ein thx oder so =/:(

Scheint echt nichts mehr zu kommen.

-.-'

reddragon1212
06.03.2009, 13:49
@AlterHacker

ich bin auch gerade am lernen und mir hilft das :)
also vielen dank ;):)

DeCeN
09.03.2009, 22:05
ich hab mir jetzt nich den ganzen thread durchgelesen aber ich würd statt
if (menue0==1)
einfach:

switch( menu0 ){
case 1 : //mach was-1
case 2 ://mach was-2
case ....
default //ausgabe wenn falsche eingabe;)

MfG DeCeN

AlterHacker
09.03.2009, 22:08
ich hab mir jetzt nich den ganzen thread durchgelesen aber ich würd statt einfach:

switch( menu0 ){
case 1 : //mach was-1
case 2 ://mach was-2
case ....default //ausgabe wenn falsche eingabe;)MfG DeCeN


Hättest dir besser mal meinen Code angeguckt. denn da steht:


switch(auswahl){
case 1:
neueEinfuegen();
break;
case 2:
ausgeben();
break;
case 3:
bearbeiten();
break;
case 4:
durchschnitt();
break;
case 5:
return;
break;
default:
cout << "Ungueltige Auswahl!\n"; menu();
}