Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Dreieck erstellen in C
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule Dreieck erstellen in C
HartlPet
Junior Letzter Besuch: im letzten Monat
Dabei seit: 24.11.2020
Mitteilungen: 16
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-11-30


Angabe:



Ansatz:



Komme nicht weiter, weis nicht wie ich die zweite for-Schleife gestalten soll. Die erste soll ja richtig sein schätze ich?



Wahlurne Für HartlPet bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 6530
Herkunft: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-11-30


"Verfasse (wie eigentlich immer gefordert) Kommentare ..."



Wahlurne Für StrgAltEntf bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27682
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2020-11-30


Hi HartlPet

Überlege dir zunächst die Antworten auf folgende Fragen:
  1. wie breit ist das Dreieck an der breitesten Stelle
  2. wie viele führende Leerzeichen brauchst du in Zeile z (zunächst mal nur für die obere Dreieckshälfte)
  3. dann ist es einfach, wie viele Zeichen '#' du noch in dieser Zeile ausgeben mußt
  4. gibt es einen „Trick“, um aus der laufenden Zeilennummer z (von 1 bis rows die Anzahl der führenden Leerzeichen ohne(!) if zu berechnen

Die Überlegungen hängen davon ab, ob du z von 1 bis rows oder von 0 bis rows-1 laufen läßt.

Kleiner Tip am Rande:
Warum verwende ich als Variable für die Zeilen ein z😉?
Es ist immer hilfreich, Variablen entsprechend ihres Inhalts zu benennen, statt immer nur stupide i, j etc.



Gruß vom ¼

[Die Antwort wurde vor Beitrag No.1 begonnen.]


-----------------
Bild



Wahlurne Für viertel bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
HartlPet
Junior Letzter Besuch: im letzten Monat
Dabei seit: 24.11.2020
Mitteilungen: 16
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, vom Themenstarter, eingetragen 2020-11-30





So weit bin ich, wie schaffe ich es dass er wieder "zurückzählt"



Wahlurne Für HartlPet bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27682
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2020-11-30


Betrachte dieses Codestück (siehe Punkt 4. in meinem vorigen Beitrag):
C
  1. int i;
  2. for (i=1 ; i<= 9 ; i++ ) {
  3. printf("%3d%3d\n", i, abs(5-i));
  4. }
Was wird ausgegeben?
Wie ist das an den allgemeinen Fall anzupassen?



Wahlurne Für viertel bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
HartlPet
Junior Letzter Besuch: im letzten Monat
Dabei seit: 24.11.2020
Mitteilungen: 16
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2020-11-30


Versteh ich nicht ...



Wahlurne Für HartlPet bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27682
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2020-11-30


Sorry, mein Fehler. War C++, ich hab's auf C umgeschrieben.
Dann spiel es doch mal in Gedanken durch und notier die Ausgaben.



Wahlurne Für viertel bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2596
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2020-12-01


Da gefordert ist, vernünftig lesbaren und kommentierten Code zu schreiben. sollte man das Problem auch in Teilprobleme zerlegen.

1. Dateneingabe und Fehlerbehandlung.
Da die Dateneingabe mit scanf bekanntlich so ihre Tücken hat (bspw. das "Flushen" eines fehlerhaften Eingabestrings), sollte man dieses Problem zunächst unabhängig von der eigentlichen Programmlogik lösen.

2. Die Programmlogik (Ausgabe des Dreiecks).
Hier bietet es sich vielleicht an, zunächst eine Hilfsfunktion zum Schreiben einer einzelnen Zeile mit gegebener Zahl Leerzeichen (alternativ Breite) und gegebener Zahl Doppelkreuze zu implementieren.
Die Dreiecksfunktion muss sich dann nur um die Berechnungen kümmern.

Auf diese Art kommt jede Funktion mit etwa 5-10 Zeilen Code aus, der Code ist auch mit minimaler Kommentierung klar verständlich und die Fehlersuche wird stark vereinfacht.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Wahlurne Für DerEinfaeltige bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27682
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, eingetragen 2020-12-01


2020-11-30 21:46 - HartlPet in Beitrag No. 3 schreibt:
So weit bin ich, wie schaffe ich es dass er wieder "zurückzählt"
Indem du im passenden Moment die Variable stepsize negierst.

Anmerkung zum Code hier reinstellen
Deinen Code hier als Bild reinzustellen ist keine gute Idee.
  • Der Code kann von niemandem verwendet/kopiert werden, sondern man muß ihn mühsam abtippen.
  • Es gibt keine Zeilennummern, auf die man sich mit Bemerkungen beziehen kann.

Klicke auf das [num] von [Quelltext [num.] unterhalb des Eingabefensters und kopiere dann deinen Code rein. Ergebnis siehe meinen (geänderten) Beitrag #4.



Wahlurne Für viertel bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
HartlPet
Junior Letzter Besuch: im letzten Monat
Dabei seit: 24.11.2020
Mitteilungen: 16
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, vom Themenstarter, eingetragen 2020-12-02

C
  1. #include <stdio.h>
  2.  
  3. void triangle(unsigned int rows, unsigned int stepsize)
  4. {
  5. unsigned int i;
  6. unsigned int t;
  7. unsigned int max_char = (rows / 2 + 1) * stepsize - (stepsize - 1);;
  8. unsigned int count = 1;
  9. unsigned int empty;
  10.  
  11.  
  12.  
  13.  
  14. for (i = 0; i < rows; i++)
  15. {
  16. empty = max_char - count;
  17.  
  18. for (t = 0; t < empty; t++)
  19. {
  20. printf(" ");
  21. }
  22.  
  23. for (t = 0; t < count; t++)
  24. {
  25. printf("#");
  26. }
  27. printf("\n");
  28.  
  29.  
  30. if (i < rows / 2)
  31. {
  32. count += stepsize;
  33. }
  34.  
  35.  
  36.  
  37.  
  38. }
  39. }
  40.  
  41.  
  42.  
  43. int main()
  44. {
  45. unsigned int rows;
  46. unsigned int stepsize;
  47. float rows_2 = 0;
  48. float stepsize_2 = 0;
  49.  
  50. printf("How many rows? rows: ");
  51. scanf_s("%f", &rows_2);
  52.  
  53. if (rows_2 != (unsigned int)rows_2)
  54. {
  55. printf("Exiting, since you didnt enter a valid integer.");
  56. return 1;
  57. }
  58.  
  59. rows = (unsigned int)rows_2;
  60. if (rows % 2 != 1 || rows < 0)
  61. {
  62. printf("Exiting, since you entered a negative value or an uneven value. ");
  63. return 1;
  64. }
  65.  
  66. printf("Stepsize? stepsize: ");
  67. scanf_s("%f", &stepsize_2);
  68.  
  69. if (stepsize_2 != (unsigned int)stepsize_2)
  70. {
  71. printf("Exiting, since you didnt enter a valid integer.");
  72. return 1;
  73. }
  74.  
  75. stepsize = (unsigned int)stepsize_2;
  76.  
  77. if (stepsize < 1)
  78. {
  79. printf("Only integers higher than 0 are allowed for the stepsize. ");
  80. return 1;
  81. }
  82.  
  83. triangle(rows, stepsize);
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. return 0;
  92. }
  93.  
  94.  



Wahlurne Für HartlPet bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
HartlPet
Junior Letzter Besuch: im letzten Monat
Dabei seit: 24.11.2020
Mitteilungen: 16
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2020-12-02


Schaffe es einfach nicht. Was meinst du mit negieren?



Wahlurne Für HartlPet bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2596
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2020-12-02


Er meint damit, es negativ zu machen.


Weiterhin fehlen die Kommentare.
Wenn man sich in jedem Schritt aufschreibt, was genau passieren soll, lösen sich Probleme wie die Programmlogik der triangle-Funktion mehr oder weniger von alleine.

Tipp:
Du könntest zum Zeichnen des Dreiecks zwei Schleifen nutzen.
Eine für die obere Hälfte und eine für die Untere.





PS.: Wenn du die Quelltextumgebung nutzt, könntest du die Programmiersprache angeben.
C
// EDIT 1/4
// ich habe oben die Sprache C ergänzt
// dafür hattest du hier die Zeilennumerierung weg gelassen
// zweimal den gleichen Code brauchen wir ja nicht, habe diesen hier somit entfernt


PPS.: Warum liest du die Zahlen als float ein und nicht als Integer?


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Wahlurne Für DerEinfaeltige bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27682
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, eingetragen 2020-12-02

\(\begingroup\)\(\newcommand\d{\mathop{}\!\mathrm{d}}\)
2020-12-02 19:35 - DerEinfaeltige in Beitrag No. 11 schreibt:
Tipp:
Du könntest zum Zeichnen des Dreiecks zwei Schleifen nutzen.
Eine für die obere Hälfte und eine für die Untere.
Das bedingt Code-Redundanz (praktisch den gleichen Code nochmal aufschreiben), die es grundsätzlich zu vermeiden gilt. Denn Änderungen/Korrekturen (z.B. '$' statt des '#' ausgeben, oder führende '.' statt des Leerzeichens) müssen dann an beiden Stellen vorgenommen werden.

Die Zeilen 30..34 würde ich so schreiben:
C
  1. if (i == (rows+1) / 2)
  2. {
  3. stepsize = -stepsize; // ab jetzt werden die '#' wieder reduziert
  4. }
  5. count += stepsize;
Überlege dir, was diese Änderung bewirkt!
Und erst dann probiere es aus😎
\(\endgroup\)


Wahlurne Für viertel bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 1756
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, eingetragen 2020-12-02


2020-12-02 20:12 - viertel in Beitrag No. 12 schreibt:
Die Zeilen 30..34 würde ich so schreiben:
C
  if (i = (rows+1) / 2)

Du meinst vermutlich:
C
  if (i == (rows+1) / 2)



Wahlurne Für zippy bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27682
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, eingetragen 2020-12-02


2020-12-02 21:34 - zippy in Beitrag No. 13 schreibt:
Du meinst vermutlich:
C
  if (i == (rows+1) / 2)

Oops😮 Natürlich (ein immer wieder beliebter Fehler). Hab's korrigiert. Danke.



Wahlurne Für viertel bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2596
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, eingetragen 2020-12-03


2020-12-02 20:12 - viertel in Beitrag No. 12 schreibt:
2020-12-02 19:35 - DerEinfaeltige in Beitrag No. 11 schreibt:
Tipp:
Du könntest zum Zeichnen des Dreiecks zwei Schleifen nutzen.
Eine für die obere Hälfte und eine für die Untere.
Das bedingt Code-Redundanz (praktisch den gleichen Code nochmal aufschreiben), die es grundsätzlich zu vermeiden gilt.

So wahnsinnig redundant finde ich das jetzt nicht.
C
void fill(unsigned int n, char c){
    unsigned int i;
    for (i = 0; i < n; ++i) 
        printf("%c",c);
}
 
void print_row(int i, unsigned int rows, unsigned int stepsize){
    unsigned int total = rows / 2 * stepsize + 1;
    unsigned int empty = total - (i * stepsize + 1);
    fill(empty,' ');
    fill(total - empty,'#');
    printf("\n");
}
 
void triangle(unsigned int rows, unsigned int stepsize){
    int i;
    for (i = 0; i <= rows/2; ++i) 
        print_row(i,rows,stepsize);
    for (i = rows/2 - 1; i >= 0; --i) 
        print_row(i,rows,stepsize);
}
 
 



-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Wahlurne Für DerEinfaeltige bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 27682
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.16, eingetragen 2020-12-03


@DerEinfaeltige
Touché 😎

Aber „in einem Rutsch“ ist es doch irgendwie eleganter (und auch noch vollständig kommentiert). Außerdem 2 Varianten der triangle-Funktion.
C
void fill(int n, char c)
/*
   n-mal das Zeichen c ausgeben
*/
{
   for (int i=0 ; i<n ; i++)
      printf("%c", c);
} // fill
//----------------------------------------------------------------
void printrow(int empty, int count)
/*
   eine Zeile des Dreiecks ausgeben
   empty : wie oft das Füllzeichen
   count : wie oft das darstellende Zeichen
*/
{
   fill(empty,'.');  // Füllzeichen
   fill(count,'#');  // das Zeichen für das Dreieck
   printf("\n");
} // printrow
//----------------------------------------------------------------
void triangle(int rows, int stepsize)
/*
   Das Dreieck ausgeben
   rows     : wie viele Zeilen
   stepsize : wie viele Zeichen pro Zeile mehr/weniger ausgeben
*/
{
   int maxchar = 1 + (rows-1)/2*stepsize;
   int count = 1;              // Zähler für auszugebendes Zeichen
   int i;                      // Zähler für Schleifendurchgang (Zeile)
   for (i=0 ; i<rows ; i++) {
      printrow(maxchar-count, count);
      if (i == (rows-1)/2)     // in der Mitte angekommen ?
         stepsize = -stepsize; // Zählung umkehren
      count += stepsize;       // Zähler für nächste auszugebende Zeile
      }
} // triangle
//----------------------------------------------------------------
void triangle2(int rows, int stepsize)
/*
   wie traiangle()
   Aber die Berechnung von count erfolgt mit etwas Mathematik
   Es wird die "Knickfunktion" der abs()-Funktion ausgenutzt
   Einfach mal drüber nachdenken
*/
{
   int mitte = (rows-1)/2;
   int maxchar = 1 + mitte*stepsize;
   int count;
   int i;
   for (i=0 ; i<rows ; i++) {
      count = 1 + stepsize*(mitte - abs(i-mitte));
      printrow(maxchar-count, count);
      }
}
//----------------------------------------------------------------
int main(void)
{
   triangle(7, 3);
   triangle2(7, 3);
 
   return 0;
} // main



Wahlurne Für viertel bei den Matheplanet-Awards stimmen
Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]