Die Mathe-Redaktion - 20.06.2018 13:14 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
ListenpunktSchwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktAnmeldung MPCT Juli
ListenpunktFormeleditor fedgeo
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 586 Gäste und 24 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: Automat für Eurobanknoten
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule C: Automat für Eurobanknoten
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2018-02-15


Guten Abend,

die Pseudoprogrammierin meldet sich mal wieder von dieser Seite:P
Die Aufgabe habe ich gefunden und wollte Sie zu Übungszwecken mal komplett verstehen um eventuelle neue Programmiertechniken zu erkennen/erlernen.

Es geht um einen Automaten für Eurobanknoten.
- soll möglichst wenig Banknoten ausgeben
- Banknoten in einem Array vom Datentyp int festlegen (global)

zu den Funktionen:
BetragEingeben()
- abzuhebende Betrag einlesen, Gültigkeitsprüfung, falsche Eingabe soll eine neue Eingabeaufforderung liefern

AuszahlBerechnen()
- Anzahl jeder Eurobanknote soll berechnet werden
- Berechnung für jede Geldscheingröße soll rekursiv erfolgen

Ausgabe()
- Anzahl jeder auszuzahlenden Eurobanknote soll angezeigt werden

Speichern()
- Inhalt von Ausgabe() soll in Textdatei gespeichert werden
C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int scheine[7] = {500,200,100,50,20,10,5};
  6. int ScheineNum[7] = {0};
  7.  
  8. int BetragEingeben(void);
  9. int AuszahlBerechnen(int, int);
  10. int Ausgabe(void);
  11. int Speichern(void);
  12.  
  13.  
  14. // Funktion 1 Eingabe des Betrags
  15. BetragEingeben(void)
  16. {
  17. int betrag;
  18.  
  19. do
  20. {
  21. printf("Betrag eingeben: \n");
  22. scanf("%d", &betrag);
  23. if(betrag % 5 != 0)
  24. {
  25. printf("Betrag nicht auszahlbar. Bitte erneut eingeben! \n");
  26. }
  27. }
  28. while(betrag % 5 == 0);// Fehler ?
  29. return betrag;
  30. }
  31.  
  32. // Funktion 2 AuszahlBerechnen
  33. AuszahlBerechnen(int ArrayNum, int betrag)
  34. {
  35. if(betrag >= scheine[ArrayNum])
  36. {
  37. betrag = betrag - scheine[ArrayNum];
  38. ScheineNum[ArrayNum] = ScheineNum[ArrayNum]+1;
  39. AuszahlBerechnen(ArrayNum, betrag);
  40. }
  41. else{
  42. if(betrag != 0)
  43. AuszahlBerechnen(ArrayNum+1, betrag);
  44. else
  45. return betrag;
  46. }
  47. }
  48.  
  49. //Funktion 3 Ausgabe
  50. Ausgabe()
  51. {
  52. int i;
  53. printf("Anzeige aller ausgegebener Eurobanknoten: \n");
  54. for(i=0; i<7; i++)
  55. printf("%d x %d-Scheine\n", ScheineNum[i], scheine[i]);
  56. }
  57. //Funktion 4 Speichern
  58. Speichern()
  59. {
  60. int i;
  61. FILE *file;
  62. char c[1];
  63. file = fopen("result.txt", "wt");
  64.  
  65. printf("Diese Datei wird in result.txt gespeichert! \n");
  66. }
  67.  
  68. int main()
  69. {
  70. AuszahlBerechnen(0, BetragEingeben());
  71. Ausgabe();
  72. Speichern();
  73. }

Erstmal meldet mein Compiler:


Zu meinen Unklarheiten:
Zeile 6: Ein Array mit 7 Leerstellen?

Komplette Funktion 2.
Wie kann ich mir den Ablauf bzw. die Funktionalität erklären?
Ich muss ja schauen, welchen Betrag ich habe und in welcher Wertigkeit er zu der Eurobanknote steht. Aber wieso in dieser Art und Weise?

Eine Antwort würde mich sehr erfreuen und glücklich machen. Riesen Wertschätzung und Dank an Euch schon mal jetzt,

Juliane



  Profil  Quote  Link auf diesen Beitrag Link
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 1240
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2018-02-15


2018-02-15 19:32 - julianeBeygel im Themenstart schreibt:
Komplette Funktion 2.
Wie kann ich mir den Ablauf bzw. die Funktionalität erklären?
Ich muss ja schauen, welchen Betrag ich habe und in welcher Wertigkeit er zu der Eurobanknote steht. Aber wieso in dieser Art und Weise?

