Die Mathe-Redaktion - 23.02.2020 12:38 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 527 Gäste und 19 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Erstes Programm in C++
Druckversion
Druckversion
Antworten
Antworten
Autor
Schule Erstes Programm in C++
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2010-06-27


Da ich nun zwei Treads über Anfangsprogramme in C++ mitverfolgte, versuchte ich  - nach den Tipps von viertel, matph, rlk und anderen - selbst einmal ein C++ Programm zu schreiben.

Und zwar folgende Aufgabe:
a) Zwei oder mehrere Bruchzahlen sollen eingelesen werden, wobei auch negative Zähler und Nenner vorkommen dürfen.
b) Die Eingabe soll auf Korrektheit geprüft werden.
c) Die Brüche sollen addiert werden.
d) Das Ergebnis ist - falls möglich - zu kürzen.
e) Ausgabe

C++
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. { int z1, n1, z2, n2, z3, ez, en, hz, hn, hr, i;
  7. cout <<"Addition von Bruchzahlen \n";
  8.  
  9. do{
  10. cout <<"Gib den Zähler des ersten Bruchs an: ";
  11. cin >>z1;
  12. cout <<"Gib den Nenner des ersten Bruchs an: ";
  13. cin >>n1;
  14. cout <<endl << "Der erste Bruch ist "<<z1 <<"/"<<n1 <<endl;
  15. cout <<"Gib den Zähler des zweiten Bruchs an: ";
  16. cin >>z2;
  17. cout <<"Gib den Nenner des zweiten Bruchs an: ";
  18. cin >>n2;
  19. cout <<endl << "Der zweite Bruch ist "<<z2 <<"/"<<n2 <<endl;
  20.  
  21. i=2
  22.  
  23. en=n1*n2;
  24. ez=z1*n2+z2*n1;
  25. if (en==0)
  26. cout <<"Ungültige Eingabe \n ";
  27. }while (en==0 );
  28.  
  29. cout << "Gib weitere Brüche ein oder beende die Zahleneingaben"
  30. "durch Eingabe eines Buchstabens! \n";
  31.  
  32. cout << "Neuer Zähler: ";
  33. cin >>z3;
  34.  
  35. while (z3 ist int ){ //Hier weiß ich nicht, wie die Überprüfung,
  36. //ob z3 vom richtigen Datentyp int ist, lautet.
  37. i++;
  38. z2=z3;
  39.  
  40. do{ cout << "Neuer Nenner: ";
  41. cin >>n2;
  42. if (n2==0)
  43. cout <<"Ungültige Eingabe für den Nenner \n ";
  44. else
  45. cout << "Der " << i <<".te Bruch ist << z2<<"/"<<n2<<endl;
  46. } while (n2==0);
  47.  
  48. z1=ez;
  49. n1=en;
  50. en=n1*n2;
  51. ez=z1*n2+z2*n1;
  52. cout << "Neuer Zähler: ";
  53. cin >>z3;
  54. cout << endl;
  55. }
  56.  
  57. hn=abs(en); //Euklidscher Algorithmus für ggT
  58. hz=abs(ez);
  59. while (hn>0){
  60. hr=hz-(hz/hn)*hn;
  61. hz=hn;
  62. hn=hr;
  63. }
  64. ez=ez/hz;
  65. en=en/hz;
  66.  
  67. cout <<"Ergebnis: ";
  68. if(i==2)
  69. cout <<endl;<<z1 <<"/" <<n1 <<" + " <<z2 <<"/" <<n2 <<" = " ;
  70. cout <<ez <<"/" <<en<< endl;
  71. }

Nun stellten sich mir gleich einige Fragen:

1)   Kann man, falls man zwei Zeilenumbrüche haben will, das so schreiben?
C++
cout <<"Addition von Bruchzahlen \n\n ";

2) Ist das Einlesen von mehreren Variablen in folgender Art möglich?
C++
cout <<"Gib Zähler und Nenner des ersten Bruchs (durch Beistriche getrennt) an: ";
cin >>z1, n1;

3) Erfolgt durch das Einlesen ein Zeilenumbruch am Bildschirm? Oder muss der extra eingegeben werden?

4) Wie überprüft man, ob die Eingabe vom Datentyp her richtig ist?
5) Weist C++ einer vom Datentyp her falsch eingegebenen Variablen einen Wert zu, etwa 0?

6) Wie werden mehrere Bedingungen verknüpft?
etwa
C++
if (i==2 and z2>0)

Vielen Dank im Voraus
chryso


[ Nachricht wurde editiert von chryso am 27.06.2010 16:41:32 ]



  Profil  Quote  Link auf diesen Beitrag Link
stone23
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 06.02.2004
Mitteilungen: 250
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2010-06-27


Hallo chryso,

ich bin mir nicht ganz sicher bei einigen deiner Fragen, aber ich fang mal an:

zu 1.
Ja das ist Korrekt so. \n\n bewirkt eine Leere Zeile

zu 2.
Nein das dürfte so nicht gehen. Jede Zahl muss separat eingelesen werden. Ansonsten weiss dein Programm doch nicht, welche Zahl es als erstes Speichern soll z1 oder n1.

zu 3.
ich habe leider lange keine Eingaben mehr von Hand gemacht, aber sobald du deine Zahl mit enter bestätigst, müsstest du auf eine neue Zeile  Springen.

zu4. und 5.
hmm da du nur integers hast, dürften Buchstaben zum Programmabbruch führen. doubles, werden zu integern gerundet bzw abgeschnitten.
Hier bin ich mir aber nicht ganz sicher... ich teste das mal nach dem Mittag.

zu 6.
if  (i==2 && z2>0)


MFG stone23



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26940
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2010-06-27


Hi chryso,

natürlich könnte ich diese Fragen alle beantworten.

Aber der Versuch, C++ anhand von ein paar mitgelesenen Codebeispielen zu lernen, muß zwangsläufig scheitern. Die Eigenarten von C++ sind da viel zu komplex. Dabei kann nur ein Wissen mit Löchern so zahlreich wie in einem Ytong-Block entstehen (der übliche Löchervergleich mir einem Schweizer Käse genügt da nicht wink ). Und diese Löcher einzeln durch solche Nachfragen zu stopfen ist ein Faß ohne Boden. Da würde ich Dir doch eher raten, erst mal einen Kurs online oder als Buch durchzuarbeiten.

