Forum: PC-Programmierung C Programm - for Schleife funktioniert nicht


von Juergen72 (Gast)


Lesenswert?

Hallo, ich will gerne die Widerstandsdekaden der E12-Reihe in C 
ausgeben. Diese sollen tabellarisch ausgegeben werden und mit einer 
Feldweite von 8 sowie einer Nachkommastelle.

Mein Code sieht folgendermaßen aus:
1
#include <stdio.h>
2
#include <math.h>
3
#include <stdlib.h>
4
5
int main(){
6
7
int x = 1;
8
int iNummer = 0;
9
float fWert;
10
11
for(x=1; x<=12; x++)
12
{
13
14
fWert = pow(10, x/12);
15
16
iNummer++;
17
printf("\n\tNr: %d\t Widerstand:\t %8.1f", iNummer, fWert);
18
19
}
20
}

Der Code wird auch ausgeführt, nur zeigt er bei jedem Widerstand den 
Wert 1.0 an. Wie komme ich darauf, dass er 1.2, 1.5,.... etc... ausgibt?


Wo liegt der Fehler? Was habe ich falsch gemacht?

von Gerhard Z. (germel)


Lesenswert?

Na x/12 wird wohl immer 0 sein außer für x=12. Schreib x/12.0.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Juergen72 schrieb:
> Wo liegt der Fehler? Was habe ich falsch gemacht?

x ist integer. und x ist deine Lauf-Variable.
1/12 = 0   --> 10 hoch 0  = 1
2/12 = 0   --> 10 hoch 0 = 1
..
12/12 = 1  --> 10 hoch 1 gleich 10

Du hast deine Ausgabe zwar als float Zahl, aber die vorherige Berechnung 
macht halt das was du gesagt hast.

somit wird dann aus 1 ein 1.0, und aus 10 ein 10.0 (weil du es so 
ausgaben möchtest mit %8.1f)


Tip: Wenn du durch 12.0 teilst anstelle durch 12, wird das ganze 
"automatisch" zu float berechnet

edit: germel war schneller

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Da an der Berechnung nur Integerwerte beteiligt sind, wird die Division 
auch nur als Integerdivision ausgeführt.

Dies gilt auch für Teilausdrücke wie 1.0 + x/12
Wegen Punkt vor Strichrechnung wird zuerst x/12 ausgewertet.
Dabei ist es auch egal, was für einer Variablen das später zugewiesen 
wird.

Wozu iNummer?
Was ist der Unterschied zu x?

von Markus L. (rollerblade)


Lesenswert?

Das ganze ließe sich durchaus kompakter, ohne unnütze Variablen und mit 
hinreichendem Scope hinschreiben:
1
int main(){
2
  for( int x = 1; x <= 12; x++)
3
    printf("\n\tNr: %d\t Widerstand:\t %8.1f", x, pow(10, x/12.0));
4
}

von Dirk B. (dirkb2)


Lesenswert?

Die Reihe fängt bei x=0 an und geht (in diesem Fall) bis 11.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.