Sie sind nicht angemeldet.

Santa

Schatzjäger

  • »Santa« ist der Autor dieses Themas

Beiträge: 1 355

Registrierungsdatum: 28. August 2004

  • Nachricht senden

1

Sonntag, 5. Dezember 2004, 18:20

pascal: bruchrechner

wiedermal gehts ums programmieren *g*

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
program bruchrechnen;

uses crt;
var t1t,t2t,n1n,n2n,t3t,n3n,r,s,t,u,erg,xy,yx,a: integer; oper,q: char;
(* -----------------------------------------------------------------------------------------
t1t, t2t, n1n, n2n sind zähler und nenner der Brueche, die eingegeben werden
t3t und n3n sind zähler und nenner der Ausgabe-Brueche
r, s, t und u sind zähler und nenner der brüche zum rechnen damit
erg ist das ergebnis
xy und yz sind zähler und nenner der Ausgabe, die gekuertzt sind
in "a" wird das ergebnis des ggT von Zähler und Nenner des Ausgabe-Bruches gespeichert
oper ist der operator, also die rechenart (plus, minus, ...)
q ist eine hilfsvariable zum abfragen der schleife "neustarten"
------------------------------------------------------------------------------------------- *)

procedure ggT(x,y:integer; var teiler: integer);
var tausch,d: integer;  (* d für Rest, tausch als hilfsvariable zum tauschen der werte *)
begin
    if x<y then
       begin
       tausch := x;
       x := y;
       y := tausch
       end;
    repeat
          d := x mod y;
          x := y;
          y := r;
    until d=0;       (* bis Rest 0 ist *)
    teiler := x;
end;

procedure kgv(a,b:integer; var erg:integer);
begin
     ggT(a,b,erg);
     erg := a*b div erg;
end;

procedure kuerzen;
begin
     ggT(t3t,n3n,a);
     xy := t3t div a;
     yx := n3n div a;
end;

procedure ausgabe;
begin
     kuerzen;
     if yx = 1 then
          writeln('Aus ',t1t,'/',n1n,' ',oper,' ',t2t,'/',n2n,' ist ',xy,' berechnet worden!')
     else writeln('Aus ',t1t,'/',n1n,' ',oper,' ',t2t,'/',n2n,' ist ',xy,'/',yx,' berechnet worden!');
     readln;
end;

procedure plus;
var f,g:integer;
begin
     if n1n<>n2n then
         begin
             kgv(s,u,erg);       (* kgv für kleinsten gemeinsamen Nenner *)
             f := erg div s;     (* erweitern *)
             g := erg div u;     (* ... *)
             r := r*f;           (* ... *)
             t := t*g;           (* ... *)
             t3t := r+t;         (* Zähler ist addition von 1 und 2 *)
             n3n := erg;         (* Nenner ist kgv *)
         end
     else
         begin
         t3t := r+t;
         n3n := s;
         end;
     ausgabe;
end;

procedure minus;
var f,g:integer;
begin
     if n1n<>n2n then
         begin
             kgv(s,u,erg);       (* kgv für kleinsten gemeinsamen Nenner *)
             f := erg div s;     (* erweitern *)
             g := erg div u;     (* ... *)
             r := r*f;           (* ... *)
             t := t*g;           (* ... *)
             t3t := r-t;         (* Zähler ist differenz zwischen 1 und 2 *)
             n3n := erg;         (* Nenner ist kgv *)
         end
     else
         begin
         t3t := r-t;
         n3n := s;
         end;
     ausgabe;
end;

procedure mal;
begin
     t3t := r*t;
     n3n := s*u;
     ausgabe;
end;

procedure geteilt;
begin
     t3t := r*u;
     n3n := s*t;
     ausgabe;
end;


procedure analyse;
begin
     case oper of
     '+' : plus;
     '-' : minus;
     '*' : mal;
     '/' : geteilt;
     else writeln('Falsche Eingabe beim Operator!'); readln;
     end;
end;


