Hallo liebe Community,
ich bin noch recht unerfahren was das Programmieren angeht und hab
deswegen mal angefangen, einen kleinen Taschenrechner zu programmieren.
Nun bin ich soweit das ich bei der Addition bin... und irgendwie bekomme
ich diese Fehlermeldung... Der Code sollte eigentlich vollständig
sein... hab diesen Taschenrechner davor ohne if / else getestet also als
laufendes Programm und da ging das ganze... Jetzt bei if / else ist das
irgendwie komisch...Und ja man könnte das Programm viel kürzer gestalten
aber ich möchte es mal so probiert haben... da ich noch recht neu
bin....
1
#include"pch.h"
2
#include<conio.h>
3
#include<stdio.h>
4
#include<iostream>
5
#include<math.h>
6
usingnamespacestd;
7
8
intAddition(int,int);
9
10
intmain(void)
11
{
12
intEingabe;
13
intaddition;
14
intadd1;
15
intadd2;
16
intaddsum;
17
18
19
20
printf("Welche Rechenart benutzt du?\n");
21
printf("\n");
22
printf("[1] Addition\n");
23
printf("[2] Subtraktion\n");
24
printf("[3] Multiplikation\n");
25
printf("[4] Division\n");
26
printf("\n");
27
printf("Tippe die passende Zahl in das Fenster");
28
printf("\n");
29
printf("Eingabefenster:");
30
scanf_s("%d",&Eingabe);
31
32
if(Eingabe==1)
33
{
34
system("cls");
35
36
printf("Addition\n");
37
printf("\n");
38
printf("Bitte geben Sie zwei ganze Zahlen ein!\n");
39
printf("Zahl 1: ");
40
scanf_s("%d",&add1);
41
printf("Zahl 2: ");
42
scanf_s("%d",&add2);
43
addition=addsum(add1,add2);// Problem tritt hier auf
Problem:
- Der Ausdruck vor den Klammern des sichtbaren Aufrufs muss einen
Funktionstyp (pointer-to-) aufweisen.
- Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt
Zeile 46 (hab es im Code eigentlich auch markiert extra...
Ah. Jetzt sehe ich es. :-)
1. Du hast "addsum" erst als Variable definiert und verwendest es dann
als Funktionsnamen.
2. Du willst vermutlich die Funktion "Addition" verwenden.
3. Du hast die Funktion "Addition" deklariert, aber eine Funktion
"addition" definiert. Groß-/Kleinschreibung ist relevant.
Dein Code benutzt einige Windows-spezifischer Dinge. Es ist besser,
direkt zu lernen Standard-C++ zu schreiben, welches dann überall
funktioniert. Außerdem sollte man die alten C-Arbeitsweisen direkt
weglassen und es so lernen, wie es in C++ geht:
Dominik S. schrieb:> #include <conio.h>
Ist Windows-Only. Weglassen.
Dominik S. schrieb:> #include <stdio.h>
Das heißt in C++ #include <cstdio>.
Dominik S. schrieb:> #include <math.h>
Heißt <cmath>. Aber für Grundrechenarten nicht nötig.
Dominik S. schrieb:> using namespace std;
Ist grundsätzlich zu vermeiden:
https://stackoverflow.com/a/1452738Dominik S. schrieb:> int Addition(int, int);
Ist hier groß geschrieben, unten aber klein.
Dominik S. schrieb:> printf("Welche Rechenart benutzt du?\n");
Nimm doch direkt die C++-Streams:
1
std::cout<<"Welche Rechenart benutzt du?\n";
Dominik S. schrieb:> scanf_s("%d", &Eingabe);
Gleiches gilt für die Eingabe; scanf_s ist auch noch Windows-spezifisch:
1
std::cin>>Eingabe;
Dominik S. schrieb:> system("cls");
Ist Windows-Only. Am Besten ganz weglassen.
Dominik S. schrieb:> addition = addsum(add1, add2); // Problem tritt hier> auf
addition ist eine Funktion, und addsum eine Variable. Die sind wohl
vertauscht.
Dominik S. schrieb:> _getch();
Ist Windows-Only. getc() o.ä. nutzen.
Dominik S. schrieb:> int addsum;> addsum = add1 + add2;> return addsum;
Geht kürzer
1
returnadd1+add2;
Das ganze hat überhaupt nichts mit Pointern zu tun...
Ich habe nun addsum = Addition(add1, add2);
umgeändert...
Nun kommt "Verweis auf nicht aufgelöstes externes Symbol ""int_cdecl
Addition(int,int)" (Addition@@YAHHH@Z)" in Funktion "_amin".
Und
1 nicht aufgelöste Externe...
er verweist mich nun in Zeile 1
Dominik S. schrieb:> Ich habe nun addsum = Addition(add1, add2);> umgeändert...> Nun kommt "Verweis auf nicht aufgelöstes externes Symbol ""int_cdecl> Addition(int,int)" (Addition@@YAHHH@Z)" in Funktion "_amin".> Und> 1 nicht aufgelöste Externe...> er verweist mich nun in Zeile 1
Lies noch einmal die Antworten.
So lernt ihr in der Schule? Dann schau dir am Besten parallel ein gutes
Buch an, damit du siehst wie es richtig geht. Viele Bücher sind leider
auch nicht gut, daher hier eine Liste:
https://stackoverflow.com/a/388282
Dein Programm war reines C.
C und C++ sind zwei verschiedene Programmiersprachen.
In C++ programmiert man anders. Zudem hat sich die Sprache in den
letzten 25 Jahren stark weiter entwickelt.
C++ hat zwar größtenteil C als Untermenge, trotzdem lernst du so C++
falsch.
Du solltest die Aussagen deiner Quelle überprüfen.
Naja der Lehrer fängt selbst erst wieder an zu programmieren in C++....
Also er lernt es so gesagt auch mit uns :D
Deswegen bin ich über jeden Tipp verdammt dankbar... weil das mit das
man erst so spät wie möglich definiert hätte ich so nicht gewusst :D
Dominik S. schrieb:> Naja der Lehrer fängt selbst erst wieder an zu programmieren in C++....> Also er lernt es so gesagt auch mit uns :D> Deswegen bin ich über jeden Tipp verdammt dankbar... weil das mit das> man erst so spät wie möglich definiert hätte ich so nicht gewusst :D
Das ist eine Stil-Frage. Denn es funktioniert auch, wenn man Variablen
"so früh wie möglich" definiert. Das solltest Du wissen. Den Grund für
beide Stile kannst Du später mal erlernen.
Dominik S. schrieb:> Deswegen bin ich über jeden Tipp verdammt dankbar... weil das mit das> man erst so spät wie möglich definiert hätte ich so nicht gewusst :D
Das ist in C++ aber schon immer so! In C "erst" seit 1999 (C99); nur das
alte C90 verlangt alle Variablen am Anfang der Funktion. Auch wenn man
Variablen am Anfang der Funktion definieren kann, ist es keine gute
Idee. Am Besten definiert man sie erst dann wenn man einen sinnvollen
Wert für sie hat und weist diesen direkt zu. So kann man die Variable
nie versehentlich vor der ersten Wertzuweisung lesen und man sieht auch
sofort wo der Wert herkommt. Die Variable "addsum" wird nur in 2 Zeilen
gebraucht; definiert man sie aber am Anfang der Funktion, kann man sie
auch versehentlich ganz woanders nutzen.
Dominik S. schrieb:> Ist das was der Erlkoenig geschrieben hat den C++? oder auch "nur" C?
Das ist "richtiges" C++.
Dominik S. schrieb:> Ist das was der Erlkoenig geschrieben hat den C++? oder auch "nur" C?
Ja. Das ist C++. Das hat er auch ausdrücklich hingeschrieben. :-)
Niklas G. schrieb:> Dominik S. schrieb:>> Ist das was der Erlkoenig geschrieben hat den C++? oder auch "nur" C?>> Das ist "richtiges" C++.
Man kann das auch als "C mit cout" bezeichnen.
Aber die Aufgabe gibt für C++ nicht mehr her.
Das findest du ziemlich schnell bei Strings raus.
Niklas G. schrieb:> #include <cstdio>> #include <iostream>>> int Addition (int, int);>> int main (void) {> std::cout << "Welche Rechenart benutzt du?\n"> "\n"> "[1] Addition\n"> "[2] Subtraktion\n"> "[3] Multiplikation\n"> "[4] Division\n"> "\n"> "Tippe die passende Zahl in das Fenster"> "\n"> "Eingabefenster:";> std::cout.flush ();
Den Flush kann man aber auch gleich mit machen:
[C]
std::cout << "Welche Rechenart benutzt du?\n"
"\n"
"[1] Addition\n"
"[2] Subtraktion\n"
"[3] Multiplikation\n"
"[4] Division\n"
"\n"
"Tippe die passende Zahl in das Fenster"
"\n"
"Eingabefenster:" << std::flush;
> int Eingabe;> std::cin >> Eingabe;>> if (Eingabe == 1) {
Hier würde ich eher switch/case verwenden. Und natürlich vorher auf
falsche Eingaben prüfen.
Dominik S. schrieb:> Naja der Lehrer fängt selbst erst wieder an zu programmieren in C++....
Nach 25 Jahre Pause? Hat er überhaupt schon mal in C++ programmiert?
Wie schon erwähnt wurde: C und C++ unterscheiden sich doch recht stark
und C++ hat sich in den letzten Jahren (15-20 ;-)) doch recht weit vom
alten C entfernt.
Was soll er euch denn beibringen: Programmieren (oder sogar
Softwareentwicklung) oder nur C++?
Dominik S. schrieb:> Also naja er hat schon in anderen Sprachen programmiert... aber C++ noch> nicht...
Ob es dann eine gute Idee ist das beizubringen... C++ ist eine der
komplexesten Sprachen, die braucht schon ein paar Jahre zum Lernen. Zum
Einstieg sind Python oder Java viel angenehmer.
Dominik S. schrieb:> Wie bringe ich eigentlich das Programm dazu, das es bei "else" wieder> von Anfang an lädt?
Alles in eine while- oder do-while-Schleife verpacken.
Alles, was wiederholt werden soll, also hier Alles. Im else setzt du nur
eine variable/flag, das das ganze nochmal laufen soll. Man könnte statt
der Variable auch continue und break clever anordnen. Oder falls wenn
man das Tor die Hölle öffnen will, könnte man statt der Schleife auch
goto nutzen.
Theor schrieb:> Das ist eine Stil-Frage. Denn es funktioniert auch, wenn man Variablen> "so früh wie möglich" definiert. Das solltest Du wissen. Den Grund für> beide Stile kannst Du später mal erlernen.
Unabhängig von spät oder früh (wobei wir bei uns ausschließlich früh
verwenden) ist noch wichtiger: So "eng" wie möglich. Also wenn eine
Variablen nur in einem "Block" (innerhalb {}) verwendet wird, dann nur
dort anlegen. Wir erlauben sogar unkonditionale Blöcke, wenn temporär
einige Variablen gebraucht werden, davor und danach aber nicht.
Zumindest in C. In C++ mit Hang zu 10-Zeilen-Funktionen und moderner
Makroprogrammierung (Templates/const-expr) erübrigt es sich meist.
Wie kann ich meine while Schleife denn auf diesen Code von Erlenkoenig
anwenden? Und wie kann ich es machen, das wenn die Ausgabe von z.B.
Addition erfolgreich ausgegeben worden ist, das es dann wieder zur
Auswahl vom Anfang kommt? Also wo man auswählen kann, welche Rechenart
Nur weil man iostream statt stdio verwendet, programmiert man noch lange
kein C++. C++ ist eine Multi-Paradigmen-Sprache die mindestens mal
objektorientiert ist. Im Prinzip ist das hier einfach klassische
imperative Programmierung bei der man ein bißchen C++ Zeug mitschleppt.
Einen Anfänger in C++ imperativ programmieren zu lassen aber von C
abzuraten entbehrt nicht einer gewissen Komik. Bei dem was ich so
täglich sehe macht es Sinn den Leuten erstmal richtig C beizubringen.
Scot Meyers hat ganze Bücher mit den Fallstricken gefüllt die C++ neu zu
dem hinzufügt, was schon in C komplex ist. Und das war schon deutlich
vor C++17 Standard.
x^2 schrieb:> C++ ist eine Multi-Paradigmen-Sprache
Die muss man aber nicht alle nutzen.
x^2 schrieb:> Im Prinzip ist das hier einfach klassische imperative Programmierung bei> der man ein bißchen C++ Zeug mitschleppt
Man nimmt die Vorteile, die sich bieten. Man kann davon ausgehen, dass
man sich beim Lernen zu größeren Programmen vorarbeitet und dann die
Vorteile relevanter werden.
Für einen Taschenrechner könnte man das Command Pattern (OOP) oder
Boost.Spirit (Metaprogrammierung) anwenden. Das ist aber noch ein paar
Level höher :)
x^2 schrieb:> Bei dem was ich so täglich sehe macht es Sinn den Leuten erstmal richtig> C beizubringen
Dann muss man aber danach alle schlechten C-Angewohnheiten wieder
un-lernen. Besser ist es, es direkt richtig zu lernen. C hat auch so
seine Tücken. In C++ sind viele Tücken gekapselt, da kann man z.B. mit
std::string komfortabel arbeiten.
Für einen einfachen Einstieg sind wie gesagt Python, Java, ruby o.ä.
besser geeignet. Aber C würde ich hier nicht einreihen.