Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Programmschleifen

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> C/C++
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
oppi
Gast





BeitragVerfasst am: 06. Jun 2006 12:10    Titel: Programmschleifen Antworten mit Zitat

Ich hab ein Programm geschrieben welches den Mittelwewert, die Varianz und die Standardabweichung ausrechen soll. Es funktioniert auch so weit, bis auf die Varianz, da klappt was nicht.

#include <stdio.h>
#include <math.h>
void main (void)

{
int N;
double x,xquer,v,s;
char j;

j='j';

do
{
printf("Mittelwert berechnung!\n");
printf("Bitte geben Sie ihre Werte ein!\nFuer das Ergebnis (0) druecken!\n");

N=0;
xquer=0;
v=0;

scanf("%lf",&x);

while (x!=0)
{
xquer=xquer+x;

N=N+1;
scanf("%lf",&x);
}

while (x!=0)
{
v=((x-xquer)*(x-xquer));
N=1/(N-1);
}

while (x!=0)
{
s=sqrt(v);
}


xquer=xquer/N;
printf("Mittelwert betraegt:%6.2lf\n\n",xquer);

v=(N-1)*((x-xquer)*(x-xquer));
printf("Varianz betraegt:%6.2lf\n\n",v);

s=sqrt(v);
printf("Standardabweichung betraegt:%6.2lf\n\n",s);

printf("Moechten Sie noch einmal rechnen?\n");
printf("(j) = ja, (andere Taste) = nein\n");
scanf("%s",&j);
printf("\n");

}
while (j=='j');

}

Vielleicht könnt ihr mal drüber schauen und mir posten.
Gruß Oppi
Nach oben
eazy



Anmeldungsdatum: 18.06.2006
Beiträge: 6
Wohnort: Hannover

BeitragVerfasst am: 18. Jun 2006 22:36    Titel: hallöchen oppi Antworten mit Zitat

ich hatte das Programm mir schon vor ner Woche angeschaut und es schon am selben abend fertig, nur dann wurd mir die Leitung gekappt.....naja. also es gibt da erstmal aber ein kleines problämlchen, ich haben keine Ahnung was Varianz ist, daher habe ich an der rechnung nix geändert. aber es kamen immer komische werte raus, daher denke ich mal, das passt schon^^.

Zitat:

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

double n,v,xquer = 0;
double s,x;
char auswahl;

int main(void) {
.....while(1) {
..........system("clear");
..........printf("***Varianz Rechner***\n\n");
..........printf("Bitte geben Sie ihre Werte ein!\n");
..........printf("Fuer das Ergebnis (0) druecken!\n");

..........n,v,xquer = 0;

..........scanf("%lf",&x);

..........while (x!=0) {
...............xquer=+x;

...............n+=1;
...............scanf("%lf",&x);
..........}

..........while (x!=0) {
...............v=((x-xquer)*(x-xquer));
...............n=1/(n-1);
..........}

..........while (x!=0)
...............s=sqrt(v);


..........xquer /= n;
..........printf("Mittelwert betraegt:%6.2lf\n\n",xquer);

..........v=(n-1)*((x-xquer)*(x-xquer));
..........printf("Varianz betraegt:%6.2lf\n\n",v);

..........s=sqrt(v);
..........printf("Standardabweichung betraegt:%6.2lf\n\n",s);

..........printf("Beenden? j/n\n");
..........scanf("%s",&auswahl);
..........if(auswahl != 'n') break;

..........}

return;
}

die Punkte sind als Leerzeichen gedacht.
so, ich hoff das war jetzt nich umsonst, denn du willst es ja bestimmt noch wissen Augenzwinkern

_________________
wer später bremst, fährt länger schnell
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
oppi25



Anmeldungsdatum: 06.06.2006
Beiträge: 4

BeitragVerfasst am: 23. Jun 2006 16:23    Titel: Antworten mit Zitat

Vielen Dank
Ich musste aber das system "clear rausnehmen" weil er mir einen Fehler angezeigt hatte. Was ist das eigentlich?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
eazy



Anmeldungsdatum: 18.06.2006
Beiträge: 6
Wohnort: Hannover

BeitragVerfasst am: 23. Jun 2006 17:30    Titel: hi oppi Antworten mit Zitat

"clear" bei linux das selbe wie "cls" bei windows.
kannst du aber auch genausogut weglassen, habs nur so mal für ne bessere Optik gemacht. Augenzwinkern
hast du denn das programm eingermaßen verstanden? ich glaub hätt da noch paar kommentare reinsetzen sollen. naja, kannst ja fragen, was du noch wissen willst smile

bye

_________________
wer später bremst, fährt länger schnell
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
oppi25



Anmeldungsdatum: 06.06.2006
Beiträge: 4

BeitragVerfasst am: 24. Jun 2006 10:58    Titel: Antworten mit Zitat

