Suche und behebe den Fehler

Gast #7187370
Lesenswert?

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 ...
Angehängte Dateien:
Gast #7187412
Lesenswert?

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
#7187418
Lesenswert?

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.
Gast #7187426
Lesenswert?

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
Gast #7187452
Lesenswert?

Ok, um's kurz zu machen:
1
#include<stdio.h>
2

3
static int _sqrt(int x) {
4
  return x = x*x;
5
}
6
int main(int argc, char *argv[]) {
7
  if(2 == argc) {
8
    int z;
9
    sscanf(argv[1], "%d", &z);
10
    _sqrt(z);
11
    printf("%d\n", _sqrt(z));
12
  }
13
  return 0;
14
}
Gast #7187461
Lesenswert?

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? ;-)
Gast #7187475
Lesenswert?

Danke fürs tippen Heiner.
1
#include<stdio.h>
2
static void _sqrt(int *x) {
3
  *x = *x * *x;
4
}
5
int main(int argc, char *argv[]) {
6
  if(2 == argc) {
7
    int z;
8
    sscanf(argv[1], "%d", &z);
9
    _sqrt(&z);
10
    printf("%d\n", z);
11
  }
12
  return 0;
13
}
#7187483
Lesenswert?

Hier noch eine Version mit Pointer. Und die Funktion hab ich auch noch 
umbenannt.
1
#include<stdio.h>
2

3
void quadrat(int* x) {
4
  *x = *x**x;
5
}
6

7
int main(int argc, char *argv[]){
8
  if(2 != argc){
9
    printf("Usage: %s number", *argv);
10
    return 1;
11
  }
12
  int z;
13
  sscanf("5", "%d", &z);
14
  quadrat(&z);
15
  printf("%d\n", z);
16
  return 0;
17
}
Gast #7187528
Lesenswert?

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
>     return 1;
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!!).
Gast #7187532
Lesenswert?

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!
#7187539
Lesenswert?

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).
Gast #7187540
Lesenswert?

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
#7187568
Lesenswert?

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.
Gast #7187583
Lesenswert?

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 ...
#7187598
Lesenswert?

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.
Gast #7187812
Lesenswert?

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 :))
Gast #7187816
Lesenswert?

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 😉👍
Gast #7187939
Lesenswert?

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.
Gast #7189928
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren