Seite 2 von 2

Re: Probleme/ Buch Einstieg in C

Verfasst: Sa Mär 30, 2019 10:35 am
von mfro
Du wirst - zumindest im Internet - keine hilfreiche Hilfe bekommen, wenn Du nicht lernst, richtig zu fragen.

Wir sitzen nicht vor deinem Computer, können also auch nicht sehen, was "ich habe nun ausprobiert, dass es besser läuft" oder "er rechnet dennoch falsch" wohl bedeuten könnte.

Eine richtig gestellte Frage sieht immer so aus: ich habe "x" gemacht, "y" erwartet und "z" ist dabei herausgekommen. Was muss ich an "x" ändern, damit "y" passiert?

"x", "y" und "z" sollten dabei möglichst ausführlich erklärt sein. Wir sind keine Hellseher.

P.S.: Computer rechnen (im Allgemeinen) nicht falsch. Sie rechnen vielleicht nicht das, was man erwartet hätte, aber falsch in den seltensten Fällen.

Re: Probleme/ Buch Einstieg in C

Verfasst: Sa Mär 30, 2019 10:37 am
von nufan
Hallo SueNa!
SueNa hat geschrieben:
Fr Mär 29, 2019 5:59 pm
Der Debugger gibt für die Zeilen, in denen die scanf(…) Funktion steht, folgendes an:

warning: format ' %f' expects Argument of type 'float *' but Argument 2 has type 'double *'
Genau das ist das Problem. Es sollte "%lf" (kleines L) sein und nicht "%1f" (eine Eins).
"%lf" steht für die Eingabe von Double, während "%1f" nur ein Zeichen für die Eingabe einer Float-Zahl zulässt.

Re: Probleme/ Buch Einstieg in C

Verfasst: Sa Mär 30, 2019 10:42 am
von SueNa
also sorry für meinen Fragestil ;-) ist nicht böse gemeint . .. Danke für die Tipps und alles und Danke wegen dem Hinweis wegen dem %1f
statt %lf

jetzt funktioniert es . . .

ich habe bei der Deklaration float angegeben und in den Zeilen, in denen die scanf Funktion steht, habe ich statt "%lf" nur "%f" geschrieben. . .

den Tipp mit der Berechnung habe ich auch beachtet und jetzt funktionieren beide Programme :-) JUHUU

Re: Probleme/ Buch Einstieg in C

Verfasst: Sa Mär 30, 2019 10:43 am
von SueNa
ich nehme mir das mit dem richtig Fragen stellen wirklich für meine nächsten Fragen zu Herzen . . . Danke ne ;-)

Re: Probleme/ Buch Einstieg in C

Verfasst: Mo Apr 01, 2019 9:57 am
von Xin
Sorry für die späte Antwort, das Wochenende war ziemlich voll.
SueNa hat geschrieben:
Fr Mär 29, 2019 5:40 pm
okay, was ich zuvor kopiert habe, ist meine eigene Überlegung.

So wie ich dich verstanden habe, darf ich zu Beginn nur deklarieren oder feste Werte zuweisen.
Du darfst auch rechnen, aber Du wenn Du zuverlässige Ergebnisse haben möchtest, musst Du mit Variablen rechnen, die bereits initialisiert hast - also denen bereits Werte zugewiesen sind. Wichtig dabei: Die Ergebnisse von Berechnungen ändern sich nicht mehr, wenn Du Variablen änderst.
SueNa hat geschrieben:
Fr Mär 29, 2019 5:40 pm
also wäre es richtig, wenn ich einfach nur:

Code: Alles auswählen

int anzahlEA,anzahlZA;
double preisEA,preisZA;
double SoR, rabatt=0.2, SmR;
schreibe?
Ja, die Berechnungen müssen später stattfinden
SueNa hat geschrieben:
Fr Mär 29, 2019 5:40 pm
Im Lehrbuch steht es so:
(ich kann es leider nur abschreiben, weil ich Probleme habe die Fotos, die ich gemacht habe anzuhängen, was mich jedoch nicht davon abhalten wird weiter zu machen mit dem C Lernen, außerdem macht Übung ja den Meister . . . )
Ich habe das mal hier durch den Compiler gejagt (Windows 10, deutsch) und als Preis einmal 2 und einmal 2.50 eingetragen.
Die Eingabe sieht gut aus, die Summe ist vielleicht etwas groß gewählt.

Code: Alles auswählen

