Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hätte ne Frage zum programmieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
21.06.2003, 20:10 Uhr
~0xdeadbeef
Gast


Übrigens ist das eher mathematische Notation. Programmierer lassen normalerweise die Indices bei eins anfangen, und bis zur Grenze exklusive laufen. Das sähe in diesem Fall so aus:

C++:
void print_sternchen(int n) {
    int i,j;
    for(i = -n+1; i < n; ++i) {
        for(j=0; j < abs(i); ++j)
            putchar(' ');
        for(j=0; j < 2*(n-abs(i))-1; ++j)
            putchar('*');
        putchar('\n');
    }
}


Macht jetzt keinen großen Unterschied, aber wenn du mit Arrays arbeitest, ist es deutlich angenehmer, das so zu machen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
21.06.2003, 20:49 Uhr
~modooo
Gast


Hab das nicht so ganz verstanden mit dem Program oben.
Wenn ich jetzt hier das Programm hab.
Wiso schreibt man bei der 2 Schleife -abs?
Und wie geht das mit einfach leerzeichen davor setzen?
Wenn ich leerzeichen davor mache wirkt sich auf das ganze Programm aus.





#include <iostream>
using namespace std ;


int main ()
{



int zahl,i,j;
cout << "Geben sie bitte eine Zahl ein: " ;
cin >> zahl;

for(j=-zahl+1;j<zahl;j++){
cout << '*';
for(i=1;i<zahl-abs(j);i++)cout << "**";
cout <<endl;
}


return 0 ;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
21.06.2003, 21:23 Uhr
~0xdeadbeef
Gast


Ich dachte, das würde aus der Funktion klar.

1. abs ist eine Funktion, die den Betrag des übergebenen ints zurückgibt. Zum Beispiel ist

C++:
abs(-1) = abs(1) = 1



2. Gehen wir mal meine Schleife Schritt für Schritt durch. Wir halten zu Anfang fest: Die Raute ist 2*n-1 Zeilen lang und breit, außerdem ist sie symmetrisch. Das heißt, wir müssen einen möglichst symmetrischen Schleifendurchlauf finden. Ich mache das so:

C++:
for(i = -n+1; i < n; ++i) {


Weil dann der Betrag von i symmetrisch verläuft. Für n = 3 nimmt abs(i) zum Beispiel die Werte 2, 1, 0, 1, 2 an. Wenn wir die Raute eigentlich als Quadrat auffassen, besteht eine Zeile aus 2*n-1 Zeichen. Davon sind 2*(n-abs(i))-1 Sterne, der Rest (also 2*abs(i)) sind Leerzeichen, die zu gleichen Teilen vor und hinter den Sternchen stehen. Da man Leerzeichen aber nicht sieht, können wir und die hinter den Sternchen auch sparen, und schreiben:

C++:
    for(j=0; j < abs(i); ++j)
        putchar(' '); /* abs(i) Leerzeichen vor den Sternchen einfügen */
    for(j=0; j < 2*(n-abs(i))-1; ++j)
        putchar('*'); /* 2*(n-abs(i))-1 Sternchen einfügen */
    putchar('\n'); /* Zeilenende */
}


Alles klar?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
21.06.2003, 21:50 Uhr
~0xdeadbeef
Gast


Noch ne andere Möglichkeit wäre übrigens das hier:

C++:
#include <iostream>
#include <iomanip>

using namespace std;

void print_sternchen(int n) {
    for(int i = -n+1; i < n; ++i)
        cout << setw(abs(i)+1) << '*' << setfill('*')
             << setw(2*(n-abs(i))-1)  << '\n' << setfill(' ') << flush;
}

int main() {
    int n,i;

    cout << "Zahl eingeben: ";
    cin >> n;

    print_sternchen(n);

    return 0;
}


wobei das schon ein bisschen getrickst ist. Hier mache ich das ganze über Formatierungen und Stream Manipulators. Läuft so ab:

C++:
cout << setw(abs(i)+1) << '*';


sagt dem Stream cin, dass das nächste Feld, in das er schreibt, abs(i) + 1 Zeichen breit ist, und dass er rechts in das Feld ein Sternchen schreiben soll. Den Rest füllt er mit Leerzeichen auf

C++:
cout << setfill('*');


sagt dem Stream, dass er das nächste mal zum auffüllen statt Leerzeichen Sternchen nehmen soll.

C++:
cout << setw(2*(n-abs(i))-1) << '\n';


heißt 'das nächste Feld ist 2*(n-abs(i))-1 zeichen breit, und rechts in das Feld schreibst du ein newline-Zeichen. Da wir schon ein Sternchen dastehen haben, reicht es, 2*(n-abs(i))-2 Sternchen hinzumalen, Das letzte Zeichen des Feldes wird vom newline eingenommen.

C++:
cout << setflll(' ') << flush;


setzt wieder das Leerzeichen als Füllzeichen und flusht den Stream.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
21.06.2003, 21:53 Uhr
~0xdeadbeef
Gast


Au weia...bevor virtual micht erschlägt, natürlich besser so:

C++:
void print_sternchen(int n) {
    streamsize cout_width = cout.width();
    char cout_fill = cout.fill();

    for(int i = -n+1; i < n; ++i)
        cout << setfill(' ') << setw(abs(i)+1) << '*'
             << setfill('*') << setw(2*(n-abs(i))-1)  << '\n' << flush;

    cout << setw(cout_width) << setfill(cout_fill);
}


Nur für den Fall, dass man cout schon mit komischen Flags kriegt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
22.06.2003, 16:52 Uhr
~modooo
Gast


So ich hab jetzt dieses Programm.
Aber ich kann noch keine Raute darstellen,weil das mit den leerzeichen nicht klappt.
Das Programm von oben funktioniert zwar aber davon haben wir einige Befehle
noch nicht durchgenommen.
Wie muß ich dieses Programm verändern das es geht?
Wäre dankbar für eure Hilfe.




using namespace std;

int main()
{
int zahl=0;


cout << "Geben Sie eine Zahl ein: ";
cin >> zahl;
cout << endl;

for(int i=1; i<=zahl; i++)
{
for(int j=1; j<=2*i-1; j++)
{
cout << "*";
}
cout << endl;

}

for(int k=zahl-1; k>=1; k--)
{
for(int l=1; l<=2*k-1; l++)
{
cout << "*";
}

cout << endl;
}


return 0;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
22.06.2003, 19:42 Uhr
~modooo
Gast


0xdeadbeef oder Heiko könnt ihr mir da nicht einen kleinen
Tip geben ich krieg da kein Ansatz.
Danke.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
22.06.2003, 19:48 Uhr
virtual
Sexiest Bit alive
(Operator)


Dieser Thread hat mich zu einem neuen Rätsel angeregt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
22.06.2003, 19:58 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Na gut wenn du das unbedingt in zwei teile teilen willst usw.

Ich hoffe das dir das jetzt gefällt. das malt dir die obere hälfte der raute
die untere kriegst du ja dann hoffentlich hin

C++:
int i,j;
for(i=0;i<zahl;i++){
         for(j=0;j<zahl-1-i;j++) cout <<' ';
         for(j=j;j<zahl+i;j++) cout <<'*';
         for(j=j;j<2*zahl-1;j++) cout <<' ';
         cout << endl;
}




Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 22.06.2003 um 19:58 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
22.06.2003, 21:17 Uhr
~modooo
Gast


Vielen dank Heiko.
So gehts.
Der untere Teil ist kein Problem.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: