P.roblem s.olved :)



  • /*
     * Zahlensuche.cpp
     *
     *  Created on: 29.01.2010
     *      Author: c.goupe
     */
    
    #include <iostream>
    
    using namespace std;
    
    void zahl(double* pzahl)
    {
    	cout << " Bitte zu suchende Zahl eingeben: ";
    	fflush(stdout);
    	scanf("%lf", pzahl);
    
            // wie findet ihr diesen Block ? 
    }
    int istEnthalten (double dasArray[10],double z,int o,int u)
    {
    	cout << "istEnthalten gestartet... \n";
    	int mittelpunkt =0;
    
    	if ( u > o)
    	{
    		cout << "\n-> Zahl nicht gefunden!";
    		return -1;
    	}
    
    	mittelpunkt = ( o + u) / 2;
    
    	if (dasArray[mittelpunkt] == z)
    	{
    		cout << "\nGesuchte Zahl ist: \t" << dasArray[mittelpunkt];
    		return mittelpunkt;
    	}
    	if (dasArray[mittelpunkt] > z)
    	{
    		cout << "-> obergrenze wird neu gesetzt...\n";
    		return istEnthalten(dasArray, z, mittelpunkt-1, u);
    	}
    	else
    	{
    		cout << "-> untergrenze wird neu gesetzt...\n";
    		return istEnthalten(dasArray, z, o, mittelpunkt+1);
    	}
    }
    int main()
    {
    
    	double array[10]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10};
    	double rzahl;
    	int obergrenze = 10;
    	int untergrenze = 0;
    	double erg;
    	zahl(& rzahl);
    	erg= istEnthalten(array, rzahl, obergrenze, untergrenze);
    	return 0;
    }
    

    Soweit mein programm.
    ich wenn ich mit #define N=10; am anfang mache, beginnt er zu meckern,
    sonst denke ich kann man doch mit der lösung zufrieden sein oder gibts noch irgendwelche beanstandungen ?

    Danke schon mal



  • #define N 10
    

  • Mod

    c.groupe schrieb:

    void zahl(double* pzahl)
    {
    	cout << " Bitte zu suchende Zahl eingeben: ";
    	fflush(stdout);
    	scanf("%lf", pzahl);
        
            // wie findet ihr diesen Block ? 
    }
    // Schrecklich, warum machst du auf einmal C? So mach man das in C++:
    
    double zahl(){
           cout << " Bitte zu suchende Zahl eingeben: ";
           double v;
           cin >> v;
           return v;
    }
    
    int istEnthalten (double dasArray[10],double z,int o,int u)
    {
    	cout << "istEnthalten gestartet... \n";
    	int mittelpunkt =0;    // Wozu hier mit 0 initialisieren?
    
    	if ( u > o)
    	{
    		cout << "\n-> Zahl nicht gefunden!";
    		return -1;
    	}
    
    	int mittelpunkt = ( o + u) / 2; // Mach das doch gleich hier!
    
    	if (dasArray[mittelpunkt] == z)  // == ist eigentlich keine so gute Idee bei double Werten
    	{
    		cout << "\nGesuchte Zahl ist: \t" << dasArray[mittelpunkt];
    		return mittelpunkt;
    	}
    	if (dasArray[mittelpunkt] > z)
    	{
    		cout << "-> obergrenze wird neu gesetzt...\n";
    		return istEnthalten(dasArray, z, mittelpunkt-1, u);
    	}
    	else
    	{
    		cout << "-> untergrenze wird neu gesetzt...\n";
    		return istEnthalten(dasArray, z, o, mittelpunkt+1);
    	}
    }
    int main()
    {
    
    	double array[10]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10};
    	double rzahl;         // Deklarier die Variablen wo sie gebraucht werden.
    	int obergrenze = 10;
    	int untergrenze = 0;
    	double rzahl = zahl();  // So!
    	double erg= istEnthalten(array, rzahl, obergrenze, untergrenze);
            // Obergrenze, untergrenze und erg werden nirgends benutzt!
    	return 0;
    }
    

    Soweit mein programm.
    ich wenn ich mit #define N=10; am anfang mache, beginnt er zu meckern,

    Dann nimm const int, wie sich das gehört!

    sonst denke ich kann man doch mit der lösung zufrieden sein oder gibts noch irgendwelche beanstandungen ?

    Ich habe dir ein paar Kleinigkeiten kommentiert. Es gibt noch mehr Sachen die man besser machen könnte, aber nichts gravierendes.



  • Ich finde das Interface unflexibel...
    Die Aufgabenstellung sieht auch nicht vor, dass der Algo auf eine Fixe Größe festgelegt wird. Du kannst jetzt den Parameter als Pointer definieren und die Arraygröße als zusätzlichen Parameter übergeben, oder gleich mit Iteratoren arbeiten.

    Ich hab das mal kurz implementiert wie ich mir das dachte:

    #include <iostream>
    using namespace std;
    
    int search( double* start, double* end, double zahl )
    {
        if( start > end ) return -1;
        int mid = (end - start) / 2;
        double current = start[mid];
        if( current == zahl ) return mid;
        if( current > zahl ) return search( start, start+mid-1, zahl );
        else {
            int pos = search( start+mid+1, end, zahl );
            return pos == -1 ? pos : pos+mid+1;
        }
    }
    
    int main()
    {
        double nums[10] = { 1.4, 5.3, 7., 9., 18., 33., 65, 1009, 123213, 454545 };
        cout << 454545 << " is at pos " << search(nums, nums+10, 454545) << endl;
    }
    


  • danke, habs soweit verstanden.


Anmelden zum Antworten