Hi. Laut Aufgabenstellung soll die Funktion rekursiv realisiert werden.
Da die rekursiven Aufrufe jeweils am Ende der Zweige stattfinden und die zurückgegebenen Werte nicht interessieren, ist die Funktion bis auf potentiell benötigten Stack-Bedarf ungefähr äquivalent zu der mit folgendem Körper:
C++
    while(true) {
        if(betrag >= scheine[ArrayNum])
        {
            betrag = betrag - scheine[ArrayNum];
            ScheineNum[ArrayNum] = ScheineNum[ArrayNum]+1;            
        }
        else{
            if(betrag != 0)
                ArrayNum++
            else
                return (0, falls ursprünglicher betrag == 0, sonst randomgarbage);
        }
    }

Jedenfalls: Die Grundidee ist, dass man einfach mit den höchstwertigen Scheinen anfängt und so lange diese ausgibt, wie sie von ihrem Wert her nicht zu groß sind. Ist der noch auszuzahlende Betrag kleiner als die aktuelle Scheinwertigkeit, geht man zum nächstkleineren Schein.

Dass dies auch global die Strategie ist, die zur kleinstmöglichen Gesamtzahl an Scheinen führt, wäre ganz leicht zu zeigen, wenn sich die Scheinwertigkeiten immer genau verdoppeln würden. Das ist hier nicht ganz der Fall, und darum etwas komplizierter. Ich vermute aber, dass du das ohnehin nicht zeigen sollst.



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2018-02-15


Guten Abend,

danke für die Alternativlösung. Mein Problem besteht jedoch, dass ich noch nicht das ganze Verständnis für die Funktion entwickelt habe.

Vielleicht einmal konkret gefragt.

Woher kommt eigentlich die Deklaration ArrayNum? Ist das vorgeschrieben, oder wie erklärt man sich gerade die ausgewählte Bezeichnung?

Und die Zeilen 35-45 sind mir noch unklar. Ich ahne momentan nur wieso es funktionieren könnte, kann aber guten Gewissen's nicht sagen, dass ich es 100% verstanden habe.

Vor allem wenn ich doch in der Funktion 1 nur durch 5 teilbare Beträge verlange, wieso führen wir dann diesen else-Zweig in der Funktion 2 ein? confused

Grüße

Juliane



  Profil  Quote  Link auf diesen Beitrag Link
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 1240
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2018-02-15


2018-02-15 21:10 - julianeBeygel in Beitrag No. 2 schreibt:
Woher kommt eigentlich die Deklaration ArrayNum? Ist das vorgeschrieben, oder wie erklärt man sich gerade die ausgewählte Bezeichnung?
Wie man das Ding nennt, ist egal. Es ist der Index, der für ScheineNum und scheine benutzt wird.

Und die Zeilen 35-45 sind mir noch unklar. Ich ahne momentan nur wieso es funktionieren könnte, kann aber guten Gewissen's nicht sagen, dass ich es 100% verstanden habe.
Ich habe durch die Übersetzung in eine While-Schleife versucht, die Funktionalität offensichtlicher zu machen.

Vor allem wenn ich doch in der Funktion 1 nur durch 5 teilbare Beträge verlange, wieso führen wir dann diesen else-Zweig in der Funktion 2 ein? confused
Um Division durch 5 geht es in beiden else-Zweigen nicht. Der eine wird betreten, wenn der noch auszuzahlende Betrag zu klein ist für den aktuellen Scheinwert, der andere, wenn der noch auszuzahlende Betrag 0 ist.



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2018-02-15


2018-02-15 21:21 - tactac in Beitrag No. 3 schreibt:
Der eine wird betreten, wenn der noch auszuzahlende Betrag zu klein ist für den aktuellen Scheinwert..
Irgendwie stellt es mich noch vor eine Herausforderung.
Der auszuzahlende Betrag zu klein für den aktuellen Scheinwert ist?
2018-02-15 21:21 - tactac in Beitrag No. 3 schreibt:
... der andere, wenn der noch auszuzahlende Betrag 0 ist.
Hm. Aber es ist doch else if(betrag!=0)?

Ich habe mir jetzt einmal betrag=600 angenommen.
Dieser ist ja >= 500 scheine[1]
betrag wird dann 600-500=100
Und dann?
Was mache ich mit dem leeren Array genau?
Vielleicht wird es mir dann schneller klar?