Versteh mich nicht falsch:
nach den Romanen, die ich hier schon für eigentlich hoffnungslose Fälle geschrieben habe, sollte ich doch hier auch schnell ein paar Worte schreiben können. Mache ich aber nicht, weil es eben nur Flickwerk ist. So ein Kurs bringt Dir viel mehr.
Du hattest mir eine erste Version dieses Programms per PM geschrieben, die war gut und lauffähig. Nun versuchst Du, diese Version aufzupeppen. Dabei benutzt Du aber so viel Spekulatives (eben wegen mangelnder Kenntnisse), daß ich Dir halt erst mal zu diesem Basiskurs raten muß.

Gruß vom 1/4



[Die Antwort wurde vor Beitrag No.1 begonnen.]



  Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 46023
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2010-06-27


Hi chryso,
1) Ja, das geht so.
Für Windows-Programme müßte man evtl. \r\n\r\n nehmen, aber bei C-Programmen (also auch für C++) hat sich die Auffassung durchgesetzt, daß ein einfaches \n auch genügen muß, das betrifft nicht nur mögliche Eingabeströme, sondern insbesondere auch die C-Quelltexte selbst.
2) Das Komma (= Beistrich), das in der Eingabe vorkommen soll, hat überhaupt nichts mit dem Komma zu tun, das (aus syntaktischen Gründen) im Programmtext steht.
Also nein.
3) Normalerweise beginnt die tatsächliche Verarbeitung einer Eingabe erst dann, wenn sie mit Zeilenwechsel abgeschlossen wurde.
Im Zweifelsfall muß man es ausprobieren, denn nicht alle Systeme machen das völlig gleich.
4) Es wird zunächst versucht, so einzulesen, wie es dem Datentyp entspricht, der ja durch die verwendete Variable vorgeschrieben ist.
Was dann bei unpassenden Eingaben genau passiert, kann man auch nur durch Ausprobieren feststellen, und eine wie auch immer geartete Eingabe ist zunächst mal ein String (= Zeichenkette) und kein anderer Typ (Integer oder Float usw.), und es handelt sich darum, ob die Umwandlung in den gewünschten Typ sinnvoll möglich ist.
5) Ja. Damit muß man leben, oder diese unerwünschte Möglichkeit durch geeignete Maßnahmen abfangen. Leider ist das immer recht aufwändig, man muß zunächst die Originaleingabe (als String) einlesen, und dann prüfen, ob dieser String so geformt ist, daß er wie gewünscht umgewandelt werden kann, und wenn ja, dann tut man es, und gibt sonst einen Fehler aus.
6) Die Verknüpfung erfolgt mit &&.
Dies bedeutet eine Und-Verknüpfung im sogenannten Kurzschluß-Verfahren.
Spätestens an dieser Stelle ist allerdings der Hinweis auf eine Sprachbeschreibung angebracht. Ich schließe mich viertels Meinung an, daß du beim Programmieren eher engen Kontakt zur Online-Hilfe halten mußt, dann müssen viele Fragen gar nicht erst im Forum gestellt werden.
Gruß Buri


[Die Antwort wurde vor Beitrag No.1 begonnen.]



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2010-06-27


Zuerst einmal Danke für eure Anworten.

Es ist mir klar, dass ich nicht durch Anfragen hier im Forum C++ erlernen kann. Man kann eine Programmiersprache auch nicht "im Trockenen" lernen. Man muss Programme "laufen lassen" und lernt aus den Fehlern mehr als durch eine theoretische Beschreibung.

Vor allem erhielte ich einige Antworten gleich durch einfaches Probieren, z.B. auf die Frage 1) und 2)

Die Syntax ist zwar notwendig, damit ein Programm läuft, aber diese Aufgabe war für mich vorwiegend auch ein gedankliches Spiel der Logik dahinter: Wie errreiche ich mit einer relativ kleinen Anzahl an Variablen die Addition von einer  -theoretisch - großen Zahl an Brüchen. Wie setze ich den euklidschen Algorithmus um.

Dass du, viertel, oder matph das anders programmieren würdet, ist mir auch klar.
Außerdem: Der euklidsche Algorithmus gehört in ein Unterprogramm oder wird gleich durch einen einzigen Befehl ausgeführt, die "große Anzahl" an Brüchen dürfte an der Beschränktheit von int scheitern. (Bei mir wird ja erst das endgültige Ergebnis gekürzt, gut, das könnte ich beheben, wenn ich den euklidschen Algorithmus nach der Zeile 50 einfüge.)  

Matph hatte irgendwo einen Link zu einem Online-C++ Buch angeführt, nur habe ich dort leider keine Antwort auf meine Fragen (außer 6.), das habe ich nicht gesucht) gefunden, sonst hätte ich sie hier nicht gestellt.

Soviel "Spekulatives" habe ich nicht benutzt außer dem Abbruch der Zahleneingabe durch Eingabe eines Buchstabens.
Aber ich werde das noch ausbessern.
Ich lese eben z3 als String ein und wandle das dann - falls möglich -in eine Zahl um. Ist ja wahrscheinlich kein so ein großes Problem.

chryso

Übrigens will ich vielleicht momentan gar nicht C++ erlernen, ich wollte einfach einmal ein erstes Programm schreiben, das ein wenig anspruchsvoller ist als die Ausgabe von "Hallo Welt!"

Ach noch etwas:
Ab Zeile 45 ist alles nur mehr in Grau. Daraus schließe ich, dass knapp davor, also beim if ein gravierender Fehler sein dürfte.




[ Nachricht wurde editiert von chryso am 27.06.2010 15:26:26 ]



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2010-06-27


Hallo Buri!

Danke für deine umfassenden Antworten!
Genau das brauchte ich.
Ich hatte deine Antwort noch nicht gesehen, als ich den vorigen Beitrag schrieb.

Wie schon gesagt, will ich nicht auf diese Art C++ erlernen.

LG chryso

[ Nachricht wurde editiert von chryso am 27.06.2010 13:28:46 ]



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26940
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2010-06-27


2010-06-27 13:21 - chryso in Beitrag No. 4 schreibt:
Ach noch etwas:
Ab Zeile 45 ist alles nur mehr in Grau. Daraus schließe ich, dass knapp davor, also beim if ein gravierender Fehler sein dürfte.
Hinter dem "ist" in Zeile 44 fehlt das ". Dadurch wird der gesamte nachfolgende Text als String (deshalb grau) dargestellt.

