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

Ασκηση(με αναδρομη) Αssembly


DarkJohny92

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

Εχω στη σχολη την εξης ασκηση που αναφερεται στη ρωμαικη αριθμηση αναφερω καποια χαρακτηριστικα κομματια της ασκησης:

 

M = 1000

D = 500

C = 100

L = 50

X = 10

V = 5

I = 1

Για παράδειγμα MMVI (2006) ερμηνευεται ως 1000 + 1000 + 5 + 1.

Για παράδειγμα, MCMXLIV (1944), τα συμβολα C, X και Ι προηγουνται ενας συμβολο μεγαλυτερης αξίας, και το αποτελεσμα ερμηνευεται ως εξις:

1000 + (1000 - 100) + (50 - 10) + (5 - 1).

Να γραφτεί πρόγραμμα το οποίο θα διαβάζει από το πληκτρολόγιο μία συμβολοσειρά και καλει ανάλογα τις δυο παρακάτω αναδρομικες συναρτησεις:

α) Αναδρομικη συνάρτηση int check_roman(char *s)

Η συνάρτηση αυτη επιστρεφει 1 όταν η συμβολοσειρά αποτελείται μόνο από ρωμαϊκά ψηφία, αλλιως επιστρεφει 0. Μπορείτε να θεωρησετε ότι δεχόμαστε μόνο τα κεφαλαία αντίστοιχα γράμματα: DCXI επιστρεφει 1, dCΧi επιστρεφει 0, dcxi επιστρεφει 0.

[3]

β) Αναδρομικι συνάρτηση int roman_to_decimal(char *s)

Η συνάρτηση αυτη δεχεται μία συμβολοσειρά που αποτελείται μόνο από ρωμαϊκά ψηφία (δηλαδη η main θα τη καλεσει μόνο εφόσον εχει επιστρεψει 1 η συνάρτηση check_roman). Θα υπολογίζει τον αντίστοιχο δεκαδικό αριθμό και θα τον επιστρεψει. Μπορείτε να θεωρηετε ότι η ςυμβολοσειρά που θα δοθεί θα τηρει του κανονισμους της αναπαράστασης ρωμαϊκων αριθμων και είναι ειναι εγκυρο αριθμο .

 

Σε γενικες γραμμες εχω ενα πλανο πως θα λυσω την ασκηση αυτο που με προβληματιζει ειναι ,,,,η αναγκαστικη χρησιμοποιηση αναδρομικης συναρτησης! Το πλανο μου ,χρησιμοποιει την αναδρομικη συναρτηση απλως και μονο για επαναληψεις(Σωστο? η πρεπει να κανει κατι αλλο?).Ακομα αν καποιος θα μπορουσε να μου εξηγησει χοντρικα τον δεικτη $sp και πως θα επηρεασει την αναδρομικη μου συναρτηση αφου βασικα θα γινεται συνεχομενα η μειωση του ! ? Και τριτον οταν η συναρτηση μου φτασει σε ενα σημειο που εχει κανει τη δουλεια της και πρεπει να σταματησει πως θα γυρισω στην main με παλι συνεχομενες κλησεις της ιδια συναρτησης η οποια θα εχει μια συνθηκη που θα την οδηγει στην εντολη jr $ra ( ??η οποια θα πρεπει να εκτελεστει οσες φορες εκτελεστηκε και η ιδια η συναρτηση ,,,πολυ κακο για το τιποτα μου φαινεται αυτο )!

 

Ευχαριστω πολυ .

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

Εσυ δεν χρειαζεται να κανεις πολλες φορες το addi $sp,$sp,-4 kai jr $ra.

Υποθετουμε οτι στο α0 ειναι το string που ελεγχουμε.

 

ckeck :

 

beq $a0,$0,exit #αν εχουμε φτασει στο τελος του string

 

addi $sp,$sp,-4

sw $ra,0($sp)

 

 

.

. # εδω θα κανεις τους ελεγχους σου

.

 

addi $a0,$a0,4 #το νεο ορισμα τις επομενης κλησης

jal check #καλεις ξανα την check.Εδω δηλαδη γηναιτε η αναδρομη

 

lw $ra,0($sp)

jr $ra

 

exit :

jr $ra

 

 

Απλα εχε στο νου σου οτι πρεπει να σωσεις το ra πριν καλεσεις αλλη συναρτηση (αναδρομη) γιατι οταν κληθει αυτη θα χαλασει τον ra και η 1η δεν θα ξερει που να κανει return.

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

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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