Danke und Grüße,

Juliane




  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1503
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2018-02-15


Du hast zwei Arrays.

Eines (scheine) speichert die Wertigkeiten der Scheine in absteigender Reihenfolge.
Das andere (ScheineNum) speichert die Anzahl jeder Scheinsorte.

Der naive (greedy) Algorithmus läuft jetzt wie folgt:
1. Teste ob betrag größer aktueller Schein.
2.a) Falls ja, ziehe aktuellen Schein vom Betrag ab und speichere auszuzahlenden Schein in ScheinNum (Division wäre natürlich eleganter)
2.b) Falls nein, probiere nächstkleineren Schein und gehe zu 1., bis betrag 0 ergibt.


Ansonsten sei noch zum Code zu sagen, dass Funktionen einen Rückgabetyp haben und dieser immer angegeben werden sollte.


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



  Profil  Quote  Link auf diesen Beitrag Link
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 1240
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2018-02-16


2018-02-15 22:10 - julianeBeygel in Beitrag No. 4 schreibt:
2018-02-15 21:21 - tactac in Beitrag No. 3 schreibt:
Der eine wird betreten, wenn der noch auszuzahlende Betrag zu klein ist für den aktuellen Scheinwert..
Irgendwie stellt es mich noch vor eine Herausforderung.
Der auszuzahlende Betrag zu klein für den aktuellen Scheinwert ist?
Das ist das Gegenteil von der im Code stehenden Bedingung betrag >= scheine[ArrayNum]

2018-02-15 21:21 - tactac in Beitrag No. 3 schreibt:
... der andere, wenn der noch auszuzahlende Betrag 0 ist.
Hm. Aber es ist doch else if(betrag!=0)?
Es ging um das Betreten der else-Zweige. Sie werden genau betreten, wenn die in der if-Anweisung formulierte Bedingung nicht zutrifft.

Ich habe mir jetzt einmal betrag=600 angenommen.
Dieser ist ja >= 500 scheine[1]
betrag wird dann 600-500=100
Und dann?
Dann kommt der nächste Schleifendurchlauf bzw. der endrekursive Aufruf (was inhaltlich dasselbe ist.)

Was mache ich mit dem leeren Array genau?
Vielleicht wird es mir dann schneller klar?
Welches leere Array??



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, vom Themenstarter, eingetragen 2018-02-16


Abend,

danke für die Erklärung, ist jetzt besser geworden.

