PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : total überfordert!



Floba78
27.11.2007, 17:15
Hallo ,

ich studiere seit diesem Semester Machinenbau , unter anderem haben wir dort auch C-Programmierung.Davon höre ich zum ersten mal und habe dementsprechend relativ wenig Ahnung.

Wir schreiben allerdings bald ein praktisches Testat und ich bräuchte zu folgender Aufgabe mal eure Hilfe.:

wir sollen ein C-Programm schreiben welches die n-te Wurzel der Zahl a errechnet. Dies soll mithilfe des Itterationsverfahrens geschehen.

x=1/n*((n-1)*x+a/x^(n-1)) , diese Formel ist gegeben. Das Programm soll n und a einlesen , wobei n ganzzahlig ist.

Das ganze soll abbrechen wenn die Differenz zweier Itterationswerte kleiner als 10^-8 ist.

x^(n-1) soll durch (n-1)-maliges Multiplizieren von x errechnet werden.

Mein Quelltext sieht bis jetzt so aus:

#include<stdio.h>
#include<math.h>
void main()
{
double x=0,a;
int n,i=1;
printf("\nWurzelrechnung\n");
printf("a= ");
scanf("%lf",&a);
printf("n= ");
scanf("%i",&n);





}


Habe auch ein bisschen mit der Formel rumprobiert aber es funktioniert nicht , bzw. nur ganz einfache Teile.

Hoffe ihr könnt mir Helfen , Vielen Dank schonmal im Voraus.

roboterheld
27.11.2007, 17:59
sollen wir auch gleich deine diplomarbeit schreiben?

mensch, da musst du durch, setzt dich mit deinen kameraden zusammen und diskutiere darüber. es gibt bestimmt einige die davon ahnung haben.

ansonsten würde ich maschinenbau aufgeben und tischler lernen.

Floba78
27.11.2007, 18:12
hab mir schon ein Buch durchgelesen mit den Grundlagen zur Programmierung. Wir hatten 2 Praktika und im 3. ist das o.g. Testat. Habe schon mehrere Stunden mit Übungen verbracht , aber die war kein Vergleich zu dem was hier gefordert ist. Unser Prof. setzt solche sachen vorraus und kann es einfach nicht erklären und der Übungsleiter sagt wieder das wir alles aus der Vorlesung können müssen. Geht mir ja nur um nen Ansatz bzw. einen Denkanstoß.

phaidros
27.11.2007, 23:37
Kannst du Unterprogramme schreiben? Wenn ja, dann schreib eines, um die Potenz zu berechnen, also z.B. Potenz(a,b) liefert a hoch b durch Multiplizieren.
Ein zweites Unterprogramm berechnet dir die Näherungslösung, deine Formel, und benutzt dabei das Unterprogramm Potenz(),

D. h. Naeherung(x0,a,n) liefert eine neue Näherung x1.

Im Hauptprogramm rufst du dann Naeherung solange auf, bis die Differenz zwischen x1 und x0 klein genug ist.

Poste einfach mal weiter deine Versuche hier.

roboterheld
28.11.2007, 08:05
....und der Übungsleiter sagt wieder das wir alles aus der Vorlesung können müssen. ....


na dann ist doch alles in ordnung..

thewulf00
28.11.2007, 08:21
Ich würde das, als Anschlussvorschlag zu dem von phaidros, rekursiv machen, d.h. eine Funktion, die rechnet einen Teil und für den weiteren Teil ruft sie sich selbst mit neuen Parametern auf. Das passiert so lange, bis das Ergebnis < 10^-8 ist, dann gibt die innerste Funktion ihren Wert an den nächstinnere zurück usw. usw.

Floba78
28.11.2007, 11:09
den Vorschlag mit Unterprogrammen werden wir auch noch mal testen.
haben jetzt weiter probiert und haben für die Berechnung von x^(n-1) folgendes:

#include<stdio.h>
#include<math.h>
void main()
{ float b=1,n,x,z,k=1;
printf("x= ");
scanf("%f",&x);
printf("n= ");
scanf("%f",&n);

while (k<=(n-1.))
{ k=k+1;
b=(b*x)*(k/k);
}
if (k<=n);
printf("b= %f",b);
x=(1./n)*(((n-1)*x)+(a/b));

}


damit funktioniert die Berechnung , a/x ist jetzt quasi x/b.
das Programm soll nun noch b selbst berechnen , so das es nicht mehr eingegeben werden soll.
wir müssen nun noch die abbruchbedingung formulieren.

jeffrey
28.11.2007, 12:31
hi,

Unser Prof. setzt solche sachen vorraus und kann es einfach nicht erklären und der Übungsleiter sagt wieder das wir alles aus der Vorlesung können müssen. Geht mir ja nur um nen Ansatz bzw. einen Denkanstoß.
ohjee, die erstis. daran wirst du dich im laufe des studiums noch gewöhnen, das ist ganz normal, spätestens in ein oder 2 semester wirst du dann auch erkennen, dass man in den meisten vorlesungen nix lernt. wichtig ist, dass man das skript hat, dann braucht man eigentlich gar nicht mehr hin gehn, und dann muss man sich halt zuhause vor der prüfung hinsetzen und lernen. am besten mit ein oder 2 andere zusammen, ist unterhaltsammer, und man kann zwischdrin au mal ne runde zocken ;-) vorbei ist es jetzt mit dem schönen schulerleben, in dem einem alles 3 mal vorgekaut wird. jetzt fängt das schöne studentenleben an, in dem man sich selbst einteilen muss, was man wann und wie lernt, dafür hat man aber eigentlich immer zeit für was anderes und man kann endlich ausschlafen.
mfg jeffrey

thewulf00
28.11.2007, 12:34
dass man in den meisten vorlesungen nix lernt. wichtig ist, dass man das skript hat, dann braucht man eigentlich gar nicht mehr hin gehn, und dann muss man sich halt zuhause vor der prüfung hinsetzen und lernen. am besten mit ein oder 2 andere zusammen, ist unterhaltsammer, und man kann zwischdrin au mal ne runde zocken [...] und man kann endlich ausschlafen.

OMG - Unis^^ Ein Glück, dass ich so ne Einrichtung gemieden habe... ](*,)

phaidros
28.11.2007, 21:13
Macht es doch bitte mit Unterprogrammen.
So steigt ihr ja selber nicht mehr durch, was ihr da macht:


b=(b*x)*(k/k);
Was soll die Multiplikation mit (k/k) ??
k/k ist im besten Fall 1; wenn Rundungsfehler wegen Float zuschlagen, sogar irgend etwas anderes.


if (k<=n);
Diese Zeile bewirkt rein gar nichts. Das Semikolon beendet die if-Anweisung. Mit anderen Worten: Wenn k <= n, tu nichts. Wenn nicht, tue auch nichts.


{ k=k+1;
Euch ist klar, dass ihr bei k=2 anfangt? Am Anfang setzt ihr k=1 und erhöht dann gleich am Anfang der Schleife um 1.

Ehrlich gesagt, dass ist der grausamste Quellcode, den ich seit langem gesehen habe. Und ich habe Erstsemester (allerdings Informatik) an der Uni betreut. Mein Rat: Holt euch professionelle Hilfe! Einfach in der Mensa einen Informatiker anquatschen, die reden gerne über Source-Code und erklären euch sicherlich mehr als ihr je wissen wolltet.

Das ist nicht böse gemeint, aber online ist euer Problem nicht zu lösen, ohne dass man gleich die ganze Lösung hinschreibt,