Laden...

Funktion, die feststellt, ob eine Zahl eine perfekte Zahl ist gibt nichts aus

Erstellt von bababune vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.371 Views
B
bababune Themenstarter:in
10 Beiträge seit 2015
vor 8 Jahren
Funktion, die feststellt, ob eine Zahl eine perfekte Zahl ist gibt nichts aus

Hallo Leute,
bin gerade über einer Übungsaufgabe habe diese fertig jedoch find ich meinen Fehler nicht! Es wird kein Fehler angezeigt aber die Console gibt nichts aus! Hab euch auch gleich kommentare hin damit ihr (hoffentlich) den (vorhandenen) Fehler sofort erkennt.
Danke schonmal für die Hilfe/Anregungen 😃

Aufgabenstellung:
a)Schreiben Sie eine Funktion, die feststellt, ob eine Zahl eine perfekte Zahl ist. Eine perfekte Zahl ist eine Zahl, die die Summe aller ihrer Teiler ist (außer sich selbst). Beispiel: 28 = 14 + 7 + 4 + 2+1 ist perfekt
b) Schreiben Sie ein C#-Programm, das alle perfekten Zahlen zwischen 1 und 100 ausgibt. Verwenden Sie dazu die Funktion aus a)

Mein Code:


static bool PerfekteZ(int zahl)
        {
            bool isok=false;
            int summe = 0;
            // alle Teiler zu zahl bestimmen
            // Summe der Teiler berechnen
            for (int i=1; i <= zahl/2; i++)
            {
                if (i % zahl == 0) // Teiler gefunden
                {
                    summe += i; // Summieren

                    if (zahl == summe) // Summe mit Zahl vergleichen
                    {
                        isok = true;
                    }
                    else
                    {
                        isok = false;
                    }
                }
                else
                {
                    isok = false;
                }
            }

            if (isok == true) // Ausgabe
            {
                Console.WriteLine("Perfekte Zahl: {0}", zahl);
            }
            return isok;
        }
        static void Main()
        {
            int n=0;
            do 
            {   PerfekteZ(n);
                n++;
                
            }while (n <= 100);
        }

Mfg Johnny aka Bababune

B
bababune Themenstarter:in
10 Beiträge seit 2015
vor 8 Jahren

Ah danke schonmal ich werd die == fälle gleich mal überprüfen bzw überarbeiten wenn nötig super tip schonmal, danke!
Mfg Johnny

Also den einen == true den ich drin hatte hab ich jetzt durch den tip verbessern können zu != null.

Jedoch gibt mir die Console jetzt alle Zahlen von 1 -100 aus und nicht nur die Perfekten Zahlen!

Fehler hab ich jetzt keinen mehr drin. (Zumindest wird keiner mehr angezeigt)!

Vielen Dank schonmal 😃

T
50 Beiträge seit 2010
vor 8 Jahren

Hi,

also grundsätzlich reicht es aus, in der for-Schleife die Werte aufzusummieren und danach die Summe mit der Zahl zu vergleichen. Somit kannst Du komplett auf die Variable isOk verzichten.

Ferner hätte ich die do-while-Schleife durch eine for-Schleife abgebildet, aber das ist Geschmacksache.

C
2.121 Beiträge seit 2010
vor 8 Jahren

Also den einen == true den ich drin hatte hab ich jetzt durch den tip verbessern können zu != null.

bool mit null vergleichen? Das dürfte nicht compilieren. Und es ist immer wahr, denn ein bool ist nie null. Daher wahrscheinlich die Ausgabe aller Zahlen.

Fehler hab ich jetzt keinen mehr drin.

Compilerfehler nicht. Logische Fehler schon noch 😃

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

halte Dich an das was Coffeebean und verwende den Debugger! Dann findest Du Deinen Fehler in wenigen Minuten...

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

B
bababune Themenstarter:in
10 Beiträge seit 2015
vor 8 Jahren

Hey erstmal vielen Dank für eure tollen Hilfestellungen und Anregungen !

Hab meinen finalen Code mit der "Musterlösung" meiner Professorin verglichen und komplett des selbe (bis auf namen von Variablen) . Also sollts stimmen - stimmt aber net.

Ich komm net drauf was ich noch verändern soll weil aus meiner Sicht is der Code schlüssig 😦

Den Link mit dem Debugger hab ich mir jetz 5 mal durchgelesen versteh aber immer noch nicht wie ich Zeile für Zeile durchgehen kann. Bei mir gibts nur Step over oder step into aber kein step into new instance . (Visual Studio 2012 Ultimate) aber dass hier is wohl Offtopic das lern ich schon noch 😃

falls noch wer draufkommt was ich ändern muss um nur die Zahlen auszugeben die ich Suche wäre Klasse!

Lg Bababune

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

if (i % zahl == 0) // Teiler gefunden

Nein. Siehe Modulo-Operator

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
985 Beiträge seit 2014
vor 8 Jahren

Dafür bieten sich auch Extensions an um sehr schön lesbaren Code zu erhalten:


    public static class Extension
    {
        public static IEnumerable<int> Divisors( this int value )
        {
            for ( int i = 1; i <= value / 2; i++ )
            {
                if ( value % i == 0 )
                    yield return i;
            }
        }

        public static bool IsPerfect( this int value )
        {
            return value.Divisors().Sum() == value;
        }
    }

    class Program
    {

        static void Main( string[] args )
        {
            for ( int i = 1; i < 1000; i++ )
            {
                if ( i.IsPerfect() )
                    Console.WriteLine( "{0}", i );
            }

            Console.ReadLine();
        }
    }

Da braucht man niemandem mehr zu erklären, was "IsPerfect" bedeutet, das steht da quasi in Prosa 😉

B
bababune Themenstarter:in
10 Beiträge seit 2015
vor 8 Jahren

@ MarsStein - erstmal danke für die Hilfe mit dem Modulo

aber ehrlich gesagt steh ich grad aufm Schlauch inwiefern dass mir helfen soll.

sind doch alle verwendeten vom Typ "int" also integer wodurch...:
"Der Wert des Ergebnisses liegt zwischen 0 und dem absoluten Wert von number2.

Die Argumente des Operators Modulo können Gleitkommazahlen sein, sodass 5.6 % 0.5 den Wert 0.1 zurückgibt. "

...nicht zutreffen kann. Oder wie meintest du des ?

Vielen Dank schonmal
Bababune aka Johnny

D
985 Beiträge seit 2014
vor 8 Jahren

Es kommt beim Modulo drauf an, welcher Wert wo steht und bei dir ist es einfach falsch (bei dem was du erreichen willst).

Darum sollst du dir auch die Doku zum Modulo einmal ansehen, lesen und dann verstehen

C
2.121 Beiträge seit 2010
vor 8 Jahren

Du musst die Argumente vom % umdrehen, ganz einfach.

Sir Rufos Vorschlag ist zwar in gewisser Weise elegant, über die Lesbarkeit und Verstehbarkeit lässt sich aber schon diskutieren. Für einen Anfänger würde ich mit Grundlagen anfangen und nicht gleich mit High End Syntax. So versteht ein Anfänger doch erst recht nichts mehr.