Fehler in Programmcode? Was mache ich als Anfänger falsch?
Moin, ich habe vorhin die Anregung bekommen zur Übung einen Taschenrechner zu Programmieren. Ich habe das mal versucht in etwas abstrakterer Weise darzustellen.
Nun arbeitet das Programm aber nur bis dahin wo ich die erste zu addierene Zahl eingebe, nach der Eingabe wird nichts mehr ausgegeben.
Was mache ich Falsch und vor allem weiß ich nicht mehr wie ich eine undefinierte variable aufstelle, deshalb sehen die Deklarierungen so schrecklich aus...
4 Antworten
![](https://images.gutefrage.net/media/user/regex9/1455660989427_nmmslarge__0_13_270_270_615d5a3bc6888f4c1486ce2b4d9d8f60.png?v=1455660989000)
1) Wie hier bereits geschrieben wurde, du liest die Zahlen falsch ein. Die scanf-Funktion erwartet in deinem Fall eine Referenz der Variable, in welche der Wert aus der Konsole geschrieben werden kann.
int zahl1;
scanf("%d", &zahl1);
2) Arbeite hinsichtlich deines Codes mal mit mehr Leerzeichen, hier z.B. bei der Auflistung der Argumente:
scanf("%d", &auswahl1);
Schmeiße außerdem unnötige Zeilen raus, wie den leeren Kommentar über der Funktion. Alles was du nicht brauchst, kommt raus. So bleibt die Anwendung übersichtlich.
Ein weiteres Beispiel sind die Klammern hier:
return (EXIT_SUCCESS);
Sie sind nicht notwendig und verlängern nur den Text, der zu lesen ist.
3) Einiges an Code könntest du dir übrigens sparen, wenn du die Ausgabe auf der Konsole nur etwas abänderst.
// ...
printf("Geben Sie die erste Zahl ein:\n");
int zahl1;
scanf("%d", &zahl1);
printf("Geben Sie die zweite Zahl ein:");
int zahl2;
scanf("%d", &zahl2);
int ergebnis;
if (auswahl1 == 1) {
ergebnis = zahl1 + zahl2;
}
else {
ergebnis = zahl1 - zahl2;
}
// etc. ...
Einfluss auf die Programmnavigation sollte es ja nicht nehmen, da der Nutzer bereits zu Beginn wählt, ob er gerade addieren oder subtrahieren möchte.
4) Es gibt Unterschiede zwischen den Begriffen Initialisierung, Deklaration und Definition. In Kurzform:
int a; // declaration
a = 1; // definition
int b = 1; // initialisation (= declaration + definition)
Bei dir musst du die jeweiligen Variablen nur deklarieren, definiert werden sie später durch scanf oder bei ergebnis im if-else. Sofern jeder Programmzweig die Variablen irgendwann einmal definiert, bevor sie benutzt werden, ist alles in Ordnung.
Auch wenn man in C oft noch Code vorfindet, bei dem die Variablen zu Methodenbeginn deklariert werden, würde ich dir des Weiteren raten, dies erst dann zu tun, wenn die Variable wirklich benötigt wird. So bleibt die Variable in ihrem inhaltlichen Kontext näher, in dem man sie nutzt und oft kann man sich Code-Zeilen dabei sparen, bspw. wenn Deklaration und Definition getrennt sind, obwohl es gar nicht notwendig ist. Ein Beispiel:
int a;
// some other code ...
a = 1;
Kürzer:
// some other code ...
int a = 1;
![](https://images.gutefrage.net/media/user/ThomasM22/1517575570375_nmmslarge__3_2_280_280_68de3b22861c700f9c566462e70ce8a7.jpg?v=1517575570000)
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Mal generelle Sachen:
Du benötigst nur Zahl 1 und Zahl 2, 3 und 4 kannst du dir schenken. Stattdessen nimmst du auch 1 und 2 im else-Teil
Versuche, englische Bezeichnungen für die Variablen zu nutzen
Es sollte reichen, wenn du ergebnis später deklarierst:
int result = zahl1 +/- zahl2;
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Oder so:
printf("Erste Zahl eingeben");
scan...;
printf 2. Zahl;
scan;
if(auswahl == 1) printf ("Das Ergbnis ist..." ,zahl1 + zahl2)
else printf ("Das Ergbnis ist..." ,zahl1 - zahl2)
Du machst ja eigentlich das selbe. Es reicht, wenn du bei Rechnung unterscheidest
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Der Pointeroperator fehlt...
Es muss &zahl1 sein!
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Kannst du den Code evtl. nochmal als Text reinstellen?
![](https://images.gutefrage.net/media/user/ThomasM22/1517575570375_nmmslarge__3_2_280_280_68de3b22861c700f9c566462e70ce8a7.jpg?v=1517575570000)
#include <stdio.h>
#include <stdlib.h>
/*
*
*/
int main(int argc, char** argv) {
int auswahl1 = 0;
int zahl1 = 0;
int zahl2 = 0;
int zahl3 = 0;
int zahl4 = 0;
int ergebnis = 0;
printf("Was möchten Sie tun?\n\n");
printf("1. Addieren\n2.Subtrahieren\n");
scanf("%d", &auswahl1);
if (auswahl1 == 1){
printf("Geben Sie die erste Zahl ein welche addiert werden soll:\n");
scanf("%d",zahl1);
printf("\n\nWert von zahl1 ist: %d",zahl1);
printf("Geben Sie die zweite Zahl ein:");
scanf("%d",zahl2);
ergebnis = zahl1 + zahl2;
} else {
printf("Geben Sie die erste Zahl ein welche subtrahiert werden soll:\n");
scanf("%d",zahl3);
printf("Geben Sie die zweite Zahl ein:");
scanf("%d",zahl4);
ergebnis = zahl3 - zahl4;
}
printf("Das Ergebnis ist = %d",ergebnis);
return (EXIT_SUCCESS);
}
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Evtl. solltest du die Zahl auch mit einem Pointer einlesen...
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Schau mal hier
Dort wird erklärt, das du zum einen den Pointeroperator brauchst und zum anderen den Eingabestream leeren musst...
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Aber das reicht noch nicht... Ich prüfe noch...Kenne mich mit C wenig aus...
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Ok..Es ist tatsächlich der fehlende Pointeroperator...Hatte vergessen meine Textkopie zu compilen, weshalb die änderung keinen unterschied gemacht hatte. Jetzt hab ioch es abre ausprobiert un es funktioniert...
Aber woher ist dann klar ob plus oder minus, weil bei der if-else Bedingung würde das dann ja nicht festgemacht werden