WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

römische ziffern

 

fibi
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2008, 20:33     Titel: römische ziffern
  Antworten mit Zitat      
ich bin ein matlab-anfänger und brauche für folgende aufgabe hilfe.

Aufgabe: Schreiben sie eine Funktion, die eine ganze Zahl x < 1000 einliest und Sie als römische Zahl in einem String zurückgibt.

ich bin für jede hilfe dankbar.

lg fibi
Private Nachricht senden Benutzer-Profile anzeigen


nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.320
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 23.02.2008, 22:05     Titel:
  Antworten mit Zitat      
Hi,

ich schreibe mal, wie ich es auf die Schnelle machen würde:
Code:
clear all;
clc;

zeichen = {  'A',  'M', 'D', 'C', 'L', 'X', 'V', 'I'};
zahlen  = { 5000, 1000, 500, 100,  50,  10,  5,   1 };

dez=1234;
roem=[];
i=1;
while dez>0
    if dez/zahlen{i} >= 1
        roem=[roem zeichen{i}];
        dez=dez-zahlen{i};
    else
        i=i+1;
    end
end
roem

Das Programm guckt der Reihe nach, ob die zum Zeichen gehörende
Zahl in die Dezimalzahl reinpasst, wenn ja wird das Zeichen gespeichert
und die Dezimalzahl entsprechend verkleinert.
Pass die Zahl nicht wird das nächst kleinere Zeichen genommen.
Das ist aber noch nicht ganz richtig, denn z.B. die arabische 4 wird römisch
nicht als IIII sondern als IV (1 vor 5) geschrieben.
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
fibi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2008, 19:28     Titel:
  Antworten mit Zitat      
erstmal danke für die hilfe. ich hab noch probleme mit den ausnahmen mit 4, 9, 40, ... bis jetzt klappt meine version nur bei 4. ich weiß nicht genau wo ich den ausnahmeblock reinschieben kann, damit es funktioniert.

Roem.m
 Beschreibung:

Download
 Dateiname:  Roem.m
 Dateigröße:  605 Bytes
 Heruntergeladen:  1275 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.02.2008, 07:45     Titel:
  Antworten mit Zitat      
Wenn ich Deinen Code richtig verstehe, liegt das Problem darin, dass Du die Fälle in zwei komplett getrennten if-Abfragen behandelst.

Nehmen wir dez = 450 an, dann wird ja mit folgenden Zahlen (in dieser Reihenfolge) verglichen: 5000, 4000, 1000, 900, 500 (alles ergebnislos) und 400. Hier ist es aber wieder ohne Ergebnis, da dez/zahlen{i} (= 450 / 100) eben 4.5 ist, und damit nicht im Ausnahmenvektor enthalten.

Ich denke, es wäre besser, die zweite Abfrage so zu ändern:
Code:

if (floor(dez/zahlen{i})*zahlen{i} == ausnahmen49{j})
% ...
 


Damit wird bei einer 450 durch 100 dividiert, abgerundet und wieder mit 100 multipliziert, bevor mit dem Ausnahmenvektor verglichen wird.
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.02.2008, 09:03     Titel:
  Antworten mit Zitat      
Der bei mir lauffähige Code:

Code:

clear;
clc;

zeichen = { 'A', 'M', 'D', 'C', 'L', 'X', 'V', 'I'};
zahlen = { 5000, 1000, 500, 100, 50, 10, 5, 1 };
ausnahmen49 = { 4000, 900, 400, 90, 40, 9, 4 };
zeichen49 = { 'MA', 'CM', 'CD', 'XC', 'XL', 'IX', 'IV'};

dez=(input('Geben sie eine Zahl zwischen 0 und 1000 ein: '         ));
roem=[];
i=1;
j=1;

while dez>0
   
if dez/zahlen{i} >= 1  
roem=[roem zeichen{i}];
dez=dez-zahlen{i};    
else
i=i+1;
end

if j<8
if (floor(dez/zahlen{ceil(i/2)*2})*zahlen{ceil(i/2)*2} == ausnahmen49{j})
roem=[roem zeichen49{j}];
dez=dez-ausnahmen49{j};
end
end
j=j+1;
end

disp('Römische Ziffer:');
disp(roem);

Ein weiteres Problem war, dass der Ausnahmen-Vektor nur 7 Elemente hat, der Index jedoch maximal 8 werden konnte.

Edit: Okay, "lauffähig" triffts nicht ganz. In manchen Fällen stellt er die Zahl richtig dar, in manchen (499 z.B.) noch nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
fibi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2008, 09:46     Titel:
  Antworten mit Zitat      
der code von dir (keloid) läuft bei mir überhaupt nicht. es kommt sofort: Error: The input character is not valid in MATLAB statements or expressions.

ich habs jetzt so versucht, aber auf elseif wird nicht zugegriffen. woran kann das liegen?

Code:
clear;
clc;

zeichen = { 'A', 'M', 'D', 'C', 'L', 'X', 'V', 'I'};
zahlen = { 5000, 1000, 500, 100, 50, 10, 5, 1 };
ausnahmen49 = { 4000, 900, 400, 90, 40, 9, 4, '' };
zeichen49 = { 'MA', 'CM', 'CD', 'XC', 'XL', 'IX', 'IV', '' };

dez=(input('Geben sie eine Zahl zwischen 0 und 1000 ein: '         ));
roem=[];
i=1;
j=1;

