Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Donnerstag, 22. Dezember 2005, 18:56

C Problem

Hi @ all

Ich hab ein kleines C Problem

Ich hab als Aufgabe bekommen einen Christbaum aus Sternchen zu programmieren. Es soll ein Win32 Konsolenprogramm sein

Er soll ungefähr so aussehen:

.....*
....***
..*****
.*******
*********
....***

Man kann es ja einfach machen und nur printf() schreiben.

So hat sollen wir es nicht machen hat er gesagt.

Wir sollen die Höhe des Baumes am Anfang eingeben

Ich hab mir schon überlegt man könnte es irgendwie mit einer for Schleife machen oder??

Die Schleife muss bei jeder Wiederholung 2 * dazu tun und ein " " (Leerzeichen) entfernen.

Da hab ich aber nicht den Durchblick.

Könnte mir jemand das erklären?

Danke im Voraus

Gruß Robert
Gruß Robert

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Robert« (22. Dezember 2005, 21:06)


seegurke

RCLine User

Wohnort: Schwerte

Beruf: Student

  • Nachricht senden

2

Donnerstag, 22. Dezember 2005, 19:13

Also C is bei mir schon länger her. C++ is schöner. Aber welches Leerzeichen willst du entfernen?
Gruß, David

Vereine haben ihre Strukturen...
Wir haben unseren Codex - RuhrPiraten

Fraett

RCLine User

Wohnort: Berlin

  • Nachricht senden

3

Donnerstag, 22. Dezember 2005, 20:52

Hallo!

Ich denke mal der Baum soll Symetrisch um die Hochachse sein oder?
Ich denke, das die Forumssoftware Leerzeichen am anfang einer Zeile wegfiltert. Das wäre eine Erklärung für die Leerzeichen, die nicht da sind.

Wenn du die Höhe kennst, dann kannst du ja überlegen wie hoch der Stamm und der benadelte Baum sein soll. Über einen einfachen Vergleich kann man dann entscheiden, ob man in einem Schleifendurchlauf die Krone oder den Stamm Zeichnen will.

Ich habe grade eine Idee, von deren Funktion ich überzeugt bin... ist es in C schwer einen String (gab es in C überhaupt Strings?) umzudrehen?

Ich bin eher in Java zu hause als in C, dehalb kenne ich mich da nicht wirklich aus.

Gruß, Jan

4

Donnerstag, 22. Dezember 2005, 21:19

HI

Ich kenn mich leier noch nicht so gut in C aus.


void main (void)
int ein;
int i;
{
ein=5;
for(i=1;i=ein
printf("%d",i);
getch();
}

Nur wie das mit der for Schleife genau geht kapier ich nicht ganz

Kann mir wer das erklären?

Danke im voraus ;)

Gruß Robert
Gruß Robert

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Robert« (22. Dezember 2005, 21:21)


Fraett

RCLine User

Wohnort: Berlin

  • Nachricht senden

5

Donnerstag, 22. Dezember 2005, 21:39

Hallo!

Laut Wikipedia hat das for-statement folgende Synthax:

Zitat

for (Ausdruck-1opt; Ausdruck-2opt; Ausdruck-3opt) Anweisung


Dabei wird in der Regel der erste Ausdruck für die Initialisierung der Zählvariablen genutzt. Der zweite wird in der Regel als Abbruchkriterium gewählt. Also solange dieser Ausdruck wahr ist, läuft die Schleife weiter. Bei dir steht an dieser Stelle ein "i=ein". Damit geht der nie in diese schleife, da Aufgrund der Initialisierung von ein=5 und i=1 beide Werte nicht gleich sein können. Eine ungleichung wäre hier also besser. ;) Die dritte Anweisung wird in der Regel dafür verwendet die Schleifenvariable zu modifizieren, also hoch oder runter zu zählen.

Gruß, Jan

P.S.: Ich schreibe dir mit Absicht nicht gleich die ganze Lösung, sondern geleite dich auf dem weg dahin. Den weg musst du trotzdem selber gehen. Wenn du erklärungen von mir garnicht Verstehst frag nach, ich schreibe auch häufig mist. Und wie gesagt, C ist nicht meine "Heimatsprache". ;)