Also das Programm haut hin allerdings stimmen die Formeln nicht deswegen kommen die falschen werte raus.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 24. Jun 2006 13:08    Titel: Antworten mit Zitat

Hallo!

Irgendwie kann das überhaupt nicht funktionieren, so weit ich es sehe: Du hast zuerst eine while-Schleife, die die Werte einliest, dabei die Summe bildet und die Anzahl der Werte zählt. Daraus kannst Du dann auch den Mittelwert bilden, so weit richtig. Aber: Du machst danach noch zwei mal diese Schleife, ohne noch was ein zu lesen. Dein x ist also nach der ersten Schleife schon 0 und wird sich dann auch nicht mehr ändern, so dass die neuen Schleifen überhaupt nicht mehr durchlaufen werden und die Varianz dann auch nicht gebildet wird.
Außerdem ist die letzte Schleife Quatsch. Du willst doch einfach nur von dem einen Wert der Varianz die Wurzel ausrechnen. Wieso willst Du das nochmal in einer Schleife für alle x machen. Egal wieviele x Du hast, die Varianz und die Standardabweichung gibt es nur einmal, so dass eine Schleife keinen Sinn macht an der Stelle.

Um es richtig zu machen, mußt Du die Werteliste zweimal durch gehen. Das kannst Du am besten machen, indem Du die Werte in ein Array einliest und das Array dann mehrfach durch gehst. Das Problem dabei ist, dass Du vorher nicht weißt, wie groß dieses Array werden soll. Du weißt also voher nicht, wie viel Speicher Du reservieren mußt. Du müsstest also immer, wenn Dein vorher reservierter Speicher voll wird das erkennen und automatisch neuen Speicher dazu reservieren, was das ganze ziemlich kompliziert macht und mit vielen Kopiervorgängen verbunden ist.
Alternativ könntest Du mit verketteten Listen arbeiten oder so. Dann wird dieser Teil einfacher. Oder, wenn Du in C++ programmierst, gibt es für solche Probleme schon entsprechende Klassen in der STL.

Gruß
Marco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eazy



Anmeldungsdatum: 18.06.2006
Beiträge: 6
Wohnort: Hannover

BeitragVerfasst am: 25. Jun 2006 19:54    Titel: hi nochmal :) Antworten mit Zitat

ehm, falls das an mich gerichtet ist.
Zitat:
also es gibt da erstmal aber ein kleines problämlchen, ich haben keine Ahnung was Varianz ist, daher habe ich an der rechnung nix geändert. aber es kamen immer komische werte raus, daher denke ich mal, das passt schon^^


lg eazy. bye

_________________
wer später bremst, fährt länger schnell
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 25. Jun 2006 21:10    Titel: Antworten mit Zitat

Hallo!

Schaut Euch doch Euer Programm nochmal an: Die erste Schleife wird so lange durchlaufen, bis x = 0 wird. Nach der Schleife ist x also definitiv = 0.
Dann kommen zwei while-Schleifen, die nur dann überhaupt auch nur einmal durchlaufen werden, wenn x ungleich 0 ist. Das kann es aber an dieser Stelle gar nicht sein, sonst hätte sich die erste Schleife ja gar nicht beendet. Also werden die beiden folgenden Schleife nie durchlaufen.

Gruß
Marco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eazy



Anmeldungsdatum: 18.06.2006
Beiträge: 6
Wohnort: Hannover

BeitragVerfasst am: 26. Jun 2006 09:29    Titel: okey Antworten mit Zitat

ohne Rechnung kann ich damit nix anfangen.hab ja keine Ahnung, was wie rauskommen muss, da kann ich nichts mit anfangen.

aber so langsam versteh ich den Quelltext, hehe. ich würde es aber wenn schon, dann von ganz anfang anders schreiben. das was ich gemacht habe war genau das selbe Programm, nur den Quellcode etwas einfacher & verständlicher gemacht. außerdem habe ich den Fehler mit der EINEN schleife behoben, wo ja auch das haupsächliche problem war(nach oppis äußerungen hier). Danach ging es ja, dachte ich jedenfalls. verwirrend ist es jedoch wirklich mit den anderen schleifen. Nur ich hab gedacht, dass er nur das eine wissen wollte. nuja...

also oppi, kriegst es hin? wenn du willst, gebe ich dir auch den quelltext zu meinem sortlist damit du auch mit den arays arbeiten kannst wie hier schon erwähnt. das ist auch der einfachere weg. und du musst es nicht mit C++ machen Augenzwinkern

Zitat:

#include <stdio.h>
#include <stdlib.h>

struct list {
.....int mz;
.....struct list *next;
} *ptr, *top;