In der gleichen Zeile benutzt Du am Ende
C++
... << endl;
Das ist der richtige Weg, um unter C++ ein Zeilenende auszugeben. Damit erübrigen sich alle Frage nach "\n" oder "\n\n" oder "\r\n".



  Profil  Quote  Link auf diesen Beitrag Link
TheBear
Senior Letzter Besuch: im letzten Monat
Dabei seit: 31.01.2006
Mitteilungen: 1325
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2010-06-27


Hi Viertel,

2010-06-27 14:04 - viertel in Beitrag No. 6 schreibt:
In der gleichen Zeile benutzt Du am Ende
C++
... << endl;
Das ist der richtige Weg, um unter C++ ein Zeilenende auszugeben. Damit erübrigen sich alle Frage nach "\n" oder "\n\n" oder "\r\n".

Diese Aussage stimmt nur teilweise (ich weiß, ich hab es selbst mal genau so hier im Forum geschrieben). std::endl hat zwei Effekte: Es gibt ein korrektes Linefeed aus und führt danach ein flush auf dem Ausgabestrom aus. Letzteres ist aber nicht immer gewünscht und kann zu massiven Performanceeinbußen führen.

Man kann meinem jetzigen Wissensstand nach einfach '\n' nutzen, die Implementation der STL sollte das dann schon korrekt machen.

Hier noch ein Link dazu. Ich habe das da nicht zum ersten mal gelesen, das ist also wohl nicht nur eine urban legend.

Gruß TheBear



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2010-06-27


2010-06-27 14:04 - viertel in Beitrag No. 6 schreibt:

Hinter dem "ist" in Zeile 44 fehlt das ". Dadurch wird der gesamte nachfolgende Text als String (deshalb grau) dargestellt.

Ja klar.


In der gleichen Zeile benutzt Du am Ende
C++
... << endl;
Das ist der richtige Weg, um unter C++ ein Zeilenende auszugeben. Damit erübrigen sich alle Frage nach "\n" oder "\n\n" oder "\r\n".

Nein diese Frage erübrigt sich nicht. Denn es ist kürzer, "\n\n" einfach anzufügen als "...<< endl << endl;" zu schreiben.

chryso

[ Nachricht wurde editiert von chryso am 27.06.2010 16:45:42 ]



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2010-06-27


Hallo,

Tatsächlich gibt
template <class Ch, class Tr>
  basic_ostream<Ch,Tr>& endl(basic_ostream<Ch,Tr>&);
\n aus, und führt flush() aus, wobei \n sowohl einfach im String geschrieben als auch hier (genau wie beim Einlesen,...) im Textmodus immer Systemspezifisch übersetzt wird, falls dieses Verhalten nicht gewünscht ist, so muss der Binärmodus verwendet werden.

In obigen Programm ist im Grunde nach jeder Ausgabe das flush() gewünscht. So wie der Code oben steht, wird z.B. der User erst nach dem er z1,... eingegeben hat, "Gib den Zähler des ersten Bruchs an: ",... zu lesen bekommen.
(Es sei denn, das verwendete Terminal/Terminalemulator/... liest direkt den Systempuffer aus. (Zwar so nicht ganz korrekt, aber anschaulich))

Fazit: Am einfachsten nach jeder Ausgabe auf die eine Eingabe folgen soll endl() benutzen smile

--
mfg
matph



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2010-06-27


2010-06-27 16:54 - matph in Beitrag No. 9 schreibt:

In obigen Programm ist im Grunde nach jeder Ausgabe das flush() gewünscht. So wie der Code oben steht, wird z.B. der User erst nach dem er z1,... eingegeben hat, "Gib den Zähler des ersten Bruchs an: ",... zu lesen bekommen.

Danke, das stand in dem von dir verlinkten Skript nicht, sondern nur, dass der Unterschied 'derzeit' nicht relevant sei.

**************


Ich habe mich nun durch die mühevolle Beschreibung von Variablen  gekämpft (mühevoll deshalb, weil vieles recht umständlich beschrieben wird, was ich so nicht brauche oder eh klar oder vielleicht sogar fehlerhaft* ist) und dabei stieß ich auf folgendes Beispiel:
C++
  std::cout << "Geben Sie bitte durch Leerzeichen getrennt eine Ganzzahl, 2 Kommazahlen "
            "und ein Zeichen ein:\n";
 
    std::cin >> Zahl             // Eingabe von Werten
             >> Kommazahl1       // mit denen die 4
             >> Kommazahl2       // Variablen gefüllt
             >> Zeichen;         // werden
 
    std::cout << "Zahl: "  << Zahl << std::endl  // Ausgabe der Werte
              << "Kommazahl1: " << Kommazahl1 << std::endl  // 
         ......
}
Ausgabe: 
Geben Sie bitte durch Leerzeichen getrennt eine Ganzzahl, 2 Kommazahlen und ein Zeichen ein:
Benutzereingabe: 6 8.4 6.0 g
Zahl: 6
Kommazahl1: 8.4
Kommazahl2: 6
Zeichen: g
 

Dies ist zwar nicht im Kapitel "Eingabe" zu finden, aber ich  schließe daraus, dass man - nicht durch Beistriche getrennt, sondern durch Leerzeichen - sehr wohl mehrere Eingaben in einer Zeile tätigen kann. (Frage 2))

Habe ich nun mit folgender Interpretation des oben Gesagten für mein 'Problem' recht?
C++
cout <<"Gib Zähler und Nenner des ersten Bruchs (durch Leerzeichen getrennt) an: ";
cin >>z1 >> n1;

*************

Hier steht, dass beide Variablentypen "int" und "long" im Zahlenbereich von -2147483648 bis +2147483647 liegen.
Stimmt das? Da verstehe ich dann nicht, wozu es überhaupt diese Unterscheidung gibt.
 

LG chryso



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2010-06-27


Hallo,

Man kann natürlich beliebig viele Eingaben, die man wie man möchte separieren kann, in eine Zeile schreiben, wobei man ggf. hierfür die Routinen schreiben muss, um diese weiterverarbeiten zu können.
Dein Beispiel zu z1 und n1 passt.

Zu den verschiedenen Datentypen findest du hier eine recht übersichtliche Tabelle smile

--
mfg
matph



  Profil  Quote  Link auf diesen Beitrag Link
TheBear
Senior Letzter Besuch: im letzten Monat
Dabei seit: 31.01.2006
Mitteilungen: 1325
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, eingetragen 2010-06-27


2010-06-27 18:10 - chryso in Beitrag No. 10 schreibt:

