Forum: PC-Programmierung C++ Variable zuweisen.


von Tetra (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine frage. Ich möchte bei C++ einer Variable andere Variablen 
zuweisen.

Ich habe wie folgt angefangen:

#include "iostream"
#include <conio.h>

using namespace std;

int main()
{
int J , M , T , Jahr1 , Jahr2;

cout << "Gebe das Jahr ein!  ";
cin >> J;
cout << "Gebe den Monat ein! (ganze Zahl)  ";
cin >> M;
cout << "Gebe den Tag ein! (ganze Zahl)  ";
cin >> T;
int Jahr1 = J , M , T;


getch();

return 0;
}

jetzt möchte ich Jahr1 zuweisen. Also wenn ich zum Beispiel J = 2008 M = 
12 T = 22 angebe möchte ich Jahr1 = 20081222 haben.

Wie stelle ich das an?

Danke für die Hilfe schon mal.

PS: Ich bin ein Noob was C++ angeht. Also habt bitte rücksicht.

von Vlad T. (vlad_tepesch)


Lesenswert?

Tetra schrieb:
> 12 T = 22 angebe möchte ich Jahr1 = 20081222 haben.

du kennst die Grundrechenarten * und +?

von Tetra (Gast)


Lesenswert?

ja kenne ich. Sorry hätte vorher noch erklären sollen was ich vor habe.

Also es soll eine kleine Anwendung werden die das Alter bestimmt.

Also zum Beispiel

Geboren:

13.06.1984 = 19840613

Aktuelles Datum

14.01.2012 = 20120114

20120114 - 19840613 = 279501

Dann die letzten 4 Zahlen ausklammern und man hat das Alter 27 Jahre.

PS: Wenn ich am ende das Ergebnis habe wie kann ich die letzten 4 Zahlen 
ausklammern lassen. Bevor ich die Variable ausgeben lasse?

von Karl H. (kbuchegg)


Lesenswert?

Tetra schrieb:
> ja kenne ich.

Na dann benutze sie!

   hast du 2 Zahlen 23 und 8

dann rechnest du   23 * 10 + 8 und kriegst 238 als Ergebnis.
Frage an dich: Warum in diesem Beispiel *10?

> Dann die letzten 4 Zahlen ausklammern und man hat das Alter 27 Jahre.

In deinem Beispiel.
Aber das stimmt so nicht allgemein, bzw. wenn du das etwas genauer 
aufschlüsseln willst (Jahre, Monate, Tage) stimmts überhaupt nicht mehr. 
Das wäre ein bischen zu einfach.

> PS: Wenn ich am ende das Ergebnis habe wie kann ich die letzten 4 Zahlen
> ausklammern lassen. Bevor ich die Variable ausgeben lasse?

durch Dividieren?

238 / 10  ergibt 23

von Tetra (Gast)


Lesenswert?

Sorry ich stehe gerade ein bisschen auf dem Schlauch.

wie kommst du auf die beiden Zahlen "23" und "8". Oder soll das ein 
Beispiel sein?


> Frage an dich: Warum in diesem Beispiel *10?

Da bin ich mir nicht ganz sicher.

Ein Jahr hat 12 Monate

Und ein Monat hat 30/31 Tage.

Gib mir noch ein Tipp und ich komm vielleicht drauf. :D:D

von Tetra (Gast)


Lesenswert?

Sorry streich die frage mit dem Beispiel.

:D:D

Also sollte ich die zahlen zusammen rechnen und dann statt *10 *12 
nehmen für die Anzahl der Monate?

von DirkB (Gast)


Lesenswert?

01.01.2012 -> 20120101
31.12.2011 -> 20111231
            - --------
                  8870 -> 88 Monate und 70 Tage
von Silvester bis Neujahr.

von Karl H. (kbuchegg)


Lesenswert?

Tetra schrieb:
> Sorry ich stehe gerade ein bisschen auf dem Schlauch.
>
> wie kommst du auf die beiden Zahlen "23" und "8". Oder soll das ein
> Beispiel sein?

Ja. Es soll ein Beispiel sein für deine Frage
"Also wenn ich zum Beispiel J = 2008 M = 12 T = 22 angebe
 möchte ich Jahr1 = 20081222"

Da passiert genau das

an 2008  willst du 12 'anhängen', macht 200812
und an diese Zahl wolltest du noch die 22 'anhängen', macht 20081222

Genau die Zahl, die dir als Ergebnis vorschwebte.

Und ich hab dir ein Beispiel gebracht, wie man an beispielsweise an die 
Zahl 23, die Zahl 8 'anhängen' kann.   23 * 10 + 8


>> Frage an dich: Warum in diesem Beispiel *10?
>
> Da bin ich mir nicht ganz sicher.

Damit ich in der Einerstelle die Position freibekomme!

Sag mal, wie alt bist du eigentlich?
23 * 10  macht 230
d.h. die 23 sind schon um 1 Stelle nach links verschoben und die 
Einerstelle hab ich jetzt frei um da die 8 rein zu addieren.

  230 + 8   -> 238

schaust du dir die Anfangszahlen an, 23 und 8, und schaust du dir das 
Endergebnis an, 238, dann entspricht das genau deiner 'Forderung' dass 
du an die Zahl 23 die Zahl 8 'anhängen' wolltest.

und wenn du an 345 die Zahl 87 anhängen willst, dann rechnest du eben

    345 * 100    macht 34500    (man beachte: die 345 sind da schon
                                 um 2 Stellen nach links verschoben!)
    und zu den 34500 kommen noch die 87 dazu, macht 34587

Ausgangszahlen:  345  und 87
die 87 an die 345 angehängt muss 34587 ergeben.
345 * 100 + 87 ergibt aber augenscheinlich genau diese 34587

Die 10 bzw 100 haben also ganz offensichtlich damit zu tun, um wieviele 
Stellen man die Ursprungszahl nach links 'verschieben' will um dann die 
andere Zahl einaddieren zu können und so die beiden Zahlen 
'aneinanderzuhängen'.

Einfach mal ein bischen mit Zahlen spielen und nachsehen, wie sich 
mathematische Operationen präsentieren!

von Tetra (Gast)


Lesenswert?

Ok jetzt ist der Groschen gefallen.

:D:D

Aber die frage ist wie weise ich der Variable 1 diese Rechnung zu?

Denn so mache ich etwas falsch:

cin >> Jahr1 >> J * 10000;

von Karl H. (kbuchegg)


Lesenswert?

Die Frage ist eine andere.
Die Frage ist, welche Datentypen hast du eigentlich?

Denn je nach Datentyp können die Zahlen eine gewisse Größe nicht 
überschreiten.

von Karl H. (kbuchegg)


Lesenswert?

Aber wie gesagt, und wie Dirk B. weiter oben schon gezeigt hat:
Wenn du deine Systematik weiter verfolgst, kriegst du falsche 
Ergebnisse!

Das geht so nicht.

Deine beste Option ist es, zb auszurechnen, wieviele Monate seit einem 
Stichtag, sagen wir mal beispielsweise den 1.1.1950 vergangen sind.

Willst du wissen wieviele Monate zwischen dem 1.11.1999 und dem 1.1.1950 
vergangen sind, dann rechnest du.

Zwischen dem 1.11.1999 und dem 1.1.1950 liegen erst mal (1999-1950) 
macht 49 ganze Jahre. 49 ganze Jahre, das sind 49*12 oder 588 Monate. 
Dazu kommen noch 10 ganze vergangene Monate im Jahre 1999, macht also in 
Summe 588 + 10 = 598 Monate.

Angenommen wir wollen als 2.tes Datum den 14.1.2012 nehmen, dann sieht 
die Rechnung für dieses Datum so aus
zwischen 2012 und 1950 liegen 62 ganze Jahre, das sind also 62*12 gleich 
744 Monate. Für 2012 kommt kein ganzer Monat mehr dazu, weil wir ja noch 
im Jänner sind, und da ist noch kein Monat vergangen. D.h. bezogen auf 
den 1.1.1950 sind 744 ganze Monate vergangen.

14. 1.2012      744 Monate   (bezogen auf den 1.1.1950)
 1.11.1999      598 Monate   (ebenfalls bezogen auf den 1.1.1950)

d.h. zwischen den beiden Daten, 1.11.199 und 14.1.2012, liegen 744-598 
gleich 146 Monate. 146 Monate, das sind 12 Jahre und 2 Monate. Denn 146 
/ 12 macht 12, und 146 % 12 macht 2   un 12*12 + 2 ergibt wieder die 
146.


Wenn du jetzt die Tage auch noch wissen willst, dann wirds etwas 
komplizierter. Denn 1 Jahr hat immer 12 Monate. Aber: die Monate haben 
nicht gleich viele Tage und dann gibt es ja auch noch die Schaltjahre, 
in denen ein Jahr anstelle von 365 dann 366 Tage hat.


PS. Der Stichtag 1.1.1950 war so gewählt, dass man leicht rechnen kann. 
Denn dann brauch ich keine Jahreswechsel oder dergleichen 
berücksichtigen. Die Anzahl an ganzen Monaten ist dann immer einfach die 
Monatsnummer weniger 1.

von Tetra (Gast)


Lesenswert?

Hallo ich bin es noch mal:

Also ich habe es jetzt so geschrieben:

Jahr1 = J * 100;
Jahr1_2 = Jahr1 + M;
Jahr1_3 = Jahr1_2 * 100;
Jahr1_4 = Jahr1_3 + T;

cout << Jahr1_4

aber trotzdem kommen noch fehler beim Kompelieren.

von Karl H. (kbuchegg)


Lesenswert?

Fehlermeldung lesen!

Der Compiler schreibt ja nicht einfach nur 'Fehler' hin.

von Tetra (Gast)


Lesenswert?

@Buchegger


Das habe ich bis jetzt geschrieben:

#include "iostream"
#include <conio.h>

using namespace std;

int main()
{
int J , M , T , Jahr1 , Jahr1_2 , Jahr1_3 , Jahr1_4;

cout << "Gebe das Jahr ein!  ";
cin >> J;
cout << "Gebe den Monat ein! (ganze Zahl)  ";
cin >> M;
cout << "Gebe den Tag ein! (ganze Zahl)  ";
cin >> T;
Jahr1 = J * 100;
Jahr1_2 = Jahr1 + M;
Jahr1_3 = Jahr1_2 * 100;
Jahr1_4 = Jahr1_3 + T;

cout << Jahr1


getch();

return 0;
}

Kann es sein das int der falsche Datentyp ist?

Ich will ja nicht die Tage bestimmen sondern nur das Alter....

von Karl H. (kbuchegg)


Lesenswert?

Tetra schrieb:

> Kann es sein das int der falsche Datentyp ist?

Auf einem PC mit 32-Bit int geht sich das noch aus.

Aber was ist mit deiner Fehlermeldung? Hast du die jetzt schon 
bereinigt?

> Ich will ja nicht die Tage bestimmen sondern nur das Alter....

Schon klar. Du sollst aber trotzdem richtig rechnen.

von Rolf M. (rmagnus)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Der Compiler schreibt ja nicht einfach nur 'Fehler' hin.

Tetra schrieb:
> Das habe ich bis jetzt geschrieben:

Und wo ist die Fehlermeldung vom Compiler?

Ein Fehler wäre mal:

Tetra schrieb:
1
> cout << Jahr1
2
               ^
3
       hier fehlt ein Semikolon.

Tetra schrieb:
> Ich will ja nicht die Tage bestimmen sondern nur das Alter....

Die Frage wäre, warum du dann Tage und Monate überhaupt kunstvoll mit 
den Jahren verbindest, wenn du sie am Schluß doch nur wieder verwirfst.

von Tetra (Gast)


Lesenswert?

Ok ich habe es hinbekommen und es funktioniert....


Ich habe habe nur eine letzte Frage:

Wie bekomme ich es in das in der Konsolen Anwendung später solche Sätze:

cout << "Welches Datum haben wir heute?....Druecke Enter...";
cout << "Trage das Jahr ein!";

nicht nebeneinander stehen sondern untereinander?

Also:

Welches Datum haben wir heute?....Druecke Enter...

Trage das Jahr ein!

von Tetra (Gast)


Lesenswert?

Achso das

cout << Jahr1;

war noch von einem Test.

von drhdtjrf (Gast)


Lesenswert?

Tetra schrieb:
> Wie bekomme ich es in das in der Konsolen Anwendung später solche Sätze:
>
> cout << "Welches Datum haben wir heute?....Druecke Enter...";
> cout << "Trage das Jahr ein!";
>
> nicht nebeneinander stehen sondern untereinander?
>


http://www.cplusplus.com/forum/beginner/2138/

von Matthias K. (mkeller)


Lesenswert?

Untereinander heißt in verschiedenen Zeilen.
Wie machst du beim Schreiben ein Zeilenumbruch? Mit Enter, richtig, 
woher soll das Programm auch wissen, dass es eine neue Zeile ist.

Der Zeilenumbruch ist ein Steuerzeichen
Entweder cout << "\n\r";
oder cout << endl;

BTW: Kauf dir ein C++ Buch!

Diese kann ich empfehlen:

http://www.amazon.de/lernen-professionell-anwenden-Peter-Prinz/dp/3826608240/ref=sr_1_fkmr0_1?ie=UTF8&qid=1326555569&sr=8-1-fkmr0

von Tetra (Gast)


Lesenswert?

Das Buch klingt super. Das werde ich mir besorgen.

Vielen Dank für die Hilfe

Gruß Tetra

von Rolf M. (rmagnus)


Lesenswert?

Matthias Keller schrieb:
> Der Zeilenumbruch ist ein Steuerzeichen
> Entweder cout << "\n\r";

Kein \r. Nur \n.

> oder cout << endl;

Das macht zusätzlich zum Zeilenumbruch noch ein "flush", schreibt also 
an der Stelle auch alles raus, was noch im Puffer steht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.