Usuários online

sexta-feira, 4 de novembro de 2011

Introdução a Algoritmos - Aula 04/11/2011 (Gerador de Valores por Extenso)

Gerador de Valores por Extenso

Estudar um gerador de valor por extenso é muito interessante. Podemos aprender como trabalhar com ponteiros em C/C++, usar funções para string, estruturas de decisão aninhadas, vetores de strings, e é claro, lógica computacional.

O presente gerador é bem simples e trabalha somente com números inteiros e com valores no intervalo 0 a 999. Entretanto, geradores assim são muito usados no comércio para gerar valores de notas fiscais, portanto, se quisermos um gerador profissional ele deverá trabalhar com valores que contenham centavos e com uma faixa de valores bem maior, como R$ 9.999.999.999,99 (nove bilhões e novecentos e noventa e nove milhões e novecentos e noventa e nove mil e novecentos e noventa e nove reais e noventa e nove centavos... ufa!).

Vamos ao código:


#include <cstdlib>
#include <iostream>

using namespace std;

char* extenso(int);

int main(int argc, char *argv[])
{
    int n;

    printf("Forneca um numero entre 0 e 999: ");
    scanf("%d", &n);
    printf("\n\nValor por extenso = %s\n\n", extenso(n));
 
    //for(n=0;n<=999;n++) printf("%s  ", extenso(n));
 
    system("PAUSE");
    return EXIT_SUCCESS;
}

char* extenso(int num) {
    char *unidades[10] = {
        "", "um", "dois", "tres", "quatro", "cinco", "seis", "sete", "oito",
        "nove"
    };
 
    char *dezenas[19] = {
        "", "dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta",
        "setenta", "oitenta", "noventa", "onze", "doze", "treze", "quatorze",
        "quinze", "dezesseis", "dezessete", "dezoito", "dezenove"
    };
 
    char *centenas[10] = {
        "", "cento", "duzentos", "trezentos", "quatrocentos", "quinhentos",
        "seiscentos", "setecentos", "oitocentos", "novecentos"
    };

    char* s;
    int u, d, c;
 
    s = (char *) calloc(200, sizeof(char));
 
    strcpy(s, ""); // variável inicia vazia
 
    u = num % 10;         // unidade
    num = (num - u) / 10;
    d = num % 10;         // dezena
    c = (num - d) / 10;   // centena
 
    if((c == 1) && (d == 0) & (u == 0)) {
        strcat(s, "cem"); // caso especial
        return s;
    }
    else
    if((c >= 1) && ((d != 0) || (u != 0))) {
        strcat(s, centenas[c]);
        if(d > 0) strcat(s, " e ");
        strcat(s, dezenas[d]);
        if(u > 0) strcat(s, " e ");
        strcat(s, unidades[u]);
        return s;
    }
    else
    {
        if((d > 0) && (u == 0)) {
            strcat(s, dezenas[d]);
            if(u > 0) {
                strcat(s, " e ");
                strcat(s, unidades[u]);
            }
            return s;
        }
        else
        if((d > 0) && (u > 0)) {
            strcat(s, dezenas[d]);
            strcat(s, " e ");
            strcat(s, unidades[u]);
            return s;
        }
        else
        if((d == 1) && (u > 0)) {
            strcat(s, dezenas[d*10 + u - 1]); // caso especial
            return s;
        }
        else
        {
            strcat(s, unidades[u]);
            return s;
        }
    }
}

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.

LinkWithin

Related Posts Plugin for WordPress, Blogger...

NOSSO OBJETIVO

OBJETIVO

Este blog será usado para divulgação de minhas ideias, notícias sobre tecnologia, disponibilização de links para download de materiais diversos (incluindo materiais didáticos -- que poderão ser usados em minhas aulas e/ou cursos). Gostaria de DEIXAR BEM CLARO que quaisquer materiais disponibilizados através deste blog são, tão somente, para acompanhamento de aulas e/ou cursos, e não constituem de modo algum, aulas na modalidade "ensino à distância" (EAD). Alunos têm total acesso aos materiais disponíveis, mas somente como tutoriais passo a passo. Apostilas disponibilizadas através deste blog não são materiais obrigatórios em disciplinas cursadas ou cursos ministrados.

RESPONSABILIDADE

O autor deste blog não é responsável pelo mau uso, intencional ou não, de qualquer código de programa disponibilizado aqui. Os códigos de programas disponíveis neste blog para download é e serão sempre, e tão somente, para uso didático durante o aprendizado. Seja bem-vindo.