kaynd Νοέμβριος 14, 2012 #21 Κοινοποίηση Νοέμβριος 14, 2012 Φαντάζομαι ότι ήδη τον έδωσες όλο (τουλάχιστον το τμήμα που απασχολεί η μετατροπή σε 16αδικο.) Το "ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ" που παραθέτεις, απλά καλή τη "ΔΙΑΔΙΚΑΣΙΑ" που έγραψες παραπάνω. Αν πιστεύεις ότι έχεις κι άλλο κώδικα που αφορά τη μετατροπή, γραψ' τον. τι εγινε, εχουμε τσακωθεί με το [edit] button? η διαδικασια ξανακαλεί τον εαυτό της ωραια Link to comment Share on other sites More sharing options...
nucleus Νοέμβριος 14, 2012 #22 Κοινοποίηση Νοέμβριος 14, 2012 O πίνακας ΔΕΚΑΕΞΑΔΙΚΟ περιέχει όλα τα ψηφία από 0 - 9 και Α - F του δεκαεξαδικού (προφανώς έτσι ) Δεν περιέχει το αποτέλεσμα του υπολογισμού.Η αλλαγή που χρειάζεται είναι σχετικά απλή Select Case ypoloipo Case 10 : HexDigits += "a," Case 11 : HexDigits += "b," Case 12 : HexDigits += "c," Case 13 : HexDigits += "d," Case 14 : HexDigits += "e," Case 15 : HexDigits += "f," Case Else : HexDigits += ypoloipo.ToString & "," End Select Αυτό δεν χρειάζεται μόλις βρεις το ypoloipo απλώς κάνεις ΔΕΚΑΕΞΑΔΙΚΟ[ypoloipo] και το βάζεις στο τέλος της HexDigits HexDigits += ΔΕΚΑΕΞΑΔΙΚΟ[ypoloipo] & "," EDIT:Ξέχασα το "," που διαχωρίζει τα στοιχεία του αποτελέσματος Link to comment Share on other sites More sharing options...
kaynd Νοέμβριος 14, 2012 #23 Κοινοποίηση Νοέμβριος 14, 2012 για να καταλαβαινόμαστε, μιλάω μόνο για το αρχικό κομμάτι ψευδοκώδικα που παράθεσε ο painkiller44 και όχι για τον κώδικα σε VB του nucleus. Πιθανότατα έκανα λάθος εδω. Ο πίνακας "ΔΕΚΑΕΞΑΔΙΚΟ[ ]" Δε δημιουργείται στο κομμάτι του κώδικα που παραθέτεις. Θα μπορούσε να δημιουργείται άνετα έξω από αυτή τη διαδικασία, κάθε φορά που ολοκληρώνεται μια πράξη και φτάνει στο τέλος της. Αν υποθέσω ότι δε λείπει τίποτα απ τον ψευδοκωδικα, τότε ο πινάκας δημιουργείται και συμπληρώνεται κατά την εκτύπωση του στην οθόνη, ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1]), χωρίς να έχει δηλωθεί πουθενά προηγουμένως. (!?) (Δε ξέρω και με ποιους κανόνες δουλεύει η "Ψευδογλωσσα" που χρησιμοποιείς, εγώ τα μετατρέπω όλα σε C στο μυαλό μου ) Έτσι κι αλλιως, η μετατροπή που προτείνει ο nucleus μέσα στη διαδικασία μου μοιάζει πιο λογική από το να μεταφράζεις τα στοιχεία του πινάκα εκ των υστέρων. Link to comment Share on other sites More sharing options...
painkiller44 Νοέμβριος 14, 2012 Author #24 Κοινοποίηση Νοέμβριος 14, 2012 καλα θα ηταν να το κανω στην c με ενα printf("%x",timi) θα είχα καθαρίσει ΑΛΓΟΡΙΘΜΟΣ ΑΡΙΘΜΗΤΙΚΑ_ΣΥΣΤΗΜΑΤΑΣΤΑΘΕΡΕΣ/* Η Σταθερά ΣΤΟΙΧΕΙΑ περιέχει το πλήθος των στοιχείων του πίνακα ΟΚΤΑΔΙΚΟ */ΣΤΟΙΧΕΙΑ_ΟΚΤ = 8;/* Η Σταθερά ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ περιέχει το πλήθος των στοιχείων του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ = 16;ΔΕΔΟΜΕΝΑ/* ΔΕΚΑΕΞΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το δεκαεξαδικό σύστημα αρίθμησης */ΔΕΚΑΕΞΑΔΙΚΟ: ARRAY [1.. ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ] OF CHAR;/* ΟΚΤΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το Οκταδικό σύστημα αρίθμησης */ΟΚΤΑΔΙΚΟ:ARRAY[1.. ΣΤΟΙΧΕΙΑ_ΟΚΤ] OF CHAR;/* Το πλήθος των αριθμών που θα μετατραπούν */ΠΛΗΘΟΣ:INTEGER;ΔΕΚΑΔΙΚΟΣ:INTEGER;I:INTEGER;/* Το επιλεγόμενο σύστημα αρίθμησης */ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:INTEGER;ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N)ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 16 είναι μεγαλύτερο από το 0 */EAN (N(DIV(16)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞΑΔ() */ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));/* Εμφάνισε το στοιχειο του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(16))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 16 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_OKT(N)ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 8 είναι μεγαλύτερο από το 0 */EAN (N(DIV(8)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΜΕΤΑΤΡΟΠΗ_ΟΚΤ (N(DIV(8)));/* Εμφάνισε το στοιχειο του πίνακα ΟΚΤΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(8))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 8 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΟΚΤΑΔΙΚΟ[(N(MOD(8)))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣΣΥΝΑΡΤΗΣΗ ΕΠΙΛΟΓΗ()ΔΙΕΠΑΦΗΕΙΣΟΔΟΣΕΞΟΔΟΣΕΠΙΛΟΓΗ: INTEGER;ΔΕΔΟΜΕΝΑΕΠΙΛ:INTEGER;ΑΡΧΗΤΥΠΩΣΕ(“Διάλεξε αν θα μετατρέψεις στο 16αδικό ή στο 8αδικό σύστημα. Δώσε 1 για 16αδικό ή 2 για Οκταδικό”;ΔΙΑΒΑΣΕ(ΕΠΙΛ); /* Αμυντικός Προγραμματισμός Διασφάλιση ότι οι επιλογές είναι 1 ή 2 */ΕΝΟΣΩ ((ΕΠΙΛ<>1) ΚΑΙ (ΕΠΙΛ<>2)) ΕΠΑΝΑΛΑΒΕΤΥΠΩΣΕ(“Λάθος εισαγωγή τιμής. Δώσε 1 για 16αδικό ή 2 για Οκταδικό”);ΔΙΑΒΑΣΕ(ΕΠΙΛ)ΕΝΟΣΩ-ΤΕΛΟΣ;ΕΠΙΛΟΓΗ:=ΕΠΙΛΤΕΛΟΣ-ΣΥΝΑΡΤΗΣΗΣΑΡΧΗ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ*//* Εισαγωγή τιμών στον πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */ΔΕΚΑΕΞΑΔΙΚΟ[1]:= “0”;ΔΕΚΑΕΞΑΔΙΚΟ[2]:= “1”;ΔΕΚΑΕΞΑΔΙΚΟ[3]:= “2”;ΔΕΚΑΕΞΑΔΙΚΟ[4]:= “3”;ΔΕΚΑΕΞΑΔΙΚΟ[5]:= “4”;ΔΕΚΑΕΞΑΔΙΚΟ[6]:= “5”;ΔΕΚΑΕΞΑΔΙΚΟ[7]:= “6”;ΔΕΚΑΕΞΑΔΙΚΟ[8]:= “7”;ΔΕΚΑΕΞΑΔΙΚΟ[9]:= “8”;ΔΕΚΑΕΞΑΔΙΚΟ[10]:= “9”;ΔΕΚΑΕΞΑΔΙΚΟ[11]:= “A”;ΔΕΚΑΕΞΑΔΙΚΟ[12]:= “B”;ΔΕΚΑΕΞΑΔΙΚΟ[13]:= “C”;ΔΕΚΑΕΞΑΔΙΚΟ[14]:= “D”;ΔΕΚΑΕΞΑΔΙΚΟ[15]:= “E”;ΔΕΚΑΕΞΑΔΙΚΟ[16]:= “F”;/* Εισαγωγή τιμών στον πίνακα ΟΚΤΑΔΙΚΟ */ΟΚΤΑΔΙΚΟ[1]:=“0”;ΟΚΤΑΔΙΚΟ[2]:=“1”;ΟΚΤΑΔΙΚΟ[3]:=“2”;ΟΚΤΑΔΙΚΟ[4]:=“3”;ΟΚΤΑΔΙΚΟ[5]:=“4”;ΟΚΤΑΔΙΚΟ[6]:=“5”;ΟΚΤΑΔΙΚΟ[7]:= “6”;ΟΚΤΑΔΙΚΟ[8]:= “7”;ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:=ΕΠΙΛΟΓΗ();ΤΥΠΩΣΕ(“Πόσους αριθμούς θέλετε να μετατρέψετε”);ΔΙΑΒΑΣΕ(ΠΛΗΘΟΣ);ΓΙΑ Ι:= 1 ΕΩΣ ΠΛΗΘΟΣ ΕΠΑΝΑΛΑΒΕΤΥΠΩΣΕ(“Δώσε το Δεκαδικό αριθμό”);ΔΙΑΒΑΣΕ(ΔΕΚΑΔΙΚΟΣ);ΤΥΠΩΣΕ(ΔΕΚΑΔΙΚΟΣ);ΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=1) ΤΟΤΕΤΥΠΩΣΕ(“Η Δεκαεξαδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=2) ΤΟΤΕΤΥΠΩΣΕ(“Η Οκταδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΟΚΤ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΓΙΑ-ΤΕΛΟΣΤΕΛΟΣ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑΤΟΣ*/ το σκεπτικό θα ήθελα αν μπορει καποιος να μου εξηγήσει Link to comment Share on other sites More sharing options...
kaynd Νοέμβριος 14, 2012 #25 Κοινοποίηση Νοέμβριος 14, 2012 To πρόβλημα σου δεν είναι η γλωσσά προγραμματισμού. Ότι κάνεις στη C μπορείς να το κάνεις εδω, απλά μεταφράζεις τις εντολές στα ελληνικά.Ωραία, πόσταρες ολόκληρο τον κώδικα που περιέχει και αντίστοιχη μετατροπή σε 8αδικό, οκ λίγο παραπάνω κείμενο απ ότι χρειαζόταν αλλά δε πειράζει. Απλά για να έχει νόημα αυτό που γράφουμε, πρέπει να προχωρήσουμε περά από όσα έχουν ήδη γραφτεί. Από το πρώτο ποστ του darien, την εκδοχή που εξήγησε ο nucleus, ως την απομόνωση κομματιών του ψευδοκωδικα σου που ανάφερα στα δυο τελευταία ποστ, υπάρχει κάτι απ αυτά που δε καταλαβαίνεις? Προσπαθώ κι εγώ να καταλάβω σε ποιο σημείο κολλάς. Εγώ έγραψα σε ποιο σημείο του ψευδοκωδικα σκάλωσα. (μιλάω πάντα για τον κώδικα που παραθέτει ο painkiller44). Το πώς συμπληρώνεται ο πίνακας ΔΕΚΑΕΞΑΔΙΚΟ[] κατά τη διάρκεια των υπολογισμών... η μόνη εντολή που βλέπω να τον περιλαμβάνει κατά του υπολογισμούς, είναι η "ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])" Έγραψα πάνω μια υπόθεση αλλά δεν είμαι σίγουρος γι αυτήν.[edit][duh mode on] και μόλις κατάλαβα ότι ο πινάκας δεν δημιουργείται όσο τρέχει το πρόγραμμα... είναι ορισμένος εξ αρχής και περιέχει όλα τα ψηφία του δεκαεξαδικού, από το 1 ως το F και καθώς τρέχει η "Διαδικασία", επιλέγεται το ανάλογο κελί και το εκτυπώνει. [duh mode off] Άλλο πράγμα είχα στο μυαλό μου... αλλά εστίασα στο σημείο που σκάλωσα και κατάλαβα. Αντίστοιχα πρέπει κι εσύ να δείξεις συγκεκριμένα τι δε καταλαβαίνεις στον κώδικα.Επίσης πες αν ειναι σε πιον "Διερμηνευτή" το τρέχεις... και ποιά έκδοση του. Γιατί με το μάτι ο κώδικας που παραθέτεις μοιάζει να δουλεύει σωστά... δε μπορώ να δω γιατί λες ότι δε δουλεύει για νούμερα μεγαλύτερα του 16 Link to comment Share on other sites More sharing options...
nucleus Νοέμβριος 14, 2012 #26 Κοινοποίηση Νοέμβριος 14, 2012 Ετοιμαστείτε έρχεται κουβερτούλα /* Η Σταθερά ΣΤΟΙΧΕΙΑ περιέχει το πλήθος των στοιχείων του πίνακα ΟΚΤΑΔΙΚΟ */ΣΤΟΙΧΕΙΑ_ΟΚΤ = 8;/* Η Σταθερά ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ περιέχει το πλήθος των στοιχείων του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ = 16; ΣΤΑΘΕΡΕΣ Περιγραφικά τα σχόλια δεν έχουμε κάτι να εξηγήσουμε εδώ /* ΔΕΚΑΕΞΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το δεκαεξαδικό σύστημα αρίθμησης */ΔΕΚΑΕΞΑΔΙΚΟ: ARRAY [1.. ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ] OF CHAR;/* ΟΚΤΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το Οκταδικό σύστημα αρίθμησης */ΟΚΤΑΔΙΚΟ:ARRAY[1.. ΣΤΟΙΧΕΙΑ_ΟΚΤ] OF CHAR;/* Το πλήθος των αριθμών που θα μετατραπούν */ΠΛΗΘΟΣ:INTEGER;ΔΕΚΑΔΙΚΟΣ:INTEGER;I:INTEGER;/* Το επιλεγόμενο σύστημα αρίθμησης */ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:INTEGER; ΔΕΔΟΜΕΝΑ ΔΕΚΑΕΞΑΔΙΚΟ Array (ή πίνακας) χαρακτήρων (CHAR) ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ θέσεων (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 16). ΟΚΤΑΔΙΚΟ Array όπως και πιο πάνω με ΣΤΟΙΧΕΙΑ_ΟΚΤ θέσεων όμως (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 8). Σημείωση:Από το 1 αρίθμηση των ψευδοκώδικα μου μέσα σε όλες τις γλώσσες ξεκινάνε από το μηδέν ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 16 είναι μεγαλύτερο από το 0 */EAN (N(DIV(16)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞΑΔ() */ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));/* Εμφάνισε το στοιχειο του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(16))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 16 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣ ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N) "Συνάρτηση" μετατροπής ενός αριθμού N: INTEGER; που δέχεται σαν είσοδο σε ΔΕΚΑΕΞΑΔΙΚΟ. Αν Ν > 0 διαίρεσε το Ν με το 16: Ν(DIV(16)) = αποτέλεσμα της διαίρεσης Εαν το αποτέλεσμα είναι μεγαλύτερο του 0 Ξανακάλεσε τον εαυτό σου (ΑΝΑΔΡΟΜΗ ΕΠΙΔΡΟΜΗ) με όρισμα το αποτέλεσμα και φτου από την αρχή Αν το αποτέλεσμα είναι μικρότερο ή ίσο με το μηδέν (ΡΗΤΟΡΙΚΗ ΕΡΩΤΗΣΗ:μπορεί να είναι μικρότερο ?) Τότε εκτύπωσε το ψηφίο του δεκαεξαδικού στο οποίο αντιστοιχεί το Ν.Το κατάλληλο στοιχείο βρίσκεται στην θέση του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ με index το αποτέλεσμα της πράξης N(MOD(16))+1 κοινώς N modulo 16 αυξημένο κατά 1. ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 8 είναι μεγαλύτερο από το 0 */EAN (N(DIV(8)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΜΕΤΑΤΡΟΠΗ_ΟΚΤ (N(DIV(8)));/* Εμφάνισε το στοιχειο του πίνακα ΟΚΤΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(8))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 8 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΟΚΤΑΔΙΚΟ[(N(MOD(8)))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣ ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_OKT(N) Ίδια διαδικασία με την "συνάρτηση" ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N) ακριβώς τα ίδια βήματα με επάνω απλώς εδώ κάνει όλες τις πράξεις με 9 αντί 16. ΔΙΕΠΑΦΗΕΙΣΟΔΟΣΕΞΟΔΟΣΕΠΙΛΟΓΗ: INTEGER;ΔΕΔΟΜΕΝΑΕΠΙΛ:INTEGER;ΑΡΧΗΤΥΠΩΣΕ(“Διάλεξε αν θα μετατρέψεις στο 16αδικό ή στο 8αδικό σύστημα. Δώσε 1 για 16αδικό ή 2 για Οκταδικό”;ΔΙΑΒΑΣΕ(ΕΠΙΛ); /* Αμυντικός Προγραμματισμός Διασφάλιση ότι οι επιλογές είναι 1 ή 2 */ΕΝΟΣΩ ((ΕΠΙΛ<>1) ΚΑΙ (ΕΠΙΛ<>2)) ΕΠΑΝΑΛΑΒΕΤΥΠΩΣΕ(“Λάθος εισαγωγή τιμής. Δώσε 1 για 16αδικό ή 2 για Οκταδικό”);ΔΙΑΒΑΣΕ(ΕΠΙΛ)ΕΝΟΣΩ-ΤΕΛΟΣ;ΕΠΙΛΟΓΗ:=ΕΠΙΛΤΕΛΟΣ-ΣΥΝΑΡΤΗΣΗΣ ΣΥΝΑΡΤΗΣΗ ΕΠΙΛΟΓΗ() Ο κώδικας είναι επεξηγηματικότατος εδώ.Συνοπτικά δίνει στον χρήστη 2 επιλογές: 1 για 16αδικό ή 2 για Οκταδικό Και κάνει και έλεγχο λαθών . ΑΡΧΗ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ*//* Εισαγωγή τιμών στον πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */ΔΕΚΑΕΞΑΔΙΚΟ[1]:= “0”;ΔΕΚΑΕΞΑΔΙΚΟ[2]:= “1”;ΔΕΚΑΕΞΑΔΙΚΟ[3]:= “2”;ΔΕΚΑΕΞΑΔΙΚΟ[4]:= “3”;ΔΕΚΑΕΞΑΔΙΚΟ[5]:= “4”;ΔΕΚΑΕΞΑΔΙΚΟ[6]:= “5”;ΔΕΚΑΕΞΑΔΙΚΟ[7]:= “6”;ΔΕΚΑΕΞΑΔΙΚΟ[8]:= “7”;ΔΕΚΑΕΞΑΔΙΚΟ[9]:= “8”;ΔΕΚΑΕΞΑΔΙΚΟ[10]:= “9”;ΔΕΚΑΕΞΑΔΙΚΟ[11]:= “A”;ΔΕΚΑΕΞΑΔΙΚΟ[12]:= “B”;ΔΕΚΑΕΞΑΔΙΚΟ[13]:= “C”;ΔΕΚΑΕΞΑΔΙΚΟ[14]:= “D”;ΔΕΚΑΕΞΑΔΙΚΟ[15]:= “E”;ΔΕΚΑΕΞΑΔΙΚΟ[16]:= “F”;/* Εισαγωγή τιμών στον πίνακα ΟΚΤΑΔΙΚΟ */ΟΚΤΑΔΙΚΟ[1]:=“0”;ΟΚΤΑΔΙΚΟ[2]:=“1”;ΟΚΤΑΔΙΚΟ[3]:=“2”;ΟΚΤΑΔΙΚΟ[4]:=“3”;ΟΚΤΑΔΙΚΟ[5]:=“4”;ΟΚΤΑΔΙΚΟ[6]:=“5”;ΟΚΤΑΔΙΚΟ[7]:= “6”;ΟΚΤΑΔΙΚΟ[8]:= “7”;ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:=ΕΠΙΛΟΓΗ();ΤΥΠΩΣΕ(“Πόσους αριθμούς θέλετε να μετατρέψετε”);ΔΙΑΒΑΣΕ(ΠΛΗΘΟΣ);ΓΙΑ Ι:= 1 ΕΩΣ ΠΛΗΘΟΣ ΕΠΑΝΑΛΑΒΕΤΥΠΩΣΕ(“Δώσε το Δεκαδικό αριθμό”);ΔΙΑΒΑΣΕ(ΔΕΚΑΔΙΚΟΣ);ΤΥΠΩΣΕ(ΔΕΚΑΔΙΚΟΣ);ΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=1) ΤΟΤΕΤΥΠΩΣΕ(“Η Δεκαεξαδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=2) ΤΟΤΕΤΥΠΩΣΕ(“Η Οκταδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΟΚΤ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΓΙΑ-ΤΕΛΟΣΤΕΛΟΣ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑΤΟΣ*/ Κυρίως πρόγραμμα ή αλλιώς void main() όπως λέει η C. 1)Aρχικοποιεί τους πίνακες ΔΕΚΑΕΞΑΔΙΚΟ ή ΟΚΤΑΔΙΚΟ με απευθείας ανάθεση τιμών σε όλες τις θέσεις τους (Άσκηση προς τον αναγνώστη:Πως αλλιώς μπορείς να το κάνεις ?) 2) [B]ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:=ΕΠΙΛΟΓΗ();[/B] Παίρνουμε την επιλογή του χρήστη 3) [B]ΤΥΠΩΣΕ(“Πόσους αριθμούς θέλετε να μετατρέψετε”); ΔΙΑΒΑΣΕ(ΠΛΗΘΟΣ);[/B] Πόσους αριθμούς θέλετε να μετατρέψετε? Βάζω την επιλογή στην μεταβλητή ΠΛΗΘΟΣ.(Ορίστηκε στο τμήμα ΔΕΔΟΜΕΝΑ στην αρχή). 4) ΤΥΠΩΣΕ(“Δώσε το Δεκαδικό αριθμό”);ΔΙΑΒΑΣΕ(ΔΕΚΑΔΙΚΟΣ);ΤΥΠΩΣΕ(ΔΕΚΑΔΙΚΟΣ);ΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=1) ΤΟΤΕΤΥΠΩΣΕ(“Η Δεκαεξαδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=2) ΤΟΤΕΤΥΠΩΣΕ(“Η Οκταδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΟΚΤ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΓΙΑ-ΤΕΛΟΣ[/B] [B]ΓΙΑ Ι:= 1 ΕΩΣ ΠΛΗΘΟΣ ΕΠΑΝΑΛΑΒΕ Για κάθε αριθμό που εισάγει ο χρήστης μέχρι να φτάσουμε το ΠΛΗΘΟΣ που επέλεξε κάνουμε την μετατροπή του σε ΔΕΚΑΕΞΑΔΙΚΟ ή ΟΚΤΑΔΙΚΟ ανάλογα με την αρχική του επιλογή εκτελώντας τις "συναρτήσεις" ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ και ΜΕΤΑΤΡΟΠΗ_OKT αντίστοιχα που ορίστηκαν πιο πάνω. Link to comment Share on other sites More sharing options...
painkiller44 Νοέμβριος 14, 2012 Author #27 Κοινοποίηση Νοέμβριος 14, 2012 Ετοιμαστείτε έρχεται κουβερτούλα /* Η Σταθερά ΣΤΟΙΧΕΙΑ περιέχει το πλήθος των στοιχείων του πίνακα ΟΚΤΑΔΙΚΟ */ΣΤΟΙΧΕΙΑ_ΟΚΤ = 8;/* Η Σταθερά ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ περιέχει το πλήθος των στοιχείων του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ = 16; ΣΤΑΘΕΡΕΣ Περιγραφικά τα σχόλια δεν έχουμε κάτι να εξηγήσουμε εδώ /* ΔΕΚΑΕΞΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το δεκαεξαδικό σύστημα αρίθμησης */ΔΕΚΑΕΞΑΔΙΚΟ: ARRAY [1.. ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ] OF CHAR;/* ΟΚΤΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το Οκταδικό σύστημα αρίθμησης */ΟΚΤΑΔΙΚΟ:ARRAY[1.. ΣΤΟΙΧΕΙΑ_ΟΚΤ] OF CHAR;/* Το πλήθος των αριθμών που θα μετατραπούν */ΠΛΗΘΟΣ:INTEGER;ΔΕΚΑΔΙΚΟΣ:INTEGER;I:INTEGER;/* Το επιλεγόμενο σύστημα αρίθμησης */ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:INTEGER; ΔΕΔΟΜΕΝΑ ΔΕΚΑΕΞΑΔΙΚΟ Array (ή πίνακας) χαρακτήρων (CHAR) ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ θέσεων (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 16). ΟΚΤΑΔΙΚΟ Array όπως και πιο πάνω με ΣΤΟΙΧΕΙΑ_ΟΚΤ θέσεων όμως (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 8). Σημείωση:Από το 1 αρίθμηση των ψευδοκώδικα μου μέσα σε όλες τις γλώσσες ξεκινάνε από το μηδέν ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 16 είναι μεγαλύτερο από το 0 */EAN (N(DIV(16)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞΑΔ() */ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));/* Εμφάνισε το στοιχειο του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(16))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 16 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣ ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N) "Συνάρτηση" μετατροπής ενός αριθμού N: INTEGER; που δέχεται σαν είσοδο σε ΔΕΚΑΕΞΑΔΙΚΟ. Αν Ν > 0 διαίρεσε το Ν με το 16: Ν(DIV(16)) = αποτέλεσμα της διαίρεσης Εαν το αποτέλεσμα είναι μεγαλύτερο του 0 Ξανακάλεσε τον εαυτό σου (ΑΝΑΔΡΟΜΗ ΕΠΙΔΡΟΜΗ) με όρισμα το αποτέλεσμα και φτου από την αρχή Αν το αποτέλεσμα είναι μικρότερο ή ίσο με το μηδέν (ΡΗΤΟΡΙΚΗ ΕΡΩΤΗΣΗ:μπορεί να είναι μικρότερο ?) Τότε εκτύπωσε το ψηφίο του δεκαεξαδικού στο οποίο αντιστοιχεί το Ν.Το κατάλληλο στοιχείο βρίσκεται στην θέση του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ με index το αποτέλεσμα της πράξης N(MOD(16))+1 κοινώς N modulo 16 αυξημένο κατά 1. ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 8 είναι μεγαλύτερο από το 0 */EAN (N(DIV(8)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΜΕΤΑΤΡΟΠΗ_ΟΚΤ (N(DIV(8)));/* Εμφάνισε το στοιχειο του πίνακα ΟΚΤΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(8))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 8 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΟΚΤΑΔΙΚΟ[(N(MOD(8)))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣ ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_OKT(N) Ίδια διαδικασία με την "συνάρτηση" ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N) ακριβώς τα ίδια βήματα με επάνω απλώς εδώ κάνει όλες τις πράξεις με 9 αντί 16. ΔΙΕΠΑΦΗΕΙΣΟΔΟΣΕΞΟΔΟΣΕΠΙΛΟΓΗ: INTEGER;ΔΕΔΟΜΕΝΑΕΠΙΛ:INTEGER;ΑΡΧΗΤΥΠΩΣΕ(“Διάλεξε αν θα μετατρέψεις στο 16αδικό ή στο 8αδικό σύστημα. Δώσε 1 για 16αδικό ή 2 για Οκταδικό”;ΔΙΑΒΑΣΕ(ΕΠΙΛ); /* Αμυντικός Προγραμματισμός Διασφάλιση ότι οι επιλογές είναι 1 ή 2 */ΕΝΟΣΩ ((ΕΠΙΛ<>1) ΚΑΙ (ΕΠΙΛ<>2)) ΕΠΑΝΑΛΑΒΕΤΥΠΩΣΕ(“Λάθος εισαγωγή τιμής. Δώσε 1 για 16αδικό ή 2 για Οκταδικό”);ΔΙΑΒΑΣΕ(ΕΠΙΛ)ΕΝΟΣΩ-ΤΕΛΟΣ;ΕΠΙΛΟΓΗ:=ΕΠΙΛΤΕΛΟΣ-ΣΥΝΑΡΤΗΣΗΣ ΣΥΝΑΡΤΗΣΗ ΕΠΙΛΟΓΗ() Ο κώδικας είναι επεξηγηματικότατος εδώ.Συνοπτικά δίνει στον χρήστη 2 επιλογές: 1 για 16αδικό ή 2 για Οκταδικό Και κάνει και έλεγχο λαθών . ΑΡΧΗ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ*//* Εισαγωγή τιμών στον πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */ΔΕΚΑΕΞΑΔΙΚΟ[1]:= “0”;ΔΕΚΑΕΞΑΔΙΚΟ[2]:= “1”;ΔΕΚΑΕΞΑΔΙΚΟ[3]:= “2”;ΔΕΚΑΕΞΑΔΙΚΟ[4]:= “3”;ΔΕΚΑΕΞΑΔΙΚΟ[5]:= “4”;ΔΕΚΑΕΞΑΔΙΚΟ[6]:= “5”;ΔΕΚΑΕΞΑΔΙΚΟ[7]:= “6”;ΔΕΚΑΕΞΑΔΙΚΟ[8]:= “7”;ΔΕΚΑΕΞΑΔΙΚΟ[9]:= “8”;ΔΕΚΑΕΞΑΔΙΚΟ[10]:= “9”;ΔΕΚΑΕΞΑΔΙΚΟ[11]:= “A”;ΔΕΚΑΕΞΑΔΙΚΟ[12]:= “B”;ΔΕΚΑΕΞΑΔΙΚΟ[13]:= “C”;ΔΕΚΑΕΞΑΔΙΚΟ[14]:= “D”;ΔΕΚΑΕΞΑΔΙΚΟ[15]:= “E”;ΔΕΚΑΕΞΑΔΙΚΟ[16]:= “F”;/* Εισαγωγή τιμών στον πίνακα ΟΚΤΑΔΙΚΟ */ΟΚΤΑΔΙΚΟ[1]:=“0”;ΟΚΤΑΔΙΚΟ[2]:=“1”;ΟΚΤΑΔΙΚΟ[3]:=“2”;ΟΚΤΑΔΙΚΟ[4]:=“3”;ΟΚΤΑΔΙΚΟ[5]:=“4”;ΟΚΤΑΔΙΚΟ[6]:=“5”;ΟΚΤΑΔΙΚΟ[7]:= “6”;ΟΚΤΑΔΙΚΟ[8]:= “7”;ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:=ΕΠΙΛΟΓΗ();ΤΥΠΩΣΕ(“Πόσους αριθμούς θέλετε να μετατρέψετε”);ΔΙΑΒΑΣΕ(ΠΛΗΘΟΣ);ΓΙΑ Ι:= 1 ΕΩΣ ΠΛΗΘΟΣ ΕΠΑΝΑΛΑΒΕΤΥΠΩΣΕ(“Δώσε το Δεκαδικό αριθμό”);ΔΙΑΒΑΣΕ(ΔΕΚΑΔΙΚΟΣ);ΤΥΠΩΣΕ(ΔΕΚΑΔΙΚΟΣ);ΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=1) ΤΟΤΕΤΥΠΩΣΕ(“Η Δεκαεξαδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=2) ΤΟΤΕΤΥΠΩΣΕ(“Η Οκταδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΟΚΤ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΓΙΑ-ΤΕΛΟΣΤΕΛΟΣ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑΤΟΣ*/ Κυρίως πρόγραμμα ή αλλιώς void main() όπως λέει η C. 1)Aρχικοποιεί τους πίνακες ΔΕΚΑΕΞΑΔΙΚΟ ή ΟΚΤΑΔΙΚΟ με απευθείας ανάθεση τιμών σε όλες τις θέσεις τους (Άσκηση προς τον αναγνώστη:Πως αλλιώς μπορείς να το κάνεις ?) 2) [B]ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:=ΕΠΙΛΟΓΗ();[/B] Παίρνουμε την επιλογή του χρήστη 3) [B]ΤΥΠΩΣΕ(“Πόσους αριθμούς θέλετε να μετατρέψετε”); ΔΙΑΒΑΣΕ(ΠΛΗΘΟΣ);[/B] Πόσους αριθμούς θέλετε να μετατρέψετε? Βάζω την επιλογή στην μεταβλητή ΠΛΗΘΟΣ.(Ορίστηκε στο τμήμα ΔΕΔΟΜΕΝΑ στην αρχή). 4) ΤΥΠΩΣΕ(“Δώσε το Δεκαδικό αριθμό”);ΔΙΑΒΑΣΕ(ΔΕΚΑΔΙΚΟΣ);ΤΥΠΩΣΕ(ΔΕΚΑΔΙΚΟΣ);ΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=1) ΤΟΤΕΤΥΠΩΣΕ(“Η Δεκαεξαδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΕΑΝ (ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ=2) ΤΟΤΕΤΥΠΩΣΕ(“Η Οκταδική μορφή είναι:”);/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΟΚΤ() */ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΟΚΤ(ΔΕΚΑΔΙΚΟΣ)ΕΑΝ-ΤΕΛΟΣΓΙΑ-ΤΕΛΟΣ[/B] [B]ΓΙΑ Ι:= 1 ΕΩΣ ΠΛΗΘΟΣ ΕΠΑΝΑΛΑΒΕ Για κάθε αριθμό που εισάγει ο χρήστης μέχρι να φτάσουμε το ΠΛΗΘΟΣ που επέλεξε κάνουμε την μετατροπή του σε ΔΕΚΑΕΞΑΔΙΚΟ ή ΟΚΤΑΔΙΚΟ ανάλογα με την αρχική του επιλογή εκτελώντας τις "συναρτήσεις" ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ και ΜΕΤΑΤΡΟΠΗ_OKT αντίστοιχα που ορίστηκαν πιο πάνω. ωραια μεχρι εδω .προσπαθησε τωρα να τρεξεις τον κωδικα με τον νουμερακι 17 για παραδειγμα ο οποιος ειναι το 11 στον δεκαεξαδικο θα σου βγει ; Link to comment Share on other sites More sharing options...
painkiller44 Νοέμβριος 14, 2012 Author #28 Κοινοποίηση Νοέμβριος 14, 2012 To πρόβλημα σου δεν είναι η γλωσσά προγραμματισμού. Ότι κάνεις στη C μπορείς να το κάνεις εδω, απλά μεταφράζεις τις εντολές στα ελληνικά.Ωραία, πόσταρες ολόκληρο τον κώδικα που περιέχει και αντίστοιχη μετατροπή σε 8αδικό, οκ λίγο παραπάνω κείμενο απ ότι χρειαζόταν αλλά δε πειράζει. Απλά για να έχει νόημα αυτό που γράφουμε, πρέπει να προχωρήσουμε περά από όσα έχουν ήδη γραφτεί. Από το πρώτο ποστ του darien, την εκδοχή που εξήγησε ο nucleus, ως την απομόνωση κομματιών του ψευδοκωδικα σου που ανάφερα στα δυο τελευταία ποστ, υπάρχει κάτι απ αυτά που δε καταλαβαίνεις? Προσπαθώ κι εγώ να καταλάβω σε ποιο σημείο κολλάς. Εγώ έγραψα σε ποιο σημείο του ψευδοκωδικα σκάλωσα. (μιλάω πάντα για τον κώδικα που παραθέτει ο painkiller44). Το πώς συμπληρώνεται ο πίνακας ΔΕΚΑΕΞΑΔΙΚΟ[] κατά τη διάρκεια των υπολογισμών... η μόνη εντολή που βλέπω να τον περιλαμβάνει κατά του υπολογισμούς, είναι η "ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])" Έγραψα πάνω μια υπόθεση αλλά δεν είμαι σίγουρος γι αυτήν. [edit] [duh mode on] και μόλις κατάλαβα ότι ο πινάκας δεν δημιουργείται όσο τρέχει το πρόγραμμα... είναι ορισμένος εξ αρχής και περιέχει όλα τα ψηφία του δεκαεξαδικού, από το 1 ως το F και καθώς τρέχει η "Διαδικασία", επιλέγεται το ανάλογο κελί και το εκτυπώνει. [duh mode off] Άλλο πράγμα είχα στο μυαλό μου... αλλά εστίασα στο σημείο που σκάλωσα και κατάλαβα. Αντίστοιχα πρέπει κι εσύ να δείξεις συγκεκριμένα τι δε καταλαβαίνεις στον κώδικα. Επίσης πες αν ειναι σε πιον "Διερμηνευτή" το τρέχεις... και ποιά έκδοση του. Γιατί με το μάτι ο κώδικας που παραθέτεις μοιάζει να δουλεύει σωστά... δε μπορώ να δω γιατί λες ότι δε δουλεύει για νούμερα μεγαλύτερα του 16 EAN (N>0) ΤΟΤΕ EAN (N(DIV(16)))>0 ΤΟΤΕ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16))); ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1]) ΕΑΝ-ΤΕΛΟΣ ΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣ εστω ο αριθμος 17 τρεχει το προγραμμα .1)17>0 ΝΑΙ 2.)17div16>0 ΝΑΙ 3.)το σημείο τρια ειναι μελανο διοτι δεν υπαρχει ΕΑΝ-ΤΕΛΟΣ να προσδιορίσει τι θα εκτελεστει αν θα εκτελεστει αναδρομικα στον εαυτο του δηλαδη θα ξεκινησει παλι απο το σημειο 1)? αν θα τυπώσει το με το ΤΥΠΩΣΕ και εστω οτι τυπώνει καθε εκτελεση του εαυτου του θα υπάρξει αποτελεσμα 17mod16+1 =2 πρωτη φορα και μετα 1mod16+1=2 παλι .μονο ετσι βρισκω λογικη εξηγηση οτι καθε φορα που τρεχει τον εαυτο του θα υπάρχει εκτύπωση του 1 και μετα παλι 1 απο τον πινακα .τι λετε ?ειναι εφικτο ;:eek: Link to comment Share on other sites More sharing options...
nucleus Νοέμβριος 14, 2012 #29 Κοινοποίηση Νοέμβριος 14, 2012 ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N)ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 16 είναι μεγαλύτερο από το 0 */EAN (N(DIV(16)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞΑΔ() */ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));/* Εμφάνισε το στοιχειο του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(16))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 16 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣΤελικά το λάθος δεν το βρήκες ε?Άντε να το πάρει το ποτάμιΟ ψευδοκώδικας είναι λάθος.Το διόρθωσα στο VB κώδικα αλλά δεν το πρόσεξες :S.Έτσι όπως είναι πάνω δουλεύει για αριθμούς που η δεκαεξαδική τους μορφή είναι μονοψήφια.Για παραπάνω ψηφία δεν δουλεύει επειδή δεν αποθηκεύει πουθενά και δεν δείχνει σε κάθε αναδρομή το δεκαεξαδικό ψηφίο που υπολογίζειΣωστός είναι έτσιΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N)ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 16 είναι μεγαλύτερο από το 0 */ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])EAN (N(DIV(16)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞΑΔ() */ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));/* Εμφάνισε το στοιχειο του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(16))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 16 αυξημένο κατά 1*/ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣΚαι πάμε για το 17 με τον νεό κώδικαΠρώτη εκτέλεση: 17 MOD 16 = 1 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[1 + 1 = 2] = 117 DIV 16 = 1 Eδώ σε μια οποιαδήποτε γλώσσα θέλει να πάρεις το ακέραιο μέρος του αποτελέσματοςτο 1 είναι μεγαλύτερο του 0 (EAN (N(DIV(16)))>0) οπότε ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(1); (αναδρομή με όρισμα 1)Δέυτερη εκτέλεση:1 MOD 16 = 1 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[1 + 1 = 2] = 11 DIV 16 = 0 Δεν είναι μεγαλύτερο του 1 άρα τέρμα η εκτέλεση της συνάρτησης Έξοδος του προγράμματος 11. (και αυτό είναι λάθος βέβαια κανονικά πρέπει να αντιστρέφουμε τα ψηφια) και εξηγώΈστω δεκαδικός αριθμός 549.Η δεκαεξαδική του μορφή είναι με 225.Eκτελούμε τον κώδικα μας (με την αλλαγή)Εκτέλεση πρώτη:549 MOD 16 = 5 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[5 + 1 = 6] = 5549 DIV 16 = 34 > 0 άρα αναδρομή με όρισμα το 34Εκτέλεση δεύτερη:34 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 234 DIV 16 = 2 > 0 άρα αναδρομή με όρισμα το 2Εκτέλεση τρίτη:2 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 22 DIV 16 = 0 οπότε τερματίζειΕΞΟΔΟΣ:522 που είναι λάθος το σωστό είναι 225. Το ότι χρειάζεται αντιστροφή το είπαν και πιο πάνω άλλοι posters.Αυτά.EDIT:EAN (N(DIV(16)))>0 ΤΟΤΕΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΕΑΝ-ΤΕΛΟΣH εντολή ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1]) ΔΕΝ ΕΚΤΕΛΕΙΤΑΙ ΠΟΤΕ μιας και η ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16))); μεταφέρει τον έλεγχο στην αρχή της διαδικασίας. Οπότε ή βγάζεις το ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1]) από τον έλεγχο και το βάζεις πριν από το ΕΑΝ όπως έκανα σε αυτό το post ή αλλάζεις την σειρά EAN (N(DIV(16)))>0 ΤΟΤΕΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));ΕΑΝ-ΤΕΛΟΣ Link to comment Share on other sites More sharing options...
painkiller44 Νοέμβριος 14, 2012 Author #30 Κοινοποίηση Νοέμβριος 14, 2012 ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N)ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 16 είναι μεγαλύτερο από το 0 */EAN (N(DIV(16)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞΑΔ() */ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));/* Εμφάνισε το στοιχειο του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(16))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 16 αυξημένο κατά 1*/ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣΤελικά το λάθος δεν το βρήκες ε?Άντε να το πάρει το ποτάμιΟ ψευδοκώδικας είναι λάθος.Το διόρθωσα στο VB κώδικα αλλά δεν το πρόσεξες :S.Έτσι όπως είναι πάνω δουλεύει για αριθμούς που η δεκαεξαδική τους μορφή είναι μονοψήφια.Για παραπάνω ψηφία δεν δουλεύει επειδή δεν αποθηκεύει πουθενά και δεν δείχνει σε κάθε αναδρομή το δεκαεξαδικό ψηφίο που υπολογίζειΣωστός είναι έτσιΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N)ΔΙΕΠΑΦΗΕΙΣΟΔΟΣN: INTEGER;ΕΞΟΔΟΣΔΕΔΟΜΕΝΑΑΡΧΗEAN (N>0) ΤΟΤΕ /* Εάν το ακέραιο μέρος της διαίρεσης του Ν με το 16 είναι μεγαλύτερο από το 0 */ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])EAN (N(DIV(16)))>0 ΤΟΤΕ /* Το ακέραιο μέρος του πηλίκου περνάει στην επόμενη αναδρομική κλήση της διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞΑΔ() */ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));/* Εμφάνισε το στοιχειο του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ που βρίσκεται στη θέση Ν(MOD(16))+1 δηλαδή όσο είναι το υπόλοιπο της διαίρεσης του Ν με το 16 αυξημένο κατά 1*/ΕΑΝ-ΤΕΛΟΣΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣΚαι πάμε για το 17 με τον νεό κώδικαΠρώτη εκτέλεση: 17 MOD 16 = 1 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[1 + 1 = 2] = 117 DIV 16 = 1 Eδώ σε μια οποιαδήποτε γλώσσα θέλει να πάρεις το ακέραιο μέρος του αποτελέσματοςτο 1 είναι μεγαλύτερο του 0 (EAN (N(DIV(16)))>0) οπότε ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(1); (αναδρομή με όρισμα 1)Δέυτερη εκτέλεση:1 MOD 16 = 1 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[1 + 1 = 2] = 11 DIV 16 = 0 Δεν είναι μεγαλύτερο του 1 άρα τέρμα η εκτέλεση της συνάρτησης Έξοδος του προγράμματος 11. (και αυτό είναι λάθος βέβαια κανονικά πρέπει να αντιστρέφουμε τα ψηφια) και εξηγώΈστω δεκαδικός αριθμός 549.Η δεκαεξαδική του μορφή είναι με 225.Eκτελούμε τον κώδικα μας (με την αλλαγή)Εκτέλεση πρώτη:549 MOD 16 = 5 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[5 + 1 = 6] = 5549 DIV 16 = 34 > 0 άρα αναδρομή με όρισμα το 34Εκτέλεση δεύτερη:34 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 234 DIV 16 = 2 > 0 άρα αναδρομή με όρισμα το 2Εκτέλεση τρίτη:2 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 22 DIV 16 = 0 οπότε τερματίζειΕΞΟΔΟΣ:522 που είναι λάθος το σωστό είναι 225. Το ότι χρειάζεται αντιστροφή το είπαν και πιο πάνω άλλοι posters.Αυτά.EDIT:EAN (N(DIV(16)))>0 ΤΟΤΕΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΕΑΝ-ΤΕΛΟΣH εντολή ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1]) ΔΕΝ ΕΚΤΕΛΕΙΤΑΙ ΠΟΤΕ μιας και η ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16))); μεταφέρει τον έλεγχο στην αρχή της διαδικασίας. Οπότε ή βγάζεις το ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1]) από τον έλεγχο και το βάζεις πριν από το ΕΑΝ όπως έκανα σε αυτό το post ή αλλάζεις την σειρά EAN (N(DIV(16)))>0 ΤΟΤΕΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1])ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N(DIV(16)));ΕΑΝ-ΤΕΛΟΣΥπερευχαριστω .πραγματικα η λυση προφανως ειναι μονο με πινακα .γιατι reverse σε ψευδοκωδικα δεν μπορω να σκεφτω . Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.