Converter para numero romano

1. Converter para numero romano

renan
renanpk

(usa Outra)

Enviado em 09/11/2014 - 22:02h

Como eu faço um programa em c para converter um numero menor que 3999 para romano?



  


2. Re: Converter para numero romano

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/11/2014 - 00:51h

Não existe nenhuma grande sacada: seu programa vai fazer exatamente a mesma coisa que você faria se tivesse de converter manualmente (i.e. separar em partes e escolher os componentes do numeral em função dos valores de cada parte).


3. Re: Converter para numero romano

renan
renanpk

(usa Outra)

Enviado em 10/11/2014 - 10:59h

não me ajudou muito não, pq por exemplo eu fiz o seguinte programa porem não consigo imprimir nada:
#include <stdio.h>
#include <math.h>

int main()
{
char vetor[] = {};
char m[][3] = {"M","MM","MMM"};
char c[][4] = {"C","CC","CCC","CD","D","DC","DCC","DCCC","CM" };
char d[][4] = {"X","XX","XXX","XL","L","LX","LXX","LXXX","XC" };
char u[][4] = {"I","II","III","IV","V","VI","VII","VIII","IX" };
scanf("%s", &vetor);

if(vetor[4]){//Se o vetor tiver tamanho 4
switch(vetor[0]){
case '1':
printf("%s", m[0]);
break;
case '2':
printf("%s", m[1]);
break;
case '3':
printf("%s", m[2]);
break;
}
switch(vetor[1])
{
case '1':
printf("%s", c[0]);
break;
case '2':
printf("%s", c[1]);
break;
case '3':
printf("%s", c[2]);
break;
case '4':
printf("%s", c[3]);
break;
case '5':
printf("%s", c[4]);
break;
case '6':
printf("%s", c[5]);
break;
case '7':
printf("%s", c[6]);
break;
case '8':
printf("%s", c[7]);
break;
case '9':
printf("%s", c[8]);
}
switch(vetor[2])
{
case '1':
printf("%s", d[0]);
break;
case '2':
printf("%s", d[1]);
break;
case '3':
printf("%s", d[2]);
break;
case '4':
printf("%s", d[3]);
break;
case '5':
printf("%s", d[4]);
break;
case '6':
printf("%s", d[5]);
break;
case '7':
printf("%s", d[6]);
break;
case '8':
printf("%s", d[7]);
break;
case '9':
printf("%s", d[8]);
}
switch(vetor[3])
{
case '1':
printf("%s", u[0]);
break;
case '2':
printf("%s", u[1]);
break;
case '3':
printf("%s", u[2]);
break;
case '4':
printf("%s", u[3]);
break;
case '5':
printf("%s", u[4]);
break;
case '6':
printf("%s", u[5]);
break;
case '7':
printf("%s", u[6]);
break;
case '8':
printf("%s", u[7]);
break;
case '9':
printf("%s", u[8]);
}
}
else if (vetor[3]){//se o vetor tiver tamanho 3
switch(vetor[0])
{
case '1':
printf("%s", c[0]);
break;
case '2':
printf("%s", c[1]);
break;
case '3':
printf("%s", c[2]);
break;
case '4':
printf("%s", c[3]);
break;
case '5':
printf("%s", c[4]);
break;
case '6':
printf("%s", c[5]);
break;
case '7':
printf("%s", c[6]);
break;
case '8':
printf("%s", c[7]);
break;
case '9':
printf("%s", c[8]);
}
switch(vetor[1])
{
case '1':
printf("%s", d[0]);
break;
case '2':
printf("%s", d[1]);
break;
case '3':
printf("%s", d[2]);
break;
case '4':
printf("%s", d[3]);
break;
case '5':
printf("%s", d[4]);
break;
case '6':
printf("%s", d[5]);
break;
case '7':
printf("%s", d[6]);
break;
case '8':
printf("%s", d[7]);
break;
case '9':
printf("%s", d[8]);
}
switch(vetor[2])
{
case '1':
printf("%s", u[0]);
break;
case '2':
printf("%s", u[1]);
break;
case '3':
printf("%s", u[2]);
break;
case '4':
printf("%s", u[3]);
break;
case '5':
printf("%s", u[4]);
break;
case '6':
printf("%s", u[5]);
break;
case '7':
printf("%s", u[6]);
break;
case '8':
printf("%s", u[7]);
break;
case '9':
printf("%s", u[8]);
}
}
else if (vetor[2]){//se o vetor tiver tamanho 2
switch(vetor[0])
{
case '1':
printf("%s", d[0]);
break;
case '2':
printf("%s", d[1]);
break;
case '3':
printf("%s", d[2]);
break;
case '4':
printf("%s", d[3]);
break;
case '5':
printf("%s", d[4]);
break;
case '6':
printf("%s", d[5]);
break;
case '7':
printf("%s", d[6]);
break;
case '8':
printf("%s", d[7]);
break;
case '9':
printf("%s", d[8]);
}
switch(vetor[1])
{
case '1':
printf("%s", u[0]);
break;
case '2':
printf("%s", u[1]);
break;
case '3':
printf("%s", u[2]);
break;
case '4':
printf("%s", u[3]);
break;
case '5':
printf("%s", u[4]);
break;
case '6':
printf("%s", u[5]);
break;
case '7':
printf("%s", u[6]);
break;
case '8':
printf("%s", u[7]);
break;
case '9':
printf("%s", u[8]);
}
}
else if (vetor[1]){//se o vetor tiver tamanho 2
switch(vetor[0])
{
case '1':
printf("%s", u[0]);
break;
case '2':
printf("%s", u[1]);
break;
case '3':
printf("%s", u[2]);
break;
case '4':
printf("%s", u[3]);
break;
case '5':
printf("%s", u[4]);
break;
case '6':
printf("%s", u[5]);
break;
case '7':
printf("%s", u[6]);
break;
case '8':
printf("%s", u[7]);
break;
case '9':
printf("%s", u[8]);
}
}

return 0;
}