wurzi

RCLine User

Wohnort: Österreich

Beruf: Programmierer

  • Nachricht senden

6

Donnerstag, 22. Dezember 2005, 21:51

Allgemeines zur for-Schleife

for(initialwer;bedingung;increment / decrement)

die schleife wird solange ausgeführt bis die bedingung false wird.

BSP:
for(i=0;i < 10;i++) {
printf("%d\n",i);
}

Ausgabe:
0
1
2
3
4
...
9


Die Lösung könnte so aussehen:
Eine ungerade Zahl eingeben lassen
dann eine schleife laufen lassen bei der immer 2 abgezogen werden
in java schaut das dann so aus: for(int i=<eingabewert>;i > -1;i-=2)
ob das in C genau so geschrieben werden kann weis ich jetzt nicht!

und dann immer <eingabe wert> - i / 2 leerzeichen ausgeben und den rest mit wert von i sternen auffüllen
Wäre nett wenn mich der eine oder andere besuchen würde.

Übrigens: Krieg ist Gottes Art den Amerikanern Geographie zu lehren ...

http://nitghtflyer.ni.ohost.de/
:w

wurzi

RCLine User

Wohnort: Österreich

Beruf: Programmierer

  • Nachricht senden

7

Donnerstag, 22. Dezember 2005, 21:54

Zitat

Original von Fraett

Und wie gesagt, C ist nicht meine "Heimatsprache". ;)


Was sprichst du sonst?

Und sorry, dass ich eine mögliche lösung verraten hab!

wenn sie denn funktioniert ;)
Wäre nett wenn mich der eine oder andere besuchen würde.

Übrigens: Krieg ist Gottes Art den Amerikanern Geographie zu lehren ...

http://nitghtflyer.ni.ohost.de/
:w

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wurzi« (22. Dezember 2005, 21:55)


8

Donnerstag, 22. Dezember 2005, 21:54

Hallo Jan

Ich weiß ich muss selber nachdenken ;)

for(i=1;i<ein;++)

Wenn ich jetzt

so zählt er einmal hoch, oder?

Nur wie geb jetzt das mit **** aus?

Welcher Datentyp ist eigentlich ein * Character?

Danke im voraus

Gruß Robert
Gruß Robert

wurzi

RCLine User

Wohnort: Österreich

Beruf: Programmierer

  • Nachricht senden

9

Donnerstag, 22. Dezember 2005, 21:59

du kannst das als Zeihcenkette deffinieren

char stern = '*';
oder
char[] stern = "*";
char[] sterne = "******";

oder wenn ich mich nicht irre

char[N] sterne;

darfst mich aber nicht schlagen wenns nicht 100%ig stimmt, bin auch mehr JAVA!
Wäre nett wenn mich der eine oder andere besuchen würde.

Übrigens: Krieg ist Gottes Art den Amerikanern Geographie zu lehren ...

http://nitghtflyer.ni.ohost.de/
:w

kmx4fun

RCLine User

Wohnort: Bad Oeynhausen

Beruf: Student, Elektrotechnik

  • Nachricht senden

10

Donnerstag, 22. Dezember 2005, 22:23

Zitat

Original von Robert
for(i=1;i<ein;++)


so ist es richtig:

for(i=0;i<1;i++)
{
}


so würde die schleife einmal durchlaufen


Zeichenkette ist unschön, verschwenderisch, und noch vieles mehr :D

Also, ich würde es so lösen, die Höhe gibt die Anzahl der Schleifen durchläufe, in dieser schleife läuft noch eine schleife in die die Sterne und Leerzeichen geschrieben werden. Diese ergibt sich ebenfalls aus der Höhe. Argh, blöd zu erklären, aber ganz simpel! Darf ich? darf ich darf ich darf ich? :evil:


Also schmatisch geschrieben:

Höhe eingeben;

solange zähler < höhe
{

schleife
schreib soviele leerzeichen: höhe-zähler / 2
schleife
schreibe anzahl sternchen = zähler2

bei jedem durchlauf zähler2 um 2 erhöhen
}

schreibe "Baumständer" // der ist ja immer gleich?!


bisschen denken musst du noch selbst, das programm wäre so nicht komplett

