dreieck
-
also ich hab auch ein grosses problem
unskilled
15:11:01 10.06.2009
#######
so sollte das ja aussehen wenn man hoehe 4 hat und breite 7, hab das programm soweit fertig, er gibt es aber nur immer richtig aus wenn hoehe und breite gleich sind, sonst wenn ich deine werte eingebe, sieht das so aus
# #
# #
# # # # # # #und umso höher die werte auseinanderliegen, desto schlimmer, brauche schnelle hilfe
Mein Programm:
int i,x=35,weite=2;
cout<<"\n"<<"\n"<<"Sie haben sich fuer die Darstellung eines Dreiecks entschieden!"<<"\n";cout<<"\n"<<"\n"<<"Wie wollen Sie ihr Dreieck ausgeben?"<<"\n";
cout<<"Auf dem Kopf? [1]"<<"\n";
cout<<"Auf Grundseite? [2]"<<"\n"<<"\n";cout<<"Ihre Auswahl: ";
cin>>i;switch (i)
{case 1:
{
person student;
FILE* datei;datei=fopen("test.txt","a");
cout<<"Geben Sie bitte die Hoehe ihres Dreiecks ein: ";
cin>>student.hoehe;
fprintf(datei,"%d\n",student.hoehe);
cout<<"\n"<<"Geben Sie bitte die Breite ihres Dreiecks ein: ";
cin>>student.breite;
fprintf(datei,"%d\n",student.breite);
cout<<"\n"<<"\n";fclose(datei);
if(student.breite>student.hoehe)
{
cout<<"Falsche Werte eingegeben!!!";
}
else
{x=x-student.breite;
cout<<setw(x);for(i=2; i<=student.breite; i++)
{
cout<<"*", cout<<char(00);}
cout<<endl;
x++;for (i=3; i<=student.hoehe; i++)
{
cout<<setw(x);
cout<<"*"<<setw((student.breite*2)-weite-2)<<"*"<<endl;
x++;
student.breite--;
}cout<<setw(34)<<"*"<<endl;
}
}
break;case 2:
{
person student;
FILE* datei;datei=fopen("test.txt","a");
cout<<"Geben Sie bitte die Hoehe ihres Dreiecks ein: ";
cin>>student.hoehe;
fprintf(datei,"%d\n",student.hoehe);
cout<<"\n"<<"Geben Sie bitte die Breite ihres Dreiecks ein: ";
cin>>student.breite;
fprintf(datei,"%d\n",student.breite);
cout<<"\n"<<"\n";fclose(datei);
if(student.breite>student.hoehe)
{
cout<<"Falsche Werte eingegeben!!!";
}
else
{cout<<setw(x);
cout<<"*"<<endl;
x=x--;for (i=3; i<=student.hoehe; i++)
{
cout<<setw(x);
cout<<""<<setw(weite)<<""<<endl;
x--;
weite=weite+2;
}cout<<setw(x);
for (i=0; i<student.breite; i++)
{
cout<<"*", cout<<char(00);}
cout<<endl<<endl;
}}
break;
-
Beim Verändern der Weite musst Du natürlich das Verhältnis zwischen Breite und Höhe beachten. Stur mit 2 zu erhöhen (bzw. zu verringern) klappt nur wenn Höhe und Breite gleich sind.
Ändere z.B. die Schleife im case 2: zuweite = (student.hoehe - 2)/2; for (i=3; i<=student.hoehe; i++) { weite += 2*(student.breite - 1); cout<<setw(x); cout<<"*"<<setw( weite / (student.hoehe - 1) )<<"*"<<endl; x--; }das x kann man natürlich auch noch anpassen ...
Gruß
Werner
-
danke, kannst mir auch eben kurz erklären, was du da genau gemacht hast
weite = student.breite - 2;
for (i=3; i<=student.hoehe; i++)
{
weite += 2*(student.breite - 1);
cout<<setw(x);
cout<<""<<setw( weite / (student.hoehe - 1) )<<""<<endl;
x--;
}und muss ich den hier auch noch was verändern, ich hab nun ja einfach gesagt das, die breite nicht höher sein darf als die breite, aber ob das so gedacht war.
if(student.breite>student.hoehe)das müsste doch eigentlich auch gehen oder?
cout<<setw(x);
for (i=0; i<student.breite; i++)
{
cout<<"*", cout<<char(00);}
cout<<endl<<endl;
-
:eek;
Von deinem Code bekommt man AugenkrebsBenutz bitte Code-Tags: [cpp]Code[/cpp ] Ohne Leerzeichen
-
Ja ist ja gut, brauch trotzdem ne antwort
-
c++-rookie schrieb:
danke, kannst mir auch eben kurz erklären, was du da genau gemacht hast
Du suchst letztlich in jeder Zeile des Dreiecks nach dem Wert in setw, der die aktuelle Breite bestimmt. Denke Dir die Zeilen mit einem Index ix=0 bis ix=student.hoehe-1 versehen. Die erste Zeile mit ix=0 hat die Breite 0 und die letzte hat die Breite 2*(student.breite-1) - jeweils ohne den führenden '*'. Diese beiden Zeilen werden zwar innerhalb der for-Schleife nicht ausgegeben, aber der lineare Zusammenhang
weite = 2 * (student.breite - 1) / (student.hoehe - 1) * ixgilt in allen Zeilen.
Sind Breite und Höhe gleich, so gilt weite = 2*ix. Das ist genau das was Du ursprünglich codiert hast. Mit jedem ix (jeder Zeile) steigt die weite um 2. Das mit dem hinzuaddieren zu weite wollte ich beibehalten, weil Du schon so angefangen hattest, aber die Differenz von einem ix - also einer Zeile zur nächsten -
weite += 2 * (student.breite - 1) / (student.hoehe - 1)kann ein gebrochener Wert sein und wird dann abgerundent. Diese Rundungsfehler würden sich aufaddieren und das Ergebnis verfälschen. Deshalb rechne ich nicht mit der weite selbst, sondern mit einem Wert
weite * (student.hoehe - 1)ich erweitere die Gleichung also einfach mit (student.hoehe - 1), dann verliert man die Genauigkeit nicht.
Der Startwert ist im Prinzip =0, aber so gewählt, dass korrekt gerundet wird. Nämlich:weite_0 = ((student.hoehe - 1) - 1)/ 2 = (student.hoehe - 2)/2;Auf solche und ähnliche Dinge sind bereits Leute vor Deiner Geburt gekommen - schau Dir dazu mal den Bresenham-Algorithmus an.
c++-rookie schrieb:
.. und muss ich den hier auch noch was verändern, ich hab nun ja einfach gesagt das, die breite nicht höher sein darf als die breite, aber ob das so gedacht war.
warum sollte die Breite nicht größer sein dürfen als die Höhe. Füge mein Code-Schnipsel ein und probiere es selber aus.
Gruß
Werner
-
wofür steht den += ?
-
c++-rookie schrieb:
wofür steht den += ?
auf dem Level macht das hier keinen Spaß.Hat Dir meine Antwort (s.o.) weiter geholfen? Hast Du den Code ausprobiert? (ich habe übrigens noch einen Fehler in meinen Ausführungen korrigiert)
Gruß
Werner
-
c++ rookoe schrieb:
Ja ist ja gut
Ne ist's nicht

-
Dieser Beitrag wurde gelöscht!