While Programm in C (Theoretische Informatik)

Hi,
ich habe mal ein kleines While Programm in C geschrieben (ich weiß dann ist es kein wirkliches while Programm mehr :D(also im Sinne der theoretischen Informatik))
Einiges stimmt natürlich nicht, zB die scanf und printf Funktionen sind normalerweise nicht vorgesehen, da die Variablen als gegeben behandelt werden und nicht erst deklariert werden müssen...
While Programme bestehen aus 4 Anweisungsarten:
x := 0 Löschen einer beliebigen Speicherzelle hier x
x := x + 1 Erhöhen einer beliebigen Speicherzelle um 1 (hier x)
x:= x - 1 Erniedrigen des Inhalts einer beliebigen Speicherzelle (hier x)
while x != y do (sry ungleich zeichen nicht gefunden^^)

While-Programme sind in der Lage mit diesen 4 Anweisungsarten alle Algorithmen durchführen zu können, und seien sie noch zu kompliziert...
In meinem Beispiel sind bis jetzt Addition, Subtraktion und Multiplikation durchführbar, wobei die Anweisungen in der while schleife eigentlich den Vorraussetzungen entsprechen, wie gesagt außer einigen Ausnahmen, die notwendig sind...

Aber nun zu meiner Frage hat jemand eine Idee wie ich mit diesen 4 Anweisungen eine Division durchführen kann?

#include <stdio.h>
main() {
int addieren1,addieren2,x = 0,h = 0,subtrahieren1,subtrahieren2 ;
int multiplizieren1,multiplizieren2,z = 0 ;

printf("\nW h i l e - P r o g r a m m ");
printf("\n\nA D D I T I O N");
printf("\nBitte erste Zahl eingeben : ");
scanf("%i",&addieren1);
printf("\nBitte zweite Zahl eingeben : ");
scanf("%i",&addieren2);
x = addieren1 ;
while (h != addieren2) {
h = h + 1 ;
x = x + 1 ;
}
printf("\n\nDas Ergebnis ist %i",x);

printf("\n\nS U B T R A K T I O N");
printf("\nVorraussetzung: x > y || x - y = 0");
printf("\nBitte erste Zahl eingeben(x) : ");
scanf("%i",&subtrahieren1);
printf("\nBitte zweite Zahl eingeben(y) : ");
scanf("%i",&subtrahieren2);
x = 0 ;
h = 0 ;
x = subtrahieren1 ;
while (h != subtrahieren2) {
h = h + 1 ;
x = x - 1 ;
}
printf("\n\nDas Ergebnis ist %i",x);

printf("\n\nM U L T I P L I K A T I O N");
printf("\nVorrausetzung: x>0 && y > 0");
printf("\nBitte erste Zahl eingeben(x) : ");
scanf("%i",&multiplizieren1);
printf("\nBitte zweite Zahl eingeben(y) : ");
scanf("%i",&multiplizieren2);
x = 0 ;
h = 0 ;
x = multiplizieren1 ;
while (h != multiplizieren2) {
h = h + 1 ;
z = z + x ;
}
printf("\n\nDas Ergebnis ist %i",z);
printf("\n\n\n");
system("PAUSE");
}

Danke schon im voraus,
Viele grüße,
Xethicalh4exe
PS: Sorry wenn ich irgendwas falsch dargestellt habe, ich beschäftige mich mit der Theoretischen Informatik erst seit heute, und bringe es mir selbst bei.. 8)
PPS: Ich weiß , ich hätte es um einige Variablen und Zeilen verringern können^^
 
Ich verstehe zwar den Sinn und Zweck der Angelegenheit nicht, aber das hat die Theorie wahrscheinlich so an sich.
Ich weiß aber, dass man die Division als wiederholte Subtraktion beschreiben kann:
x / y = gibt an, wie oft man von y von x abziehen muss um 0 zu erhalten.
Nachdem du nur mit ganzzahligen Werten arbeitest sollte das wohl reichen.

