alle Zahlen außer natürliche Zahlen filtern



  • Hier ist die Aufgabenstellung:

    Schreiben Sie ein Programm zur Ermittlung einer Zahlenfolge, die sich aus folgender Bedingung ergibt:
    Ausgehend von einer beliebigen positiven Zahl sind die nachfolgenden Zahlen der Folge nach folgender Definition zu bilden: Für gilt :

    Z.B. ergibt sich für die Ausgangszahl =11 hiermit die Folge:

    11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

    Zur Programmlaufzeit ist die Ausgangszahl vom Benutzer einzugeben . Ist diese Zahl nicht ganzzahlig , negativ oder größer als 200 ist sie zurückzuweisen und eine Neueingabe ist zu ermöglichen Wird für die Zahl 0 eingegeben, so ist das Programm zu beenden

    Wurde eine ganze positive Zahl für eingegeben, so sind entsprechend der obigen Definition die Zahlen der Folge zu ermitteln und zwar solange, bis eine Zahl . kleiner oder gleich 1 wird.
    Die Zahlen der Folge sind auf dem Bildschirm auszugeben und zwar so, dass je 10 Zahlen in einer Zeile stehen. Außerdem ist die Anzahl der Folgeglieder und die Summe über alle Glieder der Folge zu ermitteln und auf dem Bildschirm auszugeben

    Probleme bereitet mir wie ich es schaffe das nur die natürlichen Zahlen zugelassen werden und beim Rest immer eine wiederholte Eingabe zugelassen wird.

    Das habe ich schon mal produziert, als Anfang, aber beim obigen bleibe ich einfach hängen und weis nicht weiter..

    #include <iostream.h>
    #include <stdio.h>
    void main ()
    {
    int z, Zn;

    cout<<"gebe eine Zahl ein";
    cin>>z;
    if((z>0)&&(z<200))
    {
    while(z>0)
    {
    if(z%2==0)
    {
    Zn=z/2;
    }
    else
    {
    Zn=(3*z)+1;
    }
    cout<<Zn;
    }
    }
    else cout<<"Fehler";
    }

    Gruss

    P. S.: Ich habe mich registriert, aber das dauert ein wenig bis es aktiviert ist...



  • Keiner mir keiner einen Hinweis oder eine Antwort geben, der Code bleibt natürlich nicht so stehen und ich habe ihn schon mittlerweilse weiterentwickelt. Aber ich bekomme das mit den natürlichen Zahlen einfach nicht hin... 😞

    Vielleicht bin ich auch zu blöde dafür... 😞

    Gruss



  • #include <iostream> 
    
    using namespace std;
    
    int main()
    {
    	int z;
    
    	cout << "gebe eine Zahl ein: zwischen 1 und 200"<<endl;
    
        while (true){
            while (! (cin >> z))
            {  
                cin.clear();
                cin.ignore(cin.rdbuf()->in_avail());
            }
    
            if( z<1 || z >200)
                continue;
            else
                break;
        }
    
    	cout << z;
    	do
    	{
    		if(z % 2 != 0)
    		{
    			z = z * 3 +1;
    			cout << ", " << z;
    		}
    		z = z/2;
    		cout << ", " << z;
    	}
    	while (z > 1);
    
    	cout << "\n\nterminiert.\n\n";
    
    }
    

    erster ansatz.. aber eine hölle bastelei.. uff

    jetzt fehlt noch der schwung mit den 10 zahlen in einer reihe..

    na ja, ich kenne die aufgabe *grins*



  • Danke, Danke,

    das hätte ich jetzt nicht erwartet.

    Also mein Ansatz wäre folgender gewesen:

    #include <iostream.h>
    #include <stdio.h>
    void main ()
    {
    int z, Zn[10];
    
    cout<<"gebe eine Zahl ein"; 
    cin>>z;
    	if((z>0)&&(z<200))
    	{
    	while(z>1)
    	{
    		if(z%2==0)	
    		{
    			Zn[10]=z/2;
    		}
    		else
    		{
    			Zn[10]=(3*z)+1;
    		}
    		cout.width(5);
    		cout<<Zn[10];
    	}
    	}
    	else cout<<endl<<"Ende"; 
    }
    

    Was hälst du davon?



  • Ich weis das mein Code schlecht ist, aber wenn ich schon dabei bin, ne Frage:

    Wie bekomme ich den Array variabel? Also nicht mit der 10 drinnen.

    Und wie greife ich auf den Array um ihn nach 10 aufzusplitten auf eine neue Spalte?

    Gruss



  • Ich finde vor allem deinen mittleren Code sehr interessant.

    while (true){ 
            while (! (cin >> z)) 
            {   
                cin.clear(); 
                cin.ignore(cin.rdbuf()->in_avail()); 
            } 
    
            if( z<1 || z >200) 
                continue; 
            else 
                break; 
        }
    

    Wobei ich den nicht ganz verstehe. Das ist sozusagen die Fehlerabfanschleife, nicht? *ein bisschen ratlos*



  • Dein Programm fängt aber die nicht ganzzahligen Zahlen nicht ab.

    Wie wäre das zu lösen, denn das ist ja meine eigentliche Frage gewesen. Was meinst du?



  • mein code hat noch viele fehler.. achtung..

    aber float zahlen abfangen... intern schneidet der einfach ab bei mir

    3.1415 == 3

    es gibt sicher elegante lösungen. aber zu früh, gerade .



  • double z_in;
       int z; 
    
        cout << "gebe eine natürliche Zahl ein: zwischen 1 und 200"<<endl; 
    
        while (true){ 
            while (! (cin >> z_in)) 
            {   
                cin.clear(); 
                cin.ignore(cin.rdbuf()->in_avail()); 
            } 
            z = (int) z_in;     
            if( z<1 || z >200||z_in - z > 0) 
                continue; 
            else 
                break; 
        }
    


  • if (a<0 || a>200 || a<(int)a || a>(int)a)
    		printf("fehler");
    	else
    		printf("korrekt");
    

    so hätt ich es gemacht.



  • Besten Dank an alle.

    Das sieht wirklich gut aus. 🙂

    MfG


Anmelden zum Antworten