Hier steht, dass beide Variablentypen "int" und "long" im Zahlenbereich von -2147483648 bis +2147483647 liegen.
Stimmt das? Da verstehe ich dann nicht, wozu es überhaupt diese Unterscheidung gibt.

So richtig schön ist das Buch nicht - Richtig müsste es ungefähr so heißen (Achtung, die genauen Werte weiß ich nicht; die muss man im C++-Standard nachlesen):

Ein Byte sind mindestens 8 Bit (es geht auch anders, manche Taschenrechner haben z.B. Bytes aus 5 Bit, da muss ein C++-Compiler dann mindestens 1.6 Maschinen-Bytes zu einem logischen Byte zusammenfassen)
Ein char ist genau ein Byte groß.
Ein int ist mindestens zwei Byte groß (-32768 bis 32767, wenn 1 Byte = 8 bit)
Ein long ist mindestens vier Byte groß.
...

Der Punkt ist: die Werte sind plattformabhängig, und müssen nur die oben genannten Mindestanforderungen erfüllen, dürfen aber gerne höhere Anforderungen erfüllen. Das ist hier der Fall, dadurch sind int und long nicht mehr unterscheidbar. Nur bei char ist die genaue Größe vorgeschrieben, soweit ich das weiß.


[Die Antwort wurde nach Beitrag No.10 begonnen.]



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, vom Themenstarter, eingetragen 2010-06-27


@matph
Wenn man sein erstes Programm in C++ schreibt, kann man keine Eingabe verwenden, für die man "ggf. erst eine Routine schreiben muss". Deshalb war meine Frage 2) auch ganz konkret.

Nur hatte ich - da ich diese Eingabe nicht kenne - (sonst müsste ich ja nicht fragen) angenommen, man könne vielleicht die einzelnen Variablen mit Kommata separieren. Tatsächlich lässt sich diese Trennung mit Leerzeichen durchführen.

Aber warum kann man mir diese für einen Insider einfache Frage erst beantworten, nachdem durch stundenlanges Suchen selbst darauf gestoßen bin?

Deine Tabelle, matph, mag übersichtlich sein, aber 1.) sie ist für C (ob sie auch für C++ gilt, kann ich dann nur hoffen)  2) sie hat nicht einmal eine Bezeichnung der Datentypen, da kann ich dann nur mutmaßen, was die einzelnen Bezeichnungen bedeuten könnten 3)Es kommen andere Typen vor als in dem anderen Link. Außerdem was heißt "typical value". Wie ist "typical" definiert? Genaugenommen wirft die Tabelle mehr Fragen auf als ich vor dem Ansehen hatte. frown

Danke TheBear! Deine Beschreibung hat mir da mehr Klarheit gebracht.

chryso



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, eingetragen 2010-06-27


Hallo,

2010-06-27 19:52 - chryso in Beitrag No. 13 schreibt:
Nur hatte ich - da ich diese Eingabe nicht kenne - (sonst müsste ich ja nicht fragen) angenommen, man könne vielleicht die einzelnen Variablen mit Kommata separieren. Tatsächlich lässt sich diese Trennung mit Leerzeichen durchführen.

Aber warum kann man mir diese für einen Insider einfache Frage erst beantworten, nachdem durch stundenlanges Suchen selbst darauf gestoßen bin?

Buri hat doch in Beitrag No.3 darauf ganz konkret geantwortet confused

Tatsächlich könntest du die Variablen genausogut durch einen Tabulator oder eine neue Zeile trennen,... dies macht überhaupt keinen Unterschied im Programm, es bleibt einfach immer alles im Puffer, solange es nicht benötigt wird smile


2010-06-27 19:52 - chryso in Beitrag No. 13 schreibt:
Deine Tabelle, matph, mag übersichtlich sein, aber 1.) sie ist für C (ob sie auch für C++ gilt, kann ich dann nur hoffen)  2) sie hat nicht einmal eine Bezeichnung der Datentypen, da kann ich dann nur mutmaßen, was die einzelnen Bezeichnungen bedeuten könnten 3)Es kommen andere Typen vor als in dem anderen Link. Außerdem was heißt "typical value". Wie ist "typical" definiert? Genaugenommen wirft die Tabelle mehr Fragen auf als ich vor dem Ansehen hatte. frown

Du kannst davon ausgehen, dass ich die Tabelle nicht als Antwort verlinkt hätte, wenn diese nicht auch für C++ zutreffen würde (dieses basiert hierbei auf dem C90 Standard), du musst also nicht hoffen.

In der Spalte Description steht eindeutig Maximum value for a short int, Minimum value for an int,... dabei sehe ich keinerlei Spielraum für Mutmaßungen was den Datentyp (hier eben short int bzw. int) betrifft.

Typical ist dabei gar nicht definiert, es ist ein Wert der für deinen Compiler auf deinem System zutreffen könnte.
Wenn man wissen möchte, wie groß die Datentypen tatsächlich sind, so muss man diese natürlich in der Spezifikation des Compilers für die entsprechende Architektur (von der dies nicht zuletzt maßgeblich beeinflusst wird) nachlesen.

--
mfg
matph



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, vom Themenstarter, eingetragen 2010-06-29


2010-06-27 16:54 - matph in Beitrag No. 9 schreibt:

Fazit: Am einfachsten nach jeder Ausgabe auf die eine Eingabe folgen soll endl() benutzen smile

Da ich nun auch ein Programm testen kann, sehe ich den Unterschied zwischen fed-Code einblenden
und fed-Code einblenden

Was da intern genau passiert, weiß ich zwar noch immer nicht genau ( was ist ein flush), aber ich sehe den Unterschied in der Ausgabe.

Dass man diesen Unterschied im  Online-Tutorial als anfangs unwichtig abtut, ist eigentlich nicht verständlich.  

Denn es ist doch wesentlich, ob man eine Aufforderung zu einer Zahleneingabe VOR oder NACH der Eingabe sieht.

chryso



  Profil  Quote  Link auf diesen Beitrag Link
xycolon
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 11.11.2004
Mitteilungen: 2643
Aus: Herten
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.16, eingetragen 2010-06-29


2010-06-29 20:57 - chryso in Beitrag No. 15 schreibt:
2010-06-27 16:54 - matph in Beitrag No. 9 schreibt:

Fazit: Am einfachsten nach jeder Ausgabe auf die eine Eingabe folgen soll endl() benutzen smile


