Jump to content



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


painkiller44

Recommended Posts

Διαιρείς τον αριθμό με το 16. Σε κάθε βήμα κρατάς το κάθε υπόλοιπο σαν δεκαεξαδικό ψηφίο και το πηλίκο γίνεται διαιρετέος στο επόμενο βήμα όπου ξαναδιαιρείς. Μέχρι να μείνει υπόλοιπο 0.

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])

ΕΑΝ-ΤΕΛΟΣ

ΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣ

N ειναι η εισοδος στην διαδικασία ενας ακεραιος δεκαδικος αριθμος

Link to comment
Share on other sites

Δεν ξέρω αν σε βοηθάει αλλά ορίστε το πρόγραμμα σε Python.

Στην ουσία χρειάζεσαι κάποιον τρόπο να αποθηκεύεις κάθε 16δικό ψηφίο και μετά να το αντιστρέψεις!


hx=""
t=dc
while True:
if t<1:break
t2=t
t=int(t2/16)
t2-=(t*16)
if t2<10:hx+=str(t2)
elif t2==10:hx+="A"
elif t2==11:hx+="B"
elif t2==12:hx+="C"
elif t2==13:hx+="D"
elif t2==14:hx+="E"
elif t2==15:hx+="F"
res=""
for i in range(1,len(hx)+1):
res+=hx[-i]
print res
dc=89722683205

Link to comment
Share on other sites

Δεν ξέρω αν σε βοηθάει αλλά ορίστε το πρόγραμμα σε Python.

Στην ουσία χρειάζεσαι κάποιον τρόπο να αποθηκεύεις κάθε 16δικό ψηφίο και μετά να το αντιστρέψεις!


hx=""
t=dc
while True:
if t<1:break
t2=t
t=int(t2/16)
t2-=(t*16)
if t2<10:hx+=str(t2)
elif t2==10:hx+="A"
elif t2==11:hx+="B"
elif t2==12:hx+="C"
elif t2==13:hx+="D"
elif t2==14:hx+="E"
elif t2==15:hx+="F"
res=""
for i in range(1,len(hx)+1):
res+=hx[-i]
print res
dc=89722683205

ευχαριστώ αλλα δεν βοηθησε και πολυ :innocent::innocent:

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])

ΕΑΝ-ΤΕΛΟΣ

ΤΕΛΟΣ-ΔΙΑΔΙΚΑΣΙΑΣ

N ειναι η εισοδος στην διαδικασία ενας ακεραιος δεκαδικος αριθμος

μα αυτός είναι ψευδοκώδικας, τι ακριβώς ψάχνεις;

Link to comment
Share on other sites

[MENTION=12152]painkiller44[/MENTION]

Σεντονάκι incoming ή αλλιώς Wall of Text

ΟΡΙΣΜΟΙ ΜΕΤΑΒΛΗΤΩΝ

Ένα αλφαριθμητικό HexDigits που θα κρατάει τα ψηφία του δεκαεξαδικού χωρισμένα με κόμμα ή όποιον άλλον χαρακτήρα θες.

Μεταβλητή akeraioMeros που κρατά το ακέραιο μέρος της διαίρεσης του αριθμού που θες να μετατρέψεις με το 16 (INTEGER)

Μεταβλητή ypoloipo που κρατά το υπόλοιπο της διαίρεσης του αριθμού που θες να μετατρέψεις με το 16 (INTEGER)

Ελέγχεις τον αριθμό που θες να μετατρέψεις αν είναι μεγαλύτερος του 0 ξεκινάς:

1)akeraioMeros = Math.Floor ή οποιαδήποτε συνάρτηση που επιστρέφει το ακέραιο μέρος ενός DECIMAL αριθμού με όρισμα το αποτέλεσμα της διαίρεσης του αριθμού που θες να μετατρέψεις με το 16 (χρησιμοποιείς τον τελεστή /)

2)ypoloipo = κάνεις Mod τον αριθμό που θες να μετατρέψεις με το 16

3)ελέγχεις το ypoloipo.

Αν είναι 10 συνενώνεις στο τέλος του HexDigits την τιμή "a,"

Αν είναι 11 συνενώνεις στο τέλος του HexDigits την τιμή "b,"

Αν είναι 12 συνενώνεις στο τέλος του HexDigits την τιμή "c,"

Αν είναι 13 συνενώνεις στο τέλος του HexDigits την τιμή "d,"

Αν είναι 14 συνενώνεις στο τέλος του HexDigits την τιμή "e,"

Αν είναι 15 συνενώνεις στο τέλος του HexDigits την τιμή "f,"

Aν έχει οποιαδήποτε άλλη τιμή αποθηκεύεις στον πίνακα HexDigits[anadromes] την τιμή του ypoloipo και ένα ","

