Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Να γινει αλγοριθμος που να διαβαζει χλμ και να εμφανιζει τι σεβις χρειαζεται το αμαξι

Το αμαξι καινει ενα μικρο σερβις καθε 5000χλμ και ενα μεγαλο καθε 15000 πχ αμα εχει το αμαξι 20000χλμ χρειαζεται μικρο

 

Η λυση μ ειναι αυτη,νομιζω ειναι λαθος

 

Αλγοριθμος σερβις

Διαβασε χlm

Αν (χλμ mod 15000)>=5000 kai (χλμ mod 15000)<=15000 τοτε

Εμφανισε μικρο

Αλλιως

Εμφανισε μεγαλο

Τ.αν

Τ.σερβις

Δημοσ.

Κατ αρχην το (χλμ mod 15000)<=15000 ισχυει παντα. Αρα σιγουρα εισαι σε λαθος δρομο.

Κοιτα υπαρχει περίπτωση το αμαξι να μην θελει καθολου σερβις. Αρα 3 πιθανα σενάρια:

  1. Θελει μεγαλο σερβις
  2. Θελει μικρο σερβις
  3. Δεν θελει σερβις

Οπότε εχουμε και λεμε

Αλγοριθμος σερβις
Διαβασε χλμ
Αν χλμ > 15000 τοτε
  Εμφανισε μεγαλο
Αλλιως αν χλμ >= 5000 τοτε
  Εμφανισε μικρο
Αλλιως
  Εμφανισε καθολου
Τ.αν
Τ.σερβις 
Δημοσ.

Κατ αρχην το (χλμ mod 15000)<=15000 ισχυει παντα. Αρα σιγουρα εισαι σε λαθος δρομο.

Κοιτα υπαρχει περίπτωση το αμαξι να μην θελει καθολου σερβις. Αρα 3 πιθανα σενάρια:

  • Θελει μεγαλο σερβις
  • Θελει μικρο σερβις
  • Δεν θελει σερβις
Οπότε εχουμε και λεμε
Αλγοριθμος σερβις
Διαβασε χλμ
Αν χλμ > 15000 τοτε
  Εμφανισε μεγαλο
Αλλιως αν χλμ >= 5000 τοτε
  Εμφανισε μικρο
Αλλιως
  Εμφανισε καθολου
Τ.αν
Τ.σερβις 
Ευχαριστω για την βοηθεια αλλα δεν καταλαβες την ασκηση

Θα δωσω αλλο ενα παραδειγμα

Αμα το αμαξι εχει 30.000 θα πρεπει να κανεις μεγαλο γιατι ειχε γινει τελευταια φορα στα 15000

Αμα εχει 35000 Χρειαζεται μικρο γιατι εχει κανει τελευταια φορα στα 30000

 

Δεν ειναι τοσο απλο δυστηχως

Δημοσ.

 

Κατ αρχην το (χλμ mod 15000)<=15000 ισχυει παντα. Αρα σιγουρα εισαι σε λαθος δρομο.

Κοιτα υπαρχει περίπτωση το αμαξι να μην θελει καθολου σερβις. Αρα 3 πιθανα σενάρια:

  1. Θελει μεγαλο σερβις
  2. Θελει μικρο σερβις
  3. Δεν θελει σερβις

Οπότε εχουμε και λεμε

Αλγοριθμος σερβις
Διαβασε χλμ
Αν χλμ > 15000 τοτε
  Εμφανισε μεγαλο
Αλλιως αν χλμ >= 5000 τοτε
  Εμφανισε μικρο
Αλλιως
  Εμφανισε καθολου
Τ.αν
Τ.σερβις 

 

Και άμα το αμαξι έχεις πάνω από 15000 χλμ θα θέλει συνέχεια μεγαλο service;

Τον ts τον ενδιαφέρει το ανα 5κ και 15κ χιλιόμετρα

  • Like 1
Δημοσ.

Άρα μεταφέρεις σε 2η μεταβλητή τα χμ και την μηδενίζεις ανα 15.000 την μία και ανα 5000 για το μικρό.

 

Έχεις τρεις μεταβλητές που οι δύο μηδενίζουν ανα 5Κ και 15Κ αλλά το βήμα τους είναι ίδιο.

Δημοσ.

Το mod είναι το υπόλοιπο της διαίρεσης? 

εάν ναι

