Guten Tag,
ich hoffe ich bin im richtigen Forum und habe somit auch Erfolg mit
meiner Frage.
Ich habe ein C Programm gegeben und soll nun den Fehler finden und es so
umschreiben das es das tut was es soll.
_____________________________________________________________________
Programm ist als Bild im Anhang, konnte die nicht sauber hier ins
Textfeld schreiben.
_____________________________________________________________________
Aufgabenstellung:
c)
Geben sie an, was das Programm ausgibt, wenn sie es mit 5 als Argument
aufrufen. Begründen sie ihre aussage.
d)
Korrigieren sie das Programm, so dass es korrekt funktioniert.
zu c) ich habe das Programm mal in einen online Compiler gehackt aber da
kam nichts bei raus auch wenn ich z=5 eingegeben habe ... -.-
zu d) ich glaube das einfachste wäre eine math.h Bibliothek einzubinden
und das Programm dann umzuschreiben, aber glaube nicht das es das ziel
der aufgaben Stellung ist das so zu machen, da ja die Funktion _sqrt
klar definiert wurde ... :/
Gibt es hier Ideen, Anmerkungen oder Lösungen ? Bin da gerade etwas
hilflos ...
Michael Langmaack schrieb:> Gibt es hier Ideen, Anmerkungen oder Lösungen ? Bin da gerade etwas> hilflos ...
Ausdrucken.
Dann auf ein hölzernes Küchenbrettchen kleben (die mit dem Griff)
Demjenigen der das Gelumpe fabriziert hat, nun dieses Brettchen rechts
und links kräftig in die Fre…
Michael Langmaack schrieb:> ich hoffe ich bin im richtigen Forum und habe somit auch Erfolg mit> meiner Frage.> Gibt es hier Ideen, Anmerkungen oder Lösungen ? Bin da gerade etwas> hilflos ...
Suche Dir ein Rätselforum.
Michael Langmaack schrieb:> zu c) ich habe das Programm mal in einen online Compiler gehackt aber da> kam nichts bei raus auch wenn ich z=5 eingegeben habe ... -.-
Da hätte 0 bei rauskommen sollen, oder?
LG, Sebastian
Michael Langmaack schrieb:> zu c) ich habe das Programm mal in einen online Compiler gehackt aber da> kam nichts bei raus auch wenn ich z=5 eingegeben habe ... -.-
Da hätte 0 bei rauskommen sollen, oder?
LG, Sebastian
Michael Langmaack schrieb:> zu d) ich glaube das einfachste wäre eine math.h Bibliothek einzubinden> und das Programm dann umzuschreiben, aber glaube nicht das es das ziel> der aufgaben Stellung ist das so zu machen,
Ich sehe nicht wieso math.h hier hilfreich wäre ...
LG, Sebastian
Michael Langmaack schrieb:> Programm ist als Bild im Anhang, konnte die nicht sauber hier ins> Textfeld schreiben.
Steht doch direkt im Absendeformular oben. [c ]code[/c]
Übrigens, Hausaufgaben werden im Forum generell nicht gerne gesehen.
Michael Langmaack schrieb:> ich habe das Programm mal in einen online Compiler gehackt aber da> kam nichts bei raus auch wenn ich z=5 eingegeben habe ... -.-
argc ist die Anzahl an Argumenten. Mit dem if wird der ganze Teil mit
der Abfrage nur ausgeführt, wenn argc 2 ist. Ohne Argumente ist argc 1,
da das erste Argument (argv[0]), in der Regel der Programmname ist
(obwohl es diverse Möglichkeiten gibt, auch argv[0] zu ändern). Damit
argc 2 ist, müsste also exakt 1 Parameter übergeben werden. Da sollst du
anscheinend 5 mitgeben. Also als "./program 5" oder so aufrufen, sonnst
passiert gar nichts.
Michael Langmaack schrieb:> zu d) ich glaube das einfachste wäre eine math.h Bibliothek einzubinden> und das Programm dann umzuschreiben, aber glaube nicht das es das ziel> der aufgaben Stellung ist das so zu machen, da ja die Funktion _sqrt> klar definiert wurde ... :/
Das wäre sicher die Sauberste Lösung.
Das Programm oben hat 2 Fehler:
1) In C hat man immer pass by value. Wenn du der Funktion _sqrt einen
Parameter übergibst, und dessen Wert darin änderst, hatt das ausserhalb
der Funktion keinen Einfluss. Du könntest folgende 2 Sachen machen:
1.a) Entweder das Resultat zurück geben (wie in der stdlib)
1.b) Einen Pointer auf die Variable mit dem Wert übergeben, und den
Wert auf den dieser Zeigt auslesen und dann überschreiben. Vermutlich
will er das.
2) Vermutlich wurde _sqrt gewählt, weil sqrt bereits von der standard
Library definiert wird. Die diversen C Standards legen aber fest, dass
Namen die mit _ anfangen für die Implementierung reserviert sind. Die
Funktion _sqrt zu nennen ist deshalb unportabl und implementation
defined, man sollte soetwas nicht machen.
Zu
> d) Korrigieren sie das Programm, so dass es korrekt funktioniert.
Würde ich, wenn ich die Aufgabe bekommen hätte, zusätzlich zur Lösung
noch anmerken, dass nicht definiert wurde, was das Programm denn tun
solle. Abgesehen vom _ bei _sqrt, ist es ein gültiges C Program, und
daher in keiner möglichen Definition tatsächlich falsch. Ohne die Info
was das Programm tun soll, ist formell gesehen davon auszugehen, dass es
korrekt funktioniert.
Online Compiler war dann doch eine gute Idee. Beim onlinegdb kann man
auch im single step durch das Programm, das ist hilfreicher als fertige
Lösungen.
Hallo Michael Langmaack
1.) die Funktion zur Berechnung muss einen Wert zurückgeben:
=> int _sqrt(int x)
dieser Wert muss ausgegeben werden mit printf:
=> printf("%d\n", _sqrt(z));
somit wird bei auf Aufruf:
sqrt 5 der Wert 25 angezeigt
Michael Langmaack schrieb:> Programm ist als Bild im Anhang, konnte die nicht sauber hier ins> Textfeld schreiben.
Gelesen?
Formatierung (mehr Informationen...)
1
C-Code
Oder brauchst du auch noch jemand, der dir das vorliest?
Heiner schrieb:> Hast Du Deinen Mist mal compiliert und getestet oder nur hirnlos hier> reingeschrieben????
Zweiteres, sonst hätt ich das ja abschreiben müssen.
Eugen Marmorstein schrieb:> Heiner schrieb:>> Hast Du Deinen Mist mal compiliert und getestet oder nur hirnlos hier>> reingeschrieben????>> Zweiteres, sonst hätt ich das ja abschreiben müssen.
Dann halte Dich besser in Zukunft raus, da Du ja eh' keine Ahnung hast
Heiner schrieb:> Ok, um's kurz zu machen:> #include<stdio.h>> static int _sqrt(int x) {> return x = x*x;> }> int main(int argc, char *argv[]) {> if(2 == argc) {> int z;> sscanf(argv[1], "%d", &z);>10 _sqrt(z);>11 printf("%d\n", _sqrt(z));> }> return 0;> }
Ist das _sqrt(z) in Zeile 10 zum Anwärmen, damit's in Zeile 11 besser
läuft? ;-)
Ingolf G. schrieb:> Heiner schrieb:>> Ok, um's kurz zu machen:>> ...>> _sqrt(z);>> printf("%d\n", _sqrt(z));>>> Warum zwei mal> der Aufruf _sqrt(z) ?>> C ist schon lustig :D
Prima! Ein aufmerksamer Leser!! Hast den Test bestanden! Freu Dich!
Also:
- einmal dient's dazu, den Leser "wachzurütteln"
- einmal dient's dazu, das Ergebnis anzuzeigen
Norbert schrieb:> Heiner schrieb:>> Ok, um's kurz zu machen:> Ist das _sqrt(z) in Zeile 10 zum Anwärmen, damit's in Zeile 11 besser> läuft? ;-)
Auch Du hast den Test bestanden!!
Gratuliere!
> Aber x*x ist das Gegenteil davon
Falls dies der 2. Fehler ist, hätte das Programm noch einen 3. Fehler.
sqrt(5) ist keine Integer und das printf("%d") unterschlägt die
Nachkommastellen.
Daniel A. schrieb:> Hier noch eine Version mit Pointer. Und die Funktion hab ich auch noch> umbenannt.
Du bist .... einfach genial!
Nur entspricht Dein Beitrag nicht dem Original (siehe Eingangspost des
TO),
1
if(2!=argc){
2
>printf("Usage: %s number",*argv);
3
>return1;
4
>}
und ich glaube nicht, dass der TO etwas mit
1
*x=*x**x;
anfangen kann (dafür fehlt ihm das Wissen, sonst hätte er nicht die
Fragen gestellt!!).
Daniel A. schrieb:> sqrt steht für Wurzel. Aber x*x ist das Gegenteil davon, das Quadrat.
Wo steht, dass die Funktion die WURZEL (!!) berechnen soll? Lt Fkt soll
das Quadrat von x berechnet werden, und nur die Berechnungsformel ist
maßgebend, nicht der Name der Funktion!!!
Grundgütiger!
Heiner schrieb:> Nur entspricht Dein Beitrag nicht dem Original (siehe Eingangspost des> TO),
Ja natürlich nicht. Das Original ist ja anscheinend falsch, und es gibt
keine Anforderungen, was es tun sollte, wenn es richtig wäre. Eigentlich
kann man da machen, zu was auch immer man gerade Lust hätte. Es gibt ja
keine Anforderungen.
Heiner schrieb:> Wo steht, dass die Funktion die WURZEL (!!) berechnen soll?
sqrt steht eigentlich immer für Square root, also Wurzel, egal ob Mathe
oder Programmieren. Darum ist es definitiv Sinvoll, zumindest die
Funktion umzubennenen. (Denn wie ich auch schon darauf (mehrfach)
hinwies, gibt es ja keine Anforderungen, was das Programm eigentlich tun
soll).
Daniel A. schrieb:> Heiner schrieb:>> Nur entspricht Dein Beitrag nicht dem Original (siehe Eingangspost des>> TO),>> Ja natürlich nicht. Das Original ist ja anscheinend falsch, und es gibt> keine Anforderungen, was es tun sollte, wenn es richtig wäre. Eigentlich> kann man da machen, zu was auch immer man gerade Lust hätte. Es gibt ja> keine Anforderungen.
Der war gut!
Klar! Man hätte auch ein Kreissegment berechnen können oder eine
verkettete Liste oder ... - es gibt ja keine Anforderungen.
ohje
Heiner schrieb:> Hoffentlich bist Du NICHT(!!) in einem technischen Beruf tätig!!
Doch. Ist momentan etwas Applikationsentwicklung (grösstenteils
Firmeninterne), diverse Systeme verwalten, und noch ein paar andere
Sachen.
Daniel A. schrieb:> Ja natürlich nicht. Das Original ist ja anscheinend falsch, und es gibt> keine Anforderungen, was es tun sollte, wenn es richtig wäre. Eigentlich> kann man da machen, zu was auch immer man gerade Lust hätte. Es gibt ja> keine Anforderungen.
Vermutlich doch, nur hat leider der TO davon abgesehen, Punkte a) und b)
seiner Aufgabenstellung mitzuteilen, die insoweit vielleicht
aufschlussreich hätten sein können.
Michael Langmaack schrieb:> auch wenn ich z=5 eingegeben habe ...
Wo???
Schreib lieber Zeile für Zeile, was Du verstanden hast. Oder frag was Du
nicht verstehst.
Daniel A. schrieb:> Heiner schrieb:>> Hoffentlich bist Du NICHT(!!) in einem technischen Beruf tätig!!>> Doch. Ist momentan etwas Applikationsentwicklung (grösstenteils> Firmeninterne), diverse Systeme verwalten, und noch ein paar andere> Sachen.
Off Topic
Gottseidank firmenintern!! Da kann wenigstens für die Allgemeinheit kein
Schaden entstehen, wenn Du Anforderungen nach Gusto interpretierst, das
Einzige, was drohen könnte wäre die Insolvenz Deines Arbeitgebers ...
Unsere internen Kunden sind oft sehr Froh, wenn ich mit denke. (Bei
Unklarheiten frage ich natürlich auch nach). Es ist selten, dass an
alles gedacht wird, und dann ist es immer am besten zu sehen, was die da
effektiv zu machen versuchen.
Klar, ich könnte auch nicht mitdenken, und alles exakt nach Vorgabe
machen, auch wenn ich weiss, dass dann üble Sachen passieren können &
werden, und Zeit mit unnötigen manuellen Schritten verschwendet werden
wird. Aber das macht niemanden Froh.
Vielen Dank für die doch vielen hilfreichen Lösungen und
Lösungsvorschläge...
für die die mir vorwerfen das man hier seine Hausaufgaben nicht machen
soll, es ist ein Klausuraufgabe einer Altklausur in der ich festgehangen
habe.
für die die sagen das x = x * x keine Wurzel ist, das ist mir bewusst,
für die Aufgabenstellung kann ich leider nichts :/
und an alle die sich hier einen Kopf gemacht haben und das mal eben so
runter getackert haben, danke für die Mühe :))
Michael Langmaack schrieb:> Vielen Dank für die doch vielen hilfreichen Lösungen und> Lösungsvorschläge...>> für die die mir vorwerfen das man hier seine Hausaufgaben nicht machen> soll, es ist ein Klausuraufgabe einer Altklausur in der ich festgehangen> habe.>> für die die sagen das x = x * x keine Wurzel ist, das ist mir bewusst,> für die Aufgabenstellung kann ich leider nichts :/>> und an alle die sich hier einen Kopf gemacht haben und das mal eben so> runter getackert haben, danke für die Mühe :))
+1 😉👍
Michael Langmaack schrieb:> die aufgabenteile a) und b) beinhalten, beschreibe das programm Zeile> für Zeile und zeichne ein nassi-shneidermann-diagramm zur main funktion
Wenn Du das gemacht hast, weisst Du doch, wo genau Dein Problem ist. Wir
wissen das nicht. Ich habe sogar zufällig genau danach gefragt.
A. S. schrieb:> Schreib lieber Zeile für Zeile, was Du verstanden hast. Oder frag was Du> nicht verstehst.
Potenzieren ist wohl auch einfacher als Wurzel ziehen, was? ;)
Beim (selbst programmierten) Wurzelziehen könnte man eine
Annährungsformel einsetzen - die funktioniert aber nicht gut mit
Integern, sondern viel besser mit Fließkommazahlen.
Beim Multiplizieren muss man auch wissen, wie weit man das treiben kann,
und sollte außerdem wissen, wenn man schnelle Register nutzen möchte,
wie man das in Assembler hinbekommt.
In Assembler sieht man die Grenzen und die Möglichkeiten der Umschiffung
eher als bei einer Hochsprache, bei der erstmal nicht klar ist, wie weit
man multiplizieren kann.