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

Προβλημα σε loop ψευδοκωδικα.


nickname2016

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

Είναι ωραίο το πρόβλημα γιατί σε βάζει στην ουσία της χρήσης της υποδιαίρεσης. Δηλαδή με την επανάληψη που δείχνεις πριν από 60 στο 167 βγάζεις τι; Τίποτα διότι πρέπει να βρεις τις ώρες και αυτό σημαίνει ότι 1.5 ώρα κλήση και 1.7 ώρα κλήση θα είναι 2 ώρες η κάθε μία άρα θα είναι 4 ώρες!

 

και στο προηγούμενο θέμα που έθιξα το 3599 είναι στην ώρα γιατί η πρώτη 60 άδα είναι το πρώτο λεπτό..άρα η 59η 60άδα είναι το 59 λεπτό, και μετά πάμε στην ώρα, άρα τα 60 δευτερόλεπτα μετά το 59*60 είναι στην μια ώρα!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 33
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Για να μην το κουράζουμε το θέμα: Αυτή είναι η λύση

Δεν είναι εύκολο γιατί έχει μπέρδεμα με τα δευτερόλεπτα που εισάγουμε και τα λεπτά και ώρες που παίρνουμε.

 

Ν=0
Πίνακας α(63) \ 0 62, χρήση από 1 έως 62
Τερμάτισε=Ψευδής
Επανέλαβε {
      Εισαγωγή "Κλήση=", δευτ
      αν δευτ>=1 και δευτ<=10000 τότε {
            Ν++
            Αν (δευτ-1) δια 60 <59 τότε {
                α((δευτ-1) δια 60+1)++
            } αλλιώς {
                α((δευτ-1) δια 3600+60)++
            }
      } Αλλιώς {
      Τερμάτισε=Αληθής
      }
} Μέχρι Τερμάτισε
Αν Ν>0 τότε {
      Τύπωσε "Συνολικές Κλήσεις :", Ν
      αν α(1)>0 τότε Τύπωσε μορφή$("Κλήσεις 1 λεπτού : {0}", α(1))
      Για ι=2 έως 59 {
            αν α(ι)>0 τότε Τύπωσε μορφή$("Κλήσεις {0} λεπτών : {1}", ι,α(ι))
      }
      αν α(60)>0 τότε Τύπωσε μορφή$("Κλήσεις 1 ώρας : {0}", α(60))
      Για ι=61 έως 62 {
            αν α(ι)>0 τότε Τύπωσε μορφή$("Κλήσεις {0} ωρών : {1}", ι-59,α(ι))
      }
}

θα μπορούσε κανείς να βάλει το Αν Ν>0 τότε { ...}  μέσα στην Επανέλαβε για να δείχνει σε κάθε εισαγωγή αποτέλεσμα! Απλά κάποια στιγμή μπορεί να ήθελε 62 γραμμές (59 για τα λεπτά και 3 για τις ώρες)


Το ωραίο στο κώδικα είναι ότι η πρώτη ώρα βγαίνει ΜΟΝΟ για τα δευτερόλεπτα από το 59*60+1 έως το 60*60, δηλαδή μόνο για 60 δευτερόλεπτα. Μετά πάει μια ώρα επιπλέον! Η οποία θα βγει μέχρι και το 59 λεπτό της γιατί μετά θα πάμε στην επόμενη ώρα!


Με τον τρόπο του Defacer (με 167 εγγραφές). Απλά κάνουμε μια επιπλέον σούμα για τη 2η και τρίτη ώρα.

 

Ν=0 : κ=0