4)Ελέγχεις την τιμή του akeraioMeros.Αν είναι > 0 κάνεις την πρώτη σου αναδρομή καλώντας την ίδια σου την συνάρτηση με όρισμα το akeraioMeros και αυξάνεις την τιμή του anadromes κατά 1 και πας πάλι στο βήμα 1) αν είναι 0 ο υπολογισμός τελειώνει και πας στο βήμα 5)

5)Εμφάνιση αποτελέσματος.

Αφαιρείς το τελευταίο "," από την HexDigits (με κάποια συνάρτηση Trim ή ανάλογη) μετά το χωρίζεις σύμφωνα με το "," (με κάποια συνάρτηση Split ή ανάλογη) και απλώς δείχνεις από το τέλος προς την αρχή τα μέρη τα οποία πήρες από την Split

κώδικας για VB Console Application

Module Module1

Dim anadromes As Integer = 1
Dim HexDigits As String
Dim ypoloipo As Integer
Dim akeraioMeros As Integer

Sub convertToHex(ByVal input As Decimal)
akeraioMeros = Math.Floor(input / 16)
ypoloipo = input Mod 16
Console.WriteLine("Ektelesh:" & anadromes & " apotelesma diaireshs me to 16:" & akeraioMeros & " apotelesma Mod me to 16:" & ypoloipo)
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
If akeraioMeros > 0 Then
anadromes += 1
convertToHex(akeraioMeros)
End If
End Sub

Sub Main()
Console.WriteLine("Eisagete aritmo gia metatroph:")
Dim input = Console.ReadLine
Dim numberToConvert As Decimal
If Decimal.TryParse(input, numberToConvert) Then
If numberToConvert > 0 Then
Console.WriteLine("Swsto apotelesma metatrophs me thn synarthsh Hex toy .NET:" & Hex(numberToConvert))
convertToHex(numberToConvert)
Dim correctOutput = HexDigits.TrimEnd(",").Split(",")
Console.Write("Hex timh meta thn synarthsh mas:")
For i As Integer = correctOutput.Length To 1 Step -1
Console.Write(correctOutput(i - 1))
Next


End If
Else
Console.WriteLine("Lathos eisodos")
End If
End Sub

End Module

Link to comment
Share on other sites

δεν αντιλαμβανομαι τον τροπο υλοποιησης βασικα πηγα να το τρεξω και δεν τρεχει .για μεγαλυτερους αριθμους απο 16 και ειπα μηπως γνωριζει καποιος .

Το κομμάτι του φευδοκώδικα που παράθεσες δουλεύει σαν τμήμα (το αντίστοιχο μιας function στη C) ενός μεγαλυτέρου προγράμματος.

Η "ΔΙΑΔΙΚΑΣΙΑ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(N)" το μόνο που βλέπω κάνει είναι, αρχικά να ελέγχει αν το N είναι μεγαλύτερο του 0, μετά διαιρεί το N με το 16, και στη συνέχεια να ταΐζει το αποτέλεσμα αυτής της πράξης πίσω στην είσοδο της διαδικασίας για να υπολογιστεί την επομένη φορά που θα κληθεί... (όπου Ν βάζει το αποτέλεσμα της πράξης N(DIV(16)) . Απλά στο τέλος κάθε υπολογισμού σου τυπώνει το δεκαεξαδικό ψηφίο που υπολόγισε εκείνη τη στιγμή. (που btw λείπει η αντιστοίχηση των ψηφίων μετά το 9 με τα αντίστοιχα γράμματα) Ο πίνακας "ΔΕΚΑΕΞΑΔΙΚΟ[ ]" Δε δημιουργείται στο κομμάτι του κώδικα που παραθέτεις. Θα μπορούσε να δημιουργείται άνετα έξω από αυτή τη διαδικασία, κάθε φορά που ολοκληρώνεται μια πράξη και φτάνει στο τέλος της.

Ίσως να μπορέσουμε να σε βοηθήσουμε να καταλάβεις τι παίζει, αν δώσεις και τον υπόλοιπο κώδικα.

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

Ένα παράδειγμα του κώδικα που πρέπει να συνοδεύει αυτό που παράθεσες, είναι αυτό που βλέπεις στο "Sub Main()" του nucleus.

Link to comment
Share on other sites

[MENTION=12152]painkiller44[/MENTION]

Σεντονάκι incoming ή αλλιώς Wall of Text

ΟΡΙΣΜΟΙ ΜΕΤΑΒΛΗΤΩΝ

Ένα αλφαριθμητικό HexDigits που θα κρατάει τα ψηφία του δεκαεξαδικού χωρισμένα με κόμμα ή όποιον άλλον χαρακτήρα θες.

Μεταβλητή akeraioMeros που κρατά το ακέραιο μέρος της διαίρεσης του αριθμού που θες να μετατρέψεις με το 16 (INTEGER)

Μεταβλητή ypoloipo που κρατά το υπόλοιπο της διαίρεσης του αριθμού που θες να μετατρέψεις με το 16 (INTEGER)

Ελέγχεις τον αριθμό που θες να μετατρέψεις αν είναι μεγαλύτερος του 0 ξεκινάς:

1)akeraioMeros = Math.Floor ή οποιαδήποτε συνάρτηση που επιστρέφει το ακέραιο μέρος ενός DECIMAL αριθμού με όρισμα το αποτέλεσμα της διαίρεσης του αριθμού που θες να μετατρέψεις με το 16 (χρησιμοποιείς τον τελεστή /)