Was da intern genau passiert, weiß ich zwar noch immer nicht genau ( was ist ein flush), aber ich sehe den Unterschied in der Ausgabe.

Wenn man mehrere Ausgaben nacheinander machen möchte und dafür mehrere Befehle zur ausgabe nutzt, ist es schneller die einzelnen Teile erstmal im Speicher zu sammeln und dann in einem einzigen Schritt alles auf einmal an die Konsole (den Bildschirm oder was auch immer) zu schicken.
Eine solche Aktion heißt gemeinhin "flush".

gruß,
xycolon



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.17, vom Themenstarter, eingetragen 2010-06-30


@Jan-Philipp, Danke.

==========

Da ich mein Programm nun testen konnte und feststelle, dass es ganz ausgezeichnet funktioniert, stelle ich es nun nochmals hierher.
C++
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. { int z1, n1, z2, n2, z3, ez, en, hz, hn, hr, i;
  7. char g;
  8. cout <<"Addition von Bruchzahlen " << endl<< endl;
  9.  
  10. do{
  11. cout << "Gib den Zaehler und Nenner (durch ein Leerzeichen getrennt) \n";
  12. cout << "des ersten Bruches an: ";
  13. cin >> z1 >> n1;
  14. cout << endl<<"Der erste Bruch ist "<<z1 <<"/"<<n1 <<endl;
  15. cout <<endl << "Gib den Zaehler und Nenner des zweiten Bruches an: ";
  16. cin >> z2 >>n2;
  17. cout << "Der zweite Bruch ist "<<z2 <<"/"<<n2 <<endl;
  18.  
  19. i=2;
  20.  
  21. en=n1*n2;
  22. ez=z1*n2+z2*n1;
  23. if (en==0)
  24. cout <<endl<<"Ungueltige Eingabe! "<<endl;
  25. }while (en==0 );
  26.  
  27. cout <<endl<< "Gib weitere Brueche ein oder beende das Einlesen "
  28. "durch Eingabe einer 0 "<<endl;
  29.  
  30. do {
  31.  
  32. cout <<endl<< "Neuer Zaehler: ";
  33. cin >>z3;
  34.  
  35. while (z3!=0)
  36. {
  37. i++;
  38. z2=z3;
  39.  
  40. do{
  41. cout << "Neuer Nenner: ";
  42. cin >>n2;
  43. if (n2==0)
  44. cout << endl<<"Ungueltige Eingabe fuer den Nenner "<< endl;
  45. else
  46. cout <<endl<< "Der " << i <<".te Bruch ist " << z2<<"/"<<n2<<endl;
  47. } while (n2==0);
  48.  
  49. z1=ez;
  50. n1=en;
  51. en=n1*n2;
  52. ez=z1*n2+z2*n1;
  53. cout <<endl << "Neuer Zaehler: ";
  54. cin >>z3;
  55. }
  56.  
  57. hn=abs(en); //Euklidscher Algorithmus fuer ggT
  58. hz=abs(ez);
  59. while (hn>0)
  60. {
  61. hr=hz-(hz/hn)*hn;
  62. hz=hn;
  63. hn=hr;
  64. }
  65. ez=ez/hz; // durch ggT kuerzen
  66. en=en/hz;
  67. cout<<endl<< "Das Ergebnis wurde gekuerzt durch "<<hz<<endl;
  68.  
  69. cout <<endl<<"Ergebnis: ";
  70. if(i==2)
  71. cout <<endl<<z1 <<"/" <<n1 <<" + " <<z2 <<"/" <<n2 <<" = " ;
  72. cout <<ez <<"/" <<en<< endl;
  73.  
  74. cout<< endl <<"Willst du eine neue Addition durchfuehren? j/n " ;
  75. cin>>g;
  76. cout<< endl ;
  77. ez=0; en=1;
  78. i=0;
  79.  
  80. } while (!(g =='n' ||g=='N'));
  81.  
  82. return 0;
  83. }

LG chryso



[ Nachricht wurde editiert von chryso am 30.06.2010 01:25:58 ]



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.18, eingetragen 2010-06-30


Hallo,

Ausgezeichnet, dies sieht doch sehr gut aus smile

Nach dem du ja sicherlich den Code gepostet hast, um ein Feedback zu erhalten:

Das richtige Einrücken ist unheimlich wichtig (und man sollte es sich daher von Anfang an angewöhnen), um die Übersicht beim Programmieren zu behalten, und die Lesbarkeit des Codes zu erhöhen:
C++
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main(){
  5. int z1, n1, z2, n2, z3, ez, en, hz, hn, hr, i;
  6. char g;
  7. cout << "Addition von Bruchzahlen " << endl << endl;
  8.  
  9. do{
  10. cout << "Gib den Zaehler und Nenner (durch ein Leerzeichen getrennt) \n";
  11. cout << "des ersten Bruches an: ";
  12. cin >> z1 >> n1;
  13. cout << endl << "Der erste Bruch ist " << z1 << "/" << n1 << endl;
  14. cout << endl << "Gib den Zaehler und Nenner des zweiten Bruches an: ";
  15. cin >> z2 >> n2;
  16. cout << "Der zweite Bruch ist " << z2 << "/" << n2 << endl;
  17.  
  18. i=2;
  19.  
  20. en=n1*n2;
  21. ez=z1*n2+z2*n1;
  22.  
  23. if(en==0)
  24. cout << endl << "Ungueltige Eingabe! " << endl;}
  25. while(en==0);
  26.  
  27. cout << endl << "Gib weitere Brueche ein oder beende das Einlesen "
  28. "durch Eingabe einer 0 " << endl;
  29.  
  30. do{
  31. cout << endl << "Neuer Zaehler: ";
  32. cin >> z3;
  33.  
  34. while(z3!=0){
  35. i++;
  36. z2=z3;
  37.  
  38. do{
  39. cout << "Neuer Nenner: ";
  40. cin >> n2;
  41. if(n2==0)
  42. cout << endl << "Ungueltige Eingabe fuer den Nenner " << endl;
  43. else
  44. cout << endl << "Der " << i << ".te Bruch ist " <<
  45. z2 << "/" << n2 << endl;}
  46. while(n2==0);
  47.  
  48. z1=ez;
  49. n1=en;
  50. en=n1*n2;
  51. ez=z1*n2+z2*n1;
  52. cout << endl << "Neuer Zaehler: ";
  53. cin >> z3;}
  54.  
  55. hn=abs(en); //Euklidscher Algorithmus fuer ggT
  56. hz=abs(ez);
  57. while(hn>0){
  58. hr=hz-(hz/hn)*hn;
  59. hz=hn;
  60. hn=hr;}
  61. ez=ez/hz;
  62. en=en/hz;
  63. cout << endl << "Das Ergebnis wurde gekuerzt durch " << hz << endl;
  64.  
  65. cout << endl << "Ergebnis: ";
  66. if(i==2)
  67. cout << endl << z1 << "/" << n1 << " + " << z2 << "/" << n2 << " = " ;
  68. cout << ez << "/" << en << endl;
  69.  
  70. cout << endl << "Willst du eine neue Addition durchfuehren? j/n " ;
  71. cin >> g;
  72. cout << endl ;
  73. ez=0; en=1;
  74. i=0;}
  75. while(!(g =='n' ||g=='N'));
  76.  
  77. return 0;}
