Die Mathe-Redaktion - 18.07.2019 03:01 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktAnmeldung MPCT Sept.
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 292 Gäste und 5 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C: Programm führt nicht bis zum Ende aus
Druckversion
Druckversion
Autor
Schule J C: Programm führt nicht bis zum Ende aus
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 176
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-05-31


Hi!

Es geht um diese Aufgabenstellung (ich variiere Sie ein wenig, indem ich den User 3 ganze Zahlen einlesen lasse und dann das relevante überprüfe)  :



Irgendwie scheint es nicht zu funktionieren - sieht Jemand, woran es liegt:
C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void sort(int* x, int* y) {
  5. int temp;
  6. temp = *x;
  7. *x = *y;
  8. *y = temp;
  9. }
  10.  
  11. int is_evenly_spaced(int* a, int* b, int* c) {
  12. while(*a > *b || *b > *c) {
  13. sort(a, b);
  14. sort(b, c);
  15. }
  16.  
  17. if((*b - *a) == (*c - *b)) {
  18. return 1;
  19. } else {
  20. return 0;
  21. }
  22. }
  23.  
  24. int main() {
  25. int z1, z2, z3;
  26. printf("Bitte geben Sie drei ganze Zahlen ein: \n");
  27. scanf("%d %d %d", &z1, &z2, &z3);
  28.  
  29. if(is_evenly_spaced(&z1, &z2, &z3)) {
  30. printf("wahr\n");
  31. } else {
  32. printf("falsch\n");
  33. }
  34.  
  35. return 0;
  36. }



  Profil  Quote  Link auf diesen Beitrag Link
Fabi
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 03.03.2002
Mitteilungen: 4494
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-05-31


Hi,

Zum Beispiel für den Input (6,3,9) bleibst du in der while-Schleife in Zeile 12ff hängen; die Logik dort stimmt einfach nicht und wird niemals zu einem sortiertem Array führen.

vG,
Fabi


-----------------
"There would be the mathematical equivalent of worldwide rioting." (P.C.)

Willst du Hamburg oben sehen, musst du die Tabelle drehen.



  Profil  Quote  Link auf diesen Beitrag Link
Creasy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2019
Mitteilungen: 310
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2019-05-31


Hey,
von $C$ hab ich zunächst wenig Ahnung, aber müsstest du in Zeile 13/14 nicht Zeiger übergeben?
Und wenn ich es richtig sehe, kann es passieren, dass die Whileschleife nicht abbricht. Ein Bsp: (1,3,2).
Erste Whileschleife: ->(3,1,2) -> (3,2,1)
Zweite Whileschleife: ->(2,3,1) -> (2,1,3)
Dritte Whileschleife: ->(1,2,3) -> (1,3,2)
Und wir sind wieder am Anfang.

Grüße
Creasy

[Die Antwort wurde vor Beitrag No.1 begonnen.]