Also dann noch ein einmal z.B. für betrag=600.
Dieser ist ja >= 500 bzw. im Array scheine[0]
(//Null ist ja erste Stelle wo die fünfhunderter sind)?
betrag wird dann 600-500=100
Und dann wird die Anzahl der fünfhunderter von null auf 1 erhöht. (Zeile 38, ScheineNum)
Ahso dann ist mein aktueller betrag=100 und es läuft durch die Rekursion nochmal ab.

Dann wird aber betrag = 0 und an der Stelle hänge ich dann noch.
Dann springe ich in den else-Zweig aber der gilt ja für != 0.
Insofern wird return betrag aktiv, aber wo geht dann die 0 hin?

Für was ist dann die Zeile 43 gedacht? Es geht doch immer auf dank der Funktion 1 BetragEingeben auf, wieso die Bedingung mit Ungleichheit des betrags?


Grüße

Juliane

[Die Antwort wurde nach Beitrag No.5 begonnen.]



  Profil  Quote  Link auf diesen Beitrag Link
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 1240
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, eingetragen 2018-02-16


2018-02-16 00:53 - julianeBeygel in Beitrag No. 7 schreibt:
Dann wird aber betrag = 0 und an der Stelle hänge ich dann noch.
Dann springe ich in den else-Zweig aber der gilt ja für != 0.
Insofern wird return betrag aktiv, aber wo geht dann die 0 hin?
Der Inhalt von betrag ist ja im nächsten Durchlauf erstmal 100. ArrayNum ist immer noch 0, und scheine[ArrayNum] immer noch 500. betrag >= scheine[ArrayNum] gilt dann also nicht mehr, und der äußere else-Zweig wird betreten.
Dort wird entweder die Funktion verlassen (wenn nichts mehr auszuzahlen ist) oder der Index für die beiden Arrays erhöht, um von den 500ern zu den 200ern überzugehen usw.

Für was ist dann die Zeile 43 gedacht? Es geht doch immer auf dank der Funktion 1 BetragEingeben auf, wieso die Bedingung mit Ungleichheit des betrags?
Man will ja nicht nur 500er auszahlen, sondern irgendwann vieleicht auch mal 10er und 5er. Mit Division durch 5 hat, wie schon gesagt, der Test nichts zu tun.

Hier:
    6. int ScheineNum[7] = {0};
sollten übrigens ein paar mehr 0en stehen.



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, vom Themenstarter, eingetragen 2018-02-16


Guten Tag,

ich glaube, dass ich dem Verständnis ein Stück näher gekommen bin. Die Funktion 2 (also AuszahlBerechnen, bekommt ja als Eingabeparameter den betrag und gibt zwei Parameter also den betrag und die ArrayNum zurück.

Ich kann irgendwie jedoch nicht ganz an einer Stelle mitkommen.
Wenn ich jetzt nochmal den betrag = 600 eingebe. Schritt für Schritt.
betrag >= scheine[500]
betrag = 600 - 500 = 100
ScheineNum[0] = ScheineNum[0+1] (also man zählt ja von 0 die Arrays hoch, also bei 7 Werten 0 bis 6)
Und jetzt wird doch die Funktion erneut aufgerufen mit dem aktuellen betrag=100.
2018-02-16 09:36 - tactac in Beitrag No. 8 schreibt:
ArrayNum ist immer noch 0, und scheine[ArrayNum] immer noch 500. betrag >= scheine[ArrayNum] gilt dann also nicht mehr, und der äußere else-Zweig wird betreten.
Weshalb ist jetzt ArrayNum "immer noch 0" und scheine[0]=500?

Wieso muss ich eig für ArrayNum keine Datentyp-Zuweisung machen?
Also in Zeile 33 ist das ja geschehen. Woran bzw. wie erkläre ich mir jedoch, dass es dann kompatibel mit den Arrayfelderkomponenten scheine[7] und ScheineNum[7] ist?

Die Compilerfehler machen mich auch noch zu schaffen. Hat da eventuell jemand eine Idee?

2018-02-16 09:36 - tactac in Beitrag No. 8 schreibt:
Hier:
    6. int ScheineNum[7] = {0};
sollten übrigens ein paar mehr 0en stehen.
Hm, wirklich?

Danke herzlich,

Juliane



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 4143
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, eingetragen 2018-02-16


2018-02-16 12:54 - julianeBeygel in Beitrag No. 9 schreibt:
Die Compilerfehler machen mich auch noch zu schaffen. Hat da eventuell jemand eine Idee?

Hallo Juliane,

schreibe "int BetragEingeben(void)" anstelle von "BetragEingeben(void)" etc.



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, vom Themenstarter, eingetragen 2018-02-16


Hey,

danke die Fehlermeldungen sind jetzt weg, aber es geschieht nichts. Also es gibt keine Eingabeaufforderung des Geldbetrags.

Danke und Grüße,

Juliane




  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1503
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.12, eingetragen 2018-02-16


Teste mal die Eingabefunktion.
Deren Logik erscheint zweifelhaft.


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



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.13, vom Themenstarter, eingetragen 2018-02-16


2018-02-16 13:27 - DerEinfaeltige in Beitrag No. 12 schreibt:
Teste mal die Eingabefunktion.
Ja da ist was faul. Und zwar muss die Eingabe eingelesen werden und neu anfordern, wenn der Betrag nicht durch 5 teilbar ist. Also wenn betrag % 5 != 0 ist muss ich neu anfordern. Das stimmt vorne und hinten nicht.
Wenn ich jedoch auch in while(betrag % 5 != 0) einsetze, dann geht's auch nicht auf. Das ist dann in der Variante doch gar nicht realisierbar?

Danke und Grüße,

Juliane



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1503
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.14, eingetragen 2018-02-16


Eine mögliche Lösung wäre:
C++
int betragEingeben(){
    int betrag;
    while(1){ // Endlosschleife
     printf("Bitte Betrag eingeben\n");
     scanf("%d",&betrag);
     if (betrag % 5 == 0){ // Heureka, eine gültige Eingabe!
        return betrag; // Schnell zurückgeben!
     }
     printf("Eingabe ungültig. :(\n");
    }
}
 

Die üblichen Problem mit scanf bleiben natürlich erhalten.


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



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.15, vom Themenstarter, eingetragen 2018-02-16


Hey,

danke für die Alternative.

2018-02-16 15:52 - DerEinfaeltige in Beitrag No. 14 schreibt:
Die üblichen Probleme mit scanf bleiben natürlich erhalten.
Ja und zwar ist es doch bei dem Programm unmöglich eine dynamische Eingabe von der Tastatur abzuverlangen? Jedenfalls erscheint es in meiner kleiner Programmierwelt so?

Eine einzige Möglichkeit die sich mir da in den Kopf stellt sind Zeiger.

Kann ich wirklich nur in Zeile 17 den Betrag initialisieren?

Grüße

Juliane




  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1503
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.16, eingetragen 2018-02-16


2018-02-16 16:13 - julianeBeygel in Beitrag No. 15 schreibt:

Ja und zwar ist es doch bei dem Programm unmöglich eine dynamische Eingabe von der Tastatur abzuverlangen? Jedenfalls erscheint es in meiner kleiner Programmierwelt so?


Wenn du sauber definierst, was eine "dynamische Eingabe" sein soll, kann man dir auch da sicher zeigen, wie es geht.


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



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.17, vom Themenstarter, eingetragen 2018-02-16


2018-02-16 17:49 - DerEinfaeltige in Beitrag No. 16 schreibt:
Wenn du sauber definierst, was eine "dynamische Eingabe" sein soll, kann man dir auch da sicher zeigen, wie es geht.
Naja einfach, dass man aufgefordert wird einen Betrag einzugeben und wenn dieser nicht durch 5 teilbar ist, dass man erneut aufgefordert wird.

Grüße und danke,

Juliane



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1503
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.18, eingetragen 2018-02-16


2018-02-16 18:01 - julianeBeygel in Beitrag No. 17 schreibt:
2018-02-16 17:49 - DerEinfaeltige in Beitrag No. 16 schreibt:
Wenn du sauber definierst, was eine "dynamische Eingabe" sein soll, kann man dir auch da sicher zeigen, wie es geht.
Naja einfach, dass man aufgefordert wird einen Betrag einzugeben und wenn dieser nicht durch 5 teilbar ist, dass man erneut aufgefordert wird.

Grüße und danke,

Juliane

Genau das macht meine Routine, wie du leicht ausprobieren kannst.
(Sie scheitert nur, wenn der Nutzer überhaupt keine Zahl eingibt. Dieses Problem lässt sich mit scanf jedoch nicht gut lösen.)


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



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.19, vom Themenstarter, eingetragen 2018-02-16


Hey,

ich habe deine Routine eingebaut, jedoch kann ich nichts eingeben und bekomme jedoch direkt die Ausgabe von:

(da ich betrag auf 5 initialisiert habe)

Grüße und danke,

Juliane



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2147
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.20, eingetragen 2018-02-16


Am Rande: Du solltest beim Compileraufruf vielleicht nicht *.c, sondern den tatsächlichen Namen deiner c-Datei angeben. (Es sei denn du weißt genau was du tust und machst das mit Absicht so, dann will ich nichts gesagt haben.)


-----------------
⊗ ⊗ ⊗



  Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 1503
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.21, eingetragen 2018-02-17


2018-02-16 20:25 - julianeBeygel in Beitrag No. 19 schreibt:
Hey,

ich habe deine Routine eingebaut, jedoch kann ich nichts eingeben und bekomme jedoch direkt die Ausgabe von:

(da ich betrag auf 5 initialisiert habe)

Grüße und danke,

Juliane

Gut, da du aus irgendeinem Grund eine gleichnamige, globale Variable hast, kann da das ein oder andere eben schiefgehen. :)

Komplett sähe das bei mir etwa so aus:
C
#include <stdio.h>
 
int betragEingeben(){
    int betrag;
    while(1){ // Endlosschleife
     printf("Bitte Betrag eingeben\n");
     scanf("%d",&betrag);
     if (betrag % 5 == 0){ // Heureka, eine gültige Eingabe!
        return betrag; // Schnell zurückgeben!
     }
     printf("Eingabe ungültig. :(\n");
    }
}
 
void betragAuszahlen(int betrag, int *typen, int N, int *auszahlung){
    int t = 0; // Index
    while (t < N && betrag > 0){ // Schleife bis Index am Ende oder betrag auf 0
        auszahlung[t] += betrag / typen[t]; // Anzahl Scheine berechnen und speichern
        betrag -= typen[t] * auszahlung[t]; // Betrag reduzieren
        ++t; // Index erhöhen
    }
}
 
void printArr(int *arr, int N){
    printf("[");
    int i;
    for (i = 0; i < N-1; ++i){
        printf("%d, ",arr[i]);
    }
    printf("%d]",arr[i]);
}
 
int main()
{
    int scheine[7] = {500,200,100,50,20,10,5};
    int output[7] = {0,0,0,0,0,0,0};
    betragAuszahlen(betragEingeben(),scheine,7,output);
    printArr(output,7);
    printf("\nSeeya next time! :)\n");
    return 0;
}
 



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



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.22, vom Themenstarter, eingetragen 2018-02-17


Hallo,

danke für die Hinweise, ich hatte einfach einen Hänger im Browser und daher kam es wohl zustande. Hab ihn neugestartet dann ging's.

Ich habe mal zu Übungszwecken das Struktogram von Beitrag #14 (der Funktion BetragEingeben) mal erstellt. Ist das so in Ordnung?
|------------------------|
| betrag mit int         |
|------------------------|
|        while(true)     |
|     |------------------|
|     | Zahl eingeben    |
|     | und einlesen     |
|     |------------------|
|     |\ betrag % 5 ==0  |
|     | \                |
|     |  \               |
|     |   \              |
|     |    \             |
|     |     \            |
|     |      \          /|
|     |       \        / |
|     |        \      /  |
|     |         \    /   |
|     |          \  /    |
|     | true      \/false|
|     |----------------- |
|     |return     |    / |
|     |betrag     |   /  |
|     |           |  /   |
|     |------------------|
|     |falscher betrag   |
|     |erneute Eingabe   |
-------------------------|

Und noch eine Frage zu den Funktionen. Wie ist das eigentlich mit der leeren Menge also void gemeint?
int BetragEingeben(void) usw.
Eine Funktion erwartet ja Eingabewerte (vom vorgegebenen Datentyp) und gibt Ausgabewerte (Anzahl und Datentyp auch definierbar) zurück.

Grüße

Juliane

[Die Antwort wurde nach Beitrag No.20 begonnen.]



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2147
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.23, eingetragen 2018-02-17


2018-02-17 10:28 - julianeBeygel in Beitrag No. 22 schreibt:
Und noch eine Frage zu den Funktionen. Wie ist das eigentlich mit der leeren Menge also void gemeint?
int BetragEingeben(void) usw.
In den Klammern stehen normalerweise die Funktionsparameter, so wie bei Auszahlberechnen in deinem Startbeitrag. Wenn eine Funktion keine Parameter hat, sollte die Klammer folglich leer sein, richtig? In C bedeutet das aber aus historischen Gründen, dass die Funktion beliebige Argumente entgegen nehmen kann. Um eine Funktion zu deklarieren, die keine Parameter hat, schreibt man (void) als Parameterliste. Das ist ein willkürlicher Sonderfall und lässt sich nicht anders verstehen.

Ansonsten kann man void vielleicht eher noch als Typ mit nur einem Element verstehen, auch wenn man dieses Element in C nicht benennen kann. Eigentlich muss man nur wissen, dass void-Funktionen keinen Rückgabewert haben (mit dem man weiterarbeiten kann), und dass andererseits void-Zeiger auf beliebiges zeigen können (aber auch nicht dereferenziert werden können.)



  Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 4143
Aus: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.24, eingetragen 2018-02-17


int Ausgabe(void) und int Speichern(void) sind auch nicht richtig. Es muss void Ausgabe(void) und void Speichern(void) heißen, da die Funktionen keinen Wert zurückgeben. Bei deiner ursprünglichen Funktion AuszahlBerechnen ist es nicht klar, da die Funktion manchmal was zurückgibt und manchmal nicht. Das sollte nicht passieren.



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 30.10.2013
Mitteilungen: 165
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.25, vom Themenstarter, eingetragen 2018-02-17


Abend,

2018-02-17 15:58 - StrgAltEntf in Beitrag No. 24 schreibt:
int Ausgabe(void) und int Speichern(void) sind auch nicht richtig. Es muss void Ausgabe(void) und void Speichern(void) heißen, da die Funktionen keinen Wert zurückgeben.
void Ausgabe(void), also Ausgabe erhält ja keinen integer-Wert und gibt an die Funktion nichts zurück? Es folgt nur eine interne Berechnung bzw. Ausgabe der Arrays, daher void Ausgabe(void)?

Zur Sicherheit: Das Struktogramm aus #Beitrag22 ist doch korrekt?

Danke Euch,

Grüße Juliane



  Profil  Quote  Link auf diesen Beitrag Link
julianeBeygel hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    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-2018 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]