Dezimalzahl in Bruch umwandeln C?

4 Antworten

Ist doch ganz einfach: Du liest die Zahl (im Beispiel 0,64) ein und "merkst" dir den Bruch, also 64/100 im Beispiel. Dann findest du den größten gemeinsamen Teiler der Zahl (mit dem euklidischen Algorithmus) und 100 und teilst Zähler und Nenner durch den GGT. Dann hast du den gekürzten Bruch. (im Beispiel 16/25, weil ggt(64,100) ist 4). Was du vielleicht noch machen musst, ist eine Ausnahme machen, wenn der ggt(x, 100) gleich 100 ist. Dann einfach nur den gekürzten Zähler ausgeben, anstatt künstlich (y/1); ich weiß ja nicht, wie du das genau umsetzen musst.

Woher ich das weiß:Studium / Ausbildung – Studium der Informatik

Der größte gemeinsame Teiler kann nur 1, 2, 4, 5, 10, 20, 25, 50 oder 100 sein. Das vereinfacht das kürzen erheblich. Geht dann ohne euklidischen Algorithmus oder Primfaktorzerlegung.

Waa ist den x/100 als Dezimalzahl? Bzw. was ist denn zB 0.05 als Bruch mit Nenner 100?

Woher ich das weiß:Studium / Ausbildung – Informatikstudium

Wie weit bist du? Wo kommst du nicht weiter? Was hast du dir überlegt?

Ich werde dir sicher kein komplettes Programm schreiben, aber ich helfe dir gerne, wenn du genau erklärst, wie dein bisheriger Ansatz aussieht und wo deine Probleme sind.

officialcuser 
Fragesteller
 04.03.2019, 19:34
#include <stdio.h>
#include <stdlib.h>
long ggT(long zaehler,long nenner);
void berechneBruch(long ggT, long *zaehler,long *nenner);
int main()
{
    long zaehler=0,nenner=100;
    long ggTei=0;
    double number=0.0;
    scanf("%lf",&number);
    printf("%lf\n",number);
    number=number*100;
    zaehler=number;
    printf("%lf\n",number);
    printf("%ld\n",nenner);
    ggTei=ggT(zaehler,nenner);
    berechneBruch(ggT,&zaehler,&nenner);
     printf("%ld\n_\n %ld",zaehler,nenner);

    return EXIT_SUCCESS;
}
/*
Name: ggT
Parameter: z1,z2
Description: ggT vom Bruch berechnen
*/
long ggT(long zaehler,long nenner){

int anz=0;
    while(nenner>zaehler){
        anz=anz+1;
    }
    return anz;


}
/*
Name: berechneBruch
Parameter: number zaehler nenner
Description: dezimalzahl in gekürzten Bruch umwandeln
return value:
        EXIT_SUCCESS    wenn alles stimmt
        EXIT_FALLTURE   bei nummer größer 1
*/
void berechneBruch(long ggT, long *zaehler,long *nenner){

double number=0;
    *zaehler=*zaehler/number;
    *nenner=*nenner/number;
    return EXIT_SUCCESS;


}

Das wäre mein Code bisher aber weiter habe ich keine Ahnung

0
officialcuser 
Fragesteller
 04.03.2019, 20:06
@officialcuser

wenn ich zum Beispiel 0.22 eingebe gibt es folgendes aus:

0.22

0.220000

22.000000

100

0
Schachpapa  05.03.2019, 13:26
@officialcuser

Die Funktion, die du ggT nennst, macht entweder gar nichts (wenn nenner <= zaehler) oder geht in eine Endlosschleife. Jedenfalls berechnet sie kein ggT. Da der ungekürzte Nenner immer 100 ist, kannst du den ggT auch von 100 bis 1 runterzählen und teilen sobald es passt (zaehler % ggT == 0)

BerechneBruch teilt durch number, was du vorher mit 0 initialisierst. Den übergebenen Parameter ggT benutzt du nicht.

Im Aufruf von berechneBruch übergibst du ggT, das ist aber der Name der Funktion, vermutlich meinst du die Variable ggTei?

Mich wundert, dass da überhaupt irgendwas passiert. Ist das C? Ist bei mir mindestens 20 Jahre her. Das macht keine Typprüfung, oder?

0