if km mod 15000==0 or km mod 15000>10000:
emfanise 'megalo'
else:
emfanise 'mikro'
 
 Δηλαδή εάν είσαι ακριβώς για μεγάλο ή έχεις κάνει πάνω από 10000 κμ μετά το μεγάλο είσαι για μεγάλο αλιώς είσαι για μικρό
Δεν καλύπτεται η περίπτωση με 0κμ που πας για μικρό στα 5000 και πρέπει να την βάλεις χωριστά
Δημοσ.

Αν km < 5000 return "kanena"

 

Αν όχι, θέλουμε σέρβις. Τα σέρβις επαναλαμβάνονται με κύκλο διάρκειας 3, μικρό-μικρό-μεγάλο. Επομένως θέλουμε να κάνουμε κάτι modulo 3 για να μας δώσει την τελική απάντηση. Τι θα κάνουμε modulo? Τον αριθμό των συμπληρωμένων 5000 km, αφού σέρβις κάποιου είδους έχουμε ανά 5000km.

 

pentoxiliara = km DIV 5000

 

όπου DIV η ακέραια διαίρεση προς αποφυγή παρεξηγήσεων. Αυτό που κάνει η C ανάμεσα σε int και int.

 

service = pentoxiliara % 3 == 2 ? "megalo" : "mikro"

 

Το αποτέλεσμα του modulo συγκρίνεται με το 2 επειδή το μεγάλο σέρβις έρχεται τελευταίο, μετρώντας από το μηδέν στη θέση 2 του κύκλου παραπάνω.

 

Υπάρχει μόνο ένα πρόβλημα ακόμα, αυτό στην πραγματικότητα μας δίνει τον κύκλο μικρό-μεγάλο-μικρό επειδή τα πρώτα 5000 km δεν θέλουν κανένα σερβις. Πώς θα φέρουμε τα πράγματα στη θέση τους; Αφαιρώντας ένα πεντοχίλιαρο πριν τον υπολογισμό του modulo.

 

Άρα όλο μαζί γίνεται

 

Αν km < 5000 return "kanena"

km = km - 5000   // αυτό μπορεί βέβαια να ενσωματωθεί στο επόμενο

return (km DIV 5000) % 3 == 2 ? "megalo" : "mikro"

  • Like 2
Δημοσ.

αν υποθέσουμε οτι εκανε σερβις στην προηγούμενη, απλα κανεις mod 15000

Αλγοριθμος σερβις
Διαβασε χλμ
χλμ <- χλμ mod 15000
Αν χλμ = 0 τοτε
  Εμφανισε μεγαλο
Αλλιως αν χλμ >= 5000 τοτε
  Εμφανισε μικρο
Αλλιως
  Εμφανισε καθολου
Τ.αν
Τ.σερβις
Δημοσ.

Πρέπει να ξεκαθαριστεί αν η τιμή 'κανένα' παίζει

επίσης τι πρέπει να επιστρέφει ο αλγόριθμος αν ο χιλιομετρητής δείχνει 9.999 και τί στα 10.001 

Η αρχική μου εκτίμηση ήταν ότι το κανένα δεν παίζει

στα 5.001 όπως και στα 9.999 πρέπει να δώσει μικρό το service των 10.000 δηλαδή  ενώ στα 10.001 πρέπει να δώσει μεγάλο το service των 15000

 

defacer 

  γιατί λες αν km<5000 να επιστρέψει 'κανένα' (δηλαδή στα 4999 επιστρέφει κανένα)

  ενώ στα 5001 που έγινε service πριν 1 κμ να επιστρέψει 'μικρό'

Δημοσ.

Πήρα ως δεδομένο πως προσπαθούμε να απαντήσουμε στην ερώτηση "τι σέρβις πρέπει να κάνω αυτή τη στιγμή αν υποθέσουμε ότι τα παλιά μου σερβις είναι εντάξει".

 

Δηλαδή, μια μέρα πας στο αμάξι και βλέπεις λέει 36742 χιλιόμετρα. Ουπς, ξέχασα να κάνω σέρβις, τι γίνεται τώρα; Θα κάνεις ένα μικρό δεδομένου ότι το 30000 το έκανες και είναι μεγάλο, ενώ το 35000 δεν το έκανες.

 