while (dez>0) && (dez<1000)
   
if (fix(dez/zahlen{i})) >= 1
    roem=[roem zeichen{i}];
    dez=dez-zahlen{i};
elseif (fix(dez/zahlen{i})) == or (4, 9)
    roem=[roem zeichen49{j}];
    dez=dez-ausnahmen49{j};
else
    i=i+1;
    j=j+1;
end

end

disp('    ');
disp('Römische Ziffer:');
disp(roem);
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.02.2008, 10:04     Titel:
  Antworten mit Zitat      
Welche Version von Matlab benutzt Du denn?

Ich benutze Version R2007b, und da läuft der Code ohne diese Fehlermeldung.
Private Nachricht senden Benutzer-Profile anzeigen
 
keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 26.02.2008, 10:12     Titel:
  Antworten mit Zitat      
Ich hab eine bei mir funktionierende Version in den Anhang gesetzt.

Das Problem an dem elseif ist, dass die Bedingung nie erfüllt ist.
Du müsstest hier Deine Dezimalzahl mit der nächsten 10er-Potenz vergleichen.
Als Beispiel kannst Du die Zahl 400 nehmen. Die erste If-Abfrage fällt drei Mal negativ aus. 5000, 1000 und 500 sind jeweils größer als 400, dadurch ist dez/zahlen{i} kleiner als Null. Insbesondere ist dez/zahlen{i} weder 4 noch 9.
Die jeweils nächsthöhere Zehnerpotenz erhältst Du, indem Du "zahlen{i}" durch "zahlen{ceil((i+1)/2)*2}" ersetzt.

Ausserdem musst Du darauf achten, dass j auch inkremetiert wird, wenn ein Ausnahmefall gefunden wurde. Ansonsten passieren böse Dinge nach dem ersten Fund ;)

Roem.m
 Beschreibung:

Download
 Dateiname:  Roem.m
 Dateigröße:  751 Bytes
 Heruntergeladen:  1235 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 26.02.2008, 10:26     Titel:
  Antworten mit Zitat      
Ich verstehe überhaupt nicht wozu Ausnahmenfälle-Überprüfung braucht.
Da ihr je der Reihe nach prüft würde so auch funktionieren:

Code:

zeichen = { 'A', 'MA', 'M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'};
zahlen = [ 5000, 4000, 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ];

dez=input('Geben sie eine Zahl zwischen 0 und 1000 ein: ' );
roem=[];
i=1;
j=1;

while dez>0

   if dez/zahlen(i) >= 1
      roem=[roem zeichen{i}];
      dez=dez-zahlen(i);
   else
      i=i+1;
   end

end
disp('Römische Ziffer:');
disp(roem);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
fibi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 23.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2008, 10:39     Titel:
  Antworten mit Zitat      
danke an alle für die hilfe. jetzt funktionierts. denny hat recht, warum kompliziert wenn es einfach auch geht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin
Admin

Admin



Beiträge: 652
Anmeldedatum: 16.06.07
Wohnort: Bietigheim-Bissingen
Version: ---
     Beitrag Verfasst am: 26.02.2008, 15:01     Titel:
  Antworten mit Zitat      
Hallo denny,

hättest du Lust deinen Code in der Script-Ecke zu posten?! Wäre wieder eine nette Sache dafür.

Kann es auch gern selbst machen aber will mich nicht mit fremden Federn schmücken.

Viele Grüße Martin
_________________

Der kleine goMatlab.de-Knigge - Eine kleine Liste von wichtigen Regeln, die jeder beachten sollte
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 09.05.2008, 22:32     Titel:
  Antworten mit Zitat      
Hallo Martin,

Hab irgend wie deine Frage übersehen. Ich poste es gerne! Unter uns ich wäre nicht böse, wenn du es auch gepostet hättest. Smile Aber danke für deine Rücksicht!
Private Nachricht senden Benutzer-Profile anzeigen
 
hannes123

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2017, 14:16     Titel: römischen ziffern in arabische zahlen umrechnen
  Antworten mit Zitat      
ich bin ebenfalls matlab anfänger und würde hilfe brauchen beim umrechnen von römischen zahlen in arabische

sprich mein hauptprogramm soll erkennen ob es sich um eine römische oder arabische zahl handelt und dementsprechend in das jeweils andere umrechnen

hilfe benötige ich nur bei der funktion für das umrechnen von römischen in arabische zahlen

arabische in römische umrechnen habe ich bereits

freue mich auf antworten

mfg
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.05.2017, 15:34     Titel:
  Antworten mit Zitat      
Hallo, irgendwie so, aber da muss man noch die römische Zahlen auf Syntax prüfen
z.B CXL statt XCL

Code:

zeichen     = { 'A', 'MA', 'M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'};
zahlen      = [ 5000, 4000, 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ];
roem        = input('Geben sie eine römische Zahl ein: ', 's' );
dez         = [];
idx         = 1 ;
while ~isempty(roem)
   anz_pruef_zeichen   = length( zeichen{idx});
   res = strncmp(roem, zeichen{idx}, anz_pruef_zeichen);
   if res      
      dez  = [dez, zahlen(idx)];
      if roem > anz_pruef_zeichen
         roem = roem(anz_pruef_zeichen + 1: end);
      else
         roem = [];
      end
   else
      idx = idx + 1;
   end

end

disp('Arabische Ziffer:');
disp(sum(dez));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.