2)ypoloipo = κάνεις Mod τον αριθμό που θες να μετατρέψεις με το 16

3)ελέγχεις το ypoloipo.

Αν είναι 10 συνενώνεις στο τέλος του HexDigits την τιμή "a,"

Αν είναι 11 συνενώνεις στο τέλος του HexDigits την τιμή "b,"

Αν είναι 12 συνενώνεις στο τέλος του HexDigits την τιμή "c,"

Αν είναι 13 συνενώνεις στο τέλος του HexDigits την τιμή "d,"

Αν είναι 14 συνενώνεις στο τέλος του HexDigits την τιμή "e,"

Αν είναι 15 συνενώνεις στο τέλος του HexDigits την τιμή "f,"

Aν έχει οποιαδήποτε άλλη τιμή αποθηκεύεις στον πίνακα HexDigits[anadromes] την τιμή του ypoloipo και ένα ","

4)Ελέγχεις την τιμή του akeraioMeros.Αν είναι > 0 κάνεις την πρώτη σου αναδρομή καλώντας την ίδια σου την συνάρτηση με όρισμα το akeraioMeros και αυξάνεις την τιμή του anadromes κατά 1 και πας πάλι στο βήμα 1) αν είναι 0 ο υπολογισμός τελειώνει και πας στο βήμα 5)

5)Εμφάνιση αποτελέσματος.

Αφαιρείς το τελευταίο "," από την HexDigits (με κάποια συνάρτηση Trim ή ανάλογη) μετά το χωρίζεις σύμφωνα με το "," (με κάποια συνάρτηση Split ή ανάλογη) και απλώς δείχνεις από το τέλος προς την αρχή τα μέρη τα οποία πήρες από την Split

κώδικας για VB Console Application

Module Module1

Dim anadromes As Integer = 1
Dim HexDigits As String
Dim ypoloipo As Integer
Dim akeraioMeros As Integer

Sub convertToHex(ByVal input As Decimal)
akeraioMeros = Math.Floor(input / 16)
ypoloipo = input Mod 16
Console.WriteLine("Ektelesh:" & anadromes & " apotelesma diaireshs me to 16:" & akeraioMeros & " apotelesma Mod me to 16:" & ypoloipo)
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
If akeraioMeros > 0 Then
anadromes += 1
convertToHex(akeraioMeros)
End If
End Sub

Sub Main()
Console.WriteLine("Eisagete aritmo gia metatroph:")
Dim input = Console.ReadLine
Dim numberToConvert As Decimal
If Decimal.TryParse(input, numberToConvert) Then
If numberToConvert > 0 Then
Console.WriteLine("Swsto apotelesma metatrophs me thn synarthsh Hex toy .NET:" & Hex(numberToConvert))
convertToHex(numberToConvert)
Dim correctOutput = HexDigits.TrimEnd(",").Split(",")
Console.Write("Hex timh meta thn synarthsh mas:")
For i As Integer = correctOutput.Length To 1 Step -1
Console.Write(correctOutput(i - 1))
Next


End If
Else
Console.WriteLine("Lathos eisodos")
End If
End Sub

End Module

ευχαριστω πολυ ετσι το σκεφτηκα και εγω με πινακα αλλα σε μενα το εχει χωρις πινακα

[MENTION=258]kaynd[/MENTION]

ΑΡΧΗ /*ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ*/

ΔΕΚΑΕΞΑΔΙΚΟ[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”;


ΤΥΠΩΣΕ(“Δώσε το Δεκαδικό αριθμό”);
ΔΙΑΒΑΣΕ(ΔΕΚΑΔΙΚΟΣ);
ΤΥΠΩΣΕ(ΔΕΚΑΔΙΚΟΣ);
ΤΥΠΩΣΕ(“Η Δεκαεξαδική μορφή είναι:”);
/* Κλήση της Διαδικασίας ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ() */
ΥΠΟΛΟΓΙΣΕ ΜΕΤΑΤΡΟΠΗ_ΔΕΚΑΕΞ(ΔΕΚΑΔΙΚΟΣ)
ΕΑΝ-ΤΕΛΟΣ
ΤΕΛΟΣ

Link to comment
Share on other sites

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

Αν αυτός είναι κώδικας που σας έχει δοθεί σε κάποιο μάθημα, κάτι έχει χαθεί στην αντιγραφή. Αν είναι από συσπουδαστή / γνωστό που έκανε την άσκηση, τότε απλά έχει ξεχάσει κάτι.

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

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 σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.