Tiefe eines Brunnens

Post Reply
Message
Author
j23

Tiefe eines Brunnens

#1 Post by j23 »

Hi.
ich melde mich mit der Aufgabe zur Diskusion.

Die Tiefe eines Schachts oder Brunnen können wir in Kurzer Zeit errechnen, wenn wir einen Stein hinunterfallen lassen und die Zeitspanne vom Loslassen des Steins bis zum Eintrefen des Schalls nach dem Aufprall möglichst genau messen.
Berechnung durch Iteration.
Zu erst Rechnung von der Schachttiefe ohne Berücktsichtigung der Schallgeschwindigkeit nach der Formel :
s1=(t*t*a)/2
hierhin bedeuten:
s1-Tiefe ohne Berücksichtigung der Schallgeschwindigkeit
t - gemessene Zeit
a - Erdbeschleunigung=9,81 m/sec²
Anschließend ermittelt unser Programm, wie lange der Schall auf der errechneten Strecke unterwegs gewesen wäre. Diese Zeit ergibt sich aus der Formel:
ts = s1/V
ts = Zeit für den Schall
s1 = Tiefe ohne Berücksichtigung des Schalls
V = Schallgeschwindigkeit

Aufgabe:
Statt Iterationsberechnung ( Im Menü unter case ' I ' aufgefürt)- Rekursionfunktion -"rekursion() " Berechnung im neuen case " R " anwenden !!!

/***********************************************************************/
/* Berechnung der Tiefe eines Schachtes aus der Zeit */
/* zwischen dem Loslassen eines Steins und dem Eintreffen */
/* des Schalls nach Aufschlag des Steins. Die Berechnung */
/* erfolgt: a) Mit Hilfe der exakten Loesungsformel. */
/* b) Mittels Iteration. */
/***********************************************************************/

#include <stdio.h>
#include <curses.h>
#include <math.h>
#include <ctype.h>

#define SCHALL 330.0 /* Schallgeschwindigkeit 330 m/s. */
#define ERDBESCHL 9.81 /* Erdbeschleunigung 9.81 m/(s^2).*/
#define ABWEICHUNG 0.001 /* zugel. Abweichung bei Iteration*/
#define BIL clear(); /* Bildschirm loeschen */
#define ROW 4 /* erste Ausgabezeile */
#define COL 10 /* Ausgabespalte */
#define RETURN 13

void wait(void);

