c++ Zahl als "*" ersetzen?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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! :)

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
@ralphdieter

Die Idee mit der Feldbreite ist sehr schick! Gefällt mir! :)

Und der Hinweis mit den Includes ist auch sehr schön, aber da hatte ich schon ganz grottige embedded C-Compiler, die Kommentare nach Präprozessor-Direktiven fehlinterpretiert haben, aber das ist dann ja eigentlich ein Compiler-Bug ... naja egal. :)

Ich war kurz davor zu schreiben, dass cin standardmäßig an cout gebunden ist, aber dann dachte ich mir: "Das merkt sowieso keiner, und sprengt den Rahmen" ... und jetzt kommst du. :)

Ich habe auch damit gehadert, ob ich diesen Teil nun weg lasse, oder dazu schreibe, habe mich dann aber für letzteres entschieden (im Hinblick auf mögliche Legacy-Flags, wobei du natürlich Recht hast, und heutzutage kaum noch jemand mit weniger als C++98 kompilieren wird)

Allerdings stellen hier oft viele Leute Fragen zu C++, welche die eingestellte Original-Version von Dev-C++ einsetzen, mit dem ebenso veralteten Compiler, und genau diese Leute stoßen dann evtl. auf Probleme.

Das ist auch der Grund, warum ich ...

size_t choice = 0;

... statt ...

size_t choice {};

... geschrieben habe, da hier viele Einsteiger oft nicht die Version des Standards berücksichtigen, und man sich so späteres Nachfragen spart, wenn man die Codebeispiele so allgemein wie möglich hält. :)

Persönlich bevorzuge ich bei neuen Projekten immer den aktuellsten Standard, und verwende C++11 als Minimum, wobei ich die neuen Features von C++14 nur noch ungern missen möchte. Für Codebeispiele setze ich aber bewusst oftmals auf "ältere" Standards.

(Wenn es nur um Beispiele von Algorithmen geht, die Kunststücke mit Zeigern machen, achte ich sogar oftmals auf Kompatibilität zu C90, wenn es nicht unbedingt anders sein muss.)

Auf jeden Fall ist die Idee mit der Feldbreite sehr schön! :)

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)

}

Genau das, was ich brauche! Danke :D

0

Ein ...

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

... war zu einfach, oder? :)

1
@TeeTier

Eleganz war hier für mich nebensächlich, ich hab mich am Beispielcode des Fragestellers orientiert (deswegen auch printf statt cout) und versucht, eine für ihn verständliche Lösung zu schreiben.

0
@ceevee

Natürlich ist auch printf() in C++ erlaubt, aber dann bitte richtig:

 printf("%c", '*');

Soll in der nächsten Teilaufgabe '%' statt '*' ausgegeben werden, ist das bei allen Beispielen hier kein Problem. Aber printf("%") kann einen mehreren Stunden lang mit Fehlersuche beschäftigen.

Und wenn schon formatiert wird, kann man das ausnutzen:

printf( "%.*s\n", n, "********************" );

Das erspart einem die ganze Schleifenkonstruktion.

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

Danke.

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

Wie funktioniert die For-Schleife?

0
@Beell1951

sollte so klappen, Angabe aber ohne Gewähr ;) konnte es nicht testen, bin aktuell unterwegs und hab' es mit dem Handy geschrieben:

#include 
using namespace std;

int main(){
int a,b,c;
b = 3;
c = 20;

cout << "Bitte gib eine Zahl zwischen " << b << "und " << c << " ein" << endl;
cin >> a;

if(a > b && a < c){
for(int i = 0; i < a; i++){
if(i != a-1){
cout << '*' << endl;
}
else{
cout << '*\n' << endl;
}
}
}
else{
cout << 'Eingabe nicht valide' << endl;
}

}
1
@MaganRevan

Es funktioniert! Super :)

Wie kann ich es machen, dass die "*" nebeneinander sind und nicht untereinander?

Und zum Schluss kommt immer so eine komische Zahl ^^

Siehe:

Bitte gib eine Zahl zwischen 3 und 20 ein

3

*

*

10762

0
@Beell1951

Die Sternchen stehen untereinander, weil Du nach jedem einen Zeilenumbruch (endl) ausgibst. Lass es einfach weg.

Die "komische Zahl" ist der Wert des Multibyte-char 'Eingabe nicht valide'.  Nur mit doppelten Anführungszeichen wäre das ein String.

0
@ralphdieter

Da hast du recht, ralphdieter, daran hab' ich, als ich es vorhin im Zug schrieb nicht gedacht.

0

Java Zufallszahlen Programm (for Schleife)?