Mfg

Marcel (der das mal eben runtertippen wird) :D :evil:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kmx4fun« (22. Dezember 2005, 23:12)


Fraett

RCLine User

Wohnort: Berlin

  • Nachricht senden

11

Donnerstag, 22. Dezember 2005, 22:50

Mensch Jungs! :D

Da räumt man einmal ein bisserl weiter das Zimmer auf und dann sowas hier! Nee ey! ;) Ihr seid doch alle viel zu schnell für mich... ==[]

@Marcel: Schon sehr ausführlich, wenn auch (zum Glück?) nicht komplett. ich hätte das noch ein bisserl verzögert... ;)

@Wurzi: Jupp, Java ist auch für mich gewohnter. Manche Sachen gehen aber nur in C/C++. Assemblerprogrammierung macht sich so doof in Java oder einer funktionalen Programmiersprache (bei mir bis jetzt meist Haskell).

@ Mod oder Admin oder sonstewen aus der Crew: Irgendwie ist es zum Code-schnipseln doof, wenn führende Leerzeichen "gefressen" werden. Gibt es irgendeinen Weg das zu umgehen?

Gruß, Jan

kmx4fun

RCLine User

Wohnort: Bad Oeynhausen

Beruf: Student, Elektrotechnik

  • Nachricht senden

12

Donnerstag, 22. Dezember 2005, 22:56

Quellcode

1
2
3
4
5
gib es als [.CODE] ein (# Zeichen oben)

     *
   ***
  ****



hier mal meine Idee der Umsetzung: http://kmx4fun.de.vu/BAUM.EXE

Quellcode kann jeder haben, nur Jan noch nicht :D :ok:

13

Donnerstag, 22. Dezember 2005, 23:01

Ja. Beim Editieren auf den Button mit # druecken. Ist nicht ganz einwandfrei, aber doch besser.
Vorsicht: folgendes Bild geht per Programm nur wenn zwischen den Sternchen Leerzeichen sind. Bin auch nicht sicher ob's so bei allen gleichmaessig rueberkommt.

Quellcode

1
2
3
4
5
6
7
8
9
10
       *
      **
     ***
    ****
   *****
  ******
 *******
********
      **
      **
Gruss
Thomas
🖖

Vielleicht ist Wissen doch nicht die Antwort auf alles

Fraett

RCLine User

Wohnort: Berlin

  • Nachricht senden

14

Donnerstag, 22. Dezember 2005, 23:13

Hallo!

Sachmal Marcel, haste mich jetzt mit dem Themenersteller verwechselt oder willst du mich nur ärgern? ;)

Nur ein Test:

Quellcode

1
2
3
4
5
6
for(int i=0; i<blablubb; i--){
  if (this.sinnlos==true) Sytem.out.println("das hier ist Sinnlos");
    else 
      if(this.isTest) System.out.println("das hier ist ein Test");
        else System.out.println("das hier ist Müll");
}


@ Thomas: Danke für den Tipp!

Gruß, Jan

kmx4fun

RCLine User

Wohnort: Bad Oeynhausen

Beruf: Student, Elektrotechnik

  • Nachricht senden

15

Donnerstag, 22. Dezember 2005, 23:20

Jup, habe dich verwechselt, Robert Schilling bekommt den Code (noch) nicht, du schon, wenn du willst ==[]

War keine absicht :w

16

Donnerstag, 22. Dezember 2005, 23:26

Zitat

Original von Fraett

Quellcode

1
2
3
4
5
6
for(int i=0; i<blablubb; i--){
  if (this.sinnlos==true) Sytem.out.println("das hier ist Sinnlos");
    else 
      if(this.isTest) System.out.println("das hier ist ein Test");
        else System.out.println("das hier ist Müll");
}


Jan, unguenstig eingerueckt. Weckt einen falschen Eindruck vom Code. Nur meine persoenliche Meinung aber da die Bedingungen gleichwertig sind sollten sie auf gleicher Ebene stehen:

Quellcode

1
2
3
4
5
6
for(int i=0; i<blablubb; i--){
  if (this.sinnlos==true) Sytem.out.println("das hier ist Sinnlos");
  else 
  if(this.isTest) System.out.println("das hier ist ein Test");
  else System.out.println("das hier ist Müll");
}

