[C] Fehler in Programm

epic

De Puta Brot :D
ID: 49135
L
1 Mai 2006
155
3
Hi,
hab heute begonnen mit C (für die Schule)
und ich habe einen Fehler in meinem Programm.
Worum gehts? Ich soll ein Programm schreiben, dass Kilogramm in versch. andere Gewichtsklassen umrechnet.
Es soll eine Vorschleife drin sein die die Zeilen von 1-10 Kilo wiederholt.
Das hab ich bis jetzt gemacht:

Code:
#include <stdio.h>
main()

{
	double unze = 28.249523125;
	double feinunze = 21.1034768;
	double pfund = 453.59237;
	double grain = 64.79891;
	double stone = 6350.29318;

	int zahl;

	double ergunze = (1000/unze);
	double ergfeinunze = (1000/feinunze);
	double ergpfund = (1000/pfund);
	double erggrain = (1000/grain);
	double ergstone = (1000/stone);

	printf("kg \t Unze \t Feinunze \t Pfund \t grain \t stone\n");

for zahl=1;zahl<=10;zahl++)

	printf("1 %f ",ergunze*zahl);
	printf("1 %f ",ergfeinunze*zahl);
	printf("1 %f ",ergpfund*zahl);
	printf("1 %f ",erggrain*zahl);
	printf("1 %f ",ergstone*zahl);

	return 0;

}

und das haut nicht hin =(
 
Neben den geschwungenen Klammern, die flaschenkind bereits angesprochen hat, fehlt auch eine runde Klammer nach dem for. Mit diesen beiden Änderungen sollte das Programm laufen.
 
Beim Ausgeben würde ich auch Tabulatoren einsetzen und die Anzahl der Nachkommastellen begrenzen, damit du was erkennen kannst.
 
tH hat recht, so gibt es in jedem Fall einen Syntax-Fehler.

Mich wundert aber, wozu Du die Variablen ergunze, ergfeinunze, etc. brauchst. Ich meine, erg steht offenbar für Ergebnis, aber Du legst dort kein Ergebnis, sondern einen anderen, zweiten Umrechnungsfaktor (Unzen je Kilogramm) ab.

Versteh' mich nicht falsch, ich will Dich nicht niedermachen. Ich möchte Dir lediglich ein paar Kleinigkeiten aufzeigen, die Dir helfen könnten schöneren und damit meistens auch besseren Code zu schreiben. Es muß ja nicht sein, daß Du alle Dummheiten die ich (und viele andere auch am Anfang) gemacht habe, nachmachst.

Würdest Du statt
PHP:
	double unze = 28.249523125;
	double ergunze = (1000/unze);
	int zahl;
	printf("1 %f ",ergunze*zahl);
einfach
PHP:
	double unze = 28.249523125;
	printf("%d kg = %f unzen\n", zahl, zahl*1000/unze);

schreiben käme das doch auf das gleiche raus, oder? Die zusätzliche Variable hättest Du aber gespart.

Am schönsten (von der Lesbarkeit und Verständlichkeit her) fände ich aber:

PHP:
	double gramm_pro_unze = 28.249523125;
	int gewicht_in_kilogramm;
	double gewicht_in_unzen= gewicht_in_kilogramm* 1000 / gramm_pro_unze;
	printf("%d kg sind %f oz\n", gewicht_in_kilogramm, gewicht_in_unzen);

Nun haben die Variablen "sprechende Namen". "gramm_pro_unze" kann doch fast nicht mehr mißverstanden werden, oder?

Die Berechnung steht in einem Statement für sich, jeder sieht: hier wird was berechnet. Die Ausgabe steht auch für sich, denn hier wird etwas ausgegeben. Alles ist schön aufgeräumt.

Solche Überlegungen stellt man sich nicht, wenn man gerade beginnt zu programmieren, aber wenn die Projekte größer werden (bei mir sind sie sehr groß, ich mach das ja beruflich), dann muß man darüber nachdenken, sonst versteht man bald seinen eigenen Code nicht mehr.
 
Meinst Du mit #define?

Das wollte ich nun gerade nicht erwähnen, denn meiner Erfahrung nach steigt jeder früher oder später nach C++ um und dann wäre
const type name = value;
am schönsten.
 
Ja, man machte das so, weil es ja kein const-Konstrukt in C gibt. Man könnte also jederzeit den Wert der Konstanten versehentlich ändern (beispielsweise in dem man bei einem Vergleich nur "=" statt "==" schreibt...

Aber wir sollten epic an unseren Überlegungen teilhaben lassen:

PHP:
#incldue <stdio.h>

#define GRAMM_PRO_UNZE 28.249523125

int main()
{
    int kilogramm;
    double unzen;
    for (kilogramm = 1; kilogramm < 11; kilogramm++)
    {
        unzen = kilogramm * 1000 / GRAMM_PRO_UNZE;
        printf("%d kg sind %f oz.\n", kilogramm, unzen);
    }
}

Der Präprozessor (der beispielsweise vor dem Compilieren alles, was nur Kommentar ist rausschmeißt) wird durch die #define direktive angewiesen jedes Vorkommen von GRAMM_PRO_UNZE im Quelltext durch den Text (!) 28.249523125 zu ersetzen. Deshalb darf an dieser Stelle kein semikolon kommen.
Der Compiler macht dann aus dem Text eine Zahl, deren Codierum im Binärcode abgelegt wird.