Forum: PC-Programmierung Suche und behebe den Fehler


von Michael Langmaack (Gast)


Angehängte Dateien:

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 ...

von Lillifee (Gast)


Lesenswert?

Michael Langmaack schrieb:
> Bin da gerade etwas hilflos ...

Studiere bitte etwas anderes ...

von Eugen Marmorstein (Gast)


Lesenswert?

Probiers mal mit
1
static void _sqrt(int &x)

Und außerdem berechnet Deine Funktion da keine Quadratwurzel sondern ein 
Quadrat!

von Norbert (Gast)


Lesenswert?

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…

von This is no Rätselforum (Gast)


Lesenswert?

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.

von Sebastian (Gast)


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

von J. S. (jojos)


Lesenswert?

Ikebana oder bei handwerklichem Geschick was mit Holz.

Ich mag solche Antworten auch nicht, aber wenn es kein Troll ist fällt 
mir nichts anderes ein.

von Sebastian (Gast)


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

von Heiner (Gast)


Lesenswert?

Eugen Marmorstein schrieb:
> Probiers mal mit
>
1
static void _sqrt(int &x)
>


Na Kollege, das stimmt ja wohl nicht.
Nochmal probieren!!

von Daniel A. (daniel-a)


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.

von J. S. (jojos)


Lesenswert?

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.

von Heiner (Gast)


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

von Eugen Marmorstein (Gast)


Lesenswert?

Heiner schrieb:
> Na Kollege, das stimmt ja wohl nicht.
> Nochmal probieren!!

Hast Recht.
1
static void _sqrt(int *x)

von Forist (Gast)


Lesenswert?

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?

von Heiner (Gast)


Lesenswert?

Eugen Marmorstein schrieb:
> Heiner schrieb:
>> Na Kollege, das stimmt ja wohl nicht.
>> Nochmal probieren!!
>
> Hast Recht.
>
>
1
static void _sqrt(int *x)

Kollege!!

Hast Du Deinen Mist mal compiliert und getestet oder nur hirnlos hier 
reingeschrieben????

von Eugen Marmorstein (Gast)


Lesenswert?

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.

von Heiner (Gast)


Lesenswert?

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

von Heiner (Gast)


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
}

von Eugen Marmorstein (Gast)


Lesenswert?

Heiner schrieb:
> Dann halte Dich besser in Zukunft raus, da Du ja eh' keine Ahnung hast

Ach lass mich doch auf meinem Mount Stupid in Frieden.

von Ingolf G. (frosch)


Lesenswert?

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

von Norbert (Gast)


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? ;-)

von Heiner (Gast)


Lesenswert?

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

von Heiner (Gast)


Lesenswert?

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!

von Norbert (Gast)


Lesenswert?

Heiner schrieb:
> Gratuliere!

Gut verkauft! ;-)

von K.Thaler (Gast)


Lesenswert?

Kürzer:
return x*x;

von Eugen Marmorstein (Gast)


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
}

von J. S. (jojos)


Lesenswert?

K.Thaler schrieb:
> Kürzer:
> return x*x;

Kein Wunder das die Raketen nicht mehr zum Mond kommen.

von Daniel A. (daniel-a)


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
}

von Paul (Gast)


Lesenswert?

J. S. schrieb:
> K.Thaler schrieb:
>
>> Kürzer:
>> return x*x;
>
> Kein Wunder das die Raketen nicht mehr zum Mond kommen.

was ist daran falsch?

von Daniel A. (daniel-a)


Lesenswert?

sqrt steht für Wurzel. Aber x*x ist das Gegenteil davon, das Quadrat.

von Noch was (Gast)


Lesenswert?

> 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.

von Heiner (Gast)


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!!).

von Heiner (Gast)


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!

von Daniel A. (daniel-a)


Lesenswert?

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.

von Daniel A. (daniel-a)


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).

von Heiner (Gast)


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

von Daniel A. (daniel-a)


Lesenswert?

Ja, warum nicht?

von Heiner (Gast)


Lesenswert?

Daniel A. schrieb:
> Ja, warum nicht?

Off Topic

Hoffentlich bist Du NICHT(!!) in einem technischen Beruf tätig!!

von Daniel A. (daniel-a)


Lesenswert?

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.

von Percy N. (vox_bovi)


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.

von A. S. (Gast)


Lesenswert?

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.

von Heiner (Gast)


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 ...

von Daniel A. (daniel-a)


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.

von Michael Langmaack (Gast)


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 :))

von Michael Langmaack (Gast)


Lesenswert?

die aufgabenteile a) und b) beinhalten, beschreibe das programm Zeile 
für Zeile und zeichne ein nassi-shneidermann-diagramm zur main funktion

von Heiner (Gast)


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 😉👍

von A. S. (Gast)


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.

von MaWin (Gast)


Lesenswert?

Da die Fehlerinformation von sscanf nicht abgefragt wird und z nicht 
initialisiert wird, entsteht bei Eingabe von Nicht-Zahlen Undefined 
Behaviour.

von rbx (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.