-----------------
Smile (:



  Profil  Quote  Link auf diesen Beitrag Link
hgseib
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 04.04.2019
Mitteilungen: 116
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2019-05-31


Hallo

Programmierer (bin selbst seit jahrzehnten einer) erklären vorher ganz exakt wie etwas funktioniert. Und hinterher können sie präzise erklären, warum es garnicht hat funktionieren können.

Also nicht denken, programmierer debuggen. Arbeite dein Programm schrittweise ab und prüfe z.B. wann du einen Zeiger benützt und wann den Wert einer Variablen. Beim Bebuggen kann man den temporären Wert einer Variablen einsehen und man erlebt den tatsächlichen Verlauf des Programmes.

mfg

EDIT: hatte noch ein paar Bemerkungen zum Programm selbst, die aber wieder gelöscht.



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 176
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2019-05-31


2019-05-31 11:45 - Fabi in Beitrag No. 1 schreibt:
Hi,

Zum Beispiel für den Input (6,3,9) bleibst du in der while-Schleife in Zeile 12ff hängen; die Logik dort stimmt einfach nicht und wird niemals zu einem sortiertem Array führen.

vG,
Fabi

eidt:
opps, gerade gesehen, dass ich Fallunterscheidung bei der Hilfsfunktion sort() vergessen habe.



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 176
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2019-05-31


2019-05-31 11:48 - Creasy in Beitrag No. 2 schreibt:
Hey,
von $C$ hab ich zunächst wenig Ahnung, aber müsstest du in Zeile 13/14 nicht Zeiger übergeben?
Und wenn ich es richtig sehe, kann es passieren, dass die Whileschleife nicht abbricht. Ein Bsp: (1,3,2).
Erste Whileschleife: ->(3,1,2) -> (3,2,1)
Zweite Whileschleife: ->(2,3,1) -> (2,1,3)
Dritte Whileschleife: ->(1,2,3) -> (1,3,2)
Und wir sind wieder am Anfang.

Grüße
Creasy

[Die Antwort wurde vor Beitrag No.1 begonnen.]

Wegen Zeigerübergabe:
Die sort()-Funktion erwartet ja keine dereferenzierten Zeiger (also Werte, auf die der Zeiger zeigt), sondern Zeiger (also Adressen).
Ich hatte vor kurzem eine ähnliche Frage, wie du:
LinkC : Wieso kein Pointer als Aktualparameter bei Übergabe an Hilfsfunktion?

Ach jetzt grad seh ich es:
Ich hab bei der sort()-Funktion die Fallunterscheidung vergessen. Ich editier es noch mal schnell und update dann in einem separatem Post.



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 176
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2019-05-31


Update:

lol, es lag einfach nur daran, dass ich die Fallunterscheidung verpeilt habe hinzuzufügen - jetzt funktioniert das Programm - zumindest macht es gemäß den Testcases, die unser Dozent bei der Aufgabenstellung mitgeliefert hat, das was es soll:
C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void sort(int* x, int* y) {
  5. int temp;
  6.  
  7. if(*x > *y) {
  8. temp = *x;
  9. *x = *y;
  10. *y = temp;
  11. }
  12. }
  13.  
  14. int is_evenly_spaced(int* a, int* b, int* c) {
  15. while(*a > *b || *b > *c) {
  16. sort(a, b);
  17. sort(b, c);
  18. }
  19.  
  20. if((*b - *a) == (*c - *b)) {
  21. return 1;
  22. } else {
  23. return 0;
  24. }
  25. }
  26.  
  27. int main() {
  28. int z1, z2, z3;
  29. printf("Bitte geben Sie drei ganze Zahlen ein: \n");
  30. scanf("%d %d %d", &z1, &z2, &z3);
  31.  
  32. if(is_evenly_spaced(&z1, &z2, &z3)) {
  33. printf("wahr\n");
  34. } else {
  35. printf("falsch\n");
  36. }
  37.  
  38. return 0;
  39. }

Danke an alle Hinweise.



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2667
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2019-05-31


Laut Aufgabenstellung erwartet is_evenly_spaced ints und keine Zeiger auf int.



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 176
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2019-05-31


2019-05-31 15:32 - ligning in Beitrag No. 7 schreibt:
Laut Aufgabenstellung erwartet is_evenly_spaced ints und keine Zeiger auf int.

Ach so, ja - hätte ich erwähnen sollen:
Hab die Aufgabe leicht verändert, dass man es auch mit Pointern machen kann.
Ich wiederhole gerade paar Dinge, da Klausur nicht mehr so weit hin ist... zu diesem Zeitpunkt hatten wir noch keine Pointer, daher auch nichts von in der Aufgabenstellung erwähnt.
Die Lösung ohne Pointer bekomme ich auch hin, ist aber unbequemer (man braucht schon etliche if-Kaskaden und kann schnell den Überblick verlieren).

So wie ich es gemacht habe´(Werte swappen), geht es aber nur über Zeiger, denk ich.



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2667
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2019-05-31


Ich hab nicht gesagt, dass du es ohne Zeiger machen sollst, sondern dass die Parameter von is_evenly_spaced keine Zeiger sein sollen. Und das geht ganz leicht.



  Profil  Quote  Link auf diesen Beitrag Link
hgseib
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 04.04.2019
Mitteilungen: 116
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, eingetragen 2019-05-31


der Hinweiss von ligning ist wichtig!

is_evenly_spaced soll wohl etwas testen?
Wenn du Pointer verwendest, dann können die Originaldaten durch 'sort' verändert werden. Das kann nicht im Sinne des Erfinders sein ;-)

mfg




  Profil  Quote  Link auf diesen Beitrag Link
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 176
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, vom Themenstarter, eingetragen 2019-06-01


2019-05-31 20:11 - hgseib in Beitrag No. 10 schreibt:
der Hinweiss von ligning ist wichtig!