Πίνακας α(168)
Τερμάτισε=Ψευδής
Επανέλαβε {
      Εισαγωγή "Κλήση=", δευτ
      αν δευτ>=1 και δευτ<=10000 τότε {
            Ν++
            α((δευτ-1) δια 60+1)++
      } Αλλιώς {
      Τερμάτισε=Αληθής
      }
} Μέχρι Τερμάτισε
Αν Ν>0 τότε {
      Τύπωσε "Συνολικές Κλήσεις :", Ν
      αν α(1)>0 τότε Τύπωσε μορφή$("Κλήσεις 1 λεπτού : {0}", α(1))
      Για ι=2 έως 59 {
            αν α(ι)>0 τότε Τύπωσε μορφή$("Κλήσεις {0} λεπτών : {1}", ι,α(ι))
      }
      κ=61
      Για ι=62 έως 167 {
            αν α(ι)>0 τότε α(κ)+=α(ι)
            αν (ι +1) υπολ 60 =0 τότε κ++
      }
      αν α(60)>0 τότε Τύπωσε μορφή$("Κλήσεις 1 ώρας : {0}", α(60))
      Για ι=61 έως 62 {
            αν α(ι)>0 τότε Τύπωσε μορφή$("Κλήσεις {0} ωρών : {1}", ι-59,α(ι))
      }
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά είναι σούπερ απλό και δεν ξέρω γιατί το συζητάμε. Δίνω JavaScript γιατί πονάνε τα μάτια μου να διαβάζω ψευδογλώσσες.

var d, durations = new Array(167).fill(0);

while((d = parseInt(prompt("duration in seconds? (-1 to stop looping)"), 10)) != -1) {
    var index = d / 60 | 0; // integer division
    ++durations[index];
}

for (var i = 0; i < 60; ++i) {
    console.log("Durations between " + i + " and " + (i + 1) + " minutes = " + durations[i]);
}

var sum = 0;
for (var i = 60; i < 120; ++i) sum += durations[i];
console.log("Durations between 1 and 2 hours = " + sum);

var sum = 0;
for (var i = 120; i < 167; ++i) sum += durations[i];
console.log("Durations between 2 and 3 hours = " + sum);

Live εδώ. Δεν είναι και πολύ σόι σαν JavaScript κώδικας γιατί προσπάθησα να την κρατήσω πολύ κοντά σε κάτι αντίστοιχο με ψευδογλώσσα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το Live δεν παίζει...Ενώ μαζεύει νούμερα το log δεν εμφανίζεται!

ο κώδικας προφανώς είναι λάθος χωρίς πολλά πολλά!

διότι εμφανίζει τιμές "μεταξύ" ορίων...Οπότε αντί να εμφανίζει τρεις ενδείξεις για τις ώρες (1η, 2η, 3η) εμφανίζει 2...

 

δεν γίνεται να εμφανίζει από 1 έως 2 και το 2 μέσα και μετά από 2 έως 3 με το 2 πάλι μέσα...

έτσι πρέπει να βγάλει κάτι..Αν βγάλει το 2, στη δεύτερη ώρα θα βγάλει το 3 άρα θα μετράει μέχρι το 7200. Μέχρι το 10000 θα πάνε χαμένες οι κλήσεις!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το ξέρεις ότι για να εμφανιστεί η έξοδος από την console.log πρέπει πρώτα να ανοίξεις την κονσόλα έτσι;  :rolleyes:

 

Ο κώδικας για τις ανάγκες της συζήτησης ας πούμε ότι δεν ξέρω αν είναι γενικά σωστός, αλλά σίγουρα δεν είναι λάθος με τον τρόπο που λες. Αν θες να το συζητήσουμε περισσότερο ξέρεις υποθέτω πώς γίνεται: [α] τι έκανες, [β] τι περίμενες να συμβεί, [γ] γιατί περίμενες να συμβεί το αυτό, [δ] τι συνέβη τελικά.

 

Αν και θα έπρεπε να είναι προφανές από το ότι οι συνθήκες τερματισμού στα for είναι όλες με μικρότερο και όχι με μικρότερο-ίσον.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ok νόμιζα θα έβγαζε καμία πάνω στη σελίδα. Κατάλαβα...άνοιξα τον έλεγχο και από εκεί κάνεις επιλογή τη κονσόλα!

Για το σκεπτικό σου δουλεύει το πρόγραμμα! :-D

Αν του κάνει του nickname2016..δεν γνωρίζω! Νομίζω ότι η περιγραφή του ήταν λάθος! 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλά Κρασιά...βλέπω Πάπι πήρες και παρέα για υποστήριξη!

Άσχετα με τις συνθήκες τερματισμού...αυτό εδώ είναι λάθος:

 

Από 1 έως 2

και

Από 2 έως 3

 

Δηλαδή αν κάποιος έβλεπε τα αποτελέσματα θα έπρεπε να είχε και επεξηγήσεις ότι το (2) δεν είναι στο πρώτο. και το (3) δεν είναι στο δεύτερο, ή ότι το (1) δεν είναι στο πρώτο και το (2) δεν είναι στο δεύτερο;

Ούτε εσύ Πάπι ούτε ο Visualizer το καταλάβατε! Το "τα ξέρω όλα" δεν ισχύει...αλλά όταν σου δίνω το επιχείρημα θέλω το αντεπιχείρημα. Ο Defacer με καλεί να δω το κώδικα. Πρώτα με ενδιαφέρει τι αποτελέσματα δίνει σε σχέση με το πως τα ονομάζει! Βασίστηκε στη περιγραφή του OP ως πως το πως περίπου τα θέλει χωρισμένα.. Έκανε σαν τον γιαπωνέζο που από ένα ελαττωματικό κομμάτι του είπαν "φτιάξε το ίδιο" και το έκανε το ίδιο ελαττωματικό!

(κανονικά δεν ασχολούμαι τόσο με ένα θέμα αλλά η επένδυση στη μάθηση είναι πάντα καλό, είναι μια προσφορά)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν, περιοριζόμενοι καθαρά στο πώς δουλεύει ο κώδικας.

 

AFAIK σε όλο τον πλανήτη όταν προγραμματίζουμε λογική "από 1 μέχρι 2 μέρες" εννοούμε "από 24 ώρες 0 λεπτά 0 δευτερόλεπτα μέχρι 47 ώρες 59 λεπτά 59 δευτερόλεπτα". Αυτό ακριβώς κάνει ο κώδικας παραπάνω, αυτό κάνει και οποιοσδήποτε άλλος κώδικας βάζει πράγματα σε buckets γιατί δεν υπάρχει καμία άλλη "λογική" (δηλαδή, που να δίνει αποτελέσματα τα οποία δεν καταλήγουν πολύ εύκολα σε "παράδοξα" ή "λάθος" αποτελέσματα όταν εξετάζεις το μοίρασμα στο σύνολό του). Είναι σούπερ στάνταρ σε σημείο there is nothing to think about.

 

Για να ξαναπώ το ίδιο πράγμα με άλλα λόγια: όταν λέμε "πωλήσεις που έγιναν από το Νοέμβριο μέχρι το Δεκέμβριο", η πρώτη Δεκεμβρίου ή μέρος αυτής δεν περιλαμβάνεται.

 

Εγώ θεωρώ πως η πλειοψηφία των ανθρώπων και το σύνολο των προγραμματιστών που θα καθήσουν να το σκεφτούν μισό λεπτό θα καταλήξουν στο ίδιο συμπέρασμα γιατί όπως είπα, οποιοδήποτε άλλο συμπέρασμα οδηγεί σε παράδοξα και λάθη. Εσύ θεωρείς ότι αυτό χρειάζεται επεξήγηση. Cool, όταν γράψεις τέτοιο πρόγραμμα βάλε και επεξηγήσεις. Αλλά από αυτό το σημείο πώς φτάνουμε στο "ο κώδικας έχει λάθος" μόνο εσύ το ξέρεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πάλι δεν εξήγησες..

Αν ο κ Νίκος μένει από 1ο Μέχρι 2ο όροφο και ο κ. Πέτρος από Ισόγειο μέχρι πρώτο...Υπάρχει περίπτωση να μένουν και οι δυο στον ίδιο όροφο....Προφανώς όχι. Άρα η λογική "από έως" για σύγκριση δυο ατόμων εδώ είναι ΟΚ.

Αν τώρα σου πως ότι από Ισογειο μέχρι 1ο μένουν 10, από 1ο μέχρι 2ο μένουν 5 και από 2ο μέχρι 3ο μένουν 20..και σε ρωτήσω: πόσοι μένουν στο 2ο ...τι θα απαντήσεις; 5 ή 20;

Όπως διαβάζω τη λίστα οι 10 μένουν στο Ισόγειο, οι 5 στο πρώτο και οι 20 στο δεύτερο...Στο 3ο δεν μπορεί να μείνει κανείς (αφού δεν έχεις ένδειξη έστω και μηδενική)

Θες να το διαβάσω αλλιώς;

Οι δέκα μένουν στο πρώτο, οι 5 στο δεύτερο και οι 20 στο τρίτο..Και πόσοι μένουν στο ισόγειο; Ουδείς;

 

Το έπιασες το λάθος σου;

 

 

Επιπλέον το πάνω όριο στην περιοχή π.χ. 2 λεπτά με 3 λεπτά πρέπει να είναι εντός γιατί αλλιώς κόβεις δεκαδικά και στις χρεώσεις δεν γίνεται...δηλαδή αν κάποιος μιλήσει 3.5 ώρες και έχει χρέωση ανά ώρα θα γράψει 4 ώρες και όχι 3. Εσύ θα το έβαζες όμως μεταξύ 3 και 4 (Αλλά όχι 4). Αν πάλι μίλαγε κάποιος 4 ώρες θα το έβαζες μεταξύ 4 και 5, άρα σε άλλη κατηγορία. Όμως και το 3.5 και το 4 χρεώνονται το ίδιο!

 

(το 3.5 ώρες είναι στο άρτιο 4)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...