Ich muß mit hilfe von for-schleifen eine Raute programmieren die
Kanntenlänge muß über eine Variable eingegeben werden. Kanntenlämge im
Bsp. =4
An der stelle von Kästechen soll ich einen * verwenden
Kann mir jemand helfen?
Ist doch eigentlich relativ einfach:
Du nimmst eine Variable die die Anzahl der Sternchen angibt.
Zu Beginn ist der Wert, nach deinem Beispiel zwei.
Dann legst du eine for-schleife an, in der jeweils eine neue Zeile
geöffnet wird, ein Sternchen ausgegeben wird und dazwischen dann die
Anzahl an Leerzeichen (auch als Variable, immer +2) und wieder ein
Sternchen.
Das ganze dann noch rückwärts bis du wieder beim Startwert ist.
So ungefähr müsste das gehen du musst halt ein bisschen tüfteln, bis es
aann genau passt, aber im Prinzip total easy.
Raute schrieb:>> Kann mir jemand helfen?
Gerne, für 30 Euro via Moneybookers hast dus heute Abend noch in deinem
E-Mail Postfach. Sprache darfst du zwischen C, C++, Java wählen.
Was fällt dir auf, wenn du dir die Rauten anschaust.
In der ersten Zeile sind die * jeweils an Position 5 + 6
In der zweiten Zeile, (wenn I > 1) an Position 4 + 7
In der zweiten Zeile, (wenn I > 2) an Position 3 + 8
usw.
Wenn variable l = 5 und variable r = 6 kannst du in der geforderten FOR
Schleife l jeweils decrementieren und r incrementieren.
Wie du die darstellst kommt auf die Programmiersprache an.
Ich rate mal: "\n"
Und wenn du mehr Leerzeilen haben willst, dann machst du einfach mehr.
Warum schreibst du eigentlich nicht gleich alle Aufgaben die du bekommen
hast rein, dann gehts schneller.
kannst du 1 Leerzeichen ausgeben.
Dementsprechend kannst du zb mit
1
for(i=0;i<n;++i)
2
printf(" ");
n Stück Leerzeichen ausgeben.
Und jetzt sieh dir deine Raute noch einmal genauer an. Und zwar nur die
obere Hälfte:
1
**
2
* *
3
* *
4
* *
Sieh dir die Zeile 1 an:
1
**
das sind 3 Leerzeichen, 1 Stern, 0 Leerzeichen, 1 Stern
Zeile 2:
1
* *
das sind 2 Leerzeichen, 1 Stern, 2 Leerzeichen, 1 Stern
Zeile 3:
1
* *
das sind 1 Leerzeichen, 1 Stern, 4 Leerzeichen, 1 Stern
Zeile 4:
1
* *
das sind 0 Leerzeichen, 1 Stern, 6 Leerzeichen, 1 Stern
Zsammengefasst
Zeile Leerezeichen Stern Leerezeichen Stern
1 3 1 0 1
2 2 1 2 1
3 1 1 4 1
4 0 1 6 1
An dir liegt es jetzt für die jeweiligen ANzahl an Leerzeichen Formeln
zu finden, die höchst wahrscheinlich mit der aktuellen Zeilennummer und
der Gesamtzahl an Zeilen abhängen wird.
Am Beispiel der Zeile 1: Wenn die Gesamtzahl der Zeilen 4 ist, dann
sieht es wohl so aus, als ob die erste Anzahl an Leerzeichen, 4 - 1,
also "Gesamtzahl_Zeilen - aktuelle Zeile" ist. Ein kurzer Blick auf die
tatsächlichen Zahlen bestätigt diese Vermutung und zur Sicherheit kann
man das auch mal mit einer anderen Raute ausprobieren.
Jetzt bist du drann: Wie errechnet sich die 2.te vorkommende Anzahl
Leerezeichen? Und natürlich: Wie ist das mit der 2.ten Hälfte der Raute?
Habe die Aufgabe auch mal versucht:
Den oberen Teil der Raute habe ich
Mein Quelltext:
1
2
3
4
#include<iostream>
5
#include<iomanip>
6
usingnamespacestd;
7
8
intmain()
9
inta,b,c,längeorg,d,v=-2,l,länge;
10
cin>>länge;
11
12
längeorg=länge;
13
for(d=0;d<längeorg;d++)
14
{
15
16
for(a=0;a<länge-1;a++)
17
{cout<<" ";}
18
cout<<"*";
19
länge=länge-1;
20
v=v+2;
21
for(b=0;b<v;b++)
22
{cout<<" ";}
23
cout<<"*";
24
cout<<endl;
25
26
}
27
28
29
30
return0;
31
}
Für Zahlen über 50 stimmt mein Programm nicht mehr!
Weshalb?
Vermutlich habe ich noch einige programmier"fehler" drin
Für Tips wäre ich dankbar!
Gruß joooo
Joooo schrieb:> Der Compiler von Visual Studio 2005;
tatsächlich.
Ich wär nie auf die idee gekommen, das zu probieren.
würde trotzdem davon abraten:
1. eventuell nicht portabel auf andere Compiler
2. sollte jemand auf anderem Tastaturlayout an dem Code arbeiten wollen,
hat er schlechte Karten
3. Code sowieso lieber auf englisch
Joooo schrieb:> Für Zahlen über 50 stimmt mein Programm nicht mehr!> Weshalb?> Vermutlich habe ich noch einige programmier"fehler" drin
Glaub ich nicht. Bei 255 wäre es auffällig für ein Überlauf aber bei 50
eher unwahrscheinlich.
Kann es sein, dass die Konsole nur 50 Zeichen breit ist und deine Zeile
in der nächsten fortgesetzt wird?
Samuel K. schrieb:> Kann es sein, dass die Konsole nur 50 Zeichen breit ist und deine Zeile> in der nächsten fortgesetzt wird?
Ja kann, es aber weshalb ändert sich die Steigung auf der linken Seite?
Gruß Jooo
Vlad Tepesch schrieb:> Joooo schrieb:>> Der Compiler von Visual Studio 2005;>> tatsächlich.> Ich wär nie auf die idee gekommen, das zu probieren.> würde trotzdem davon abraten:>> 1. eventuell nicht portabel auf andere Compiler
Das ist noch stark untertrieben. Es ist in C++ eigentlich gar nicht
erlaubt. Wenn der Compiler das akzeptiert, ist er in dieser Hinsicht
fehlerhaft. Entsprechend wenige Compiler werden das also tun.
Joooo schrieb:> Samuel K. schrieb:>> Kann es sein, dass die Konsole nur 50 Zeichen breit ist und deine Zeile>> in der nächsten fortgesetzt wird?> Ja kann, es aber weshalb ändert sich die Steigung auf der linken Seite?
Genau aus diesem Grund.
Rolf Magnus schrieb:> Vlad Tepesch schrieb:>> Joooo schrieb:>>> Der Compiler von Visual Studio 2005;>>>> tatsächlich.>> Ich wär nie auf die idee gekommen, das zu probieren.>> würde trotzdem davon abraten:>>>> 1. eventuell nicht portabel auf andere Compiler>> Das ist noch stark untertrieben. Es ist in C++ eigentlich gar nicht> erlaubt. Wenn der Compiler das akzeptiert, ist er in dieser Hinsicht> fehlerhaft. Entsprechend wenige Compiler werden das also tun.
Es ist Standard-C++ (außer gcc fällt mir gerade keiner ein, der es nicht
unterstützt)
"identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit
identifier-nondigit:
nondigit
universal-character-name
other implementation-defined characters"
"2.11 An identifier is an arbitrarily long sequence of letters and
digits. Each universal-character-name in an identifier shall designate a
character whose encoding in ISO 10646 falls into one of the ranges
specified in
Annex A of TR 10176:2003. Upper- and lower-case letters are different.
All characters are significant."
bzw. C99
"6.4.2.1 Each universal character name in an identifier shall designate
a character whose encoding in ISO/IEC 10646 falls into one of the ranges
specified in annex D... An implementation may allow multibyte characters
that are not part of the basic source character set to appear in
identifiers; which characters and their correspondence to universal
character
names is implementation-defined."
Joooo schrieb:> Ja kann, es aber weshalb ändert sich die Steigung auf der linken Seite?
Na, weil die ausgegebenen Zeilen länger sind als 50 Zeichen und daher
umgebrochen werden.
Michael Schikora schrieb:> ..und wenn man defines vernünftig einsetzt, wird der Code auch> schön leserlich auch ohne Umlaute, wie meiner:>> (Grässliches)>> // SCNR
Mach besser nicht solche Vorschläge, das könnte jemand ernstnehmen.
Michael Schikora schrieb:> void main()
Und schon ab da ist das Verhalten des Programms undefiniert.
Arc Net schrieb:> An implementation may allow multibyte characters> that are not part of the basic source character set to appear in> identifiers
Oh. Ich hatte da nur Buchstaben (nur A-Z und a-z), Zahlen und
Unterstrich im Kopf. Das hab ich so oft gehört und gelesen, daß ich nie
auf die Idee gekommen bin, das mal in der Norm nachzulesen. Dennoch
halte ich es für eine schlechte Idee, Umlaute in Identifiern zu
verwenden.
>>..und wenn man defines vernünftig einsetzt, wird der Code auch>>schön leserlich auch ohne Umlaute, wie meiner:
wolltest mir damit mitteilen das mein Code unlesserlich ist oder was
willst du mit deinem "müll-code" sagen? Für ernst gemeinte Tips und
Ratschläge bin ich immer dankbar!
Gruß Jooo
> wolltest mir damit mitteilen das mein Code unlesserlich
Das ist er in der Tat, vor allem durch die recht eigenwillige
Formatierung.
Auch Deine IDE bietet eine Autoformatierung an mit verschiedenen
Standardeinstellungen. Nutze sie, und schau Dir an wie andere es machen.
Und Leerzeichen kosten in C/C++ nichts.
Aber nein, das war nicht mein Hauptanliegen
> "müll-code" ?
Zumindest nur "kleiner" Müll :-)
Er ist nur extra unleserlich gemacht(bis auf die Tabs), aber ganz simpel
aufgebaut, wenn man die #defines auflöst:
//Gibt es noch C-Compiler, die diesen Kommentar nicht unterstützen?
Selbst vor C99
void main() //Gibt es Compiler, die undef. Verhalten zeigen?
{
char x, in; // Besser: Eine Zeile, je Variable,
char y, anzahl; // außer vielleicht x,y zusammen
anzahl = getchar() - '0'; //nur für '0' bis '9' sinnvoll
for( y=anzahl ; y ; --y ) //y: 4,3,2,1
{
for( x=anzahl ; x ; --x) //x: 4,3,2,1
putchar( x+y == anzahl+1 ? '*' : ' ');
for( x=anzahl ; x ; --x)
putchar( x == y ? '*' : ' ');
putchar( '\n' );
}
for( y=1 ; anzahl+1-y ; ++y )//y: 1,2,3,4
{
for( x=anzahl ; x ; --x)
putchar( x+y == anzahl+1 ? '*' : ' ');
for( x=anzahl ; x ; --x)
putchar( x == y ? '*' : ' ');
putchar( '\n' );
}
};
..aber vor allem war es spät, ich musste auf eine Sicherung warten,
hatte trotzdem gute Laune, hatte Lust auf "Fingerübung" und darum steht
unten drunter auch:
"SCNR"
Mein Gruß sieht übrigens noch unleserlicher aus (in BF):
+++++[>+++++>>>++<<<[>+++>++++<<-]<-]>>++.>++.<------.>>.<<<+++[>++++<-]
>.>---.+++++.+.++.++++.
Rolf Magnus schrieb:> Michael Schikora schrieb:>> void main() //Gibt es Compiler, die undef. Verhalten zeigen?>> Das tun alle.
Richtig, Warnungen geben sie wohl alle aus, Fehler je nach
Einstellungen. Da habe ich mich nicht eindeutig ausgedrückt.
Wenn der Standard von undefinierten Verhalten spricht, heißt es ja nur,
dass dem Compilerbauer freigestellt ist, wie er damit umgeht.
Michael Schikora schrieb:> Rolf Magnus schrieb:>> Michael Schikora schrieb:>>> void main() //Gibt es Compiler, die undef. Verhalten zeigen?>>>> Das tun alle.>> Richtig, Warnungen geben sie wohl alle aus, Fehler je nach> Einstellungen. Da habe ich mich nicht eindeutig ausgedrückt.>> Wenn der Standard von undefinierten Verhalten spricht, heißt es ja nur,> dass dem Compilerbauer freigestellt ist, wie er damit umgeht.
Im Prinzip ja:
Allerdings denke ich, dass was du meinst nennt isch "unspezifiziertes
Verhalten".
unspez Verhalten bedeutet: Grundsätzlich muss der Compiler bzw. der
erzeugte Code schon irgendwas Sinnvolles tun. Der Compilerbauer kann
sich allerdings aussuchen was genau.
Bei undefiniertem Verhalten hingegen darf alles passieren. Wenn du "void
main" schreibst und das Programm daraufhin deine Festplatte formatiert,
dann ist das aus Sicht des C-Standards ok.
Pippano schrieb:> Versuch doch mal den Code ob der deinen Erwartungen entspricht.
Es ist ja zu hoffen, dass er in den mittlerweile fast 10 Jahren seit
seiner Frage das Problem schon selbst gelöst hat.