mikrocontroller.net

Forum: PC-Programmierung Raute programmieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Raute (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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?

: Gesperrt durch Moderator
von Phil J. (sunflower_seed)


Bewertung
0 lesenswert
nicht lesenswert
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.

von D. I. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Werner A. (homebrew)


Bewertung
0 lesenswert
nicht lesenswert
Mal so als Ansatz...
I = 4            I = 3  
1234**7890       1234**7890
123*56*890       123*56*890  
12*4567*90       12*4567*90
1*345678*0       12*4567*90
1*345678*0       123*56*890
12*4567*90       1234**7890
123*56*890
1234**7890
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.

von Vlad T. (vlad_tepesch)


Bewertung
0 lesenswert
nicht lesenswert
Leute, hört auf, fremder Kinder Hausaufgaben zu machen.

von D. I. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Werner A. schrieb:
> Mal so als Ansatz...
>
> I = 4            I = 3
> 1234**7890       1234**7890
> 123*56*890       123*56*890
> 12*4567*90       12*4567*90
> 1*345678*0       12*4567*90
> 1*345678*0       123*56*890
> 12*4567*90       1234**7890
> 123*56*890
> 1234**7890
> 

Der Ansatz taugt nix

von Raute (Gast)


Bewertung
0 lesenswert
nicht lesenswert
wie kann ich die leerzeilen (blanks) erhöhen bzw wie stelle ich die 
blanks dar?

von hdd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sag doch mal, welche Sprache du eigentlich programmieren sollst (steht 
bestimmt irgendwo auf dem Aufgabenblatt)?

von Phil J. (sunflower_seed)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Raute (Gast)


Bewertung
0 lesenswert
nicht lesenswert
sorry! c

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
zb. mit
   printf( " " );

kannst du 1 Leerzeichen ausgeben.
Dementsprechend kannst du zb mit
  for( i = 0; i < n; ++i )
    printf( " " );
n Stück Leerzeichen ausgeben.

Und jetzt sieh dir deine Raute noch einmal genauer an. Und zwar nur die 
obere Hälfte:
   **
  *  *
 *    *
*      *


Sieh dir die Zeile 1 an:
   **
   das sind 3 Leerzeichen, 1 Stern, 0 Leerzeichen, 1 Stern

Zeile 2:
  *  *
   das sind 2 Leerzeichen, 1 Stern, 2 Leerzeichen, 1 Stern

Zeile 3:
 *    *
   das sind 1 Leerzeichen, 1 Stern, 4 Leerzeichen, 1 Stern

Zeile 4:
*      *
   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?

von Joooo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Habe die Aufgabe auch mal versucht:
Den oberen Teil der Raute habe ich
Mein Quelltext:
 


#include <iostream>
#include <iomanip>
using namespace std;

int main()
int a,b,c,längeorg,d,v=-2,l,länge;
cin>>länge;

längeorg=länge;
for(d=0;d<längeorg;d++)
{
  
for(a=0;a<länge-1;a++)
    {cout<<" ";}
      cout<<"*";
      länge=länge-1;
      v=v+2;
for(b=0;b<v;b++)
    {cout<<" ";}
      cout<<"*";
    cout<<endl;

}  



   return 0;
}


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

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Dein C++-Compiler erlaubt Umlaute in Bezeichnern? Was ist das denn für 
ein interessanter Compiler?

von Joooo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der Compiler von Visual Studio 2005;
Aber das ist ja nicht das Problem!.....

von Vlad T. (vlad_tepesch)


Bewertung
0 lesenswert
nicht lesenswert
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

von Sam .. (sam1994)


Bewertung
0 lesenswert
nicht lesenswert
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?

von Joooo (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

von Rolf Magnus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Arc N. (arc)


Bewertung
0 lesenswert
nicht lesenswert
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."

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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.

von Michael S. (schiko)


Bewertung
0 lesenswert
nicht lesenswert
..und wenn man defines vernünftig einsetzt, wird der Code auch
schön leserlich auch ohne Umlaute, wie meiner:

#include <stdio.h>
#define so stdout
#define If for
#define F0R(out,stern,z) char
#define For(out) putc(out,so)
#define FOR(out,stern,z) g##z##out
#define Inc(z) For('\n')
#define BackSpace()(('\r'<< 2) - '\n')
#define LineFeed() ( '\t' >> 1 )
#define NewLine()  (BackSpace() + LineFeed())

void main()
{
  F0R(out=0,stern=4,z)out,in;
  F0R(out++,out--,out==in) stern,blank;
  blank = FOR(char,stern,et)() - '0';
  If(stern=blank;stern;--stern)
  {
    If(out=blank;out;--out)
      For(out+stern==blank+1?BackSpace():NewLine());
    If(out=blank;out;--out)
      For(out==stern?BackSpace():NewLine());
    Inc(stern);
  }
  If(stern=1;blank+1-stern;++stern)
  {
    If(out=blank;out;--out)
      For(out+stern==blank+1?BackSpace():NewLine());
    If(out=blank;out;--out)
      For(out==stern?BackSpace():NewLine());
    Inc(blanc);
  }
};

// SCNR

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
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.

von Rolf Magnus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von jooooo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>>..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

von Michael S. (schiko)


Bewertung
0 lesenswert
nicht lesenswert
> 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):
+++++[>+++++>>>++<<<[>+++>++++<<-]<-]>>++.>++.<------.>>.<<<+++[>++++<-] 
>.>---.+++++.+.++.++++.

von Rolf Magnus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Michael Schikora schrieb:
> void main() //Gibt es Compiler, die undef. Verhalten zeigen?

Das tun alle.

von Michael S. (schiko)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
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.

von Pippano (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
So hab mir gerade Processing aus Langeweile heruntergeladen und hatte 
mit Programmieren noch nie etwas am Hut. Hab mich dann auch mal an eine 
Raute ran gemacht und siehe da ich hab es geschafft nach ca 15 Minuten. 
Versuch doch mal den Code ob der deinen Erwartungen entspricht.


void setup(){
  size(500,500);
  background(255);
  raute();
}


void raute(){

for(int a1 = 250; a1 <= 500 ; a1 = a1){              //rechter oberer 
Strich
    for(int b1 = 0; b1 <= 250 ; b1 = b1 + 1){
      if (b1 <= b1+1){
    a1 = a1 +1;
    point(a1,b1);
  }
    }
  }

for(int a2 = 500; a2 >= 250 ; a2 = a2){              //rechter unterer 
Strich
    for(int b2 = 250; b2 <= 500 ; b2 = b2 + 1){
      if (b2 <= b2+1){
    a2 = a2 -1;
    point(a2,b2);
  }
    }
  }

for(int a3 = 250; a3 >= 0 ; a3 = a3){              //linker oberer 
Strich
    for(int b3 = 0; b3 <= 250 ; b3 = b3 + 1){
      if (b3 <= b3+1){
    a3 = a3 - 1;
    point(a3,b3);
  }
    }
  }


for(int a4 = 0; a4 <= 250 ; a4 = a4){              //linker unterer 
Strich
    for(int b4 = 250; b4 <= 500 ; b4 = b4 + 1){
      if (b4 <= b4+1){
    a4 = a4 +1;
    point(a4,b4);
  }
    }
  }
}

Beitrag #6089067 wurde von einem Moderator gelöscht.
von Rolf M. (rmagnus)


Bewertung
2 lesenswert
nicht lesenswert
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.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.