Man sollte dabei auf keinen Fall Tabulatoren und Leerzeichen mischen.
(Die Klammersetzung, Abstände zwischen Operatoren,... kann man natürlich ebenso anders gestalten)
Beim Einrücken sind mir ein paar Schönheitsfehler aufgefallen:
4c4
< int main(){
---
> int main(void){
18,19d17
<     i=2;
<
29a28
>   i=2;
75c74
<   while(!(g =='n' ||g=='N'));
---
>   while(g!='n' && g!='N');

Der andere Punkt ist, es gibt unheimlich viele Fallunterscheidungen im Programm, so sehen die Aufforderungen zur Eingabe immer wieder anders aus und auch die Ausgaben unterscheiden sich. Dies ist hier vielleicht als Spielerei so gewollt, doch generell sollte man versuchen, Redundanzen zu vermeiden, und ein Interface so einfach wie möglich zu gestalten.

--
mfg
matph

[ Nachricht wurde editiert von matph am 30.06.2010 01:59:28 ]



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.19, vom Themenstarter, eingetragen 2010-06-30


Hallo matph!

Nachdem ich den Code gepostet hatte, dachte ich mir, dass das nicht so ordentlich aussehe und dann habe ich versucht, den Code ein wenig ordentlicher zu gestalten.
Offensichtlich hat sich das mit deinem Beitrag überschnitten.

Na so besonders 'ordentlich' ist mein Code wahrscheinlich nicht geworden, aber ich habe versucht, zusammengehörige Klammern untereinander zu stellen (waren sie eigentlich in Scite).
Ich habe einmal gehört, dass man das sollte.

Aber eigentlich gefällt mir eh besser, wenn man z.B. do und while untereinander schreibt.

(2010-06-30 01:31 - matph
4c4
< int main(){
---
> int main(void){


Was ist hier der Unterschied?



18,19d17
<     i=2;
<
29a28
>   i=2;


Gut, da kann man es auch hinstellen.
Ich hatte es dorthin geschrieben, wo eben zwei Brüche eingelesen worden waren.

Was bedeutet eigentlich 29a28?
Zwischen Zeile 28 und 29 ? Aber was bedeutet a ?

(2010-06-30 01:31 - matph
75c74
<   while(!(g =='n' ||g=='N'));
---
>   while(g!='n' && g!='N');


Ich hatte das geschrieben, was mir logischer vorkam.
Bei der 2. Variante hätte ich nachdenken müssen, ob es wohl das macht, was ich wollte. Aber es ist natürlich dasselbe.

Ist die Variante mit dem && schneller?

LG Chryso



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.20, eingetragen 2010-06-30


Hallo,

Tatsächlich gibt es keinen praktischen unterschied zwischen der Version mit void und der ohne (der Referenz entsprechende sollte es allerdings dort stehen: hier).

Beide while-Schleifen werden von der gcc zum selben Assembler-Code übersetzt.

Die Bedeutung der Buchstaben: smile
a ... added
d ... deleted
c ... changed


--
mfg
matph



  Profil  Quote  Link auf diesen Beitrag Link
Vharhbi
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 05.03.2010
Mitteilungen: 28
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.21, eingetragen 2010-06-30


2010-06-30 03:54 - matph in Beitrag No. 20 schreibt:

Tatsächlich gibt es keinen praktischen unterschied zwischen der Version mit void und der ohne (der Referenz entsprechende sollte es allerdings dort stehen: hier).


Das mit dem void ist aus dem C Standard. Der C++ Standard sieht das anders, was (wenn ich mich richtig erinner) auch im Buch vom Stroustrup stehen duerfte und mit besseren Typsystem/Typpruefung bei C++ zusammenhaengt.



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.22, eingetragen 2010-06-30


Hallo,

In C++ gilt:
ISO/IEC 14882 - 8.3.5 2
[...] If the parameter-declaration-clause is empty, the function takes no arguments. The parameter list (void) is equivalent to the empty parameter list. [...]


In C hingegen gibt man mit (void) an, dass die Funktion keine Parameter besitzt, () bedeutet, dass die Parameter nicht spezifiziert sind.

In beiden fällen kann man void weglassen, ich finde es schöner mit smile

--
mfg
matph



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.23, vom Themenstarter, eingetragen 2010-06-30


Habe ich das nun richtig verstanden?

int main(void)
sagt eigentlich nur aus, dass der Funktion 'main' keine Parameter übergeben werden.
....
Hier sollte man am Ende 'return 0' (o.ä.) schreiben;


Wohingegen (dein Link)
void main()
aussagt, dass die Rückgabe 'nichts' ist, also kein int wie im Fall oben.
.....
Hier kommt am Ende ein return;

Dann müsste es eigentlich auch ein
void main(void)
geben?

--------
Übrigens dein i erst 28a29 gibt doch Sinn, denn da muss dem i weniger oft der Wert 2 zugewiesen werden => das Programm ist schneller wink




  Profil  Quote  Link auf diesen Beitrag Link
LutzL
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 06.03.2002
Mitteilungen: 10094
Aus: Berlin-Mahlsdorf
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.24, eingetragen 2010-06-30


Hi,

bis auf evtl. Spitzfindigkeiten ist "main()" und "main(void)" dasselbe. C++ wird Dir eine Warnung ausgeben, wenn der Rückgabetyp nicht int ist. In C ist "void main()" möglich.

Rückgabe von 0 steht für erfolgreichen Programmablauf, Werte ungleich 0 sind Fehlerrückmeldungen, die z.B. von einem aufrufenden Skript ausgewertet werden können.

Ciao Lutz



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.25, vom Themenstarter, eingetragen 2010-07-01


2010-06-27 12:06 - viertel in Beitrag No. 2 schreibt:

Dabei kann nur ein Wissen mit Löchern so zahlreich wie in einem Ytong-Block entstehen (der übliche Löchervergleich mir einem Schweizer Käse genügt da nicht wink ).


Hallo Viertel!

Dein Vorwurf war in keiner Weise gerechtfertigt.
Natürlich habe ich mir ein paar Kenntnisse mit Hilfe eines  Online-Tutorials angelesen. Wie hätte ich sonst ein syntaktisch fast ganz richtiges Programm schreiben können? Das kann man sich nicht "einfach so" überlegen. Du wirst doch nicht glauben, dass die wenigen fehlerhaften Codebeispiele von Silke und grizzy reichen, sich eine korrekte Syntax anzueignen! Ganz abgesehen davon, dass vieles gar nicht vorgekommen war. Gerade bei einer Programmiersprache, wo es auf jeden Strich drauf ankommt - besonders, wenn man ein Programm gar nicht testen kann!!

2010-06-27 12:06 - viertel in Beitrag No. 2 schreibt:

... sollte ich doch hier auch schnell ein paar Worte schreiben können. Mache ich aber nicht, weil es eben nur Flickwerk ist.

Dabei benutzt Du aber so viel Spekulatives (eben wegen mangelnder Kenntnisse), daß ich Dir halt erst mal zu diesem Basiskurs raten muß.

Wenn man deinen Beitrag durchlas, konnte man zum Schluss kommen, der Code sei so falsch, dass es sich nicht rentiere, hier mit einer Korrektur zu beginnen.

1) Ich hatte gar nicht um eine Korrektur gebeten, sondern ganz konkrete Fragen gestellt. Warum dürfen das andere, aber ich nicht?

2) Wie ich schon weiter oben feststellte, gab es nicht so viel 'Spekulatives'. Ich hatte nur die Idee, es gebe eine Möglichkeit, die Korrektheit eines eingelesenen Datentyps zu überprüfen. Dies wäre ja vielleicht sinnvoll, denn wie fängt man falsche Eingaben ab?
Gibt es nicht. Na und? Was hinderte dich, das zu sagen?
Muss ich halt eine andere Lösung für den Abbruch der Zahleneingabe finden.

Natürlich habe ich das nicht in dem Online-Tutorial gefunden.
(Wie sollte ich etwas finden, das es nicht gibt?)

3) Sonst war das Programm  (bis auf ein fehlendes ; und " ) richtig.

Versteh mich nicht falsch:
Ich mache dir keinen Vorwurf, dass du meine Fragen nicht beantwortest. Das kann man nicht von jemandem erwarten.
Das haben, Gott sei Dank, andere gemacht.

Aber mich störte es, dass du so tust, als wäre dies (eben wegen mangelnder Kenntnisse) ein fehlerhaftes Programm.
Das war es nicht.

LG chryso





  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26940
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.26, eingetragen 2010-07-03


Och nö frown

Da hatte ich schon ein "Versteh mich nicht falsch…" dazu geschrieben, bin aber trotzdem auf Grund gelaufen.

Zu dem Programm selbst habe ich doch gar nichts geschrieben. Den Basiscode hatten wir doch schon per PM geklärt.

Nun hast Du aber versucht, daraus mehr zu machen, mit einem Wissen, das Du aus dem von Dir angegebenen Link gezogen hast (ich habe keine Ahnung, was/wieviel Du davon gelesen hast). Mit diesem Wissen hattest Du ja nach Deiner Angabe (die ich jetzt erst erfahren habe) auch den Basiscode erstellt (wie Du das hinbekommen hattest, wußte ich nicht, hatte mich aber schon über den bis auf Winzigkeiten der Groß-/Kleinschreibung perfekten Code gewundert).

Du hast daraufhin Ideen entwickelt, wie man das Programm verbessern könnte. Eine für einen neugierigen Menschen völlig normale Sache. Nun fehlte Dir aber das Wissen, wie das zu bewerkstelligen ist, und Du hast spekuliert. Nun wird mir meine Bemerkung "Dabei benutzt Du aber so viel Spekulatives…" auf die Goldwaage gelegt. Das bezog sich natürlich auf die Änderungen ralativ zum Basiscode (den ich ja kannte). Daß Du das nun so auffaßt, daß ich damit gleich den ganzen Code kritisiere, ist wieder mal eines dieser mißlichen, aber immer wieder auftretenden Mißverständnisse.

Und Deine Fragen sah ich etwa auf diesem Level:
Ein Schüler, der gerade das Dividieren gelernt hat, will wissen, was der euklidische Algorithmus ist und wie er funktioniert (da geht es ja auch um Division, hat er irgendwo aufgeschnappt). Das würde ich ihm auch nicht beantworten (wenn er nicht gerade deutlich überdurchschnittlich begabt ist), sondern ihn darauf verweisen, erst mal weiter zu lernen, das kommt dann schon irgendwann, und dann kann er es auch verstehen.

Natürlich kann man Deine Fragen beantworten, aber wie Du gesehen hast, zieht das zwangsläufig weitere Fragen nach sich (Bsp. eukl. Alg.: was sind Reste? Warum muß ich die dann so weiter verwenden? Wozu brauche ich den GGT? e.t.c.). Es fehlt einfach noch zu viel Grundwissen. Deshalb hatte ich die Beantwortung abgelehnt. Aber "Das haben, Gott sei Dank, andere gemacht.". Kann ja auch jeder machen.

Zitat SparrowCaptain Jack Sparrow:
Alles klar soweit?
Hoffentlich kennst Du den Film, sonst geht die Bemerkung auch in die Hose.
 wink



  Profil  Quote  Link auf diesen Beitrag Link
Blackbeard
Ehemals Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 21.05.2009
Mitteilungen: 57
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.27, eingetragen 2010-07-03


2010-06-30 12:32 - LutzL in Beitrag No. 24 schreibt:
...In C ist "void main()" möglich...
Seit/Bis wann denn das ?? Gemäß ISO/IEC:9899 ist das auch in C nicht erlaubt, d.h. int muss es geben, alles andere ist implementations- bzw. compiler-abhängig.



  Profil  Quote  Link auf diesen Beitrag Link
LutzL
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 06.03.2002
Mitteilungen: 10094
Aus: Berlin-Mahlsdorf
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.28, eingetragen 2010-07-03


Ok,

ob der Standard es erlaubt, weiss ich nicht, ich habe es aber oft genug gesehen, bei kleinen Progrämmchen. In C (gcc) gibt es, soweit ich mich erinnere, eine Warnung, in C++ ist das ein Fehler.

Ciao Lutz



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.29, vom Themenstarter, eingetragen 2010-07-13


2010-07-03 01:41 - viertel in Beitrag No. 26 schreibt:

(wie Du das hinbekommen hattest, wußte ich nicht, hatte mich aber schon über den bis auf Winzigkeiten der Groß-/Kleinschreibung perfekten Code gewundert).

Ich hatte mich ja wohl bemüht. Denn testen konnte ich ihn ja nicht.


Nun wird mir meine Bemerkung "Dabei benutzt Du aber so viel Spekulatives…" auf die Goldwaage gelegt. Das bezog sich natürlich auf die Änderungen relativ zum Basiscode.

Auch hier war das einzig Spekulative, dass man vielleicht eine Eingabe auf die Korrektheit des Datentyps überprüfen könne.
Gut, das lässt sich nicht so einfach machen. Deshalb hatte ich ja gefragt.

Andrerseits wollte ich nicht vor jeder Eingabe eines zusätzlichen Bruchs ein char für eine Abbruchsbedingung einlesen.

So, wie ich das nun umgesetzt habe, funktioniert der Code tadellos.
Und es war auch nicht schwierig.

Alles andere war keine Spekulation.


Natürlich kann man Deine Fragen beantworten, aber wie Du gesehen hast, zieht das zwangsläufig weitere Fragen nach sich

Ist das nicht immer so, wenn eine Frage nicht gleich umfassend im ersten Beitrag beantwortet wurde?

Waren es hier mehr Fragen als sonst bei vergleichbaren Aufgaben?

LG chryso




  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.30, eingetragen 2010-07-13


Hallo,

Das Einlesen eines bestimmten Datentyps bei einer Eingabe würde ich wie folgt machen smile
C++
#include <iostream>
using namespace std;
 
template <class T>
T getT(char s='\n'){
  T x;
  try{
    cin.exceptions(ios_base::badbit | ios_base::failbit); 
    cin >> x;} 
  catch(const exception& x){
    cerr << "Error: " << typeid(x).name() << endl << 
      "Retry " << typeid(T).name() << ":" << endl;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), s);
    return getT<T>(s);}
  cin.ignore(numeric_limits<streamsize>::max(), s);
  return x;} 
 
int main(int argc, char** argv){
  int i; double d;
  cout << "int:" << endl;
  i = getT<int>();
  cout << "double:" << endl;
  d = getT<double>();
  cout << i << " " << d << endl;
  return 0;}

--
mfg
matph

[ Nachricht wurde editiert von matph am 13.07.2010 04:32:38 ]



  Profil  Quote  Link auf diesen Beitrag Link
chryso
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 07.02.2009
Mitteilungen: 10529
Aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.31, vom Themenstarter, eingetragen 2010-07-14


Hallo matph!

Nicht, dass ich ihn brauchte, aber leider ist da in deinem Code noch ein Fehler drinnen. wink
Ich habe zwar versucht, ihn auszubessern, ist mir aber nicht geglückt.

Und zwar, wenn man ein char statt einer Zahl eingibt, schreibt das Programm "Retry i (oder d):". Die erste Zahl oder das erste char, das man nun eingibt, wird ignoriert, anstatt dass diese Zahl dem i zugewiesen (oder ein erneutes "Retry" ausgegeben) würde.

LG chryso



  Profil  Quote  Link auf diesen Beitrag Link
matph
Senior Letzter Besuch: im letzten Quartal
Dabei seit: 20.11.2006
Mitteilungen: 5506
Aus: A
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.32, eingetragen 2010-07-14


Hallo,

Ich hatte den Code durchaus getestet, und er funktioniert auch im Terminal/Eingabeaufforderung problemlos.
Im SciTE allerdings, so denke ich kommst du auch auf dieses Ergebnis, wird anders gepuffert, daher kommt es zu diesem Verhalten.

Dieser Code sollte das gewünschte Verhalten ermöglichen smile
C++
#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>
using namespace std;
 
template <class T>
T getT(){
  T x; string str;
  stringstream sts;
  try{
    sts.exceptions(ios_base::badbit | ios_base::failbit);
    if(getline(cin,str).eof()) 
      throw runtime_error("eof");
    sts << str;
    sts >> x;}
  catch(runtime_error r){
    throw r;}
  catch(const exception& e){
    cerr << "Error: " << e.what() << endl <<
      "Retry " << typeid(T).name() << ":" << endl;
    return getT<T>();}
  return x;}
 
int main(int argc, char** argv){
  int i; double d;
  cout << "int:" << endl;
  i = getT<int>();
  cout << "double:" << endl;
  d = getT<double>();
  cout << i << " " << d << endl;
  return 0;}

--
mfg
matph

[ Nachricht wurde editiert von matph am 14.07.2010 03:11:58 ]



  Profil  Quote  Link auf diesen Beitrag Link
Wrathchild
Senior Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 09.01.2007
Mitteilungen: 783
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.33, eingetragen 2010-07-18


2010-06-27 14:04 - viertel in Beitrag No. 6 schreibt:
In der gleichen Zeile benutzt Du am Ende
C++
... << endl;
Das ist der richtige Weg, um unter C++ ein Zeilenende auszugeben. Damit erübrigen sich alle Frage nach "\n" oder "\n\n" oder "\r\n".
Das liest man immer wieder und es ist falsch. cout << '\n' gibt unabhängig vom Betriebssystem einen Zeilenumbruch aus, und zwar so, wie es auf der jeweiligen Plattform üblich ist (LF unter UNIX, CR unter Mac OS Classic, CRLF unter Windows). Der Unterschied zwischen cout << endl und cout << '\n' liegt darin, dass endl nicht nur einen Zeilenumbruch ausgibt, sondern auch den Ausgabepuffer flusht, was erhebliche Performanceeinbrüche verursachen kann. Ich habe Programme gesehen, bei denen ein Ersetzen von endl durch '\n' eine Performancesteigerung von mehreren hundert Prozent nach sich zog.



  Profil  Quote  Link auf diesen Beitrag Link
chryso hat die Antworten auf ihre/seine Frage gesehen.
chryso hatte hier bereits selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]