anfänger frage funktionen...
-
hi
wir lernen zur zeit ind er berufsschule c++ nund achte ich arbeite ich daheim mal bissi vor
macht auf jeden fall fun und wollte mal einen kleinen Rechner schreibend er mir alle Primzahlen zwischen 3 und 1000 ausgibt und dachte mir verbind ich das doch mal gleich mit funktionen aber irgendwie will er net wer kann mir helfen?
#include <iostream.h> #include <conio.h> main() { int i; int j; for (i = 3; i <= 1000; i++) { j = prim(i); if (j == 1) { cout << i << " ist eine Primzahl\n"; } } getch(); } int prim(int l) { int teiler; int k; teiler = l/2; for (; teiler <= l; teiler++) { k = l % teiler; if (k == 0) { return 1; } } }beim kompilieren sagt er:
error C2065: 'prim' : nichtdeklarierter Bezeichner
error C2373: 'prim' : Neudefinition; unterschiedliche Modifiziererweiß nur net so rechtw as alter und neuer stil ist bind er meihnung es so in der Schule (leider bisher nur theoretisch) gelernt zu haben wer kann mir helfen?
ob er nun schon richtig primzahlen berechnet oder nicht is mir erstmal egal (und soll mir bitte auch keienr vorsagen da ich es selbst probieren will) mir gehts um den fehler da ich daraus net schlau werd geht wohl irgendwo um die funktion
achja wenn der code grauenhaft sein sollte (aus welchen grund auch immer) ich lerne sehr gern dazu sollte er top sein freu ich mich aber auch gern über das lob
mfg
chrisi01
-
jeder beziechner, den du verwendest, musst zuvor deklariert worden sein (wobei der compiler stur von oben nach unten liest). in main verwendest du prim, obwohl es erst später deklariert und definiert wird. also:
entweder du fügst vorher eine vorwärtsdeklaration ein:int prim(int l);damit weiss der compiler, dass prim eine funktion ist, die ein int als parameter erhält und ein int zurückgibt. üblich ist in so einem falle aber eher, einfach prim vor main zu definieren. da auch programmierer faul sind, versucht man meist, vorwärtsdeklarationen durch geeignete organisation so weit es geht zu vermeiden.
-
Der Compiler kennt die Funktion prim nicht, da du keinen Prototyp über der main geschrieben hast. Das nennt man deklarieren. der fehler verschwindet auch wenn du die funktion über die main schreibst.
-
hi
cool er hats kompiliert
zwar eine Warnung aber kein Fehler is ja schonmal gut habs jetzt so gelöst:#include <iostream.h> #include <conio.h> int prim(int l); void main (void) { int i; int j; for (i = 3; i <= 1000; i++) { j = prim(i); if (j == 1) { cout << i << " ist eine Primzahl\n"; } } getch(); } int prim (int l) { int teiler; int k; teiler = l/2; for (; teiler <= l; teiler++) { k = l % teiler; if (k == 0) { return 1; } } }was wäre nun die 2. Möglichkeit die du angesprochen hast? hab es nicht so richtig verstanden?!
meinst du so?
#include <iostream.h> #include <conio.h> int prim (int l) { int teiler; int k; teiler = l/2; for (; teiler <= l; teiler++) { k = l % teiler; if (k == 0) { return 1; } } } void main (void) { int i; int j; for (i = 3; i <= 1000; i++) { j = prim(i); if (j == 1) { cout << i << " ist eine Primzahl\n"; } } getch(); }habs noch nicht probiert aber werd es jetzt so mal probieren
jetzt muss ich nur noch gucken wieso er zu jeder zahl sagt das es eine primzahl ist

mfg
chrisi01
-
chrisi01_bald_angemeldet schrieb:
jetzt muss ich nur noch gucken wieso er zu jeder zahl sagt das es eine primzahl ist

weil das das einzige ist, was diese funktion zurückliefern kann?

könnte die warnung etwas mit einem evtl. fehlenden return zu tun haben...?
-
ups mist *g* falsch gelesen
-
das ist ein kleines L und keine 1

