Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier 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. ...

Antwort
Alt 25.09.06, 14:59   #1 (permalink)
 
Registriert seit: 23.05.05
Xalon Leistung: Facit NTK
Xalon eine Nachricht über ICQ schicken
Likes: 0
Standard Quadratwurzel

Anzeige

Aufgabe:
Schreibe ein Programm das die Quadratwurzel von x errechnet.

Besonderheiten:

  • Lass den User zwischen mindestens 2 Verfahren wählen.
  • Gib die zwischenschritte aus

Quellen:
http://de.wikipedia.org/wiki/Quadratwurzel

Happy Coding,
Xalon
Xalon ist offline   Mit Zitat antworten
Alt 25.09.06, 15:24   #2 (permalink)
 
Registriert seit: 25.06.06
0wnZ Leistung: Facit NTK
0wnZ eine Nachricht über ICQ schicken
Likes: 0
Standard

Wie genau soll das Ergebnis bestimmt werden ?
0wnZ ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 25.09.06, 16:16   #3 (permalink)
Themenstarter
 
Registriert seit: 23.05.05
Xalon Leistung: Facit NTK
Xalon eine Nachricht über ICQ schicken
Likes: 0
Standard

Meinst du wie es berechnet werden soll?
Naja steht doch was dazu in Wiki
Xalon ist offline   Mit Zitat antworten
Alt 25.09.06, 17:08   #4 (permalink)
 
Registriert seit: 02.08.06
Jon2 Leistung: Facit NTK
Likes: 0
Standard

Hi das hatte ich mal geschrieben gehabt. Sollte funktionieren:

Das Script   

PHP-Code:
<?php

$x 
81;

$x split("\.",$x);

$int = (strlen($x[0]))/2;
$int2 split("\.",$int);

if (
$int2[0] == $int) {
  
$eins substr($x[0],0,2);
    
$zahlen=2;
} else {
  
$eins substr($x[0],0,1);
    
$zahlen=1;
}

for(
$i=0$i<$eins$i++) {
  if ((
$i*$i) <= $eins) {
      
$ergebniss $i;
        
$Rest $eins-($i*$i);
    }
}

for (
$i=$zahlen$i<(strlen($x[0])); $i+=2) {
  
$number=substr($x[0],$i,2);
    
$number $Rest.$number;
    
$ergeb2 $ergebniss*2;
    
$ergeb4 0;
    for (
$j=0$j<10$j++) {
      
$ergeb3 $ergeb2.$j;
        if ((
$ergeb3*$j) <= $number) {
          
$ergeb4 $j;
            
$Rest $number-($ergeb3*$j);
        }
    }
    
$ergebniss.=$ergeb4;
}

if (!isset(
$x[1])) {
  
$x[1] = "";
}

for (
$i=0$i<(strlen($x[1])); $i+=2) {
  
$number=substr($x[0],$i,2);
    
$number $Rest.$number;
    
$ergeb2 $ergebniss*2;
    
$ergeb4 0;
    for (
$j=0$j<10$j++) {
      
$ergeb3 $ergeb2.$j;
        if ((
$ergeb3*$j) <= $number) {
          
$ergeb4 $j;
            
$Rest $number-($ergeb3*$j);
        }
    }
    
$ergebniss.=$ergeb4;
}
if (
$Rest != 0) {
  
$ergebniss .= ".";
    
$a=0;
  while(
$Rest != 0) {
      
$a++;
    
$number00;
      
$number $Rest.$number;
      
$ergeb2 $ergebniss*2;
      
$ergeb4 0;
      for (
$j=0$j<10$j++) {
        
$ergeb3 $ergeb2.$j;
          if ((
$ergeb3*$j) <= $number) {
            
$ergeb4 $j;
              
$Rest $number-($ergeb3*$j);
          }
      }
      
$ergebniss.=$ergeb4;
        if(
$a == 100) {
          
$Rest =0;
        }
  }
}

print 
$ergebniss;

?>


Jon2
Jon2 ist offline   Mit Zitat antworten
Alt 25.09.06, 17:16   #5 (permalink)
 
Registriert seit: 25.06.06
0wnZ Leistung: Facit NTK
0wnZ eine Nachricht über ICQ schicken
Likes: 0
Standard