int main (void) {
.....int zahl ;

.....printf("zahl eingeben \n");
.....scanf("%i",&zahl);

.....ptr = (struct list*) malloc(sizeof (struct list));

.....ptr->mz = zahl ;
.....top = ptr;
.....top->next = NULL;

.....do {
..........ptr = (struct list*) malloc(sizeof (struct list));

..........printf("zahl eingeben \n");
..........scanf("%i",&zahl);

..........ptr->mz = zahl;
..........ptr->next = top;
..........top =ptr;
.....}while (ptr->mz != 0);

.....ptr = top ;

.....do {
..........printf ("%i\n",ptr->mz);

..........ptr = ptr->next;

.....}while (ptr->next != NULL);

return;
}


und das vermischt mit .......

Zitat:

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

double n,v,xquer = 0;
double s,x;
char auswahl;

int main(void) {
.....while(1) {
..........n,v,xquer = 0;

..........printf("Bitte geben Sie ihre Werte ein!\n");
..........printf("Fuer das Ergebnis (0) druecken!\n");

..........scanf("%lf",&x);

..........while (x!=0) {
...............xquer=+x;

...............n+=1;
...............scanf("%lf",&x);
..........}

..........while (x!=0) {
...............v=((x-xquer)*(x-xquer));
...............n=1/(n-1);
..........}

..........s=sqrt(v);

..........xquer /= n;
..........printf("Mittelwert betraegt:%6.2lf\n\n",xquer);

..........v=(n-1)*((x-xquer)*(x-xquer));
..........printf("Varianz betraegt:%6.2lf\n\n",v);

..........s=sqrt(v);
..........printf("Standardabweichung betraegt:%6.2lf\n\n",s);

..........printf("Beenden? j/n\n");
..........scanf("%s",&auswahl);
..........if(auswahl != 'n') break;

.....}

return;
}


naja, aber das zweite würde ich wie gesagt, wieder von ganz anfang schreiben. Augenzwinkern

ansonsten.....lg Tanzen
eazy

_________________
wer später bremst, fährt länger schnell


Zuletzt bearbeitet von eazy am 26. Jun 2006 14:25, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen MSN Messenger
as_string



Anmeldungsdatum: 24.02.2006
Beiträge: 80
Wohnort: Heidelberg

BeitragVerfasst am: 26. Jun 2006 14:03    Titel: Antworten mit Zitat

Hallo!

Ich schreibe das mal in Formeln (steht aber auch in jeder Formelsammlung):
Mittelwert:

Also: Summe aller x durch Anzahl der x.
Varianz:

Also für jeden Wert die Differenz zum Mittelwert bilden und die Quadrate dieser Differenzen aufsummieren. Danach durch die Gesamtzahl teilen (also einen Mittelwert der Quadrate der Differenzen zum richtigen Mittelwert bilden...).
Standardabweichung:

Man muß also zuerst den Mittelwert bestimmen, indem man alle Werte durch geht, dabei die Summe bildet und die Anzahl durch Mitzählen bestimmt. Danach erst kann man die Varianz ausrechnen, indem man nochmal alle Werte durch geht, von denen immer den vorher ausgerechneten Mittelwert abzieht und die Differenz quadriert. Diesen Wert muß man dann wieder durch die selbe Anzahl teilen, wie vorher.
Die Standardabweichung ist dann einfach die Wurzel aus der Varianz. Das ist dann also eine einfache Rechnung.
Weil man alle Werte zwingend zweimal durchgehen muß, muß man die Werte nach dem Einlesen in ein Array oder so zwischen speichern. sonst müßte man die Werte zweimal einlesen, was nicht besonders schön wäre (überhaupt, wenn die nicht aus einer Datei kommen, sondern von Hand eingegeben werden würden). Das wird aber in Euren Bsp. überhaupt nicht gemacht, weshalb die zweite und 3. Schleife überhaupt keinen Zweck erfüllen. Sie werden sogar nicht einmal ein einziges Mal durch geführt. Dazu kommt noch, dass die 3. Schleife völlig überflüssig ist. Wenn ich schon die Varianz habe, muß ich bei der nur noch einmal die Wurzel ziehen und muß mir die einzelnen Werte nicht mehr anschauen. Dafür braucht man aber keine Schleife.
Wie man die Werte jetzt am besten zwischenspeichert, ist eine andere Frage. Da C in dieser Beziehung doch arg umständlich ist, muß man sich entweder kompliziert Gedanken über das Speichermanagment machen, mit verketteten Listen arbeiten, oder erstmal mit einem statischen Array arbeiten und die maximale Größe dann auf 1024 Werte begrenzen oder so... Das hat aber nicht unbedingt direkt etwas mit der Rechnung zu tun. Ich würde dafür dann auch eher C++, Java oder irgendeine andere Prog.-Sprache empfehlen, bei der dynamische Arrays in irgendeiner Form schon eingebaut sind.

Gruß
Marco
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> C/C++ Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen