C-code verbessern

hi experten,

ich bin gerade dabei hier an der uni c zu erlernen. das geht so
auch ganz gut voran. meine frage ist jetzt: weiss jemand, ob es
irgendwo im netz ein forum gibt, wo man c-code posten kann um
ihn von anderen beurteilen zu lassen ? wenn ja, wo ist das ?

danke fuer eure hilfe!

cu micha

Hi,

poste Deinen Code doch hier. Es gibt bestimmt ein paar nette Leute hier, die gute Tips abgeben können. Und einige werden sicher durch reines mitlesen auch was lernen können.

Viele Grüsse,

Herb

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Genau, her damit!
Immer her damit mit dem guten Vitamin C!

Hi Micha,
ich antworte extra nicht auf dein Code-Posting, damit Du ihn schnell löschen kannst :smile:

Bitte poste ihn erneut, aber formatier den Code mit dem pre-Tag. Dann ist er sicherlich lesbarer!

Gruß

J.

(P.S. Pre-Tag:

 und 

benutzen)

hi Jose’,

vielen Dank fuer Deinen Hinweis, hier also das Programm samt
Aufgabenstellung nochmal ordentlich formatiert:

 Schreiben Sie ein Programm, das einen Sägezahn vertikal 
in den unten
 dargestellten Formen auf Bildschirm ausgibt. Die Breite 
des Bildschirms
 beträgt normal 80 Spalten (numeriert von 0 bis 79). Die 
Umrandung
 stellt symbolisch die Bildschirm- bzw. Fenstergrenzen 
dar.

 Um den Sägezahn variabel gestalten zu können, sollen 
folgende Parameter
 von Tastatur geholt werden:
 --\> LINKS : Spalte, in der die linke Spitze des 
Sägezahns liegen soll
 --\> RECHTS : Spalte, in der die rechte Spitze des 
Sägezahns liegen soll
 --\> ZEILEN : Anzahl der Zeilen, in denen der 
Sägezahn von LINKS nach
 RECHTS zu- 
bzw. von RECHTS nach LINKS abnimmt
 --\> FILL : ist 0, wenn links von den Sternen 
Leerzeichen ausgegeben
 werden sollen 
und ist 1, wenn an Stelle der Leerzeichen
 Minuszeichen 
auszugeben sind
 --\> ABSCHNITTE : Anzahl der Abschnitte, die auf 
Bildschirm ausgegeben
 werden 
sollen. Ein Abschnitt besteht jeweils aus ZEILEN
 Zeilen, d.h. 
jeder komplette Sägezahnteil LINKS bis RECHTS
 bzw. RECHTS 
bis LINKS ist ein Abschnitt.

 Die Parameter müssen folgende Bedingungen erfüllen:
 0 

void leerzeichen(int,int);
void berechnung(int,int,int,int,int);
int pruefung(int,int);

void main (void)

{
 int 
links=2,rechts=8,zeilen=7,abschnitte=4,zaehler,zaehler1,zeichen=0,obergrenze=80;;

 printf("hidiho, herzlich willkommen zur Saege !!!\n");
 printf("bitte geben Sie die rechte Spalte ein:");
 do
 scanf("%i",&rechts);
 while (!pruefung(rechts,79));
 printf("und nun die linke:");
 do
 scanf("%i",&links);
 while (!pruefung(links,rechts));
 printf("und nun die Anzahl der Zeilen:");
 do
 scanf("%i",&zeilen);
 while (!pruefung(zeilen,zeilen));
 printf("wieviele Abschnitte sollen ausgegeben werden 
?");
 do
 scanf("%i",&abschnitte);
 while (!pruefung(abschnitte,abschnitte));
 printf("soll ich die leerstellen mit minuszeichen 
fuellen ?");
 do
 scanf("%i",&zeichen);
 while (!(zeichen==0 || zeichen==1));

 for (zaehler1=0;zaehler1=0;zaehler--)
 {
 weiter=((rechts-links-0)\*zaehler / 
(zeilen-1));
 leerzeichen(links + weiter,zeichen);
 printf("\*\n");
 }
 }
}

int pruefung(int eingabe,int obergrenze)
{
 if (eingabe 0)
 return (1); /\*wenn die Eingabe groesser als 0 und unter 
der geforderten obergrenze ist,
 dann sage, dass alles ok ist\*/
 printf("Fehlerhafte Eingabe, bitte nochmal!");
 return (0);
}

Hi micha,

zunächst mal: dein code tut ja im großen und ganzen, das ist schon mal was :smile:

Dennoch hätte ich den einen oder anderen Vorschlag.

  1. Benamsung. Du wirst sagen, dass es nicht so drauf ankommt, aber für größere Projekte ist es saumäßig wichtig, die Funktionen einigermaßen sinnvoll zu benennen. Eine Funktion, die Berechnung heißt, deren eigentliches Ziel es ist, Ausgaben auf dem Bildschirm zu machen, kann schon sehr verwirrend sein.

  2. Benutzerführung: Deine Routine pruefung könnte, wo sie schon dabei ist, dem Benutzer mitteilen, welcher Wert denn nun erlaubt ist. Wenn Du eine Ja/Nein-Frage stellst, darfst Du nicht auf 0 und 1 abprüfen.

  3. Deine Funktion leerzeichen. Auch hier die Namensgebung (es werden nicht nur Leerzeichen ausgegeben, der Parameter spaces ist eher eine Länge), aber auch die Struktur: Du entscheidest aufgrund eines Zeichens für jeweils eine von zwei völlig identische for-Schleife, die nur ein anderes Zeichen ausgibt. Das wäre ein klassischer Fall für den ternären Operator „?“:

    void leerzeichen(int spaces,int zeichen)
    {
    int zaehler;
    for (zaehler = 1; zaehler

    /*spaltenbreite*Zeilnnummer / Zeilenanzahl-1
    das war der Algorithmus, der die Sache
    am besten :hinbrachte…warum?
    das wissen allein die Götter *;o)*/

    Zur Erklärung: Du berechnest Die Punkte mit einer Geradengleichung y = mx + b.
    Umgeformt ist
    m = Spaltenbreite / Höhe --> spaltenbreite / (zeilenanzahl -1).
    b wäre eine Versetzung nachts rechts, bei Dir = 0.

    Dann gibt es noch ein paar Detailfragen: Du verwendest häufig printf(), um Ein-Zeichen-Strings auszugeben, dafür gibt es putchar().
    Außerdem hast Du durch Einsatz in der Schleife viele aufeinanderfolgende Aufrufe; dies ließe sich besser lösen, wenn Du Dein Zeilenstring baust und dann ausgibst.
    Dazu müßtest Du nicht einmal Schleifen verwenden, es gibt z.B. strncpy() oder so.
    Am effizientesten, aber nicht allzu elegant, wäre es, einen String mit maximaler Länge (=80) im Speicher zu halten, zum Anfang, abhängg vom Eingabeparameter, gefüllt mit ‚-‘ oder ’ '-Zeichen. Vor der Ausgabe würde ich an der berechneten Stelle ein Null-Zeichen als Stringterminierung einsetzen, nach der Ausgabe dann wieder mit dem entsprechenden Zeichen belegen.

    Gruß

    J.

Hi,

ich stimme José vollkommen zu: Die Variablen- und Funktionionsnamen müssen einem Schema folgen. Ob Du Dich an der Ungarischen Notation von MS orientierst oder Selber etwas Stringentes erfindest ist dabei egal.
Auch die Struktur des Codes sollte einheitlich sein. Du verwendest bei den do-while Schleifen keine Klammern, bei den for-Schleifen allerdings schon. Ich würde überall Klammern verwenden.
In der Funktion pruefung() springst Du unter Umständen mitten aus der Funktion heraus (mit return(1)). das gilt bei uns in der Firma als schlechter Stil, da es das Debuggen manchmal ziemlich erschweren kann. Ich würde am Anfang der Funktion eine Return-Variable definieren und diese am Schluss - und nur da - zurückgeben. Auf diese Weise kannst Du auf der Suche nach einem Problem einfach einen Breakpoint am Ende der Funktion setzen (auf die Return-Zeile) udn bist Dir sicher, dass Du immer da landest.

Ansonsten eben wie José.

Ciao,

Herb

thx
Hallo ihr zwei,

vielen Dank fuer eure Anmerkungen !!

thx micha