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