Ir ao conteúdo

C++ Desenvolvimento de Programa - Calcula Dígito Verificador


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Pessoal estou travado no desenvolvimento de um programa podem me ajudar?

Consegui fazer apenas o esqueleto dele.

//Exercício: calcula_digito_verifcador

//Autor:Luiz Eduardo Eleuterio de Souza.

//Professor: Eduardo

#include<stdio.h>
#include<locale.h>
#define TOTREG 3

typedef struct 
{
float num [30];
char fim [3];	

}entrada_dados;

entrada_dados dados [TOTREG];


int main()

{
	
	setlocale(LC_ALL, "Portuguese");


 int idx;
 
 printf("Desenvolvido por:\n\n Luiz Eduardo Eleuterio de Souza\n");
 
 for (idx =0; idx <TOTREG; idx ++)
    
    {
    	
    	printf("Digite FIM para encerrar o programa:\n");
    	//fgets(dados[idx].fim,3,stdin);
    	//fflush(stdin);
    	
    		
    	printf("Entre com uma string com valores decimais (máximo 30 caracteres):");
    	scanf("%f",&dados[idx].num);
    	fflush(stdin);
    	
    
    }



}

//FIM DO PROGRAMA

 

A primeira informação a ser disponibilizada deve ser o nome completo de todos os alunos que integram o grupo;

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.

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

Para obter o DV da string digitada pelo usuário, multiplica-se cada caracter 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.

Postado

parece que você "travou" bem no começo :(

Não tentou sequer declarar a função como pedida ou ler e mostrar uma string? Teve dificuldade ao escrever isso?

Postado
3 minutos atrás, arfneto disse:

parece que você "travou" bem no começo :(

Não tentou sequer declarar a função como pedida ou ler e mostrar uma string? Teve dificuldade ao escrever isso?

Sim, estou iniciando e não sei pra onde seguir agora.

Postado
14 minutos atrás, eduheavy disse:

Sim, estou iniciando e não sei pra onde seguir agora

 

Então não sabe nem declarar uma função
 

1 hora atrás, eduheavy disse:

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

 

cujo nome está aí acima. recebe um valor e retorna um valor inteiro que ;e o DV ou -1?

 

Tem um livro? Uma apostila? Já escreveu algum programa?

 

 

1 hora atrás, eduheavy disse:

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.

 

Essa parte também não saberia escrever? um loop lendo e mostrando uma string e que para quando a string for "fim"?

 

E se conseguir isso não conseguiria fazer um loop, do índice 0 até o fim da string, ignorando os caracteres que não sejam numero e mostrando na tela?

 

E se conseguir isso não pode declarar um contador e ir multiplicando os dígitos conforme aparecem na string pelos pesos
 

1 hora atrás, eduheavy disse:

multiplica-se cada caracter 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)

 

e somando até chegar ao valor do DV?

 

 

Consegue calcular o DV de seu RG usando essa técnica? De um CPF? do número 1234? 

 

 

Postado
16 minutos atrás, arfneto disse:

 

Então não sabe nem declarar uma função
 

 

cujo nome está aí acima. recebe um valor e retorna um valor inteiro que ;e o DV ou -1?

 

Tem um livro? Uma apostila? Já escreveu algum programa?

 

 

 

Essa parte também não saberia escrever? um loop lendo e mostrando uma string e que para quando a string for "fim"?

 

E se conseguir isso não conseguiria fazer um loop, do índice 0 até o fim da string, ignorando os caracteres que não sejam numero e mostrando na tela?

 

E se conseguir isso não pode declarar um contador e ir multiplicando os dígitos conforme aparecem na string pelos pesos
 

 

e somando até chegar ao valor do DV?

 

 

Consegue calcular o DV de seu RG usando essa técnica? De um CPF? do número 1234? 

 

 

O problema é a parte do Dv vou escrever as demais partes e retorno aqui onde travou.

Postado
19 minutos atrás, eduheavy disse:

O problema é a parte do Dv vou escrever as demais partes e retorno aqui onde travou

 

Não escreva seus programas assim. Vai levar uma eternidade para fazer. Outra para testar. E com duas eternidades já gastas pode ficar tudo difícil ;) e faltar tempo.

 

Pode fazer o contrário e começar então por um programa simples que chama a tal função. É trivial. O que importa é prosseguir logo. Testar logo.

 

