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 ?
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]
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);
}
zunächst mal: dein code tut ja im großen und ganzen, das ist schon mal was
Dennoch hätte ich den einen oder anderen Vorschlag.
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.
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.
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.
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.