4. Re: Converter para numero romano

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/11/2014 - 15:11h

renanpk escreveu:

não me ajudou muito não, pq por exemplo eu fiz o seguinte programa porem não consigo imprimir nada:


Ninguém tem obrigação de adivinhar o tipo de ajuda de que você precisa, ainda mais pelo fato de que você não tinha dito o que já tinha feito. Você fez uma pergunta genérica, não deveria reclamar de uma resposta genérica.

Como agora você mostrou o código, dá para falar bem mais.

Você não precisa de <math.h> nesse programa.

É errôneo declarar main() como “int main()”. Em C, uma lista de parâmetros vazia significa que a função aceita receber qualquer quantidade de argumentos de quaisquer tipos. O padrão do C para ambientes auto-hospedados diz que você deve declarar main() ou como “int main(void)” (i.e. não receber argumento nenhum) ou por “int main(int argc, char **argv)” (o primeiro argumento é um contador de elementos no segundo argumento, e o segundo argumento é uma lista de ponteiros de caracteres, que representam uma lista de argumentos strings).

Quando você declara vetor, cria um array com zero elementos. Tenho quase certeza de que não é isso que você quer, especialmente tendo em vista que vai ler um string com scanf() algumas linhas abaixo.

Nos demais arrays, ao limitar o tamanho dos strings em 4, está deixando de reservar espaço para byte nulo nos numerais correspondentes 8, 80 e 800. Ou você passa esse valor para 5 ou, para simplificar sua vida, declara seus arrays, por exemplo, do seguinte modo.

const char *const u[]={
"", /* 0 */
"I", /* 1 */
"II", /* 2 */
"III", /* 3 */
"IV", /* 4 */
"V", /* 5 */
"VI", /* 6 */
"VII", /* 7 */
"VIII", /* 8 */
"IX" /* 9 */
};


Repita a fórmula para as dezenas, centenas e milhares, inclusive com os elementos zero. (Eu sei que não existe zero em numerais romanos, mas aquele string vazio vai facilitar sua vida. Acredite.)

Quando eu disse para fazer exatamente o que você faria manualmente, não imaginei que você fosse criar vários fluxos diferentes dependendo do tamanho do número. Certamente dá para usar um laço de repetição para testar cada dígito do numeral indo-arábico lido (eu teria lido um número, pois facilita testar se o número lido está dentro da faixa aceitável), diminuindo bastante o comprimento do código. Se você for esperto, dá para rearrumar seus arrays de correspondência entre valor relativo e numeral romano e usar, dentro do laço, um ponteiro que saiba passar de milhar para centena, dezena e unidade também nesses arrays de correspondência rearrumados (dica: pense num array bidimensional).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts