Brüche addieren
-
@ Koeln:
Ich finde, nach dieser detailierten Antwort von Horst2 wäre ein "Danke" mehr als angebracht...@Horst2:
Ich hoffe, du kennst dich mit DCOM aus!
-
Tag zusammen! Mein Quellcode sieht folgendermaßen aus:
#include <stdio.h>
/*Bruchaddition*/void main()
{
int z1,z2,n1,n2, wert_1, wert_2, z_erg, n_erg; /* Deklaration */printf("Bitte geben Sie den Zaehler des 1. Bruchs ein:");
scanf("%i",&z1);printf("Bitte geben Sie den Nenner des 1. Bruchs ein:");
scanf("%i",&n1);while (n1 ==0 )
{
printf ("Im Nenner darf nicht 0 stehen\n");
printf("Bitte geben Sie einen anderen Nenner des 1. Bruchs ein:");
scanf("%i",&n1);
}printf("Bitte geben Sie den Zaehler des 2. Bruchs ein:");
scanf("%i",&z2);printf("Bitte geben Sie den Nenner des 2. Bruchs ein:");
scanf("%i",&n2);while (n2 ==0)
{
printf ("Im Nenner darf nicht 0 stehen\n");
printf("Bitte geben Sie einen anderen Nenner des 2. Bruchs ein:");
scanf("%i",&n2);
}
/* Ergebnis der Addition*/
/* Ein möglicher Hauptnenner ist immer die Multiplikation der beiden Bruchnenner*/z1=z1n2;
z2=z2n1;z_erg = z1+z2;
n_erg = n1*n2;/*Kürzen des Bruches*/
/*Bestimmung des GGT*/
wert_1 = z_erg;
wert_2 = n_erg;/* Für das Kürzen werden nur positive Werte benötigt -> Vorzeichenumkehrung*/
if (wert_1 < 0)
wert_1 = wert_1 *-1;if (wert_2 < 0)
wert_2 = wert_2 *-1;while (wert_1 != wert_2)
if (wert_1 > wert_2)
wert_1 = wert_1 - wert_2;
else
wert_2 = wert_2 - wert_1;/*GGT (wert_2 = wert_1 ist ermittelt*/
z_erg = z_erg/wert_1;
n_erg = n_erg/wert_1;if (n_erg ==1) /*bei einem Bruch mit der 1 im Nenner */
printf ("Ergebnis: = %i\n", z_erg); /*Es wird NUR der Zähler ausgegeben*/
else
{
printf ("Ergebnis Zaehler = %i\n", z_erg);
printf ("Ergebnis Nenner = %i\n", n_erg);
}return;
}
Haben aber den Euklid nicht benutzt, hat jemand vielleicht eine Idee zum Integrieren des Euklids??? Und wie kann bei der Ausgabe nicht nur die zahlen anzeigen lassen sondern auch den Bruchstrich??? Kann man dafür eine Struktur benutzten??
Danke Danke an die Leute (Z.B. Horst2) die mich bisher unterstützt haben
-
Bitte Code-Tags verwenden!
Köln schrieb:
printf("Bitte geben Sie den Nenner des 1. Bruchs ein:"); scanf("%i",&n1); while (n1 ==0 ) { printf ("Im Nenner darf nicht 0 stehen\n"); printf("Bitte geben Sie einen anderen Nenner des 1. Bruchs ein:"); scanf("%i",&n1); }
Das kannst du locker in eine do {} while Schleife packen, genauso mit dem 2. Bruch.
Nun, wenn du den euklidischen Algo benutzt, ist es nicht schlecht dafür eine eigene Funktion zu schreiben. Ich poste einfach mal die, die ich normalerweise benutze:
// greatest common divisor template <class T> inline T gcd(T x1, T x2) { // ensure to return not 0 if (x1 == 0 && x2 == 0) return 1; // euclidean algorithm while (x2 != 0) { T tmp = x2; x2 = x1 % x2; x1 = tmp; } return x1; }
Ist zwar templated, kannst aber das T durch int ersetzen, falls unerwünscht.
Nach deiner Addition rufst du dann die Funktion mit z_erg und n_erg auf. Danach dividierst du dann z_erg und n_erg durch das Ergebnis. That's all.
-
Danke groovemaster2002
habe die do {}while schleife integriert, aber beim Euklid bin ich echt zublöd dafür! Wo setzte ich den ein??? Und ich kann für t= int einsetzten, also so:// greatest common divisor
template <class int>
inline int gcd(int x1, int x2)
{
// ensure to return not 0
if (x1 == 0 && x2 == 0)
return 1;
// euclidean algorithm
while (x2 != 0)
{
int tmp = x2;
x2 = x1 % x2;
x1 = tmp;
}
return x1;
}Gruß Köln
do{
printf("Bitte geben Sie den Nenner des 1. Bruchs ein:");
scanf("%i",&n1);} while (n1 ==0 )
{
printf ("Im Nenner darf nicht 0 stehen\n");
printf("Bitte geben Sie einen anderen Nenner des 1. Bruchs ein:");
scanf("%i",&n1);
}printf("Bitte geben Sie den Zaehler des 2. Bruchs ein:");
scanf("%i",&z2);do{
printf("Bitte geben Sie den Nenner des 2. Bruchs ein:");
scanf("%i",&n2);} while (n2 ==0)
{
-
Hallo ich brauche hilfe!!!
Gruß Marco
-
Bekomme folgende fehlermeldung, hat jemand rat wie man den Fehler lösen kann!!
--------------------Konfiguration: Brücheaddieren - Win32 Debug--------------------
Kompilierung läuft...
Bruch.cpp
Z:\CAE\Bruch\nichtfertig\Bruch.cpp(46) : error C2601: 'ggt_mod' : Lokale Funktionsdefinitionen sind unzulaessig
Fehler beim Ausführen von cl.exe.Bruch.obj - 1 Fehler, 0 Warnung(en)
Gruß Stein
#include <stdio.h>
/*AdditionvonBrüchen*/void main()
{
int z1,z2,n1,n2,u,v, wert_1, wert_2, z_erg, n_erg; /* Deklaration */do{
printf("Geben Sie bitte den Zaehler des 1. Bruchs ein:");
scanf("%i",&z1);printf("Geben Sie bitte den Nenner des 1. Bruchs ein:");
scanf("%i",&n1);
}
while (n1 ==0 )
;{
printf ("Im Nenner darf auf keinen Fall 0 stehen\n");
printf("Geben Sie bitte einen anderen Nenner des 1. Bruchs ein und nicht die Null:");
scanf("%i",&n1);
}do{
printf("Nun geben Sie bitte den Zaehler des 2. Bruchs ein:");
scanf("%i",&z2);printf("Bitte geben Sie als letztes den Nenner des 2. Bruchs ein:");
scanf("%i",&n2);
}while (n2 ==0)
;{
printf ("Im Nenner darf nicht 0 stehen\n");
printf("Bitte geben Sie einen ANDREN Nenner des 2. Bruchs ein:");
scanf("%i",&n2);
}/Der Satz des Euklid// Größter gemeinsamer Teiler (ggt) zweier ganzer Zahlen.
Berechnung mit einem Algorithmus nach Euklid/
z1=z1n2;
z2=z2n1;z_erg = u;
n_erg = v;int ggt_mod(int u, int v){
int hilf;
while(u>0){
hilf=u;
u=v%u;
v=hilf;
}
return v;
}z_erg = u;
n_erg = v;if (n_erg ==1) /*bei einem Bruch mit der 1 im Nenner */
printf ("Ergebnis: = %i\n", z_erg); /*Es wird NUR der Zähler ausgegeben*/
else
{
printf ("Ergebnis Zaehler = %i\n", z_erg);
printf ("Ergebnis Nenner = %i\n", n_erg);
}return;
}
-
tut mir leid, aber was ist das? Benutze bitte, bitte, bitte die code-tags (das sind die buttons unter dem Nachrichtentexteditor); thanx!!
den Fehler findest du selber:- Kontroliere doch mal alle öffnenden und die dazugehörigen schließenden geschweiften Klammern {}
(ist deren Anzahl gleich oder hast du welche vergessen?)
wo endet zB deine main?
2)schau dir mal deine returns an? - wie sieht es mit der Prototypendeklaration deiner Funktionen aus?
...
n) sieht außerdem sehr nach C aus
- Kontroliere doch mal alle öffnenden und die dazugehörigen schließenden geschweiften Klammern {}
-
Danke für deine Antwort
habe die klammern überprüft habe jetzt nur noch den Fehler beim Integrieren des Satz des Euklid!
Das Programm soll Brüche addieren & als Ergebnis muss ein gekürzter Bruch raus kommen
Gruß Köln
n_erg = v;
int ggt_mod(int u, int v){ <====== Hier stimmt was nicht, weiß aber nicht was
int hilf;
while(u>0){
hilf=u;
u=v%u;
v=hilf;
}
return v;}
z_erg = u;
n_erg = v;[cpp]
-
auch wenn das mit den code-tags nicht so ganz geklappt hat, sieht man, daß du es versucht hast...
also:
2nd time: hast du die Prototypen der Funktionen vor der main deklariert??
willst du in C programmieren?
nur auf die Möglichkeit hin, daß du es wirklich nicht weißt:
der Aufbau sollte ungefähr so aussehen:#include....//Präprozessordirektiven int funktion1(int parameter1, int....); //prototypendeklaration: forward declaration int main(){ //oder eben void, aber dann natürlich ohne return //anweisungen.... //Funktionsaufruf: ergebnis = funktion1(zahl1,zahl2...); return 0; }//mit } schließen!!! //Definition der Funktionen int funktion1(int parameter1, int....){ int result; //berechnerechnerechnerechne return result; }//mit } schließen!!!
-
Habe leider es nicht mehr hinbekommen, egal danke für eurer bemühn!
Gruß Köln
[cpp][code] #include <stdio.h>
/*AdditionvonBrüchen*/void main()
{
int z1,z2,n1,n2,u,v, wert_1, wert_2, z_erg, n_erg; /* Deklaration */do{
printf("Geben Sie bitte den Zaehler des 1. Bruchs ein:");
scanf("%i",&z1);printf("Geben Sie bitte den Nenner des 1. Bruchs ein:");
scanf("%i",&n1);
}
while (n1 ==0 )
;{
printf ("Im Nenner darf auf keinen Fall 0 stehen\n");
printf("Geben Sie bitte einen anderen Nenner des 1. Bruchs ein und nicht die Null:");
scanf("%i",&n1);
}do{
printf("Nun geben Sie bitte den Zaehler des 2. Bruchs ein:");
scanf("%i",&z2);printf("Bitte geben Sie als letztes den Nenner des 2. Bruchs ein:");
scanf("%i",&n2);
}while (n2 ==0)
;{
printf ("Im Nenner darf nicht 0 stehen\n");
printf("Bitte geben Sie einen ANDREN Nenner des 2. Bruchs ein:");
scanf("%i",&n2);
}/Der Satz des Euklid// Größter gemeinsamer Teiler (ggt) zweier ganzer Zahlen.
Berechnung mit einem Algorithmus nach Euklid/
z1=z1n2;
z2=z2n1;z_erg = u;
n_erg = v;int ggt_mod(int u, int v){
int hilf;
while(u>0){
hilf=u;
u=v%u;
v=hilf;
}
return v;
}
-
@Köln:
Was, zum Geier, hat denn jetzt nicht geklappt? Wenn ich mir deinen Code so ansehe bemerke ich an den verschiedensten Stellen scheinbar doch große Verständnislücken.
Du sollst das Ding für dein Studium oder die Schule abgeben oder schon längst fertig haben? Dann müssen die Dozenten/Lehrer voraussetzen können, dass die Schüler/Studenten das auch packen können, will sagen, dass also bereits Vorkenntnisse vorhanden sind. Die sehe ich bei deinem Code allerdings nicht.
Hast Du dich da um den Grundlagenkurs gedrückt, oder wie? Das können wir auch nicht ausbügeln, ein Studium erfordert nunmal Eigeninitiative (kenn ich aus eigener Erfahrung).
Und außerdem sind die Code-Tags doch auch nicht so schwer zu verstehen:
Verwendezum Beginn eines Code-Blocks, und
zum Ende eines Code-Blocks.
Manmanman, und mit sowas verschwendet man seine Zeit... OK, ist vielleicht ein wenig hart, aber im Studium sollte man schon selber dafür sorgen können, dass man die nötigen Grundkenntnisse hat.
-
hey kölle nicht aufgeben! das kriegst du schon hin, wenn du dir vorher auch mal genau überlegst wie der Ablauf deiner Programmlogik sein soll (waage sogar den Schritt und erstelle dir mal ein Ablaufdiagramm). Schau dir mal ein paar einfachere Code-Beispiel an und übe mal die Verwendung von Funktionen. Laß dir dazu mal ein paar positivBeispiele geben oder schau mal in die tutorials; Kopf hoch