void main(void)
{
char kennbuchst;
double zeit,zeit2; /* Gesamtzeit in Sekunden. */
double tiefe,tiefe1,tiefe2; /* Tiefe des Brunnens in Meter. */
double diff, x, y; /* Hilfsvariablen */
int i;
char str[100];
initscr(); /* Initialisiert das Terminal */
cbreak(); /* Zeichen sofort weiterreichen */
nonl(); /* Keine neue Zeile bei Return */
intrflush(stdscr, FALSE);
keypad(stdscr, TRUE); /* Ziffernblock aktivieren. */
clear(); /* Bildschirm loeschen */
do /* Beginn der do-while-Schleife */
{
BIL;
mvaddstr(ROW,COL," L Berechnen der Tiefe mit der Loesungsformel");

mvaddstr(ROW+2,COL," I Berechnen der Tiefe mittels Iteration");

mvaddstr(ROW+4,COL," T Ausgeben einer Tabelle ");

mvaddstr(ROW+6,COL," x Programm beenden");

mvaddstr(ROW+8,COL," Programmfortsetzung: ");
kennbuchst = getch();
BIL;
switch(kennbuchst)
{
case 'l': /* Berechnen der Tiefe nach Eingabe */
case 'L': /* der gemessenen Zeit */
addstr("\n\n\n\t\t Zeit vom Loslassen des Steins bis zum ");
addstr("\n\t\t Eintreffen des Schalls in Sekunden : ");
addstr("\n\t\t ");
getstr(str);
sscanf(str,"%lf",&zeit);
x = zeit/SCHALL + 1.0/ERDBESCHL;
y = zeit/SCHALL;
tiefe = (double)(SCHALL * SCHALL * ( x - (x * x - y * y )));

sprintf(str,"\n\n\t\t Der Schacht ist %5.1f Meter tief",tiefe);
addstr(str);
wait();
break;
case 'i': /* Berechnen der Tiefe nach Eingabe */
case 'I': /* der gemessenen Zeit */
addstr("\n\n\n\t\t Zeit vom Loslassen des Steines bis zum ");
addstr("\n\t\t Eintreffen des Schalls in Sekunden : ");
addstr("\n\t\t ");
getstr(str);
sscanf(str,"%lf",&zeit);

tiefe1 = zeit * zeit * ERDBESCHL / 2; /* Berechnung der */
zeit2 = tiefe1/SCHALL; /* beiden Grenzwerte */
tiefe2 = (zeit - zeit2) * (zeit - zeit2) /* 'tiefe1' u.'tiefe2'*/
* ERDBESCHL / 2;

sprintf(str,"\n\n\t\t Oberer Grenzwert: = %lf Meter" ,tiefe1);
addstr(str);
sprintf(str,"\n\t\t Unterer Grenzwert: = %lf Meter\n\n" ,tiefe2);
addstr(str);
i = 0;
do
{
i++;
tiefe = .5 * (tiefe1+tiefe2); /* Mitte zw. tiefe1 u. tiefe2*/
diff = (2*tiefe/ERDBESCHL) /* Abweichung der berechneten*/
+tiefe/SCHALL - zeit; /* von der gemessenen Zeit. */

if (diff >= 0.0) /* Das Intervall wird neu */
tiefe1 = tiefe; /* festgelegt. */
else
tiefe2 = tiefe;

sprintf(str,"\n\t\t %1d .Berechnungslauf: %5.2f Meter",i,tiefe);
addstr(str);
} while (fabs(diff) > ABWEICHUNG);/* solange bis die Zeit nur */
/* noch um die festgelegte */
/* Abweichung von der gemessenen entfernt ist */
wait();
break;
case 't': /* Ausgeben einer Tabelle fuer Zeiten */
case 'T': /* zwischen 1 und 10 Sekunden */
addstr("\n\n\n\n\t\t Tabelle fuer gemessene Zeiten ");
addstr("\n\t\t von 1 bis 10 Sekunden:");
addstr("\n\n\t\t Sekunden Meter");
for( zeit = 1.0; zeit <= 10.0 ; zeit++)
{
x = (double)(zeit/SCHALL + 1/ERDBESCHL);
y = (double)(zeit/SCHALL);
tiefe = (double)( SCHALL * SCHALL * ( x -(x * x - y * y )));
sprintf(str,"\n\t\t %4.1f %5.1f ",zeit,tiefe);
addstr(str);
}
wait();
break;
case 'x':
mvaddstr(23,COL,"Programmende");
break;

default: /* Anweisungsblock des */
mvaddstr(23,COL,"Falscher Kennbuchstabe");/* Fehlerfalles */
wait();
break;
}
}while(kennbuchst != 'x'); /* Ende der do - while-Schleife */
endwin();
}
/***********************************************************************/
/* Die Funktion 'wait' gibt einen Text aus und wartet auf 'RETURN' */
/***********************************************************************/
void wait(void)
{
mvaddstr(24,1,"Bitte die Taste RETURN druecken!");
while( getch() != RETURN );
}
/************************************************************************/

kanonenfutter
Posts: 266
Joined: 10. Sep 2004 14:37
Contact:

#2 Post by kanonenfutter »

was soll der schmarren?
kann man das nicht löschen?
"Email und Internet haben gemeinsam, dass sie beide in HTML geschrieben sind" (Peter Huth, TV-Computerexperte). Zitiert nach http://www.antihuth.de/

Post Reply