anfänger frage funktionen...



  • 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


  • Mod

    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


  • Mod

    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


  • Mod

    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.



  • so

    woltle etz mal die zeit messen wie lang die berechnung braucht:

    #include <iostream.h>
    #include <conio.h>
    #include <time.h>
    
    bool prim (int l)
    {
    	int j;
    	for (j = 2; j < l; j++)
    	{
    		if (l % j == 0)
    		{
    			return false;
    		}
    	}
    	return true;  
    }
    
    int main ()
    {
    	int z;
    	time_t Zeitstempel;
        tm *nun;
        Zeitstempel = time(0);
    	int i;
    	int j;
    	for (i = 1; i <= 5; i++)
    	{
    		if (prim(i))
    		{
    			cout << i << " ist eine Primzahl" << endl;
    		}
    	}
    	time_t Zeitstempel2;
        tm *nun1;
        Zeitstempel2 = time(0);
    	z = Zeitstempel2 - Zeitstempel;
    	cout << "Programmlaufzeit: " << z << " Sekunden";
    	getch();
    	return 0;
    }
    

    Zeitstempel hat einen wert aber Zeitstempel2 ist leer WARUM?! versteh das mal wieder nicht

    und noch etwas was ich mir nicht erklären kann:

    int main ()
    {
    	int z;
    	int y;
    	int x;
    	int i;
    	int j;
    	time_t Zeitstempel;
        tm *nun;
        Zeitstempel = time(0);
    	x = Zeitstempel;
    
    	cout << x;
    
    	for (i = 1; i <= 5; i++)
    	{
    		if (prim(i))
    		{
    			cout << i << " ist eine Primzahl" << endl;
    		}
    	}
    
    	cout << x;
    
    	time_t Zeitstempel2;
        tm *nun1;
        Zeitstempel2 = time(0);
    	cout << Zeitstempel2;
    
    	z = Zeitstempel2 - Zeitstempel;
    ....
    

    wenn ichd as nun so schreib wird das erste x ausgegeben das zweite x wird aber nicht mehr angezeigt ich versteh etz echt nur noch bahnhof warum das so ist?!?

    mfg

    chrisi01



  • #include <time.h>
    
    clock_t timestart = clock();
    
    /* rechnen */
    
    clock_t timestop = clock();
    
    clock_t clocks = timestop-timestart;
    

    Mit der Konstanten CLOCKS_PER_SEC kannst du in Sekunden umrechnen.

    ------------

    chrisi01 schrieb:

    bool prim (int l)
    {
    	int j;
    	for (j = 2; j < l; j++)
    	{
    		if (l % j == 0)
    		{
    			return false;
    		}
    	}
    	return true;  
    }
    

    Warum musst du den Parameter unbedingt l nennen? Das macht es unübersichtlicher.

    Und warum schreibst du nicht "for (int j = 2; j < l; j++)" ? Finde ich auch schöner


Anmelden zum Antworten