Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Funktion, die feststellt, ob eine Zahl eine perfekte Zahl ist gibt nichts aus
bababune
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.207
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

[Tipp] Anfängerhinweis == true / == false
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
private Nachricht | Beiträge des Benutzers
bababune
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

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 :)
private Nachricht | Beiträge des Benutzers
teebeast
myCSharp.de - Member



Dabei seit:
Beiträge: 44
Herkunft: Bayern

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.105

beantworten | zitieren | melden

Zitat von bababune
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.
Zitat von bababune
Fehler hab ich jetzt keinen mehr drin.
Compilerfehler nicht. Logische Fehler schon noch :-)
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
bababune
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

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 ;)
private Nachricht | Beiträge des Benutzers
bababune
myCSharp.de - Member



Dabei seit:
Beiträge: 10

Themenstarter:

beantworten | zitieren | melden

@ 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
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.105

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am .
private Nachricht | Beiträge des Benutzers