Funktioniert nur bitte beachte
Zitat:
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
0wnZ ist offline   Mit Zitat antworten
Alt 25.09.06, 18:05   #6 (permalink)
Themenstarter
 
Registriert seit: 23.05.05
Xalon Leistung: Facit NTK
Xalon eine Nachricht über ICQ schicken
Likes: 0
Standard

Is eigentlich egal, geht ja in erster Linie um die Algos an sich,aber sagen wir mal 10
Xalon ist offline   Mit Zitat antworten
Alt 26.09.06, 17:28   #7 (permalink)
 
Registriert seit: 02.11.04
M@rex Leistung: Facit NTK
Likes: 0
Standard

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;
}
M@rex ist offline   Mit Zitat antworten
Alt 26.09.06, 18:28   #8 (permalink)
 
Registriert seit: 25.06.06
0wnZ Leistung: Facit NTK
0wnZ eine Nachricht über ICQ schicken
Likes: 0
Standard

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&auml;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>

Und nun noch der PHP-Teil
PHP   

PHP-Code:
<?php 
     
//User Angaben mal einbeziehen ^^
     
$zahl      $_GET['zahl'];
     
$verfahren $_GET['verfahren'];
     
     
//Eingabe = Zahl?
     
if (is_numeric($zahl)) { 
                        
                        
// <heron>
                        
if ($verfahren == 1) { 
                        
                        
$naeherungx 1;
                        
$naeherungy = ($zahl/$naeherungx);
                        while((
$naeherungx $naeherungx) != $zahl) { //<while>
                        
$naeherungy = ($zahl/$naeherungx);
                             echo 
"N&auml;herung X : ".$naeherungx."<br>";
                             echo 
"N&auml;herung Y : ".$naeherungy."<br>";
                             echo 
"Ergebniss: <br>";
                             if(
$zahl) { echo "Die Wurzel aus 0 ist 0. "
                             }else { 
// Zahl != 0 !
                             
echo "1 < &radic;".$zahl." < ".$naeherungy."<br>"//mal das ergebnis zur übersicht ausgeben ^^
                             
$naeherungx = (($naeherungx+$naeherungy)/2);       //neue Näherung ermitteln
                             
echo "Neue N&auml;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&auml;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 ^^
0wnZ ist offline   Mit Zitat antworten
Alt 04.10.06, 16:12   #9 (permalink)
 
Registriert seit: 10.11.05
sd333221 Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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 ^^
sd333221 ist offline   Mit Zitat antworten
Alt 04.10.06, 16:19   #10 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von sd333221
Zitat:
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:
Code:
./wurzel 133333 30 0
365.147919
Lesco ist offline   Mit Zitat antworten
Alt 04.10.06, 17:45   #11 (permalink)
 
Registriert seit: 10.11.05
sd333221 Leistung: Facit NTK
Likes: 0
Standard

achso,
mein fehler :-)
Dachte mit Genauigkeit
sind die nachkommastellen gemeint
sd333221 ist offline   Mit Zitat antworten
Alt 01.11.06, 17:59   #12 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

So dann noch was von mir
mit 3 Verfahren...
C++   
Code:
#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;
}
lagalopex ist offline   Mit Zitat antworten
Alt 01.11.06, 18:22   #13 (permalink)
 
Registriert seit: 10.11.05
sd333221 Leistung: Facit NTK
Likes: 0
Standard

Sagt mir bitte, dass ich langweilig bin
Code:
#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
sd333221 ist offline   Mit Zitat antworten
Alt 01.11.06, 18:24   #14 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

gerne, du bist langweilig

wobei du ja auch sqrt nehmen kannst... ich hab die Funktion auch benutzt, damit man einen direkten Vergleich hat...
lagalopex ist offline   Mit Zitat antworten
Alt 01.11.06, 19:29   #15 (permalink)
 
Registriert seit: 13.04.06
Corni Leistung: Facit NTK
Corni eine Nachricht über ICQ schicken
Likes: 0
Standard

Wo wir schonmal bei Mathe sind: Wie kann man eigentlich Zahlen mit z.B. 1000 oder mehr Nachkommastellen realisieren, also Programmiertechnisch?

gruß Corni
Corni ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Quadratwurzel
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



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