Ir ao conteúdo

Posts recomendados

Postado
<>

O programa deverá solicitar a entrada de uma string (máximo de 30 caracteres) com caracteres decimais, a string pode possuir caracteres utilizados para formatação do valor como: .(ponto), -(traço), virgula e outros;

A solicitação da entrada de strings será finalizada apenas quando o usuário digitar “FIM” em qualquer padrão. Mensagem: "Digite 'FIM' para encerrar o programa.”;

Caso o usuário digite uma string onde não seja possível calcular o dígito verificador, emitir a mensagem: "Atenção!!! Valor informado inválido."

Caracteres não decimais (utilizados na formatação) devem ser ignorados no cálculo do dígito verificador;

O cálculo do dígito verificador de ser realizado por uma função com nome “calcula_dv”;

A string informada pelo usuário deve ser passada para a função calcula_dv() através de chamada por valor;

A função calcula_dv() deve retornar um valor inteiro, ou seja, se o cálculo for bem sucedido retornar DV, caso contrário retornar valor -1;

Se cálculo do DV for bem sucedido enviar mensagem para o usuário: DV calculado com sucesso: + string digitada + “-“ + DV calculado.

 

 

O código fonte será avaliado e itens como cabeçalho de programa e boas práticas de programação amplamente divulgados em nossas aulas serão itens de pontuação do trabalho.

 

Regras para cálculo do dígito verificador módulo 11.

Para obter o DV da string digitada pelo usuário, multiplica-se cada caractere da string sem o DV pelos multiplicadores 9,8,7,6,5,4,3,2 nesta ordem (repetir está sequência quantas vezes for necessário), soma-se as unidades das dezenas.

 

  • Obrigado 1
  • 2 semanas depois...
Postado
Em 30/10/2021 às 18:59, Valdimiro disse:
  • #include <stdio.h>
    #include <locale.h>
    #include <string>
    
    using namespace std;
    
    int calcula_dv(int soma_main); //VARIAVEIS
    
    typedef struct
    {
    	char texto [30];
    	char aux_conv[2];
    	int  result_dv;
    	int  i;
    	int  peso;
    	int  peso2;
    	int  mult;
    	int  soma;
    } Entrada;
    
      Entrada dados;
    
    
    int main()
    {
    	setlocale (LC_ALL, "portuguese");
    
        printf("Entre com uma string com valores decimais (máximo 30 caracteres)");
    
    	fgets(dados.texto, 30, stdin);
        dados.texto[strlen(dados.texto)-1] = '\0';
    	fflush(stdin);
    	
    	
    	dados.peso2=2;
    	for(dados.i = strlen(dados.texto)-1; dados.i>=0; dados.i--)
    	{
    	dados.aux_conv[0] = dados.texto[dados.i];
    		if(peso>9)
    		{
    			dados.peso=2;
    		}
    		dados.mult = atoi(dados.aux_conv) *dados.peso;
    		printf("numero %d peso %d mult %d\n",atoi(dados.aux_conv),dados.peso,dados.mult);
    		peso++;
    		dados.soma = dados.soma + dados.mult;
    	}
    	printf("O valor de soma é: %d", dados.soma);
    	result_dv = calcula_dv(dados.soma); //chamada da função
    	printf("O digito verificado é: %d", result_dv);
    
    	return 0;
    
    	int calcula_dv(int soma_main) //VARIAVEIS
    	{
    		int mult_mod, mod_divmult, mod11;
    		mult_mod = soma_main * 10;
    		mod_divmult = mult_mod/11 * 11;
    		mod11 = mult_mod -mod_divmult;
    		return(mod11);
    	}
    
    }

     

O programa deverá solicitar a entrada de uma string (máximo de 30 caracteres) com caracteres decimais, a string pode possuir caracteres utilizados para formatação do valor como: .(ponto), -(traço), virgula e outros;

A solicitação da entrada de strings será finalizada apenas quando o usuário digitar “FIM” em qualquer padrão. Mensagem: "Digite 'FIM' para encerrar o programa.”;

Caso o usuário digite uma string onde não seja possível calcular o dígito verificador, emitir a mensagem: "Atenção!!! Valor informado inválido."

Caracteres não decimais (utilizados na formatação) devem ser ignorados no cálculo do dígito verificador;

O cálculo do dígito verificador de ser realizado por uma função com nome “calcula_dv”;

A string informada pelo usuário deve ser passada para a função calcula_dv() através de chamada por valor;

A função calcula_dv() deve retornar um valor inteiro, ou seja, se o cálculo for bem sucedido retornar DV, caso contrário retornar valor -1;