is_evenly_spaced soll wohl etwas testen?
Wenn du Pointer verwendest, dann können die Originaldaten durch 'sort' verändert werden. Das kann nicht im Sinne des Erfinders sein ;-)

mfg



Es soll ja nur testen, ob drei eingegebene Zahlen bei aufsteigender Reihenfolge den gleichen Betrags-Abstand haben - siehe testcase -
(6, 3, 9) als Eingabe liefert ja auch 'wahr' zurück.
Daher ist es ja sogar gewünscht, dass die Reihenfolge verändert wird.

Oder ich verstehe etwas nicht, daher
hier mal die Musterlösung ohne Zeiger:
C
  1. #include <stdio.h>
  2.  
  3. int is_evenly_spaced(int z1, int z2, int z3) {
  4. int min = z1, middle = z2, max = z3;
  5.  
  6. if(z2 > max)
  7. max = z2;
  8. if(z1 > max)
  9. max = z1;
  10.  
  11. if(z2 < min)
  12. min = z2;
  13. if(z3 < min)
  14. min = z3;
  15.  
  16. if(z1 < max && z1 > min)
  17. middle = z1;
  18. else if(z3 < max && z3 > min)
  19. middle = z3;
  20.  
  21. if( (middle - min) == (max - middle) )
  22. return 1;
  23. else
  24. return 0;
  25.  
  26. }
  27.  
  28. int main() {
  29.  
  30. printf("%d\n", is_evenly_spaced(3, 6, 9) );
  31. printf("%d\n", is_evenly_spaced(9, 6, 3) );
  32. printf("%d\n", is_evenly_spaced(6, 3, 9) );
  33. printf("%d\n", is_evenly_spaced(3, 0, -3) );
  34. printf("%d\n", is_evenly_spaced(4, 6, 3) );
  35. printf("%d\n", is_evenly_spaced(1, 1, 1) );
  36.  
  37. return 0;
  38. }






  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2076
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, eingetragen 2019-06-01


2019-06-01 12:36 - Zrebna in Beitrag No. 11 schreibt:

Es soll ja nur testen, ob drei eingegebene Zahlen bei aufsteigender Reihenfolge den gleichen Betrags-Abstand haben - siehe testcase -
(6, 3, 9) als Eingabe liefert ja auch 'wahr' zurück.
Daher ist es ja sogar gewünscht, dass die Reihenfolge verändert wird.


Nein, denn wie du schreibst soll is_evenly_spaced nur testen, ob die Eingabe die gewünschte Eigenschaft hat.

Dein Programm mit Zeigern verändert jedoch die Eingabe und gibt dann das Ergebnis des Tests zurück.
Das ist unter realen Bedingungen sehr gefährlich.
Der Nutzer will im Allgemeinen nur wissen, ob die Eingabe bestimmte Prädikate erfüllt und danach zumeist mit der Eingabe weiterarbeiten.

Daher sollte das Prädikat keine Seiteneffekte haben, wie sie die Variante mit Zeigern leider hat.
Die Variante mit Werten/Kopien hat keine Seiteneffekte. Es handelt sich hier um eine reine Funktion.


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2667
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, eingetragen 2019-06-01


Gefährlich ist das nicht wirklich, weil der Benutzer die Funktion ja gar nicht aufrufen kann, ohne Zeiger zu seinen Variablen zu übergeben und damit explizit die Möglichkeit einräumt, dass die Werte verändert werden. Der Name is_evenly_spaced passt dann halt nicht, und das Konzept ist auch fragwürdig. Nur nicht gefährlich.



  Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 04.03.2003
Mitteilungen: 26797
Aus: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, eingetragen 2019-06-01


Die Musterlösung ist albern confused
Wie viele ifs will der Vogel denn schreiben, wenn mehr als 3 Zahlen gegeben sind?

Die Variante mit dem Sortieren und dann Vergleichen macht da schon mehr Sinn.
Von der weiteren Verwendung der Zahlen hängt es ab, ob die Eingangsreihenfolge verändert werden darf, oder ob die Prüfung in einem Hilfsarray stattfinden muß.

Statt die Zahlen abzufragen hätte ich sie dem Programm als Parameter übergeben. Aber das hängt wohl von der genauen Aufgabenstellung ab.

Gruß vom ¼



-----------------
Bild



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna hat die Antworten auf ihre/seine Frage gesehen.
Zrebna hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]