c++ Zahl als "*" ersetzen?

...komplette Frage anzeigen

3 Antworten

Die bisherigen Antworten gefallen mir überhaupt nicht, da sie sich a) entweder auf C beziehen, obwohl eindeutig nach C++ gefragt wurde, oder b) total naiv implementiert sind, und es eindeutig an Eleganz mangelt.

Ich würde es so machen:

#include <iostream>
#include <cstdlib>
#include <cstddef>

int main(void) {
using namespace std;

const size_t mi = 3;
const size_t ma = 20;

cin.tie(&cout);

while (true) {
cout << "Zahl (" << mi << " bis " << ma << "): ";

size_t choice = 0;
cin >> choice;

if (mi > choice || ma < choice) {
cerr << "Abbruch!" << endl;
break;
}

cout << string(choice, '*') << endl;
}

return EXIT_SUCCESS;
}

Das Programm liest so lange Ganzzahlen ein und gibt diese als Reihe von Sternchen aus, bis der definierte Bereich über- oder unterschritten wird.

Noch einige Anmerkungen:

- cstddef wird für size_t eingebunden, auch wenn die anderen beiden Header das theoretisch erledigen sollten

- cstdlib wird für EXIT_SUCCESS benötigt; hab mir das anstelle von "return 0" in main() angewöhnt, da portabler

- Die using-Direktive ist funktionslokal, und da wir außer der STL ja sowieso keine weiteren Bibliotheken einsetzen, spart man sich damit eine menge unschöner "std::" Auflösungen. So etwas sollte man aber nicht dateilokal tun!

- Alle Integer-Werte sind als size_t definiert, da ein negativer Wert in der vorliegenden Aufgabe überhaupt keinen Sinn ergeben würde, und ich mir das Casten bei der Bereichsprüfung oder im string-Konstruktor sparen möchte. (Ich weiß, muss man nicht tun, aber gerade im Falle von String wäre es im Hinblick auf die Zukunft sinnvoll.)

- cout wird mithilfe der tie()-Funktion an cin gebunden, was für ein automatisches flush() sorgt, sodass wir uns darum nicht mehr kümmern müssen.

- die "merkwürdige" Reihenfolge bei den Vergleichen der Bereichsprüfung hat ihren Sinn darin, Programmierfehler zu vermeiden.

- Die Kernaufgabe wird einfach im string-Konstruktor erledigt, der für uns einen String, bestehend aus Sternchen mit der gewünschten Länge erzeugt ... ganz ohne Schleifen.

So, das wars. :)

Noch eine Anmerkung an den Fragensteller selbst, alle anderen Mitleser und die bisherigen Antworter: Nehmt euch mal die Zeit um die Standardbibliothek zu lesen! Mir fällt bei solchen Programmierfragen immer auf, dass viele Leute ständig und immer wieder das Rad neu erfinden wollen, und teils Ansätze auf absolutem low-level Niveau verfolgen. Dabei sind fast alle der gängigen Probleme schon in der STL gelöst.

Für den Anfang bitte einfach mal die Dokumentation zu den verschiedenen Konstruktoren der string-Klasse lesen, und evtl. nachschauen, was tie() eigentlich so macht. :)

Schönen Tag noch! :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von ralphdieter
08.01.2016, 15:19

Endlich mal 'ne brauchbare Antwort. Gib zu, Du hast schon heimlich ein paar Zeilen C++ codiert! Hier geb' ich noch meinen Senf dazu:

  • Ich schreibe gern zu jedem Header wenigstens ein importiertes Objekt dazu: #include<cstdlib> // EXIT_SUCCESSDas erspart oft längliche Erklärungen.
  • cin.tie(&cout) ist unnötig, da voreingestellt (siehe ISO/IEC 14882:1998, 27.3.1).
  • Und zur Eleganz: Ich selbst würde einfach nichts ausgeben und dabei mit '*' auf die Feldbreite choice auffüllen:
cout << setw(choice) << setfill('*') << "";
1

Ungefähr so müsste die Schleife aussehen.

-----------

// Eingabe n... das hast du ja soweit schon.

if (n >= 3 && n <= 20) {

int cnt = 0;

do {

printf("*");

cnt++;

}

while (cnt < n)

}

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Beell1951
08.01.2016, 13:25

Genau das, was ich brauche! Danke :D

0
Kommentar von TeeTier
08.01.2016, 13:44

Ein ...

cout << string(n, '*') << endl;

... war zu einfach, oder? :)

1

Hi,

du könntest in der Ausgabe eine For-Schleife vorschalten und diese dann durchlaufen, von 0 - kleiner Zahl. Und die Ausgabe ist dann eben * und wenn es dann bei zahl - 1 angekommen ist, dann wird ein Zeilenumbruch mit angefügt. Code musst du selber schreiben ;)

LG
MaganRevan

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Beell1951
08.01.2016, 12:10

Danke.

Wir haben in der Schule aktuell nur "float", "int" und die "do-while Schleife" gelernt.

Wie funktioniert die For-Schleife?

0

Was möchtest Du wissen?