Copiando um trecho do enunciado e acrescentando uns números

 

para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"

 

levou 10s. É claro que a string tem traços e ponto e vírgula já que eu copiei do enunciado :D e claro que tem uns números porque dá pra ver daqui. E eles estão até separadinhos para ter mais graça...

 

E escrever um  programa assim:
 

#include <stdio.h>

int DV( const char*);

int main(void)
{
    const char string[] = { "\
para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"
    };

    printf( "Exemplo de entrada: \"%s\"\n", string);
    int valor = DV(string);
    printf( "DV() retornou %d\n", valor );
    return 0;
}

int DV(const char* linha)
{
    return -1;
}

// fim do grande programa

 

quanto tempo leva?

 

E rodar o tal programa?
 

ch$  gcc x.c
ch$  ./a.out
Exemplo de entrada: "para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"
DV() retornou -1
ch$  

 

E não é que funcionou?

 

E agora? Sabe que a string deve virar "12345678" que são os números que tem lá, certo?

 

E os multiplicadores não são 
 

49 minutos atrás, arfneto disse:

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

 

E então não deve dar pra multiplicar os caras e somar?

 

	12345678
	98765432

	9 + 16 + 21 + 24 + 25 24 + 21 + 16 = 156 ? 

	156 * 10 = 1560, 1560 = 141 * 11 + 9 então DV() deve retornar 9


	12345678-9 seria o oficial então ...

 

 

Você cortou a definição :D :D  mas uma maneira popular é somar essas parcelas, multiplicar por 10 e usar o módulo 11 como DV. Tem métodos que somam os dígitos das parcelas --- 24 somaria 6 por exemplo --- e não o total, mas não faz diferença: faça o que tem que fazer apenas.

 

Entende o que quero dizer? O que importa é testar logo. chegar a algo. Não "travar" se ainda sabe fazer algo.

 

 

 

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

 

Não escreva seus programas assim. Vai levar uma eternidade para fazer. Outra para testar. E com duas eternidades já gastas pode ficar tudo difícil ;) e faltar tempo.

 

Pode fazer o contrário e começar então por um programa simples que chama a tal função. É trivial. O que importa é prosseguir logo. Testar logo.

 

Copiando um trecho do enunciado e acrescentando uns números

 


para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"

 

levou 10s. É claro que a string tem traços e ponto e vírgula já que eu copiei do enunciado :D e claro que tem uns números porque dá pra ver daqui. E eles estão até separadinhos para ter mais graça...

 

E escrever um  programa assim:
 


#include <stdio.h>

int DV( const char*);

int main(void)
{
    const char string[] = { "\
para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"
    };

    printf( "Exemplo de entrada: \"%s\"\n", string);
    int valor = DV(string);
    printf( "DV() retornou %d\n", valor );
    return 0;
}

int DV(const char* linha)
{
    return -1;
}

// fim do grande programa

 

quanto tempo leva?

 

E rodar o tal programa?
 


ch$  gcc x.c
ch$  ./a.out
Exemplo de entrada: "para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"
DV() retornou -1
ch$  

 

E não é que funcionou?

 

E agora? Sabe que a string deve virar "12345678" que são os números que tem lá, certo?

 

E os multiplicadores não são 
 

 

E então não deve dar pra multiplicar os caras e somar?

 


	12345678
	98765432

	9 + 16 + 21 + 24 + 25 24 + 21 + 16 = 156 ? 

	156 * 10 = 1560, 1560 = 141 * 11 + 9 então DV() deve retornar 9


	12345678-9 seria o oficial então ...

 

 

Você cortou a definição :D :D  mas uma maneira popular é somar essas parcelas, multiplicar por 10 e usar o módulo 11 como DV. Tem métodos que somam os dígitos das parcelas --- 24 somaria 6 por exemplo --- e não o total, mas não faz diferença: faça o que tem que fazer apenas.

 

Entende o que quero dizer? O que importa é testar logo. chegar a algo. Não "travar" se ainda sabe fazer algo.

 

 

 

Anexei o exemplo de como ele deve ficar para ficar mais claro.

verificador.rar

Postado
37 minutos atrás, eduheavy disse:

