Jump to content
Fórum Script Brasil
  • 0

Desenvolvimento de Programa - Calcula Dígito Verificador


Question

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 to post
Share on other sites

1 answer to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Cloud Computing


  • Forum Statistics

    • Total Topics
      149408
    • Total Posts
      645900
×
×
  • Create New...