Ich brauche Hilfe bei einem Programm. In diesem Programm geht es darum, dass der Computer sich eine Zahl zwischen 1 und 100 ausdenkt, welche der Nutzer dann erraten soll. Je nachdem ob die Zahl größer oder kleiner ist wird es dann ausgegeben. Man hat 10 Versuche, doch wenn ich die Zahl in z.B. 5 Versuchen erraten habe fragt mich das Programm trotzdem noch weiter nach der Zahl, so lang bis die 10 Versuche verbraucht sind. Und wie kann ich es schaffen, dass wenn die Zahl nicht erraten wird, dass das Programm sie dann am Ende ausgibt ? das ist das Programm bis jetzt:

//----------------------------------------------Variablendeklaration------------------------------------------ String Eingabe1; int Zahl; int Eingabe;

    Random rand=new Random();
    Zahl= rand.nextInt(100);
    

//-------------------------------------------------Schleife--------------------------------------------------------

    for (int Zähler=0; Zähler<10; Zähler=Zähler+1)
    {
        Eingabe1=JOptionPane.showInputDialog(null, "Geben sie ihre ausgedachte Zahl ein");
        
        Eingabe=Integer.parseInt(Eingabe1);
        

//-------------------------------------------------if-Anweisung-------------------------------------------------- if (Eingabe<Zahl) { JOptionPane.showMessageDialog(null, "Die Zahl ist größer.");}

        else if (Eingabe>Zahl)
        {JOptionPane.showMessageDialog(null, "Die Zahl ist kleiner.");}
        
        else 
        {JOptionPane.showMessageDialog(null,  "Die Zahl ist richtig.");}
        
...zur Frage

Wie in C Komma durch Punkt ersetzen (Programmieren)?

Ich möchte in C ein Programm schreiben welches nur dann weiter geht wenn man eine bestimmte Zahl (10) eingibt. Ich habe dafür eine Schleife erstellt die erst aufhört wenn die richtige Zahl eingegeben wurde die Zahl habe ich als double deklariert es funktioniert auch bloß wenn ich z.B. 12,5 eingebe wird die schleife beendet und das Programm geht weiter wie kann ich das also lösen . Google konnte mir auch nicht helfen

Danke an alle

...zur Frage

Wozu dienen die Bewertungs-Sterne bei eBay?

Bei ebay gibt es viele bunte Sternchen. Nun hat ja jeder so seine Lieblings-Farbe und viele sind vielleicht auch traurig, wenn bei ihnen plötzlich lila statt türkis leuchtet... Ich frage mich nur, was diese Sternchen zu bedeuten haben. Einfach nur ein Gag? Es ist ja nicht so, dass Verkäufer mit sehr vielen Bewertungen vertrauenswürdiger wären. Es ist eher umgekehrt. Wenn jemand schon 10.000 bewertungen hat, verkauft er meist so viel, dass er keine Zeit hat, um sich um seine Kunden richtig zu kümmern.. Außerdem ist die %-Zahl der positiven bewertungen doch viel aussagekräftiger als die Anzahl an erhaltenen bewertungen- oder etwa nicht?

...zur Frage

Mein Java Programm gibt "Primzahl" 9 aus?!?!?!?!?

int zahl, Limit, P;

zahl = 1;                        //Primzahlen von...
Limit = 10;                      //...bis                     
boolean Prim = true;             // Prim = true wenn "zahl" eine Primzahl ist

System.out.println("Die Primzahlen zw. den Zahlen " + zahl + " und " + Limit + " sind: ");

while (zahl<=Limit) {            // solang "zahl" kleiner als "Limit" ist 
  if (zahl%2 == 0) {
    Prim = false; 

  } 
  if (Prim) {
    System.out.println(zahl);

  } 
  else{

    Prim = true;

  }
  zahl++;
}
...zur Frage

Wie kann ich bei Excel ein * vor einer Zahl entfernen? mit der Suchen / Ersetzen Methode geht es nicht ?

Hallo ich muss anhand von Zahlen eine Statistik auswerten, jetzt ist es aber so, dass vor den Zahlen * stehen. Kann ich diese Sterne mit einer Formel alle entfernen?

...zur Frage

Esta keine Antwort

Hallo Leute, wir haben für übernächste Woche einen Flug in die USA gebucht. Mein Dad hat vor knapp 5 Tagen einen Antrag zum Einreisen gestellt (ESTA).

Dazu bekam er einen Code, um den Satus abzufragen. Jetzt gibt es immer einen Fehler, dass eine Zahl falsch eingegeben wurde, wir haben aber den Code ausgedruckt, also kanns daran nicht liegen. Kann es sein dass die botschaft manchmal mehr als 72 stunden braucht, weil sie einfach viel zu tuk haben?

...zur Frage

Was möchtest Du wissen?