Und da das auch nicht immer uebersichtlich ist, schreibe ich es immer so:

Quellcode

1
2
3
4
5
6
7
8
9
for(int i=0; i<blablubb; i--){
  if (this.sinnlos==true)
      Sytem.out.println("das hier ist Sinnlos");
  else 
  if(this.isTest)
    System.out.println("das hier ist ein Test");
  else
    System.out.println("das hier ist Müll");
}

Macht zwar den Code laenger, ist aber besser lesbar. Und wenn der Code auch fuer andere leichter pflegbar sein soll, dann gleich mit geschweiften Klammern. Denn solche Klammern vergisst man leicht wenn eine Codezeile eingefuegt werden soll.
Wie gesagt, meine persoenliche Meinung. Bei uns im Team im Buero achten wir doch immer (meist) auf pflegbare Programmierkonventionen. Macht das Leben im Team einfacher.
Gruss
Thomas
🖖

Vielleicht ist Wissen doch nicht die Antwort auf alles

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Thomas_R.« (22. Dezember 2005, 23:28)


Fraett

RCLine User

Wohnort: Berlin

  • Nachricht senden

17

Freitag, 23. Dezember 2005, 00:54

Hallo!

@ Thomas: Tja, du hast schon recht das die letzte von dir gepostete Variante die "beste" ist. Praktisch ist der Code den ich schreibe eigentlich immer ganz gut lesbar. Ich habe zumindest noch nie was gegenteiliges gehört... Außer jetzt von dir an diesem Beispiel. ;)
Außerdem war es nur ein Test, für den mir nichts schlaueres eingefallen ist! ;) Ich versuche eigentlich immer Programmsegmente so zu formulieren, dass die if-Statements möglichst selten mit dem gleichen "Level" auftreten. Ab und zu führt kein Weg dran vorbei, aber ein paar geschweifte Klammern können dann auch Wunder wirken.

Aber Coding-Standards sind wirklich mal so mal so. Der eine besteht darauf, dass die Geschweifte Klammer für nen neuen Block alleine in einer Zeile steht, der andere hängt sie direkt hinter das Statement, das diesen Block ausführt usw...

Ein gewisses Minimum an Komentar ist eigentlich immer wichtiger als Feinheiten im Aussehen des Codes.

Gruß, Jan

Buck

RCLine User

Wohnort: Schweiz

  • Nachricht senden

18

Freitag, 23. Dezember 2005, 01:15

Krieg ich jetzt einen Keks?
:nuts:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv) 
{
        int r,c,i;
        double hoehe;

        if(argc <= 1) {
                printf("Bitte hoehe angeben!\n");
                exit(1);
        } else { hoehe = atof(argv[1]); }
        int s = hoehe;

        for(r=1;r<(hoehe*2);r+=2){
                for(i = 0; i<s;i++){
                        printf(" ");
                }
                s--;
                for(c = 1; c <= r; c++){
                        printf("#");
                }
                printf("\n");
        }

        for(i = 0; i<(hoehe-1); i++) {
                printf(" ");
        } printf("###\n");
}
Mit freundlichen Grüssen

Patrik

Fraett

RCLine User

Wohnort: Berlin

  • Nachricht senden

19

Freitag, 23. Dezember 2005, 09:59

Moin!

Nee, jetzt gibts keinen Keks mehr! :angry: Sorry, aber ich finde es Doof komplette Lösungen zu Posten. Aber toll, das du es kannst. Ich hätte es auch gekonnt. Die meisten, die diesen Thread gehelen haben hätten es gekonnt, der Themenersteller wär sicher auch mit eigenem Lernprozess darauf gekommen. So find ich das eigentlich einfach nur doof! :no: :no: Lernprozess im Arsch und nu?

Gruß, Jan

Buck

RCLine User

Wohnort: Schweiz

  • Nachricht senden

20

Freitag, 23. Dezember 2005, 10:16

He, ganz ruhig bleiben. Ich habe die Kommentare schliesslich weggelassen :tongue:
Ausserdem ist meine Lösung nicht perfekt.
Mit freundlichen Grüssen

Patrik