mfg benediktibk
 
Code:
ergebnis := 0
solange dividend >= divisor mache
  dividend := dividend - divisor
  ergebnis := ergebnis + 1
ende_solange
rest := dividend;

Die Berechnung der Zahl hinter dem Komma solltest du hinbekommen, das ist meines Wissen Schulstoff :)

Mit LaTeX würde das natürlich auch noch schön aussehen ;)
 
Danke für eure Antworten... hab das von .doc umgesetzt und klappt einwandfrei :D
hier in nem extra Programm

#include <stdio.h>
main() {
int dividend,divisor,ergebnis = 0 ;
printf("\nD i v i s i o n");
printf("\nBitte erste Zahl eingeben : ");
scanf("%i",&dividend);
printf("\nBitte zweite Zahl eingeben : ");
scanf("%i",&divisor);
while (dividend >= divisor) {
dividend = dividend - divisor ;
ergebnis = ergebnis + 1 ;
}
printf("\n\nDas Ergebnis ist %i",ergebnis);
printf("\nRest = %i",dividend);
printf("\n\n");
system("PAUSE");
}

Danke nochmal an .doc ;)
Viele grüße,
xethicalh4exe

PS: Neue frage :)
Hat jemand ne Idee wie man damit eine Wurzel ziehen kann?
 
da hab ich schon geschaut... aber ich meinte ja wie ich mithilfe der 4 Anweisungsarten eine Wurzel ziehen kann, und dazu finde ich leider nix... vllt hab ichs ja übersehen, wie man normal die wurzel in c zieht, das weiß ich...
trotzdem Danke :D
Xethicalh4exe
PS: ich frag mich ob das überhaupt möglich ist ?(
EDIT: Hab nochmal geschaut, meinst du vllt das Heron Verfahren?
Sieht ja heftig aus, sind aber ja ferien ;)

@benediktibk
der Sinn dieser Angelegenheit hat mit den minimalen Rechnermodellen zu tun (Abstraktionen von realen rechnern, die einen minimalen Aufwand an Hardware und Software erfordern und mit denen man dennoch alle algorithmisch formulierbaren Probleme lösen kann, siehe dazu zB Turingmaschine) mehr aber noch mit der minimalen Programmiersprache der sogenannten Sprache der While programme, genau kannst du das hier nachlesen, da habe ich es auch her seite 166-167 sehr interessant ;)
 
Original von Xethicalh4exe
Hab nochmal geschaut, meinst du vllt das Heron Verfahren?
Sieht ja heftig aus, sind aber ja ferien ;)

Zum Beispiel wäre das Heron-Verfahren eine interessante Möglichkeit durch Kombination deiner schon implementierten Rechenmethoden. Iterieren kannst du dann so lange, bis du eine bestimmte Genauigkeite erreicht hast (meist Epsilon genannt).
So schwer ist das in Wirklichkeit nicht, sofern du deine anderen Methoden auch als solche definiert hast.
 
neues Problem

ich hab jetzt mal angefangen das "umzuwandeln" und stehe jetzt vor einem neuen Problem und zwar, wie stelle ich eine Divison mit Nachkommazahlen da (also zB. das das Ergebnis 0,4 ist)? Ich bin bis jetzt soweit :

#include <stdio.h>
main() {
double ergebnis = 0,nenner = 2,zwischenergebnis = 0,erstesergebnis ;
double x,y,rest,antahl ;
int ersterschritt,wurzel ;
printf("\nQ U A D R A T W U R Z E L");
printf("\nDies wird mithilfe des Heron verfahrens durchgeführt");
printf("\n\nBitte Zahl eingeben : ");
scanf("%i",&wurzel);
ergebnis = wurzel + 1 ;
while (ergebnis >= nenner ) {
zwischenergebnis = zwischenergebnis + 1 ;
ergebnis = ergebnis - nenner ;
}
rest = ergebnis ;
while(rest != 0) {
rest = 0.5 ;
}
printf("\nZwischenergebnis : %lf\n\n",zwischenergebnis + rest);
zwischenergebnis = zwischenergebnis + ergebnis ;
erstesergebnis = zwischenergebnis ;
zwischenergebnis = 0 ;
rest = 0 ;
y = wurzel ;
x = erstesergebnis ;
while (y >= x) {
y = y - x ;
zwischenergebnis = zwischenergebnis + 1 ;
}
rest = y ;
while (anzahl != 1000000) {
anzahl = anzahl + 1 ;
rest = rest + y ;
}
...............................
system("PAUSE");
}