Anexei o exemplo de como ele deve ficar para ficar mais claro

 Por favor, não faça isso. Você anexou um link para um arquivo externo. Eis o que eu DEVO fazer então: 

  • vou abrir um arquivo compactado de destino desconhecido
  • depois vou ter que arrumar algo para abrir uma biblioteca do tipo rar, que não é portável. zip seria mais como no Windows, rpm no Linux.
  • Aí vou extrair os arquivos para uma pasta do MEU computador para poder ler
  • E esse é um forum público. Cada um que achar que pode ajudar e cada um com um problema semelhante vai ter que fazer a mesma coisa se quiser entender

 

Outra opção:

 

  • você posta o conteúdo bem aqui na tela

 

Qual opção eu prefiro 🤔❓

a segunda. Não me leve a mal.

Postado
19 horas atrás, arfneto disse:

 Por favor, não faça isso. Você anexou um link para um arquivo externo. Eis o que eu DEVO fazer então: 

  • vou abrir um arquivo compactado de destino desconhecido
  • depois vou ter que arrumar algo para abrir uma biblioteca do tipo rar, que não é portável. zip seria mais como no Windows, rpm no Linux.
  • Aí vou extrair os arquivos para uma pasta do MEU computador para poder ler
  • E esse é um forum público. Cada um que achar que pode ajudar e cada um com um problema semelhante vai ter que fazer a mesma coisa se quiser entender

 

Outra opção:

 

  • você posta o conteúdo bem aqui na tela

 

Qual opção eu prefiro 🤔❓

a segunda. Não me leve a mal.

Mil desculpas, entendo seu ponto nessa questão, é que como eu vi que o fórum permite o compartilhamento .zip ou .rar achei que não teria este problema, mas entendi sim o que quis dizer.

Postado
20 minutos atrás, eduheavy disse:

Mil desculpas, entendo seu ponto nessa questão

 

Oh... Entenda que é apenas minha opinião em um forum público. Não represento o forum de modo algum. :) Só queria dizer que acho que seria o caso de ter toda a informação disponível aqui para quem busca ajuda e para quem tenta oferecer ajuda.

  • Curtir 1
  • 2 semanas depois...
Postado

@arfneto  estou totalmente travado

 


#include<stdio.h>
#include<locale.h>
//#define TOTREG 3
#define TOTREG 3
//typedef struct 
typedef struct
{
	char num[31];

} Pessoa;

Pessoa pes[TOTREG];
//char num [30];


//}entrada_dados;

//entrada_dados dados [TOTREG];
//************************************************FUNÇÃO CALCULA_DV******************************************************************//
void caucula_dv(){
	
}

//***********************************************************************************************************************************/
 main()

{
	
	setlocale(LC_ALL, "Portuguese");


 
 char idx;
 char FIM;
 
 printf("Desenvolvido por:\n\nIsrael Carlos\nLuiz Eduardo\nGuilherme Garbin\n\n");
 
    	printf(            "Digite FIM para encerrar o programa:\n"                    );
 
 for(idx=0;idx<31;idx++)
 {
 
        
    		
        printf("Entre com uma string com valores decimais (máximo 30 caracteres):\n");
    	scanf ("%c", &idx);
    	
    	if(idx < 0 )
		{
    		printf("\nAtenção!!! Valor informado inválido.\n\n");
    		
		}
	    if (idx == FIM)
	    {
	    	
		}

	    
}
		
    
	
    
   



}

//FIM DO PROGRAMA

 

  • Solução
Postado

Você ao menos rodou  programa que te mostrei no tópico #6? 

 

É praticamente a solução de seu problema.

 

E leu a explicação sobre o cálculo como eu expliquei?

 

Eu te mostrei como escrever, assim:

 

int DV( const char*);

int main(void)
{
    const char string[] = { "\
para formatacao do valor como: .(ponto), -(traco), virgula 1234 e 5678 outros;"
    };

    printf( "Exemplo de entrada: \"%s\"\n", string);
    int valor = DV(string);
    printf( "DV() retornou %d\n", valor );
    return 0;
}

 

e te mostrei até a saída do programa.

 

E aí você posta isso 15 dias depois:
 

void caucula_dv(){
	
}

 

Porque não fez como eu disse? Tem um motivo para inovar e escrever uma função assim?

 

E qual a fórmula do cálculo do DV afinal?

 

 

 

 

 

 

Descreva o cálculo do DV como está no enunciado e eu te mostro um exemplo

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...