Erster Artikel, Anzahl:5
Erster Artikel, Preis in Euro:2
Zweiter Artikel, Anzahl:2
Zweiter Artikel, Preis in Euro:2.50
Summe ohne Rabatt:157022887065377420000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000.00 Euro
Summe mit Rabatt:1256183096523019400000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000.00 Euro
Als erstes füge ich mal ein paar Ausgaben dazu, um zu gucken, was der Computer überhaupt versteht, kompiliere neu und lasse mir das ausgeben.

Code: Alles auswählen

scanf("%1f", &preisZwei);

printf( "Anzahl1 %d * Preis1 %lf\n", anzahlEins, preisEins );
printf( "Anzahl2 %d * Preis2 %lf\n", anzahlZwei, preisZwei );
    
/*Berechnung*/
Da kommt raus:

Code: Alles auswählen

C:\Users\xin\test\Sue>a.exe
Erster Artikel, Anzahl:5
Erster Artikel, Preis in Euro:2
Zweiter Artikel, Anzahl:2
Zweiter Artikel, Preis in Euro:2.50
Anzahl1 5 * Preis1 31404577413075484000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000.000000
Anzahl2 2 * Preis2 54961368115593132000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
Summe ohne Rabatt:157022887065377420000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000.00 Euro
Summe mit Rabatt:1256183096523019400000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000.00 Euro
Die Anzahl ist also korrekt angekommen, die Double nicht, hier gibts wörtwörtlich ein großes Missverständnis, obwohl das Format scheinbar stimmt:

Code: Alles auswählen

scanf("%1f", &preisZwei);                                                    // Deine Eingabezeile
printf( "Anzahl1 %d * Preis1 %lf\n", anzahlEins, preisEins );   // Meine Ausgabezeile
Bei mir steht %lf, bei Dir %1f. Oder mal als Text: Klein-El-Eff bei mir, Eins-Eff bei Dir.
Entsprechend gibt der Compiler auch auf Anforderung eine Warnung raus:

Code: Alles auswählen

C:\Users\xin\test\Sue>gcc test.c -Wall
test.c: In Funktion »main«:
test.c:14:1: Warnung: Format »%f« erwartet Argumenttyp »float *«, aber Argument 2 hat Typ »double *« [-Wformat]
test.c:20:1: Warnung: Format »%f« erwartet Argumenttyp »float *«, aber Argument 2 hat Typ »double *« [-Wformat]
Er versteht also 1f nicht für "long floats", sondern für "float". Die Warnung ist der Hinweis, dass hier beim Einlesen etwas hakt.

Ändern wir den Quelltext entsprechend bei scanf, läuft das Programm so ab:

Code: Alles auswählen

C:\Users\xin\test\Sue>a.exe
Erster Artikel, Anzahl:5
Erster Artikel, Preis in Euro:2
Zweiter Artikel, Anzahl:2
Zweiter Artikel, Preis in Euro:2.50
Summe ohne Rabatt:15.00 Euro
Summe mit Rabatt:12.00 Euro
Wie gesagt:
Xin hat geschrieben:
Fr Mär 29, 2019 1:53 pm
Vermutlich hast Du es nicht 1:1 abgetippt. Vielleicht ist eine 1 in Wirklichkeit ein i.
Da ich das Programm noch kannte, dachte ich an ein for( int i = 1; ... ). Das kleine l wird da auch gerne optisch verwechselt. (i1l!|, je nach Zeichensatz sind das optisch schnell nur Striche in der Landschaft.)
Woher weiß ich sowas? Erstens habe ich es selbst schon verwechselt, zum anderen habe ich mal C und C++ Kurse gegeben. Du bist nicht die erste. ;)

SueNa hat geschrieben:
Fr Mär 29, 2019 5:40 pm
ich hoffe mein Schreibstiel ist jetzt besser zu "ertragen" :-) Danke für die Hilfe
Viel besser, danke :-)

Re: Probleme/ Buch Einstieg in C

Verfasst: Mo Apr 01, 2019 10:01 am
von Xin
nufan hat geschrieben:
Sa Mär 30, 2019 10:37 am
Genau das ist das Problem. Es sollte "%lf" (kleines L) sein und nicht "%1f" (eine Eins).
"%lf" steht für die Eingabe von Double, während "%1f" nur ein Zeichen für die Eingabe einer Float-Zahl zulässt.
Merke... nach dem Wochenende erst darauf achten, ob es eine Seite zwei gibt... Narf... :D

Re: Probleme/ Buch Einstieg in C

Verfasst: Mi Apr 03, 2019 2:08 pm
von SueNa
Vielen Dank für die Hilfe und Mühe :-)