Διαφορετικά η άλλη εναλλακτική είναι να υποθέσεις ότι ΟΛΑ τα προηγούμενα σέρβις είναι εντάξει, που θα έδινε "κανένα" σε οποιοδήποτε νούμερο χιλιομετρητή δεν είναι πολλαπλάσιο του 5Κ, που δε μου φαίνεται ιδιαίτερα χρήσιμο πρακτικά. Αλλά sure εφόσον δεν ξεκαθαρίζεται από την εκφώνηση θα μπορούσες να το δεις κι έτσι.

 

Αυτό που δε βρίσκω καθόλου λογικό είναι να πεις ότι στα 10001 θα πρέπει να δώσει το σέρβις των 15000.

Δημοσ.

Πήρα ως δεδομένο πως προσπαθούμε να απαντήσουμε στην ερώτηση "τι σέρβις πρέπει να κάνω αυτή τη στιγμή αν υποθέσουμε ότι τα παλιά μου σερβις είναι εντάξει".

 

Δηλαδή, μια μέρα πας στο αμάξι και βλέπεις λέει 36742 χιλιόμετρα. Ουπς, ξέχασα να κάνω σέρβις, τι γίνεται τώρα; Θα κάνεις ένα μικρό δεδομένου ότι το 30000 το έκανες και είναι μεγάλο, ενώ το 35000 δεν το έκανες.

 

Διαφορετικά η άλλη εναλλακτική είναι να υποθέσεις ότι ΟΛΑ τα προηγούμενα σέρβις είναι εντάξει, που θα έδινε "κανένα" σε οποιοδήποτε νούμερο χιλιομετρητή δεν είναι πολλαπλάσιο του 5Κ, που δε μου φαίνεται ιδιαίτερα χρήσιμο πρακτικά. Αλλά sure εφόσον δεν ξεκαθαρίζεται από την εκφώνηση θα μπορούσες να το δεις κι έτσι.

 

Αυτό που δε βρίσκω καθόλου λογικό είναι να πεις ότι στα 10001 θα πρέπει να δώσει το σέρβις των 15000.

Εννοειται οτι τα προηγουμενα σερβις ειναι ενταξει

Δημοσ.

Αν πρέπει να κάνει μόνο στα πολλαπλάσια του 5Κ τότε απλά στη λύση μου αλλάξτε το 

 

Αν km < 5000 return "kanena"

 

σε

 

Αν km < 5000 || km % 5000 != 0 return "kanena"

 

Βέβαια το ίδιο πράγμα μπορείς να το γράψεις με διάφορους παρόμοιους τρόπους εν τέλει.

Δημοσ.

Αν ξεκαθαρίσει και το input, output είμαστε σε καλό δρόμο

input πολλαπλάσιο του 5000 ή οποιαδήποτε ένδειξη του χιλιομετρητή

output 'μικρό, μεγάλο ' ή 'μικρό, μεγάλο, κανένα' 

Δημοσ.

Μια λύση που πιστεύω καλύπτει κάθε ειδους εκφώνηση της συγκεκριμένης άσκησης:

Διαβασε χλμ
i = 0
Οσο χλμ >= 5000 επαναλαβε
    i = i + 1
    χλμ = χλμ - 5000
Τελος_επαναληψης

Αν i>0
   Αν χλμ == 0 τοτε
      i = i - 1
      χλμ = 5000
   Τελος_αν
   μεχρι_σερβις = 5000 - χλμ
   Αν ( i + 1) mod 3 == 0 τοτε
      Γραψε "Θα χρειαστεί σε ",μεχρι_σερβις,"μεγαλος σερβις'    
   αλλιως
      Γραψε "Θα χρειαστεί σε ",μεχρι_σερβις,"μεγαλο σερβις"
  τελος_αν
αλλιως
  μεχρι_σερβις = 5000 - χλμ
  Γραψε "Μικρο σερβις σε ",μεχρι_σερβις," χλμ"
τελος_αν

Η σκέψη μου:

 

 

Ουσιαστικά ανα 3 σερβις θα χρειάζεται μεγάλο σέρβις οπότε μετράω τα σερβις και οπως βλεπεις εκτυπώνω αναλόγως. Είναι αργή λύση αλλά πιστεύω ικανοποιεί το πρόβηλμα.

 

Tο μεχρι_σερβις εκτυπώνει σε πόσα χλμ θα χρειαστεί το αντίστοιχο σερβις. Αν ο χρήστης δώσει κατι αλλό εκτός απο πολλαπλάσιο του 5000 τότε θα υπολογίσει σε πόσα χλμ θα χρειαστεί το επόμενο σέρβις (και τι είδος σέρβις είναι).

 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...