Probleme/ Buch Einstieg in C

Schnelle objektorientierte, kompilierende Programmiersprache.
mfro
Beiträge: 311
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Probleme/ Buch Einstieg in C

Beitrag von mfro » Sa Mär 30, 2019 10:35 am

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.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

nufan
Wiki-Moderator
Beiträge: 2448
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Probleme/ Buch Einstieg in C

Beitrag von nufan » Sa Mär 30, 2019 10:37 am

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.

SueNa
Beiträge: 11
Registriert: Fr Mär 29, 2019 11:28 am

Re: Probleme/ Buch Einstieg in C

Beitrag von SueNa » Sa Mär 30, 2019 10:42 am

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

SueNa
Beiträge: 11
Registriert: Fr Mär 29, 2019 11:28 am

Re: Probleme/ Buch Einstieg in C

Beitrag von SueNa » Sa Mär 30, 2019 10:43 am

ich nehme mir das mit dem richtig Fragen stellen wirklich für meine nächsten Fragen zu Herzen . . . Danke ne ;-)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8500
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Probleme/ Buch Einstieg in C

Beitrag von Xin » Mo Apr 01, 2019 9:57 am

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 :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8500
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Probleme/ Buch Einstieg in C

Beitrag von Xin » Mo Apr 01, 2019 10:01 am

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
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

SueNa
Beiträge: 11
Registriert: Fr Mär 29, 2019 11:28 am

Re: Probleme/ Buch Einstieg in C

Beitrag von SueNa » Mi Apr 03, 2019 2:08 pm

Vielen Dank für die Hilfe und Mühe :-)

Antworten