Se cálculo do DV for bem sucedido enviar mensagem para o usuário: DV calculado com sucesso: + string digitada + “-“ + DV calculado.

 

 

O código fonte será avaliado e itens como cabeçalho de programa e boas práticas de programação amplamente divulgados em nossas aulas serão itens de pontuação do trabalho.

 

Regras para cálculo do dígito verificador módulo 11.

Para obter o DV da string digitada pelo usuário, multiplica-se cada caractere da string sem o DV pelos multiplicadores 9,8,7,6,5,4,3,2 nesta ordem (repetir está sequência quantas vezes for necessário), soma-se as unidades das dezenas.

 

 

Consegui fazer ate aqui. E não consegui seguir a diante. alguém pode me auxiliar?

@devair1010 postei.

@arfneto @devair1010 Queria colocar um Do While para fazer o laço ate que o usuario digitasse FIM.

  • Curtir 1
Postado

Acho que ainda está um pouco longe de funcionar.

 

1 hora atrás, Valdimiro disse:
typedef struct
{
	char texto [30];
	char aux_conv[2];
	int  result_dv;
	int  i;
	int  peso;
	int  peso2;
	int  mult;
	int  soma;
} Entrada;

  Entrada dados;


int main()
{

 

A declaração de dados deve estar dentro de main().

 

    fgets(dados.texto, 30, stdin);

 

Esta lendo apenas esse texto. Isso não vai de modo mágico colocar os dados dentro da estrutura e converter as letras para int e tudo...

 

1 hora atrás, Valdimiro disse:
dados.texto[strlen(dados.texto)-1] = '\0';
	

 

porque escrever '\0' que é o popular zero usando quatro letras ao invés do simples 0?

 

E está mais errado... Se fgets() ler 30 posições para o nome vai zerar o último. Se imagina que está apagando o '\n' no final considere que se o usuário digitar 29 letras não vai ter '\n' e seu programa vai apagar a última...

 

1 hora atrás, Valdimiro disse:
fflush(stdin);

 

Não use isso. fflush() sequer está definida para arquivos de entrada e não funciona em qualquer compilador.

 

1 hora atrás, Valdimiro disse:
	dados.peso2=2;

 

Está errado: não leu nada aí e não tem nada em i. E não deve criar um campo numa struct com nomes ingênuos como i ou aux...

 

1 hora atrás, Valdimiro disse:
	for(dados.i = strlen(dados.texto)-1; dados.i>=0; dados.i--)

 

pela mesma razão está errado. Não tem nada lá.

 

Sugiro rever o cálculo do DV. 

  • Obrigado 1
Postado

@Valdimiro      você está usando uma struct para armazenar os dados ,   e até funciona , mas ela não é necessária , poderia ser com variáveis simples mesmo ,  e essas exigências são para cumprir um enunciado que não foi postado ,  Qual objetivo do programa ?  ,  e seu código com o  do / while ficou ser assim  :

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <locale.h>
#include <string>
#include <ctype.h>
using namespace std;

int calcula_dv(int soma_main); //VARIAVEIS

typedef struct
{
	char texto [30];
	char aux_conv[2];
	int  result_dv;
	int  i;
	int  peso;
	int  peso2;
	int  mult;
	int  soma;
} Entrada;

int main()
{
    setlocale (LC_ALL, "portuguese");
    Entrada dados;
    int tam = 0 ;
    int j = 0;
    string aux = "";
    do
    {
        printf("Entre com uma string com valores decimais ( maximo 30 caracteres ) ");

        fgets(dados.texto, 30, stdin);
        tam = strlen(dados.texto) - 1;
        dados.texto[ tam ] = '\0';
        fflush(stdin);

        //auu = transform( dados.texto );
        for(; j<tam; j++)
            aux += toupper( dados.texto[ j ] );
        if( aux != "FIM")
        {
            dados.peso2=2;
            for(dados.i = tam; dados.i>=0; dados.i--)
            {
                dados.aux_conv[0] = dados.texto[dados.i];
                if( dados.peso > 9 )
                {
                    dados.peso = 2;
                }
                dados.mult = atoi( dados.aux_conv ) * dados.peso;
                printf("numero %d peso %d mult %d\n",atoi(dados.aux_conv),dados.peso,dados.mult);
                dados.peso++;
                dados.soma = dados.soma + dados.mult;
            }
            printf("O valor de soma é: %d\n\n", dados.soma);
            dados.result_dv = calcula_dv(dados.soma); //chamada da função
            printf("O digito verificado é: %d\n\n", dados.result_dv);
        }
    }while( aux != "FIM" );
    cout << "Fim do programa . . . !\n\n" << endl;
	return 0;
}
int calcula_dv(int soma_main) //VARIAVEIS
{
    int mult_mod, mod_divmult, mod11;
    mult_mod = soma_main * 10;
    mod_divmult = mult_mod/11 * 11;
    mod11 = mult_mod -mod_divmult;
    return(mod11);
}

 

Postado

@Valdimiro @devair1010

 

Só é preciso um loop para ler as strings até aparecer "FIM"

 

Dentro do loop é preciso extrair os dígitos, que podem ser até os 30.

 

E então calcular o DV aplicando os pesos (multiplicadores)  de modo circular

 

Em 30/10/2021 às 18:59, Valdimiro disse:

9,8,7,6,5,4,3,2

 

porque são só 8.

 

Em 30/10/2021 às 18:59, Valdimiro disse:

Regras para cálculo do dígito verificador módulo 11.

Para obter o DV da string digitada pelo usuário, multiplica-se cada caractere da string sem o DV pelos multiplicadores 9,8,7,6,5,4,3,2 nesta ordem (repetir está sequência quantas vezes for necessário), soma-se as unidades das dezenas

 

Essa descrição é medíocre se veio no enunciado original. Nada formal.

 

Eis um exemplo:

 

A entrada:

 

11 DV 9,c8,l7,u6,b5,e4,3,22021

 

então isso pode ter até 30 dígitos, mas tem 30 caracteres e é o que vai ler lido por fgets()

 

11 DV 9,c8,l7,u6,b5,e4,3,22021
     *    1    *    2    *   2
012345678901234567890123456789

 

Extraindo os dígitos:

 

11987654322021
     *    1    *    2    *   2
012345678901234567890123456789

 

E sobram esses 14 dígitos para o cálculo do DV. Já tem os pesos, então

 

1 1 9 8 7 6 5 4 3 2 2 0 2 1
9 8 7 6 5 4 3 2 9 8 7 6 5 4

 

Claro, são 8 + 6 pesos. As contas
 

  1  1  9  8  7  6  5  4  3  2  2  0  2  1
  9  8  7  6  5  4  3  2  9  8  7  6  5  4
------------------------------------------
  9  8 63 48 35 24 15  8 27 16 14  0 10  4

Soma: 281, 281 mod 11 = 6 então o

dv é 11 - 6 = 5. Se a soma mod 11 for 0 então não há uma verdade abosulta: 
se usa uma convenção. O DV pode ser fixado como 1 ou qualquer outro número.
Ou mesmo uma letra. No RG no Brasil se usa X por exemplo

 

Se eu não errei nas contas :) 

 

  • Curtir 1
  • Obrigado 1
