Gå til innhold

Fra romersk til arabisk tallsystem.


Anbefalte innlegg

Heisann

 

Oppgaven går enkelt og greit ut på å gjøre om fra romersk til arabisk tallsystem. Jeg har tatt med alle unntakene jeg støtte på, så det ble en del if-setninger. Mulig noe av dette er unødvendig.

 

Poenget er: Jeg har fått til oppgaven dersom man skriver inn nøyaktig 3 romertall(bokstaver), men jeg ønsker jo selvsagt at jeg skal kunne skrive inn så mange romerbokstaver som jeg ønsker. Derfor trenger jeg å få satt inn en array.length og litt diverse variabler. Kunne noen tenke seg å sette meg litt i gang med dette?

 

PS: jeg vet at koden sikkert er unødvendig stor og sånn, men jeg ønsker likevel (hvis mulig) å ta utgangspunkt i denne koden, ettersom jeg har skrevet den selv og forstår den fullt ut. Er ikke viktig for meg å ha en mest mulig effektiv kode, bare jeg forstår den =)

 

// april07.cpp : Defines the entry point for the console application.
//
// TODO-List
// Faa innholdet i skriv-tabell inn i lag-tabell
// Lag tabellen like stor som det som skrives inn
// Rydde koden

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

const int antallHoyeste = 3;
const int maksTabell = 3;

void lagTabell(string *tabell, int &antall);
void skrivTabell(const string *tabell, int *arabisk, int antall);

unsigned char etRomertall;
int temp;


int _tmain(int argc, _TCHAR* argv[])
{
 while(1)
   {
     string tabell[maksTabell];
     int antall;
     int arabisk[maksTabell];

     cout <<"Skriv inn et romertall paa 3 bokstaver:"<<endl;
     lagTabell(tabell, antall);
     if (antall >= antallHoyeste)
{
  skrivTabell(tabell, arabisk, antallHoyeste);
} 
   }
 return 0;
}



//--------------------------------------------------------------------
//
// Funksjon som lager tabellen
//
// -------------------------------------------------------------------

void lagTabell(
       string *tabell,	// Ut
       int &antall)	// Ut: Ant elementer i tabell

{
 antall = 3;

 int teller = 0;

 while (teller < antall)
   {
     cin >> etRomertall;
     tabell[teller] = etRomertall;
     teller++;
   } // while
}     // lagTabell


void skrivTabell(
	 const string *tabell, // inn
	 int *arabisk,	       // inn
	 int antall)	    // Inn: Antall som skal skrives
{
 int h;
 for (h = 0; h<antall; h++)
   {
     cout << tabell[h];
   }

 int teller;
 int resultat;
 int feilV = 0;
 int feilL = 0;
 int feilD = 0;
 cout<<" paa arabisk: ";
 for (teller = 0; teller<antall; teller++)
   {
     if (tabell[teller] == "I"||tabell[teller] == "i") arabisk[teller] = 1;
     if (tabell[teller] == "V"||tabell[teller] == "v") 
{
  feilV++;
  arabisk[teller] = 5;
}
     if (tabell[teller] == "X"||tabell[teller] == "x") arabisk[teller] = 10;
     if (tabell[teller] == "L"||tabell[teller] == "l") 
{
  feilL++;
  arabisk[teller] = 50;
}
     if (tabell[teller] == "C"||tabell[teller] == "c") arabisk[teller] = 100;
     if (tabell[teller] == "D"||tabell[teller] == "d") 
{
  feilD++;
  arabisk[teller] = 500;
}
     if (tabell[teller] == "M"||tabell[teller] == "m") arabisk[teller] = 1000;
   }
 resultat=0;
 int hjelp;
 if (feilV>1||feilL>1||feilD>1) cout<< "Et romertall kan ikke ha mer enn én V, L eller D";
 else
   {
     if (arabisk[0]>arabisk[1])
{
  if (arabisk[0]+arabisk[1]<arabisk[2]) cout<<"error1: dette tallet er ugyldig";
  else if (arabisk[1]<arabisk[2]) 
    {
      resultat = arabisk[0]+arabisk[2]-arabisk[1]; // eks: XIV=14
    }
  if (arabisk[1]>=arabisk[2])
    { 
      resultat = arabisk[0]+arabisk[1]+arabisk[2]; // eks: VII=7 eller XVI = 16 eller XXV=25 eller XXX=10
    }
}
   }
 if (arabisk[0]==arabisk[1])
   {
     if (arabisk[1]>=arabisk[2]) resultat = arabisk[0]+arabisk[1]+arabisk[2];
     if (arabisk[1]<arabisk[2]) cout<<"error2: dette tallet er ugyldig"; // eks: IIV eller XIV (som er godtatt i foerste if)
   }

 if(arabisk[0]<arabisk[1])
   {
     if (arabisk[1]>arabisk[2]) resultat = arabisk[1]-arabisk[0]+arabisk[2]; // eks: XLI = 41
     if (arabisk[1]<=arabisk[2]) cout<<"error3: dette tallet er ugyldig";
   }

 if (resultat != 0) cout<<resultat;
 cout << endl;
} // skrivTabell


Lenke til kommentar
Videoannonse
Annonse

Bruk vector istede for et array. Vector kan også sendes med som referanse.

 

her er litt starthjelp. til bitene du trenger.

#include <vector>

typedef std::vector<string> StringTabell_t;

void fyll_inn_data(StringTabell& tabell)
{
 tabell.push_back("IV");
 tabell.push_back("V");
 tabell.push_back("I");
 tabell.push_back("X");
}

StringTabell_t tabell;

tabell.push_back("IV");
cout << "størrelse: " << tabell.size() << std::endl;  // output 1.
fyll_inn_data(tabell);
cout << "størrelse: " << tabell.size() << std::endl;  // output 5.
tabell.clear();
cout << "størrelse: " << tabell.size() << std::endl;  // output 0.

Lenke til kommentar
  • 1 måned senere...

Kan hende jeg misforstod oppgaven men..

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  int i;
  int num = 0;
  char *in;
  int s[255] = {0};

  if(argc != 2) {
     printf("%s <roman number to convert>\n", argv[0]);
     return 1;
  }

  s['M'] = 1000;
  s['D'] = 500;
  s['C'] = 100;
  s['L'] = 50;
  s['X'] = 10;
  s['V'] = 5;
  s['I'] = 1;

  in = argv[1];

  for(i=0; i<strlen(in); i++) {
     if(s[in[i]] == 0) {
        printf("Invalid sign %c\n", in[i]);
        return 0;
     }
     num += s[in[i]];
     if(s[in[i-1]] && s[in[i-1]] < s[in[i]]) {
        num -= s[in[i-1]]*2;
     }
  }

  printf("%s converts to %d\n", in, num);
  return 0;
}

Endret av togge2
Lenke til kommentar

Godt poeng !

 

if(i > 0 && s[in[i-1]] && s[in[i-1]] < s[in]) {...}

 

  for(i=0; i<strlen(in); i++) {
     /* (...) */
     if(s[in[i-1]] && s[in[i-1]] < s[in[i]]) {
        num -= s[in[i-1]]*2;

 

Hva skjer når i == 0? (Med in[i-1], altså).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...