mikrocontroller.net

Forum: PC-Programmierung Raute programmieren


Autor: Raute (Gast)
Datum:

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?

Autor: Phil J. (sunflower_seed)
Datum:

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.

Autor: D. I. (Gast)
Datum:

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.

Autor: Werner A. (homebrew)
Datum:

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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: D. I. (Gast)
Datum:

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

Autor: Raute (Gast)
Datum:

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

Autor: hdd (Gast)
Datum:

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

Autor: Phil J. (sunflower_seed)
Datum:

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.

Autor: Raute (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry! c

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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?

Autor: Joooo (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Joooo (Gast)
Datum:

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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: Sam .. (sam1994)
Datum:

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?

Autor: Joooo (Gast)
Datum:
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

Autor: Rolf Magnus (Gast)
Datum:

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.

Autor: Arc Net (arc)
Datum:

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."

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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.

Autor: Michael Schikora (schiko)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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.

Autor: Rolf Magnus (Gast)
Datum:

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.

Autor: jooooo (Gast)
Datum:

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

Autor: Michael Schikora (schiko)
Datum:

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):
+++++[>+++++>>>++<<<[>+++>++++<<-]<-]>>++.>++.<------.>>.<<<+++[>++++<-] 
>.>---.+++++.+.++.++++.

Autor: Rolf Magnus (Gast)
Datum:

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

Das tun alle.

Autor: Michael Schikora (schiko)
Datum:

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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.