Postado

Não consegui colocar o Do While como opção de erramento do programa e nem quando digitado o zero ou letras para emitir msg de erro.

 

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

int main()
{
    setlocale(LC_ALL,"portuguese");
    int soma, resultado, numero,contador;
    char digito10 ,dv11[30];
    
    printf("\nDigite 'FIM' para encerrar o programa.");
    printf("\nEntre com uma string com valores decimais <máximo de 30 caracteres>: ");
    gets(dv11);
    
            soma = 0;
            for (contador = strlen(dv11); contador >= 0; contador--)
            {
                numero = dv11[contador];
                soma = soma +(numero*(11-contador));
            }
            resultado = 11-(soma%11);
            if (resultado==10)
            {
                digito10='0';
            }
            else
            digito10 = resultado;

    printf(" DV calculado com sucesso: %s-%d\n\n",dv11,resultado);
    getch();
    return 0;
}

  • Curtir 1
Postado
3 horas atrás, Valdimiro disse:

quando eu digito o mesmo numero, porque ele muda de digito.

porque a conta está errada. Leu o exemplo passo a passo que eu mostrei?

  • Curtir 1
Postado

@Valdimiro    mas por que você Quer colocar o do / while  ?   ,  não pode ser só o while não  ?   ,   e para verificar se na string digitada tem letras ou símbolos ou o dígito zero  você pode usar a função  isdigit  da biblioterca

#include <ctype.h>

ou procurar pelo código de cada caractere na string de acordo com a tabela ASCII .

Postado
20 minutos atrás, devair1010 disse:

você pode usar a função  isdigit  da biblioterca

#include <ctype.h>

ou procurar pelo código de cada caractere na string de acordo com a tabela ASCII

 

Ou pode simplesmente testar se o símbolo está entre '0' e '9', os dígitos afinal. Não precisa chamar uma função para isso. O programa parece um pouco complicado...

13 horas atrás, Valdimiro disse:

gets(dv11);

 

Nunca use gets(). Isso não existe mais há décadas porque é ruim. use fgets()

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!