/* File: wurzel.c -- zu Kap. 1.5.1. Programmbeispiele
   Fkt.: Berechnung der Wurzel in einem bestimmten Intervall
	 und Ausgabe in Tabellenform */
#include <stdio.h>
#include <ctype.h>
#define STEP 0.1
#define EPSILON 0.001
main()
{	int anzahl;
	double wert;
	double xneu;
	double wurzel();
	int getint();
	int nummer;
	int von, bis;
	fprintf(stderr,"Berechnung der Wurzel in einem bestimmten Intervall\n");
	fprintf(stderr,"***************************************************\n");
	fprintf(stderr,"\nGeben Sie den Anfangswert ein:");
	von = getint();
	if (von <=0) {
		fprintf(stderr,"   Unzulaessiger Eingabewert!\n");
		fprintf(stderr,"   Starten Sie das Programm neu!\n");
		exit(1);
	}
	fprintf(stderr,"\nGeben Sie den Endwert ein:");
	bis = getint();
	if (bis<von) {
		fprintf(stderr,"Der Endwert ist kleiner als der Anfangswert!\n");
		fprintf(stderr,"Starten Sie das Programm neu!\n");
		exit(1);
	}
	wert = von;
	anzahl = 0;
	nummer = von;
	printf("\n    |  0.0 |  0.1 |  0.2 |  0.3 |  0.4 |  0.5 |  0.6 |  0.7 |  0.8 |  0.9 |\n");
	printf("---------------------------------------------------------------------------\n");
	printf("\n%2d  | ", nummer);
	while(wert <= bis){
		xneu = wurzel(wert);
		anzahl = anzahl + 1;
		if (anzahl <= 10) {
			printf("%.3f| ", xneu);
		} else {
			nummer = nummer+1;
			printf("\n%2d  | %.3f| ", nummer, xneu);
			anzahl = 1;
		}
		wert = wert + STEP;
	}
	printf("\n");
}
double wurzel(wert)
	double wert;
{	double xalt;
	double abs;
	double xneu;
	xneu = wert;
	do {	xalt = xneu; 
		xneu = (xalt + wert / xalt) / 2;
		if ((abs = xalt-xneu) < 0)
			abs = -abs;
	} while (abs >= EPSILON);
	return (xneu);
}
int getint() /* Ziffernfolge lesen und konvertieren in int */
{	int i;
	int c;
	i = 0;
	c = getchar();
	while(isdigit(c)) {
		i = 10 * i + c - '0' ;
		c = getchar();
	}
	return(i);
}