An der ........... stelle soll jetzt eine Division durch 10.000.000 stattfinden, um die Nachkommastellen möglichst genau bestimmen zu können...
Wobei mir gerade einfällt wenn ich eine Division mit nachkommastellen unter berücksichtigung der Regeln durchführen kann, kann ich einige Zeilen Code streichen :D ich hoffe ihr versteht den code soweit, den ersten teilabschnitt des Heron Verfahrens habe ich schon, und der funktioniert einwandfrei 8), aber jetzt brauche ich eben einige Möglichkeit diese Art von Divisionen durchführen zu können, damit ich weitermachen kann...
Vielen Dank schon im Voraus,
Mfg,
Xethicalh4exe
 
wie mache ich das? Mfg
>> Codetags kannst du oben mit dem #-Button einfügen ( oder indem du manuell die Codetags einfügst )

Code:
#include <stdio.h>
main() {
double ergebnis = 0,nenner = 2,zwischenergebnis = 0,erstesergebnis ;
double x,y,rest,antahl ;
int ersterschritt,wurzel ;
printf("\nQ U A D R A T W U R Z E L");
printf("\nDies wird mithilfe des Heron verfahrens durchgeführt");
printf("\n\nBitte Zahl eingeben : ");
scanf("%i",&wurzel);
ergebnis = wurzel + 1 ;
while (ergebnis >= nenner ) {
zwischenergebnis = zwischenergebnis + 1 ;
ergebnis = ergebnis - nenner ;
}
rest = ergebnis ;
while(rest != 0) {
rest = 0.5 ;
}
printf("\nZwischenergebnis : %lf\n\n",zwischenergebnis + rest);
zwischenergebnis = zwischenergebnis + ergebnis ;
erstesergebnis = zwischenergebnis ;
zwischenergebnis = 0 ;
rest = 0 ;
y = wurzel ;
x = erstesergebnis ;
while (y >= x) {
y = y - x ;
zwischenergebnis = zwischenergebnis + 1 ;
}
rest = y ;
while (anzahl != 1000000) {
anzahl = anzahl + 1 ;
rest = rest + y ;
}
...............................
system("PAUSE");
}
 
Und eine Bitte von mir:
Wenn du Code schreibst, dann mach das bitte ersteinmal in Pseudocode. Pseudocode ist die Schnittstelle vom Theoretischen zum Praktischen. Deine Implementierung (ich könnte dir nun eine Implementierung in Scheme vorlegen) verwirrt letztendlich nur.
Ebenfalls solltest du dir angewöhnen deinen Code zu kommentieren. Bei Pseudocode ist das weitaus weniger nötig, als bei deinem C++-Code.

Was verstehst du denn nicht? Einfach nur, wie du aus dem Rest die Zahl nach dem Komma berechnest?

Code:
Beispiel:
12 / 7 = 1 R 5
Berechnung der Kommazahl:
5*10 / 7 = 7 R 1
1*10 / 7 = 1 R 3
3*10 / 7 = 4 R 2
2*10 / 7 = 2 R 6
....
Rest_{x-1} * 10 / Divisor = Kommazahl_x R Rest_x, wobei Rest_{-1} = Dividend modulo Divisor
.... => 1,7142...
Als Genauigkeit kannst du die Anzahl der Runden ansehen, oder selbst eine Grenze (z.b. Epsilon = 1/100000) definieren.
 
Zurück
Oben