Primzahl-Untersuchung



  • Hallo Leute,

    kann mir einer bei meinen Hausaufgaben vielleicht helfen?

    Ich muss eine C-Funktion erstellen welche dem Prototypen:

    int prim(1.Parameter , 2.Parameter, 3.Parameter);
    entspricht.

    Parameter 1 soll als Eingabeparameter eine auf die Primzahl-Eigenschaft zu untersuchende Zahl bezeichen(call by value)

    Falls die zu untersuchende Zahl keine Primzahl ist, soll Paramter 2 und Paramter 3 als Ergebnis zwei Faktoren größer als 1 liefern, deren Produkt die zu untersuchende Zahl ist (call by reference)

    Das Funktionsergebnis soll einen Wahrheitswert "wahr", wenn die zu untersuchende Zahl eine Primzahl ist, wenn nicht "falsch", liefern.

    Könnt ihr mir Tipps geben, wie ich genau diese Funktion erstelle ?
    Und wie ich genau vorgehen soll ?
    Wäre echt nett von euch 🙂



  • Könnt ihr mir Tipps geben, wie ich genau diese Funktion erstelle ?

    Leite aus der gegebenen Spezifikation die entsprechende Funktion ab bzw. stelle konkrete Fragen dazu, falls du es nicht alleine hinkriegst. Dann sehen wir weiter.



  • Danke 🙂

    Also bei int prim (1.Paramter, 2.Paramter, 3.Paramter);

    Was genau muss ich denn für die einzelnen Paramter zuweisen?

    Könnte ich einfach

    int primx;
    int primy;
    int primz;

    Zuweisen?

    Ich soll ja sogesehen 3 Fälle untersuchen....



  • Schreib doch erstmal eine Funktion, die nur auf Primzahl testet.
    Und das Programm darum auch.



  • int prim(1.Parameter , 2.Parameter, 3.Parameter);
    

    Das ist schon mal sehr gut ... aber die Parameter haben meist einen Typ und einen Namen, welche durch ihren Wertebereich als auch durch call-by-value oder call-by-reference definiert sind. Also welchen Datentyp soll der 1., 2. und 3. Parameter haben und wie ist er benannt. Natuerlich koennen sie beliebig benannt werden, da fuer den Kompiler Namen nur Schall und Rausch sind. Trotzdem ist eine sinnvolle Benennung angebracht. Beisielsweise:

    int prim(unsigned int number, unsigned int* p_first, unsigned int* p_second)
    

    Beachte das p_one/p_second Zeiger sind um call-by-reference zu entsprechen. weiterhin ist diskutabel, ob der Rueckgabewert ein int oder ein bool sein soll.



  • Hallo zusammen,

    ich sitze an der selben Aufgabe. Wie man bestimmt, ob es sich um eine Primzahl handelt, habe hinbekommen (sollte zumindest klappen), ich hänge jetzt aber am call by reference fest und brauche bitte Hilfe.

    [code="c"]

    // Primzahlen

    #include <stdio.h>

    /* Funktionsdefinition */

    int prim (int zahl, int* fakt_1, int* fakt_2)
    {
    int teiler, zaehler, zahl2; int ergebnis;

    if (zahl == 0 || zahl == 1)
    {
    ergebnis = 0; /* ergebnis wird später in einer switch anweisung aufgenommen und entspricht damit den "wahrheitswerten" */
    return ergebnis;
    }

    else
    {
    teiler = 0;
    for (zaehler = 0; zaehler <= zahl; zaehler++)

    {
    zahl2 = zahl % zaehler;

    if (zahl2 == 0)
    {
    teiler++;
    }
    }
    if (teiler == 0)
    {
    ergebnis = 1;
    return ergebnis;
    }
    else
    {
    fakt_1 = &zahl; //ab hier beginnt mein call by reference

    if (fakt_1 % 2 == 0)
    {
    fakt_1 = fakt1 / 2;
    fakt_2 == 2;
    }

    else (fakt_1 % 3 == 0)
    {
    fakt_1 = fakt_1 / 3;
    fakt_2 == 3; /* soweit habe ich es mir überlegt, ist aber wohl falsch */
    }
    ergebnis = 2;
    return ergebnis;
    }
    }
    }



  • Es fehlte das abschliessende [/code]-Tag:

    RS11 schrieb:

    Hallo zusammen,

    ich sitze an der selben Aufgabe. Wie man bestimmt, ob es sich um eine Primzahl handelt, habe hinbekommen (sollte zumindest klappen), ich hänge jetzt aber am call by reference fest und brauche bitte Hilfe.

    // Primzahlen
    
    #include <stdio.h>
    
    /* Funktionsdefinition */
    
    int prim (int zahl, int* fakt_1, int* fakt_2)
    {
        int teiler, zaehler, zahl2; int ergebnis;
    
    if (zahl == 0 || zahl == 1)
    {
        ergebnis = 0; /* ergebnis wird später in einer switch anweisung aufgenommen und entspricht damit den "wahrheitswerten" */
        return ergebnis;
    }
    
    else
    {
        teiler = 0;
        for (zaehler = 0; zaehler <= zahl; zaehler++)
    
        {
        zahl2 = zahl % zaehler;
    
            if (zahl2 == 0)
            {
            teiler++;
            }
        }
        if (teiler == 0)
        {
        ergebnis = 1;
        return ergebnis;
        }
        else
        {
            fakt_1 = &zahl; //ab hier beginnt mein call by reference
    
            if (fakt_1 % 2 == 0)
            {
                fakt_1 = fakt1 / 2;
                fakt_2 == 2;
            }
    
            else (fakt_1 % 3 == 0)
            {
                fakt_1 = fakt_1 / 3;
                fakt_2 == 3;   /* soweit habe ich es mir überlegt, ist aber wohl falsch */
            }
            ergebnis = 2;
            return ergebnis;
        }
    }
    }
    

    Du musst unbedingt an deinem Einrückungsstil arbeiten.

    Wenn du den ersten Teiler gefunden hast, bist du doch schon fertig. Du musst die Anzahl der Teiler nicht zählen.
    Hast du einen, hast du auch automatisch den zweiten. Und mehr brauchst du nicht.

    Wenn du einen Zeiger hast:
    int *fakt_1 dann ist *fakt_1 (mit 😉 der int und fakt_1 (ohne 😉 der Zeiger.
    Du willst auf den Inhalt an der Adresse, auf die fakt_1 zeigt, zugreifen.
    Dann musst du den int benutzen.

    Das fakt_1 = &zahl; ist schlimmer Mist. Du bekommst einen Zeiger auf eine lokale Variable. So kannst du keinen Wert zurück geben.
    Schau dir nochmal euer Beispiel zu "call by reference" an. Müsste swap sein.

    *fakt_1 = zaehler;
    *fakt_2 = zahl / zaehler;
    

    Und nimm mal bessere Variablennamen. teiler und zaehler sind hier irgendwie anders, als im allgemeinen Sprachgebrauch.


Anmelden zum Antworten