Brauche Hilfe bei C++ - Übungsaufgaben (Anfängerlevel)
-
Hi,
ich hoffe, hier kann mir wer weiterhelfen. Ich habe erst seit kurzem mit C++ angefangen und komme mit einigen Übungsbeispielen nicht zurecht, weil mir da Befehle und/oder Lösungsvorgänge fehlen - für die, die sich alle Postings durchlesen, bevor off-topic-fake-geschrei losgeht: Jup, ich gehör irgendwie zur Babbsi, die vergangene Woche ähnliche Fragen hatte, bin aber nicht ein und diesselbe Person. Den Kilometerunterschied würd man auch anhand der IP erkennen
Diesmal sind diese Aufgaben zu lösen, und ich weiß ehrlich gesagt nicht, wie ich da am Besten rangeh:
http://www.pri.univie.ac.at/~itep/ws0405/hue/hue02.htmlIch versuch mich erstmal durch die ersten 3 zu ackern, vielleicht lassen sich damit auch einige der restlichen lösen.
Der Übungsleiter meinte, dass die ersten drei mit "mod" oder "%" lösbar seien, aber das Thema selbst hatten wir nicht durchgenommen
Wir haben noch nicht viel gemacht, nur grundsätzliches, wie Grundrechnungsarten und wie was ausgegeben wird.
If- und While-Zeugs hatten wir auch noch nicht, auch wenn ich mir aus logischem Verständnis rausarbeiten kann, was das bedeutet. Aber wesentlich hat mir das bei den Arbeiten nicht geholfen - Nur damit ihr wisst, auf welchem Level die Beispiele zu lösen sein sollten.Beim 2. Beispiel weiß ich zwar schon, dass ich den mod brauch, um zu erkennen, ob ein Rest ist, und wenn der größer als 0 ist, ist die Zahl nicht durch 3 teilbar. Nur wie wende ich das in C++ an? Also wenn "a" der eingegebene Wert ist, dann "a%0" oder so ähnlich?
Bei Nr. 1 und 3 ist mir der "mod-Gebrauch" aber ziemlich schleierhaft *gesteh*
Wie kann ich (in Hinblick auf Bsp 7) den Wert vor einem Komma und danach separat ausgeben?
Sorry für die vielen Fragen, aber vielen Dank im Voraus,
lg,
N-Ice
-
Vielleicht doch noch das, was ich bisher ausprobiert habe. Bei Beispiel 2 hab ich:
#include <iostream.h>
int main()
{
int a,b;
cout << "Bitte geben Sie eine Zahl ein.";
cin >> a;
b = a%3;
if (b=0)
{
cout << "Diese Zahl ist durch 3 teilbar.";
}
else
{
cout << "Diese Zahl ist nicht durch 3 teilbar.";
}return 0;
}Doch egal welche Testzahlen ich eingebe, er gibt mir als Antwort immer aus, dass diese Zahl nicht durch 3 teilbar ist. Wo liegt mein Fehler?
-
OK, modulo (%) ist letztendlich auch nix anderes als ganzzahlige Division, das Ergebnis ist halt der Rest. Deshalb wird a%0 auch nicht funktionieren, da Division durch 0 nicht erlaubt ist.
Bsp:
[cpp]int a = 10, b = 3;
// die ganzzahlige Division von a durch b liefert als Ergebnis 3 Rest 1
int c = a / b; // c hat nun den Wert 3
int d = a % b; // d hat nun den Wert 1[/cpp]
Das kannst du zB bei Aufgabe 1 anwenden, um die einzelnen Stellen zu durchlaufen (/) bzw. den Wert einer Stelle zu ermitteln (%). Das sollte hoffentlich als Denkanstoss reichen.Hast du Aufgabe 1 gelöst, sollte Aufgabe 2 auch kein Problem mehr sein. Hierbei ist lediglich zu sagen, dass "Ziffernsumme" nix anderes als die Quersumme ist. Und eine Zahl ist durch 3 teilbar, wenn ihre Quersumme durch 3 teilbar ist.
Auch Aufgabe 3 sollte jetzt kein Problem mehr sein. Anstatt die Werte jeder einzelnen Ziffer zu summieren (wie noch in Aufgabe 2), gibst du die Ziffern einfach nacheinander aus.
Zu Aufgabe 7. Ich bin mir nicht ganz sicher, ob euer Lehrer dabei den Gebrauch von Gleitkommazahlen im Sinn hatte. Vor- und Nachkomma-Anteile kannst du zB so splitten
double geldwert = 15,49; int euro = static_cast<int>(geldwert); int cent = static_cast<int>(100.0 * (geldwert - euro));
Ich denke, du solltest die Geldbeträge trotzdem komplett als Integer speichern. Als Einheit ist hier natürlich nur die niederwertige sinnvoll (zB Cent). Über / und % kannst du dann zB Euro und Cent bestimmen.
-
hi groovemaster,
vielen dank für deine antwort!
beim ersten beispiel hab ich den knoten noch nicht ganz raus. nicht vom programmiertechnischen, sondern weil ich schon so nicht nachvollziehen kann, wie ich durch die divisionen und dem rest auf die stelle kommen soll, die ich mit der eingabe von 'n' (in deinem beispiel 'b') aussuche, und sie dann auch ausgeben kann. da fehlt mir grad echt der logische durchblick.beim beispiel 7:
den befehl static_cast hatten wir noch nicht. ist aber nach googlen etwas klarer. damit kann ich dann auch bsp 8 lösen, ist ja im grunde genommen dasselbe, nur umfangreicher. *denk*lg,
N-Ice
-
Hi,
Beispiel:
1358 % 10 = 8
1358 % 100 = 58
1358 % 1000= 358Basiernd auf diesem solltest du auf die Lösung kommen.
MfG Eisflamme
-
ich hätte noch ne lösung für die 13. aufgabe...
bin mir aber nicht sicher, ob es das ist was verlangt war und ob das überhaupt gut ist, was ich gemacht habe... hier ist mal der code:#include <iostream> using namespace std; int runden(float); int main() { cout << runden(40.9087765) << endl << runden(45.00000000000001) << endl << runden(100.87123342) << endl; cin.get(); return 0; } int runden(float zahl) { return (zahl + 0.5); }
das ist nur der code....
@ N-Ice:
Nun kannste ja mal überlegen, warum das so ist... damit du auch was zutun hast...
-
Modulo gibt den Restwert aus. Wie ja schon sehr schön erklärt worden ist.
Das Programm muss also prüfen ob der Restwert 0 ist.#include <iostream> using namespace std; int main() { int a, b; cout << "Eingabe: "; cin >> a; b = a % 3; // b den Restwert zuweisen if(b == 0) // Prüfen ob b = Restwert 0 ist cout << "Richtig" << endl; else cout << "Falsch, denn der Restwert ist nicht 0 sondern " << b << endl; }
-
Kommentaren wie
Nun kannste ja mal überlegen, warum das so ist... damit du auch was zutun hast...
zufolge ist wohl das Missverständnis im Umlauf, dass ich hier nur die Lösungen und fertige Codes suche, die ich dann brav abgeben kann und nix check.
Immerhin muß ich dann vor Ort ein ähnliches Beispiel programmieren und außerdem bin ich dort, WEIL ich programmieren lernen und dann auch können will. (Sonst hätt ich nach einer kaufmännischen-wirtschaftlichen Schule mit maximal Word und Excel im Unterricht ja was anderes studiert.)
Soviel zur Erklärung/Rechtfertigung, weshalb ich mit den Fragen zu euch komme, NACHDEM ich selbst rumprobiert und nach Ansätzen gegoogelt hab.
Und mod scheint ja noch eins der Simpleren zu sein, wenn mir da endlich mal der Knoten aufgeht.zum Bsp 13:
Das "using namespace std" kann ich mir bei diesem Beispiel sparen, oder? Laut google ist das nur gegen Namenskollidierungen, seh in dem Beispiel aber keine.
cin.get() macht was genau?
könnt ich das Beispiel nicht auch wie das Eurobeispiel lösen? Also wie bei dem Euro-Beispiel die Nachkomma-Beträge rausfiltern (z.b. 19,54 in 19 und 54) und dann schaun, ob die Zahl unter 50 ist, dann den ersten Wert nehmen, der zu Beginn vor dem Komma stand (also 19) und wenn sie größer ist ("else"), dann den ersten Wert nehmen und eins dazuzählen. Oder ist das zu quer gedacht?
Modulooooooo: Danke für das Beispiel. Mein Obiges hatte eh dasselbe gelöst, ich hatte nur dem Wert b mit dem Befehl (b=0) den Wert 0 zugewiesen, anstatt zu schaun, ob der Wert, der in b drin ist, gleich 0 ist (mit b==0). Hatte da den Fehler drin, das Beispiel selbst ist mir nach einfügen des zweiten "=" nun klar
-
N-Ice schrieb:
könnt ich das Beispiel nicht auch wie das Eurobeispiel lösen? Also wie bei dem Euro-Beispiel die Nachkomma-Beträge rausfiltern (z.b. 19,54 in 19 und 54) und dann schaun, ob die Zahl unter 50 ist, dann den ersten Wert nehmen, der zu Beginn vor dem Komma stand (also 19) und wenn sie größer ist ("else"), dann den ersten Wert nehmen und eins dazuzählen. Oder ist das zu quer gedacht?
Nein, das ist nicht zu quer gedacht, sondern entspricht nicht der Aufgabenstellung.
Aufgabe schrieb:
Schreiben Sie einen Ausdruck (also keine if-Anweisung oder ähnliches), der eine Zahl x kaufmännisch korrekt rundet (also aufrunden ab 0.5 und abrunden darunter).
Das Problem ist, dass normalerweise anstatt gerundet einfach die Nachkommastellen abgeschnitten werden, wenn du einen float zu int konvertierst. Das heisst dass aus 2.99 einfach 2 werden würde. Deshalb musst du 0.5 dazuzählen, weil dann 2.99+0.5=3.49 und das wird korrekt auf 3 gerundet.
Ach ja, noch zu Nr.2, da steht "mit Hilfe der Ziffernsumme überprüft, ob die eingegebene Zahl durch 3 teilbar ist", das heisst, du solltest wahrscheinlich nicht nur % verwenden sondern eher (Ziffer1+Ziffer2+Ziffer3)%3. Das hat zwar den gleichen Effekt, wird aber in der Aufgabenstellung so gefordert.
Wenn du die Nr.1 geschafft hast und eine beliebige Ziffer einer Zahl auslesen kannst, sind die Aufgaben 2 und 3 ganz einfach.
-
zum Bsp 13:
Das "using namespace std" kann ich mir bei diesem Beispiel sparen, oder? Laut google ist das nur gegen Namenskollidierungen, seh in dem Beispiel aber keine.
cout, endl und cin liegen in dem namespace std... entweder du machst using namespace std oder du scheibst vor das cout, endl und cin std::... sonst gibts fehler!(zumindest bei mir)
cin.get() macht was genau?
dies ist dazu dar, damit das programm sich nicht sofort wieder schließt... es wartet solang bis man ENTER eingegeben hat.
-
lustig schrieb:
Ach ja, noch zu Nr.2, da steht "mit Hilfe der Ziffernsumme überprüft, ob die eingegebene Zahl durch 3 teilbar ist", das heisst, du solltest wahrscheinlich nicht nur % verwenden sondern eher (Ziffer1+Ziffer2+Ziffer3)%3. Das hat zwar den gleichen Effekt, wird aber in der Aufgabenstellung so gefordert.
Yep, seh ich genauso. Sonst wärs auch irgenwie zu einfach und würde nicht ins Aufgabenbild passen.
N-Ice schrieb:
den befehl static_cast hatten wir noch nicht
[info]static_cast ist kein Befehl, da es in C++ keine Befehle gibt. Es ist nicht mehr und nicht weniger als ein Schlüsselwort.[/info]
Du kannst das Beispiel natürlich auch ohne static_cast machen. Dann wird dir ein guter Compiler aber mitteilen, dass uU Genauigkeit verlorengeht, da int nunmal den Wertebereich von double nicht abdeckt. In diesem Beispiel teilst du dem Compiler mit static_cast einfach mit, dass er sich keine Sorgen machen brauch, da du weisst was du tust.
-
Hi ihrs,
erstmal VIELEN DANK für die Hilfe! Die ersten 3 Beispiele hab ich nun tatsächlich lösen können, und das Mod sickert langsam bei mir durch
.. werd trotzdem noch ne Weile üben müssen.
Das 2. und 3. Beispiel hab ich allerdings relativ umständlich und langwierig gelöst, gibt sicher vereinfachendere Befehle, müßte aber grundsätzlich stimmen *hoff*
/*
Bsp. 2
*/#include <iostream.h>
#include <math.h>int main()
{
int a,b,x,y,z,zahl,zs,tb;cout << "Bitte geben Sie eine dreistellige Zahl ein.";
cin >> zahl;x=zahl/100;
a=zahl%100;
y=a/10;
b=a%10;
z=b;zs=x+y+z;
tb = zs%3;
if (tb==0)
{
cout << "Diese Zahl ist durch 3 teilbar.";
}
else
{
cout << "Diese Zahl ist nicht durch 3 teilbar.";
}return 0;
}/*
Bsp. 3
*/#include <iostream.h>
#include <math.h>int main()
{
int a,b,x,y,z,zahl;cout << "Bitte geben Sie eine dreistellige Zahl ein.";
cin >> zahl;x=zahl/100;
a=zahl%100;
y=a/10;
b=a%10;
z=b;cout<<"Die Umkehrung der Ziffernfolge ergibt "<< z << y << x <<'\n';
return 0;
}hmm.. meine Gedankengänge dazu.
lg, N-Ice
-
Sieht doch schon mal ganz gut aus. Ein paar kleine Anmerkungen trotzdem noch
#include <iostream> // iostream.h ist veraltet und falsch //#include <cmath> // math.h ist ebenfalls veraltet -> cmath ist korrekt // da wir aber keine speziellen Mathe-Funktionen brauchen, koennen wir uns die Header-Datei sparen using namespace std; // damit wir uns std:: ersparen int main() { // int a, b, x, y, z, zahl, zs, tb; // unnoetig, wir definieren Variablen dort, wo sie gebraucht werden cout << "Bitte geben Sie eine dreistellige Zahl ein:"; int zahl; cin >> zahl; if (zahl < 0) { cout << "Spassvogel!"; return 0; } if (zahl > 999) { cout << "Ich sagte dreistellig!"; return 0; } int a = zahl % 10; // 1. Stelle (10^0) zahl /= 10; // oder zahl = zahl / 10, falls du die Assignment Operatoren nicht kennst int b = zahl % 10; // 2. Stelle (10^1) zahl /= 10; int c = zahl % 10; // 3. Stelle (10^2) int quersumme = a + b + c; if (quersumme % 3 == 0) { cout << "Diese Zahl ist durch 3 teilbar." << endl; } else { cout << "Diese Zahl ist nicht durch 3 teilbar." << endl; } return 0; }
Nicht, dass deine Vorgehensweise falsch war. Sie wird jedoch bei Realisierung mit Schleifen komplizierter.
btw:
Benutze in Zukunft bitte die C/C++ Code-Tags.
-
Danke für die Anmerkungen. Ist so auf jeden Fall übersichtlicher als mit zig verschiedenen Variablen. Wußte mir nur nicht wirklich anders zu helfen.
Mit iostream.h und math.h arbeiten wir in den Übungen. Verwenden dort auch den GNU C++ Compiler in der Version 2.95.2, sollte das wesentlich sein. Deswegen verwende ich diese, weil bei uns nur das gewertet wird, was am dortigen Server funktioniert und vor Ort präsentiert werden kann. So bin ich auf der sichereren Seite, denk ich.
Dieses "using namespace std;" hatten wir, wie gesagt, auch noch nicht durch. Aber bisher funktionierte alles, was ich gelöst habe, auch ohne dem und ohne std::
Hatten aber noch nie was mit ^2 odgl gelöst, weil wir in Sachen Hochkomma auf später vertröstet wurden, weil das "jetzt noch nicht geht". Sollte das damit zusammenhängen.Benutze in Zukunft bitte die C/C++ Code-Tags.
Sorry, übersehen. Gelobe Besserung
Vielen Dank nochmals & Gute Nacht!
N-Ice
-
groovemaster
deine idee eine dreistellige ziffer abzufangen ist nicht grad richtig.
du prüft nur ob kleiner 0 und dann noch ob grösser 999 ist.wenn er 3 eingibt, ist die ziffer einstellig, aber bei deinem code korrekt.
Was ich machen würde ist ein
while konstrukt, welches solange abfrägt bis endweder ende oder eine dreistellige ziffer eingegeben wird.
kann man so machen ( wenns falsch ist bitte korrigieren
...... double x = 0; int eingabe; while( x<1 || x>9.99) { cout << "Geben Sie eine dreistellige Ziffer ein: " << endl; cin >> eingabe; x = eingabe; x = x / 100; } ......
Der Algorithmus müsste passsen, ist aber Ausgabetechnisch nicht ganz so toll.
Wenn man möchte könnte man auch überprüfen ob einer einen ganzzahligen wert eingibt, denn 5,22 ist auch dreistellig sogesehen. hmmm
-
newkid schrieb:
denn 5,22 ist auch dreistellig
Würde mich wundern, wenn cin da nicht meckert, immerhin wird eine Ganzzahl erwartet.
newkid schrieb:
wenn er 3 eingibt, ist die ziffer einstellig, aber bei deinem code korrekt.
Yep. Ich hatte noch irgenwie im Kopf, dass die Zahl mindestens 3 Stellen haben soll. Wenn es genau 3 Stellen sein sollen, dann müsste
if (zahl < 100 || zahl > 999) { cout << "Ich sagte dreistellig!"; return 0; }
eigentlich reichen. Damit wären dann auch negative Werte abgefangen. Keine Ahnung, ob sowas erlaubt sein soll. Mann soll bei so simplen Beispielen ja nicht gleich das Abfangen von Benutzerfehlern übertreiben.
@N-Ice
Eigentlich unverantwortlich, dass man zu Lehrzwecken zu solch alten Lehrmitteln greift. Immerhin ist der aktuelle C++ Standard auch schon 6 Jahre alt und der GCC 2.95.2 ist auch nicht mehr gerade der neueste (aktuell 3.4.x). Den könnte man schon mal aktualisieren, immerhin ist das ein freier Compiler und kostet die Schule nicht mehr als ein bisschen Zeit. Ich persönliche würde meinen Lehrer darauf ansprechen, das hängt aber halt von den beteiligten Charakteren ab. Wenn es euer Lehrer für richtig hält, die .h Header-Dateien zu verwenden, dann mach's auch so (immerhin gibt er letztendlich eine Note für eure Ergüsse) und lass die using Direktive weg. Du solltest aber trotzdem im Hinterkopf behalten, dass das eigentlich falsch ist.
17.4.1.2 Headers
N-Ice schrieb:
Hatten aber noch nie was mit ^2 odgl gelöst
Das wird in dem Beispiel auch nicht funktionieren, da der Operator ^ in C++ eine andere Bedeutung hat als Potenzieren. 10^2 (zB) sollte nur zum mathematischen Verständnis dienen, da "10 hoch 2" irgendwie seltsam aussieht.
-
Und wie kann man Bsp-1 lösen? also ich gebe 2 Zahlen(m un n) ein, und das Program soll die n-te Ziffer der Zahl m ausgeben. Ich habe den ganzen Tag mit if und for versucht aber kann es nicht machen.
-
Division durch 10 und mod 10.
-
@leka:
Hab erst jetzt wieder ins Forum geschaut. Ich habe Bsp1 dann so gelöst:#include <iostream.h> #include <math.h> int main() { int a,z,x,zahl; cout << "Bitte geben Sie eine Zahl ein."; cin >> a; cout << "Bitte geben Sie die gewuenschte Stelle (von rechts) dieser Zahl ein."; cin >> z; while (x < z ) { a = a/10; x = x + 1; } zahl = m % 10; cout<<"Die gewünschte Ziffer lautet "<<zahl<<'\n'; return 0; }
@groovemaster:
Wir behalten vorerst die "altmodische Art" bei, weil die gesamte Vorlesung darauf aufgebaut ist, folglich auch die Übungen und die Übungsbeispiele, die wir zu lösen haben.
Wir können uns dann weiter spielen, wenn wir es beherrschen, aber erklärt wird's uns halt anhand dieser Versionen.lg,
N-Ice
-
N-Ice schrieb:
while (x < z )
Das hat UB (undefiniertes Verhalten), da x noch nicht initialisiert wurde.