Ir para conteúdo
Fórum Script Brasil
  • 0

Desenvolvimento de Programa - Calcula Dígito Verificador


heavyscan

Pergunta

Preciso fazer um programa com as seguintes exigências:

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

 

Já tinha feito um para CPF queira adaptar ele para estas especificações se puderem me ajudar.

 

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"


int main(int artgc, char** argv)
{
	int valor1, valor2, valor3, valor4;	// os numeros
	char d1, d2, d3; // os delimitadores
	int n;
	int soma, i;  // para calculo dos DV 123.456.789-09 OK

	printf("Entre com o CPF no formato 012.345.678-90 e Tecle ENTER ao terminar\n");
	printf("\nCPF: ");

	n = scanf( "%3d%c%3d%c%3d%c%2d", &valor1, &d1, &valor2, &d2, &valor3, &d3, &valor4 );

	// o que leu?
	printf("\nscanf() leu %d itens\n", n);

	// os valores
	printf("scanf()     valor1 = %03d\n", valor1);
	printf("scanf()     valor2 = %03d\n", valor2);
	printf("scanf()     valor3 = %03d\n", valor3);
	printf("scanf()     valor4 = %02d\n", valor4);

	// os delimitadores
	printf("scanf()     delimitador 1 = [%c]\n", d1);
	printf("scanf()     delimitador 2 = [%c]\n", d2);
	printf("scanf()     delimitador 3 = [%c]\n", d3);

	// mostra os valores afinal
	printf("\nCPF lido %03d.%03d.%03d-%02d\n", valor1, valor2, valor3, valor4);

	// aqui vão os digitos 1 a 1 para calcular os DV
	int digito[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

	digito[0] =  valor1 / 100;
	digito[1] = (valor1 % 100) / 10;
	digito[2] =  valor1 % 10;

	digito[3] =  valor2 / 100;
	digito[4] = (valor2 % 100) / 10;
	digito[5] =  valor2 % 10;

	digito[6] =  valor3 / 100;
	digito[7] = (valor3 % 100) / 10;
	digito[8] =  valor3 % 10;

	digito[ 9] = valor4 / 10;
	digito[10] = valor4 % 10;


	printf("Digito a Digito: ");
	for (i = 0; i < 11; i = i + 1)
	{
		printf("%d ", digito[i]);
	}
	printf("\n");

	/////////////////////////////////////////////////////////// DV 1

	// o primeiro digito verificador, modulo 11 dos 9
	soma = 0;
	for (i = 0; i < 9; i = i + 1)
		soma = soma + digito[i] * (10-i); // 10..2

	// essa e a conta que da nome ao processo
	soma = soma % 11;
	if (soma > 1)
		digito[9] = 11 - soma;
	else
		digito[9] = 0;

	/////////////////////////////////////////////////////////// DV 2

	// o segundo DV, modulo 11 dos 10
	soma = 0;
	for (i = 0; i < 10; i = i + 1)
		soma = soma + digito[i] * (11 - i); // 11..2

	// essa e a conta que da nome ao processo
	soma = soma % 11;
	if (soma > 1)
		digito[10] = 11 - soma;
	else
		digito[10] = 0;


	printf("\nDV calculados: %d %d\n", digito[9], digito[10]);

	// compara os digitos
	int dv1ok = digito[9] == (valor4 / 10);
	int dv2ok = digito[10] == (valor4 % 10);

	if (dv1ok && dv2ok)
	{
		printf("CPF valido\n");
	}
	else
	{
		if (!dv1ok) printf("DV1 'devia ser %d. Lido %d\n", digito[9], (valor4 / 10));
		if (!dv2ok) printf("DV2 'devia ser %d. Lido %d\n", digito[10], (valor4 % 10));
		printf("CPF INVALIDO\n");
	};	// if
}	// main

 

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...