ProgrammieraufgabenHier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.
Quadratwurzel
Diskussion: Quadratwurzel im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige
Aufgabe:
Schreibe ein Programm das die Quadratwurzel von x errechnet.
Besonderheiten: Lass den User zwischen mindestens 2 Verfahren wählen.
...
Aufgabe:
Schreibe ein Programm das die Quadratwurzel von x errechnet.
Besonderheiten:
* Lass den User zwischen mindestens 2 Verfahren wählen.
* Gib die zwischenschritte aus
@Xalon: Nein. Ich will wissen , bis wohin ich nach dem Komma Rechnen soll, wenn es sich um eine Irrationale (nicht endene, nicht periodische) Zahl handelt
So hab schon was stehen. konnte aber aus Zeitmangel nicht Einrücken, alles nochma durchgehen. Bisher kann man das Heron verfahren wählen und jede x-beliebige Zahl benutzten. DIe Intervall-Schachtelung werde ich Morgen machen, da ich noch mehr als genug heute zu tun hab ^^
Außerdem wär es nett wenn ma jemand gucken würde, warum die selbe ausgabe erzeugt wird wenn man nichts auswählt und wenn Die Intervall-Schachtelung ausgewählt wurde.
Also hier das Eingabe-Formular :
Formular
Code:
<html>
<head>
<title>Quadratwurzel ziehen</title>
</head>
<body>
Bitte gebe eine Zahl an, aus der die Quadratwurzel gezogen werden soll.<br /><br />
<form action="http://rider.ri.ohost.de/wurzel_script.php">
<input name="zahl" type="text" value="Zahl" /> <br />
Nun wähle bitte noch das Verfahren, mit dem Die Quadratwurzel errechnet werden soll. <br /> <br />
Heron-Verfahren: <input name="verfahren" type="radio" value="1" /> <br />
Intervall-Schachtelung: <input name="verfahren" type="radio" value="0" /> <br />
<input type="submit" value="Wurzeln XD" />
</form>
</body>
</html>
$naeherungx = 1; $naeherungy = ($zahl/$naeherungx); while(($naeherungx * $naeherungx) != $zahl) { //<while> $naeherungy = ($zahl/$naeherungx); echo "Näherung X : ".$naeherungx."<br>"; echo "Näherung Y : ".$naeherungy."<br>"; echo "Ergebniss: <br>"; if(1 > $zahl) { echo "Die Wurzel aus 0 ist 0. "; }else { // Zahl != 0 ! echo "1 < √".$zahl." < ".$naeherungy."<br>"; //mal das ergebnis zur übersicht ausgeben ^^ $naeherungx = (($naeherungx+$naeherungy)/2); //neue Näherung ermitteln echo "Neue Näherung X :".$naeherungx."<br>"; //und Ausgeben } // </else> Bei Zahl != 0 } // </while> } else { if ($verfahren == 0) { echo "Musst noch warten ;)"; } if ($verfahren != 0) { echo "Bitte wähle ein Verfahren aus."; } //... kommt demnächst muss aber jetzt Franz lernen ^^ } // </else> Verfahren prüfung } else { echo"Bitte gebe eine Zahl ein."; }
?>
Auszuprobieren auf meiner Seite
achja ich muss noch einstellen, wenn sich die letzten nach komma zahenl sich nich ändern, dass dann abgebrochen wird ^^
Original von M@rex
Hab mal was in C gecodet. Ich weiss mein C is schäbig, aber es funktioniert.
Wurzel in C
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
float pow_n(int x, int n)
{
int r = x;
for(int i = 1; i < n; i++)
{
r = r * x;
}
return r;
}
float heron(int n, int d)
{
float x = 1.0f;
for (int i = 0; i < d; i++)
{
x = (x + (n / x)) / 2;
}
return x;
}
float naeherung(int n, int d)
{
float x = 0.0f;
for(int i = 0; i < d; i += 1)
{
if(i == 0)
{
for(int j = 0; j < n; j++)
{
float a = j * j;
if(a <= n) {
x = j;
if(a == n) {
return j;
}
} else {
break;
}
}
}
else
{
float buf = 0.0f;
for(float j = 0.0f; j < n; j += 1/pow_n(10, i))
{
float a = (x+j) * (x+j);
if(a < n) {
buf = j;
} else {
x = x + buf;
break;
}
}
}
}
return x;
}
int main(int argc, char** argv)
{
if(argc < 3)
{
printf("USEAGE:\n" \
"\twurzel NUMMER TIEFE METHODE\n\n" \
"\t\tNUMMER\tDie Nummer aus der die Wurzel gezogen werden soll.\n" \
"\t\tTIEFE\tGibt an wie genau die Wurzel sein soll.\n" \
"\t\tMETHODE\tDie Methode die gewählt werden soll.\n" \
"\t\t\tZur Auswahl stehen Heron-Verfahren (0) und Näherunsg-Verfahren (1).\n");
return 0;
}
int n = atoi(argv[1]);
int d = atoi(argv[2]);
int m = atoi(argv[3]);
switch(m)
{
case 0:
{
float x = heron(n, d);
printf("Die Wurzel aus %i ist %f!\n", n, x);
break;
}
case 1:
{
float x = naeherung(n, d);
printf("Die Wurzel aus %i ist %f!\n", n, x);
break;
}
}
return 0;
}
Es funktioniert nicht wirklich:
Code:
C:\Programme\Dev-Cpp>projekt1 133333 3 0
Die Wurzel aus 133333 ist 16669.250000!
C:\Programme\Dev-Cpp>projekt1 133333 3 1
Die Wurzel aus 133333 ist 365.140015!
Ich weiss auch nicht was du da beim Heron Verfahren gebaut hast ^^
Original von M@rex
Hab mal was in C gecodet. Ich weiss mein C is schäbig, aber es funktioniert.
Wurzel in C
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
float pow_n(int x, int n)
{
int r = x;
for(int i = 1; i < n; i++)
{
r = r * x;
}
return r;
}
float heron(int n, int d)
{
float x = 1.0f;
for (int i = 0; i < d; i++)
{
x = (x + (n / x)) / 2;
}
return x;
}
float naeherung(int n, int d)
{
float x = 0.0f;
for(int i = 0; i < d; i += 1)
{
if(i == 0)
{
for(int j = 0; j < n; j++)
{
float a = j * j;
if(a <= n) {
x = j;
if(a == n) {
return j;
}
} else {
break;
}
}
}
else
{
float buf = 0.0f;
for(float j = 0.0f; j < n; j += 1/pow_n(10, i))
{
float a = (x+j) * (x+j);
if(a < n) {
buf = j;
} else {
x = x + buf;
break;
}
}
}
}
return x;
}
int main(int argc, char** argv)
{
if(argc < 3)
{
printf("USEAGE:\n" \
"\twurzel NUMMER TIEFE METHODE\n\n" \
"\t\tNUMMER\tDie Nummer aus der die Wurzel gezogen werden soll.\n" \
"\t\tTIEFE\tGibt an wie genau die Wurzel sein soll.\n" \
"\t\tMETHODE\tDie Methode die gewählt werden soll.\n" \
"\t\t\tZur Auswahl stehen Heron-Verfahren (0) und Näherunsg-Verfahren (1).\n");
return 0;
}
int n = atoi(argv[1]);
int d = atoi(argv[2]);
int m = atoi(argv[3]);
switch(m)
{
case 0:
{
float x = heron(n, d);
printf("Die Wurzel aus %i ist %f!\n", n, x);
break;
}
case 1:
{
float x = naeherung(n, d);
printf("Die Wurzel aus %i ist %f!\n", n, x);
break;
}
}
return 0;
}
Es funktioniert nicht wirklich:
Code:
C:\Programme\Dev-Cpp>projekt1 133333 3 0
Die Wurzel aus 133333 ist 16669.250000!
C:\Programme\Dev-Cpp>projekt1 133333 3 1
Die Wurzel aus 133333 ist 365.140015!
Ich weiss auch nicht was du da beim Heron Verfahren gebaut hast ^^
Doch das funktioniert schon, jedoch konvergiert das Heron-Verfahren nicht schnell genug, daher reichen 3 Iterationen(hier "Tiefe") einfach nicht aus:
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
void sqrt_heron(double x, int m)
{
double r = 1.0;
for (int i = 1; i <= m; ++i) {
r = (r + x/r) / 2;
cout << i << ". Schritt sqrt(" << x << ") ~ " << setprecision(16) << r << endl;
}
}
void sqrt_is(double x, int m)
{
double a = 0.0, b = x, c;
for (int i = 1; i <= m; ++i) {
c = (a + b) / 2;
cout << i << ". Schritt sqrt(" << x << ") ~ " << setprecision(16) << c << endl;
if (c * c > x)
b = c;
else
a = c;
}
}
void sqrt_schr(double x, int m)
{
double y = x, r;
int a = 0, b = 0;
unsigned long u = 0;
while (y >= 100.0) {
y /= 100.0;
++a;
}
for (int i = 1; i <= m; ++i) {
for (b = 1; b < 10; ++b)
if (20 * u * b + b * b > y)
break;
--b;
r *= 10; r += b;
y -= 20 * u * b + b * b; y *= 100;
u *= 10; u += b;
cout << i << ". Schritt sqrt(" << x << ") ~ " << setprecision(16) << r * pow(10, a) << endl;
--a;
}
}
int main()
{
for (;;) {
int v, i;
double w;
cout << "\nVerfahren der Wurzelbestimmung:" << endl;
cout << "1 = Heron" << endl;
cout << "2 = Intervallschachtelung" << endl;
cout << "3 = schriftliches Wurzelziehen" << endl;
cout << "0 = Beenden" << endl;
cin >> v;
if (v < 1 || v > 3)
break;
cout << "Iterationsschritte: " << flush;
cin >> i;
if (i < 1)
break;
cout << "Radikand: " << flush;
cin >> w;
if (w <=0)
break;
cout << "Die Quadratwurzel aus " << w << " ist " << setprecision(16) << sqrt(w) << " (zum Vergleich)." << endl;
switch (v) {
case 1: cout << "Heron:" << endl;
sqrt_heron(w, i);
break;
case 2: cout << "Intervallschachtelung:" << endl;
sqrt_is(w, i);
break;
case 3: cout << "schriftliches Wurzelziehen:" << endl;
sqrt_schr(w, i);
break;
};
}
return 0;
}
#include <iostream>
#include <math.h>
int main()
{
std::cout << "Bitte die Zahl eingeben: ";
float eineZahl;
std::cin >> eineZahl;
eineZahl = powf(eineZahl,0.5);
std::cout << std::endl << "Die Quadratwurzel lautet: " << eineZahl << std::endl;
system("Pause");
}
Edit:
Ich weiss natürlich dass das die Aufgabenstellung nicht erfüllt,
nur so würde ich das in meinen Programmen machen, weil man
meist nicht so genaue Wurzeln braucht, und das klappt ganz gut