Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Tiefe eines Brunnens

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
j23
Gast





BeitragVerfasst am: 30. Jan 2005 23:04   Titel: Tiefe eines Brunnens

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



Anmeldungsdatum: 10.09.2004
Beiträge: 266

BeitragVerfasst am: 31. Jan 2005 17:42   Titel:

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/
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy