marinos#94 Δημοσ. 23 Οκτωβρίου 2014 Δημοσ. 23 Οκτωβρίου 2014 Θα ηθελα μια βοηθεια εχω την παρακατω ασκηση Μία μηχανή αυτόματης πώλησης καφέ δέχεται μόνο ΕΝΑ χαρτονόμισμα των 5 € κάθε φορά και δίνει τα ρέστα σε κέρματα των 10, 20 & 50 λεπτών καθώς και σε κέρματα του 1 και 2 ευρώ . Κάθε καφές κοστίζει 70 λεπτά. Να γραφεί πρόγραμμα το οποίο να ζητάει τον αριθμό των καφέδων (int) και να εμφανίζει τα ρέστα (σε κέρματα) (int) που πρέπει να δώσει. Στην περίπτωση που τα χρήματα δεν επαρκούν να εμφανίζει το κατάλληλο μήνυμα. (Τα χρήματα υπολογίζονται σε λεπτά του ευρώ).το προβλημα μου ειναι πως να μοιρασω τα διαφορα κερματα...δλδ αν εχω 3 καφεδες τοτε 3 * 0,7 = 2,1πως θα πω 1 κερμα των 2 και 1 κερμα των 10??
antbyron Δημοσ. 23 Οκτωβρίου 2014 Δημοσ. 23 Οκτωβρίου 2014 Θα κάνεις ακέραιες διαιρέσεις με τα κέρματα(ξεκινώντας από το μεγαλύτερο) μέχρι να μηδενίσει. Που κολλάς συγκεκριμένα;
Moderators Kercyn Δημοσ. 23 Οκτωβρίου 2014 Moderators Δημοσ. 23 Οκτωβρίου 2014 Θα μπορούσες να κάνεις το εξής: Χωρίζεις τα ευρώ και τα λεπτά σε 2 μέρη, δηλαδή για το παράδειγμά σου θα έχεις μια μεταβλητή με τιμή 2 και άλλη μία με τιμή 10. Ξεκινώντας από το μεγαλύτερο κέρμα, βλέπεις επαναληπτικά πόσα τέτοια κέρματα "χωράνε"[1] στο υπόλοιπο που έχεις. Παράδείγμα: 90 λεπτά ρέστα Το 50λεπτο χωράει μια φορά στα 90 που απομένουν. Στη συνέχεια σου μένουν 40. Το 50λεπτο δε χωράει, οπότε πας στο αμέσως μικρότερο (20λεπτο). Το 20λεπτο χωράει στα 40, οπότε βάζεις κι ένα 20λεπτο στα ρέστα και συνεχίζεις. Σου μένουν 20. Μπορεί να βάλεις άλλο ένα 20λεπτο Σου μένουν 0. Τελείωσες. Έτσι, τα ρέστα σου έχουν διαμορφωθεί σε 1 50λεπτο και 2 20λεπτα. [1] Δηλαδή το αποτέλεσμα της ακέραιας διαίρεσης ανάμεσα στο ρέστα που απομένουν και το κέρμα που ελέγχεις εκείνη τη στιγμή είναι 1.
marinos#94 Δημοσ. 23 Οκτωβρίου 2014 Μέλος Δημοσ. 23 Οκτωβρίου 2014 Θα κάνεις ακέραιες διαιρέσεις με τα κέρματα(ξεκινώντας από το μεγαλύτερο) μέχρι να μηδενίσει. Που κολλάς συγκεκριμένα; κολλαω στο οτι δε μπορω να καταλαβω αν για παραδειγμα εχω 290 ρεστα( για ευκολια πραξεων το βαζω ετσι) και κανω 290 % 200 και 290 / 200 πως θα βγει μετα οτι θα εχω 1 κερμα των 2 ενα των 50 και 2 των 20? Θα μπορούσες να κάνεις το εξής: Χωρίζεις τα ευρώ και τα λεπτά σε 2 μέρη, δηλαδή για το παράδειγμά σου θα έχεις μια μεταβλητή με τιμή 2 και άλλη μία με τιμή 10. Ξεκινώντας από το μεγαλύτερο κέρμα, βλέπεις επαναληπτικά πόσα τέτοια κέρματα "χωράνε"[1] στο υπόλοιπο που έχεις. Παράδείγμα: 90 λεπτά ρέστα Το 50λεπτο χωράει μια φορά στα 90 που απομένουν. Στη συνέχεια σου μένουν 40. Το 50λεπτο δε χωράει, οπότε πας στο αμέσως μικρότερο (20λεπτο). Το 20λεπτο χωράει στα 40, οπότε βάζεις κι ένα 20λεπτο στα ρέστα και συνεχίζεις. Σου μένουν 20. Μπορεί να βάλεις άλλο ένα 20λεπτο Σου μένουν 0. Τελείωσες. Έτσι, τα ρέστα σου έχουν διαμορφωθεί σε 1 50λεπτο και 2 20λεπτα. [1] Δηλαδή το αποτέλεσμα της ακέραιας διαίρεσης ανάμεσα στο ρέστα που απομένουν και το κέρμα που ελέγχεις εκείνη τη στιγμή είναι 1. θεωρητικα δε μπορω να το κανω με επαναληψη γιατι δεν την διδαχτηκαμε ακομα ειμαι στα if και switch
Moderators Kercyn Δημοσ. 23 Οκτωβρίου 2014 Moderators Δημοσ. 23 Οκτωβρίου 2014 Τότε μπορείς να πάρεις όλους τους πιθανούς καφέδες που μπορείς να πάρεις με 5 ευρά και όλα τα πιθανά ρέστα και να ελέγχεις έτσι. Δηλαδή ξέρεις ότι με έναν καφέ τα ρέστα θα είναι 2 2ευρα, 1 20λεπτο και 1 10λεπτο. Με 2 θα είναι 1 2ευρω, 1 ευρώ, 1 50λεπτο και 1 10λεπτο κοκ. Αυτό μου έρχεται τώρα, ίσως υπάρχει λιγότερο άσχημος τρόπος αλλά χωρίς επανάληψη δε βλέπω πώς αλλιώς μπορεί να γίνει.
marinos#94 Δημοσ. 23 Οκτωβρίου 2014 Μέλος Δημοσ. 23 Οκτωβρίου 2014 μηπως γινεται με πολλαπλες if?εστω ρεστα = 290 δηλαδη στην πρωτη ελεγχω αν τα ρεστα ειναι πανω απο 200και κανω ρεστα_200(δηλαδη τα διευρα) = ρεστα / 200 ρεστα = ρεστα%200απο αυτα εχω οτι τα ρεστα πλεον ειναι 90 και συνεχιζω αναλογως με τα υπολοιπα κερματα γινεται???
Moderators Kercyn Δημοσ. 23 Οκτωβρίου 2014 Moderators Δημοσ. 23 Οκτωβρίου 2014 Και αν χρειαστεί κάπου να δώσεις 2 φορές το ίδιο κέρμα τι θα κάνεις; Δηλαδή μετά το ρεστα_200 = ρεστα / 200 τι θα έχεις; Το ίδιο για μονόευρα; Και αν τα ρέστα είναι 430;
antbyron Δημοσ. 23 Οκτωβρίου 2014 Δημοσ. 23 Οκτωβρίου 2014 a b c d e total = cof * 70 if (total <= 500) { total = 500 - (cof * 70) a = total / 200 total = total - ( a * 200) b = ... } else wrong έχετε ρέστα if ( a <> 0) εκτύπωσε α ... αυτός ο αλγόριθμος πρέπει να βγαίνει. Ίσως να χρειαστεί να βάλεις μερικές if για έλεγχο των α κλπ.
marinos#94 Δημοσ. 23 Οκτωβρίου 2014 Μέλος Δημοσ. 23 Οκτωβρίου 2014 οκ ευχαριστω πολυ παιδια αν και νομιζω το βρηκα με τον τροπο μου ...γιατι και 2 φορες να βγαινει το κερμα θα προκυπτει καθε φορα απο τη διαιρεση
zynif Δημοσ. 23 Οκτωβρίου 2014 Δημοσ. 23 Οκτωβρίου 2014 Δες τα http://en.wikipedia.org/wiki/Change-making_problem#Greedy_method http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/04GreedyAlgorithmsI.pdf
aravellalousta Δημοσ. 25 Οκτωβρίου 2019 Δημοσ. 25 Οκτωβρίου 2019 Στις 23/10/2014 στις 8:00 ΜΜ, antbyron είπε Θα κάνεις ακέραιες διαιρέσεις με τα κέρματα(ξεκινώντας από το μεγαλύτερο) μέχρι να μηδενίσει. Που κολλάς συγκεκριμένα; Έχω ακριβώς την ίδια άσκηση για την σχολή και είχα αυτόν τον τρόπο σκέψης και εγω. Στο χαρτί βγαίνει, στο πρόγραμμα όχι. Καμία ιδέα τι μπορεί να πηγαίνει στραβά;;
albNik Δημοσ. 25 Οκτωβρίου 2019 Δημοσ. 25 Οκτωβρίου 2019 Ολα αυτα ειναι λαθος coins1 % 100, coins50 % 50 ... πρεπει remains%100...
xristos97 Δημοσ. 25 Οκτωβρίου 2019 Δημοσ. 25 Οκτωβρίου 2019 (επεξεργασμένο) ^^^ Εχει δικιο Επισης δες εναν διαφορετικο τροπο με τον οποιο μπορεις να το λυσεις: #include "stdio.h" #define CENTS 100 #define MONEY_EUROS 100 #define MONEY_CENTS (MONEY_EUROS * CENTS) #define COFFEE_COST 2.5 // In euros int main() { printf("How many coffees? "); int coffees; scanf("%d", &coffees); int cost = coffees * (int)(COFFEE_COST * CENTS); int change = MONEY_CENTS - cost; if (cost > MONEY_CENTS) printf("There's not enough money for %d coffees\n", coffees); else { float banknotes[] = {500, 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01}; // In euros for (int i = 0; i < sizeof(banknotes) / sizeof(float); i++) { int count = change / (int)(banknotes[i] * CENTS); change %= (int)(banknotes[i] * CENTS); if (count != 0) printf("%.2f euros: %d\n", banknotes[i], count); } } return 0; } Επεξ/σία 25 Οκτωβρίου 2019 από xristos97
marios28 Δημοσ. 25 Οκτωβρίου 2019 Δημοσ. 25 Οκτωβρίου 2019 (επεξεργασμένο) 1 ώρα πριν, aravellalousta είπε Έχω ακριβώς την ίδια άσκηση για την σχολή και είχα αυτόν τον τρόπο σκέψης και εγω. Στο χαρτί βγαίνει, στο πρόγραμμα όχι. Καμία ιδέα τι μπορεί να πηγαίνει στραβά;; Δες τα παρακάτω πάνω στα δικά σου. Χωρίς επανάληψη, χωρίς υπόλοιπα, με ενδιάμεσες τυπώσεις, δηλαδή με μία μεταβλητή "coins". Αν τα coins είναι μηδέν κατά τη διαίρεση, τα ρέστα (change) παραμένουν αμετάβλητα. Δοκίμασέ το. #include <stdio.h> #define standardMoney 500 int main() { int coffees, cost, change, coins, remain; printf("How many coffees: "); scanf("%d", &coffees); cost = coffees * 70; change = standardMoney - cost; if (cost > 500) { printf("There's not enough money for %d coffees", coffees); } else { coins = change / 200; printf("2 euros: %d", coins); change = change - (coins * 200); coins = change / 100; printf("\n1 euros: %d", coins); change = change - (coins * 100); coins = change / 50; printf("\n50 cents: %d", coins); change = change - (coins * 50); coins = change / 20; printf("\n20 cents: %d", coins); change = change - (coins * 20); coins = change / 10; printf("\n10 cents: %d", coins); } return 0; } Επεξ/σία 25 Οκτωβρίου 2019 από marios28
3c0r1z Δημοσ. 25 Οκτωβρίου 2019 Δημοσ. 25 Οκτωβρίου 2019 Η λίστα του Kercyn που είναι; Αν είναι να δίνονται έτοιμες λύσεις καλό είναι να μην ξεχνάμε και την τεκμηρίωση. Μην πάθουν και τίποτα. Στην τελική είναι πυρηνική φυσική να χρησιμοποιήσεις κάποιον debugger για να γίνει οι οποίες διορθώσεις...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα