Jump to content



Ερώτηση περι ψευδωκώδικα


painkiller44

Recommended Posts

Φαντάζομαι ότι ήδη τον έδωσες όλο (τουλάχιστον το τμήμα που απασχολεί η μετατροπή σε 16αδικο.) Το "ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ" που παραθέτεις, απλά καλή τη "ΔΙΑΔΙΚΑΣΙΑ" που έγραψες παραπάνω.

Αν πιστεύεις ότι έχεις κι άλλο κώδικα που αφορά τη μετατροπή, γραψ' τον.

τι εγινε, εχουμε τσακωθεί με το [edit] button?

η διαδικασια ξανακαλεί τον εαυτό της

ωραια :T:

Link to comment
Share on other sites

O πίνακας ΔΕΚΑΕΞΑΔΙΚΟ περιέχει όλα τα ψηφία από 0 - 9 και Α - F του δεκαεξαδικού (προφανώς έτσι :p)

Δεν περιέχει το αποτέλεσμα του υπολογισμού.Η αλλαγή που χρειάζεται είναι σχετικά απλή

 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:Ξέχασα το "," που διαχωρίζει τα στοιχεία του αποτελέσματος :p

Link to comment
Share on other sites

για να καταλαβαινόμαστε, μιλάω μόνο για το αρχικό κομμάτι ψευδοκώδικα που παράθεσε ο painkiller44 και όχι για τον κώδικα σε VB του nucleus.

Πιθανότατα έκανα λάθος εδω.

Ο πίνακας "ΔΕΚΑΕΞΑΔΙΚΟ[ ]" Δε δημιουργείται στο κομμάτι του κώδικα που παραθέτεις. Θα μπορούσε να δημιουργείται άνετα έξω από αυτή τη διαδικασία, κάθε φορά που ολοκληρώνεται μια πράξη και φτάνει στο τέλος της.

Αν υποθέσω ότι δε λείπει τίποτα απ τον ψευδοκωδικα, τότε ο πινάκας δημιουργείται και συμπληρώνεται κατά την εκτύπωση του στην οθόνη, ΤΥΠΩΣΕ(ΔΕΚΑΕΞΑΔΙΚΟ[N(MOD(16))+1]), χωρίς να έχει δηλωθεί πουθενά προηγουμένως. (!?) (Δε ξέρω και με ποιους κανόνες δουλεύει η "Ψευδογλωσσα" που χρησιμοποιείς, εγώ τα μετατρέπω όλα σε C στο μυαλό μου :p)

Έτσι κι αλλιως, η μετατροπή που προτείνει ο nucleus μέσα στη διαδικασία μου μοιάζει πιο λογική από το να μεταφράζεις τα στοιχεία του πινάκα εκ των υστέρων.

Link to comment
Share on other sites

καλα θα ηταν να το κανω στην c με ενα printf("%x",timi) θα είχα καθαρίσει :D

ΑΛΓΟΡΙΘΜΟΣ ΑΡΙΘΜΗΤΙΚΑ_ΣΥΣΤΗΜΑΤΑ
ΣΤΑΘΕΡΕΣ
/* Η Σταθερά ΣΤΟΙΧΕΙΑ περιέχει το πλήθος των στοιχείων του πίνακα ΟΚΤΑΔΙΚΟ */
ΣΤΟΙΧΕΙΑ_ΟΚΤ = 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

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

Ετοιμαστείτε έρχεται κουβερτούλα


/* Η Σταθερά ΣΤΟΙΧΕΙΑ περιέχει το πλήθος των στοιχείων του πίνακα ΟΚΤΑΔΙΚΟ */
ΣΤΟΙΧΕΙΑ_ΟΚΤ = 8;
/* Η Σταθερά ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ περιέχει το πλήθος των στοιχείων του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */
ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ = 16;
ΣΤΑΘΕΡΕΣ

Περιγραφικά τα σχόλια δεν έχουμε κάτι να εξηγήσουμε εδώ


/* ΔΕΚΑΕΞΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το δεκαεξαδικό σύστημα αρίθμησης */
ΔΕΚΑΕΞΑΔΙΚΟ: ARRAY [1.. ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ] OF CHAR;
/* ΟΚΤΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το Οκταδικό σύστημα αρίθμησης */
ΟΚΤΑΔΙΚΟ:ARRAY[1.. ΣΤΟΙΧΕΙΑ_ΟΚΤ] OF CHAR;
/* Το πλήθος των αριθμών που θα μετατραπούν */
ΠΛΗΘΟΣ:INTEGER;
ΔΕΚΑΔΙΚΟΣ:INTEGER;
I:INTEGER;
/* Το επιλεγόμενο σύστημα αρίθμησης */
ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:INTEGER;
ΔΕΔΟΜΕΝΑ

ΔΕΚΑΕΞΑΔΙΚΟ Array (ή πίνακας) χαρακτήρων (CHAR) ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ θέσεων (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 16).

ΟΚΤΑΔΙΚΟ Array όπως και πιο πάνω με ΣΤΟΙΧΕΙΑ_ΟΚΤ θέσεων όμως (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 8).

Σημείωση:Από το 1 αρίθμηση των ψευδοκώδικα μου μέσα :jester: σε όλες τις γλώσσες ξεκινάνε από το μηδέν


ΔΙΕΠΑΦΗ
ΕΙΣΟΔΟΣ
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 για Οκταδικό

Και κάνει και έλεγχο λαθών :suicide:.


ΑΡΧΗ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ*/
/* Εισαγωγή τιμών στον πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */
ΔΕΚΑΕΞΑΔΙΚΟ[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

Ετοιμαστείτε έρχεται κουβερτούλα


/* Η Σταθερά ΣΤΟΙΧΕΙΑ περιέχει το πλήθος των στοιχείων του πίνακα ΟΚΤΑΔΙΚΟ */
ΣΤΟΙΧΕΙΑ_ΟΚΤ = 8;
/* Η Σταθερά ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ περιέχει το πλήθος των στοιχείων του πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */
ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ = 16;
ΣΤΑΘΕΡΕΣ

Περιγραφικά τα σχόλια δεν έχουμε κάτι να εξηγήσουμε εδώ


/* ΔΕΚΑΕΞΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το δεκαεξαδικό σύστημα αρίθμησης */
ΔΕΚΑΕΞΑΔΙΚΟ: ARRAY [1.. ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ] OF CHAR;
/* ΟΚΤΑΔΙΚΟ είναι ο πίνακας που περιέχει όλα τα στοιχεία που χρησιμοποιεί το Οκταδικό σύστημα αρίθμησης */
ΟΚΤΑΔΙΚΟ:ARRAY[1.. ΣΤΟΙΧΕΙΑ_ΟΚΤ] OF CHAR;
/* Το πλήθος των αριθμών που θα μετατραπούν */
ΠΛΗΘΟΣ:INTEGER;
ΔΕΚΑΔΙΚΟΣ:INTEGER;
I:INTEGER;
/* Το επιλεγόμενο σύστημα αρίθμησης */
ΕΠΙΛΟΓΗ_ΣΥΣΤΗΜΑΤΟΣ:INTEGER;
ΔΕΔΟΜΕΝΑ

ΔΕΚΑΕΞΑΔΙΚΟ Array (ή πίνακας) χαρακτήρων (CHAR) ΣΤΟΙΧΕΙΑ_ΔΕΚΑΕΞ θέσεων (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 16).

ΟΚΤΑΔΙΚΟ Array όπως και πιο πάνω με ΣΤΟΙΧΕΙΑ_ΟΚΤ θέσεων όμως (έχει οριστεί ακριβώς από πάνω) (η αρίθμηση ξεκινάει από το 1 έως το 8).

Σημείωση:Από το 1 αρίθμηση των ψευδοκώδικα μου μέσα :jester: σε όλες τις γλώσσες ξεκινάνε από το μηδέν


ΔΙΕΠΑΦΗ
ΕΙΣΟΔΟΣ
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 για Οκταδικό

Και κάνει και έλεγχο λαθών :suicide:.


ΑΡΧΗ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ*/
/* Εισαγωγή τιμών στον πίνακα ΔΕΚΑΕΞΑΔΙΚΟ */
ΔΕΚΑΕΞΑΔΙΚΟ[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

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::eek::eek:

Link to comment
Share on other sites

ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(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] = 1

17 DIV 16 = 1 Eδώ σε μια οποιαδήποτε γλώσσα θέλει να πάρεις το ακέραιο μέρος του αποτελέσματος

το 1 είναι μεγαλύτερο του 0 (EAN (N(DIV(16)))>0) οπότε ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(1); (αναδρομή με όρισμα 1)

Δέυτερη εκτέλεση:

1 MOD 16 = 1 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[1 + 1 = 2] = 1

1 DIV 16 = 0 Δεν είναι μεγαλύτερο του 1 άρα τέρμα η εκτέλεση της συνάρτησης

Έξοδος του προγράμματος 11. (και αυτό είναι λάθος βέβαια κανονικά πρέπει να αντιστρέφουμε τα ψηφια) και εξηγώ

Έστω δεκαδικός αριθμός 549.Η δεκαεξαδική του μορφή είναι με 225.Eκτελούμε τον κώδικα μας (με την αλλαγή)

Εκτέλεση πρώτη:

549 MOD 16 = 5 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[5 + 1 = 6] = 5

549 DIV 16 = 34 > 0 άρα αναδρομή με όρισμα το 34

Εκτέλεση δεύτερη:

34 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 2

34 DIV 16 = 2 > 0 άρα αναδρομή με όρισμα το 2

Εκτέλεση τρίτη:

2 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 2

2 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

ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(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] = 1

17 DIV 16 = 1 Eδώ σε μια οποιαδήποτε γλώσσα θέλει να πάρεις το ακέραιο μέρος του αποτελέσματος

το 1 είναι μεγαλύτερο του 0 (EAN (N(DIV(16)))>0) οπότε ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(1); (αναδρομή με όρισμα 1)

Δέυτερη εκτέλεση:

1 MOD 16 = 1 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[1 + 1 = 2] = 1

1 DIV 16 = 0 Δεν είναι μεγαλύτερο του 1 άρα τέρμα η εκτέλεση της συνάρτησης

Έξοδος του προγράμματος 11. (και αυτό είναι λάθος βέβαια κανονικά πρέπει να αντιστρέφουμε τα ψηφια) και εξηγώ

Έστω δεκαδικός αριθμός 549.Η δεκαεξαδική του μορφή είναι με 225.Eκτελούμε τον κώδικα μας (με την αλλαγή)

Εκτέλεση πρώτη:

549 MOD 16 = 5 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[5 + 1 = 6] = 5

549 DIV 16 = 34 > 0 άρα αναδρομή με όρισμα το 34

Εκτέλεση δεύτερη:

34 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 2

34 DIV 16 = 2 > 0 άρα αναδρομή με όρισμα το 2

Εκτέλεση τρίτη:

2 MOD 16 = 2 οπότε τύπωσε το ΔΕΚΑΕΞΑΔΙΚΟ[2 + 1 = 3] = 2

2 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

Archived

This topic is now archived and is closed to further replies.

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

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.