BEGIN (* Hauptprogramm *)
repeat
      clrscr;
      writeln('Wir rechnen jetzt mit Bruechen!');
      write('Geben Sie den Zaehler von Bruch 1 ein!   ');
      readln(t1t);
      write('Geben Sie den Nenner von Bruch 1 ein!    ');
      readln(n1n);
      writeln;
      write('Geben Sie den Zaehler von Bruch 2 ein!   ');
      readln(t2t);
      write('Geben Sie den Nenner von Bruch 2 ein!    ');
      readln(n2n);
      writeln;
      write('Was moechten Sie tun? (+,-,* oder /)     ');
      readln(oper);
      writeln;
      r := t1t;
      s := n1n;
      t := t2t;
      u := n2n;
      analyse;

      writeln('Moechten Sie neustarten? J(a) oder N(ein)?');
      readln(q);
until (q <> 'j') and (q <> 'J');
END.  (* Hauptprogramm *)


hab hier ein programm mit pascal geschrieben, dass brüche verrechnen soll. aber ein paar fehler krieg ich nicht raus, hab schon das ganze wochenende versucht.

ich habs auch kommentiert, wenn fragen bleiben, sagt bescheid!

also, folgendes:
1. ich kann noch 24/5 + 2/10 berechnen, lösung ist 5.
2. ich kann auch 6/2 + 12/4 berechnen, lösung ist 6.
3. wenn ich 7/2 + 12/4 berechne, ist die lösung 1/0. (FEHLER!)
4. wenn ich 7/2 + 7/3 rechnen will, beendet sich das programm automatisch. (FEHLER!)

was ist da los?
also der unterschied zwischen 3 und 1 oder 2 ist, dass der bruch bei der ausgabe nicht soweit gekürzt werden kann, dass im nenner 1 steht.

der unterschied bei 4 ist, dass garnicht gekürzt werden kann. (35/6)

wers ausprobieren will, hier ist die exe-file:

http://home.arcor.de/para_santa/pascal/bruchrechner.exe
http://home.arcor.de/para_santa/pascal/bruchrechner.pas

(gesagt getan: endlich neuer webspace *g*)

ich verzweifel bald :heul: :worry:

ach ja, beim compilieren kommt noch die meldung:
Hint: unit BRUCHRECHNEN can't be smart linked, switching to static linking

die meldung hatte ich auch noch nie. HILFE!

DANKE SOWEIT!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Santa« (5. Dezember 2004, 18:36)


Pytho

Leichtmatrose

Beiträge: 13

Registrierungsdatum: 4. Dezember 2004

  • Nachricht senden

2

Sonntag, 5. Dezember 2004, 18:44

hmm, ich versteh zwar nicht wie das mit dem ggT funktioniert, aber ich hab auf einer anderen Seite nachgeschaut, und siehe da:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure ggT(x,y:integer; var teiler: integer);
var tausch,d: integer;  (* d für Rest, tausch als hilfsvariable zum tauschen der werte *)
begin
    if x<y then
       begin
       tausch := x;
       x := y;
       y := tausch
       end;
    repeat
          d := x mod y;
          x := y;
-->     y := r; <--- wohl ein kopier fehler? da gehört d hin weil r hat damit doch nicht zu tun, oder?
    until d=0;       (* bis Rest 0 ist *)
    teiler := x;
end;


inwiefern sich das jetzt auswirkt, etc. hab ich mir noch nicht überlegt, aber versuchs mal.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Pytho« (5. Dezember 2004, 18:45)


Santa

Schatzjäger

  • »Santa« ist der Autor dieses Themas

Beiträge: 1 355

Registrierungsdatum: 28. August 2004

  • Nachricht senden

3

Sonntag, 5. Dezember 2004, 18:53

JUCHUUU ES FUNKTIONIERT!!!

ein bescheuerter buchstabe und die ganze sache ist geritzt ...
tststs

ich hab da bestimmt 2 stunden dran gesessen, einen fehler zu finden. mit experimentieren sicher 5... :rofl:


DAAANKE!

ps: closen, bitte!