-
hi
also es war ja einiges falsch
habd as programm etz mal bissi geändert und nach meiner logik müsste es 100pro gehen:#include <iostream.h> #include <conio.h> int prim (int l) { int k; int m; int n; k = 2; for (; k < l; k++) { m = l % k; if (m == 0) { n = 1; } } return n; } void main (void) { int i; int j; for (i = 3; i <= 50; i++) { j = prim(i); if (j != 1) { cout << i << " ist eine Primzahl\n"; } } cout << "Programm beendet"; getch(); }das einzige problem istd as programm zeigt absolut gar nix an auch nicht das Programm beendet was könnte das sein?
mfg
chrisi01
-
camper schrieb:
das ist ein kleines L und keine 1

ja eben
*d'oh*Ich habs jetzt selbst nochmal gemacht:
#include <iostream> using namespace std; bool isPrime(int number) { for (int i = 2; i < number ; i++) { if (number % i == 0) // ist ohne Rest teilbar return false; // Zahl ist keine Primzahl } // konnte nicht ohne Rest geteilt werden return true; // Zahl ist eine Primzahl } int main() { for (int i = 1; i < 100; i++) { if (isPrime(i)) cout << i << " ist eine Primzahl" << endl; } system("PAUSE"); // Taste drücken return 0; }
-
hi
ja mei wieso komm ich nie auf so einfache sachen grml wieso is das bei mir immer so umständlich aber habs auf deine idee mal selbst aufgesetzt und es klappt super
danke für die hilfe...mal gucken mit was ich jetzt weiter mach

mfg
chrisi01
-
chrisi01->wie wärs mal mit
int main
-
und wieso net void main(void) ??
was spricht dagegen? zumindest funzt es auch so...
mfg
chrisi01
-
chrisi01 schrieb:
was spricht dagegen? zumindest funzt es auch so...
Klar, man kann ja auch rückwärts auf der Autobahn fahren!
An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementation-defined. All implementations
shall allow both of the following definitions of main:
int main() { /* ... / }
and
int main(int argc, char argv[]) { /* ... */ }Gruß
-
Soweit ich weiß wegen dem Rückgabewert.
return 0;signalisiert Windows glaube ich, dass alles in Ordnung lief.
Bin mir aber nicht sicher.
-
Hab was gefunden:
Rückgabewert ist der Fehlercode
Auch der Rückgabewert der Funktion main ist von Bedeutung. Gibt sie 0 zurück, wird dies als fehlerfreier Ablauf gewertet. Alle anderen Werte sin Hinweis auf einen Fehler bei der Ausführung. Gerade wenn Fehler entstehen, ist es oft sehr umständlich, wieder zur Funktion main zurückzukehren. Hier hilft die Funktion exit. Sie beendet das Programm und der Übergabeparameter wird als Rückgabewert an den Aufrufer des Programms weitergereicht.
*exit(0);
-
nee
return 0;muss man nicht schreiben, aber das muss man:
int main(){/*....*/}@chrisi01
außerdem benutzt du veraltete header, benutz mal#include <iostream>statt *.h.
welcher compiler lässt das denn noch durchgehen
-
hi
also ich verwende bisher void main (void) werd dann aber doch wenn ihr es sagt auf int main() umsteigen und ein return 0;
iostream.h lässt visual studio 6 durchgehen und auch borland 5 in der beruffschule ließ es durchgehen werd das h aber weglassen
soll ich das dann bei allen header files weglassen oder dreht es sich hier nur um die?!mfg
chrisi01
-
iostream.h und iostream sind zwei unterschiedliche Dateien.
iostream ist neuer.MfG
-
edit: wieder mal zu langsam beim korrigieren...
stimmt, nur die C-header und <strstream> sind standard
-
camper schrieb:
icepacker schrieb:
welcher compiler lässt das denn noch durchgehen

jeder standard-konforme würde ich sagen...

Die alten Header gibts nicht mehr nach dem Standard!
Gruß
-
Nochmal zum Thema Primzahlen.
Du kannst den Code folgendermaßen optimieren:
Nur die Teiler bis sqrt(Zahl) testen und auch nur die 2 und sonst ungerade Teiler.