Scripts interessantes em C

Seguem dois scripts interessantes que fiz em C quando eu estava começando a aprender a programar. Como geralmente as pessoas começam a programar nessa linguagem, esses são exercícios muito comuns de se fazer para treino – veja mais sobre linguagem C clicando no link.

Busca binária

A pesquisa binária é um algoritmo de busca em vetores que segue o paradigma de “divisão e conquista”. Ou seja, considerando que o vetor de informações esteja ordenado, são realizadas sucessivas divisões do espaço de busca comparando o elemento buscado (chave) com o elemento no meio do vetor. Se o elemento do meio do vetor for a chave, a busca termina com sucesso; caso contrário, se o elemento do meio vier antes do elemento buscado, então a busca continua na posterior metade do vetor, e se o elemento do meio vier depois da chave, a busca continua na metade anterior do vetor.

/*Busca binaria*/

#include <stdio.h>
#define MAX 100

int main (){
	int x=0, n=0, v[MAX], i=0, meio=0, fim=0, inicio=0, resposta=0;
/* zerar o vetor */
	for(i=0; i<100; i++){
		v[i]=0;
	}
/* entrada de dados */
	printf("Diga qtos numero tera sua sequencia: ");
	scanf("%d", &n);
	printf("Digite uma sequencia em ordem crescente: ");
	for(i=0;i<n;i++){
		scanf("%d", &v[i]);
	}
	printf("Digite o numero a ser procurado: ");
	scanf("%d", &x);
/* busca binaria */
	fim=n-1;
	while(inicio<=fim){
		meio=(inicio+fim)/2;
		if(v[meio]==x)
			return meio;
		if(v[meio]<x) 			inicio=meio+1; /* elimina termos antes do meio, jah q valor eh maior q o valor do meio */ 		if(v[meio]>x)
			inicio=meio-1; /* elimina termos depois do meio, jah q valor eh menor q o valor do meio */
	}

	return(-1);
}

Esse algoritmo é muito mais rápido que a busca sequencial, sendo análogo ao método utilizado ao buscar alguma informação em uma lista telefônica ou um capítulo de livro sem índice.

Verificação de CPF

O Cadastro de Pessoas Físicas (CPF ou CPF-MF) é o registro mantido pela Receita Federal do Brasil no qual podem se inscrever, uma única vez, quaisquer pessoas naturais, independentemente de idade ou nacionalidade, inclusive falecidas. Cada inscrito é unicamente identificado por um número de inscrição no CPF de 11 dígitos decimais, sendo os oito primeiros aleatoriamente designados no momento da inscrição. Já o nono (penúltimo) dígito indica a região fiscal responsável pela inscrição. Por fim, o décimo e o décimo-primeiro são dígitos verificadores calculados de acordo com o algoritmo descrito nesse artigo.

Dígito verificador (ou algarismo de controle) é um mecanismo de autenticação utilizado para verificar a validade e a autenticidade de um valor numérico, evitando fraudes ou erros de transmissão/digitação. Consiste em um ou mais algarismos acrescentados ao valor original e calculados a partir deste através de um determinado algoritmo.

Essa rotina em C calcula os dois dígitos verificadores do CPF e retorna se o CPF é válido ou não. Nesse caso, o método de cálculo desses dígitos se baseia em uma rotina tradicional, a “Módulo 11”. Para calcular o primeiro dígito verificador, cada dígito do número, começando da direita para a esquerda (do dígito menos significativo para o dígito mais significativo) é multiplicado, na ordem, por 2, depois 3, depois 4 e assim sucessivamente, até o primeiro dígito do número. O somatório dessas multiplicações dividido por 11. O resto desta divisão (módulo 11) é subtraido da base (11); o resultado é o dígito verificador. Para calcular o próximo dígito, considera-se o dígito anterior como parte do número e efetua-se o mesmo processo.

/*Verificação de CPF - cálculo do dígito verificador*/

#include <stdio.h>
#define MAX 20

int main (){
	int cpf[MAX], i=0, n=11, interno[MAX], soma=0, resto=0, digito=0, digitoverificador;

/* zerar o vetor */
	for(i=0; i<11; i++){
		interno[i]=0;
	}
	for(i=0; i<11; i++){
		cpf[i]=0;
	}

/* entrada de dados */
	printf("Digite o numero do CPF, sem pontos ou tracos: ");
	for(i=0;i<11;i++){
		scanf("%d", &cpf[i]);
	}

/* calculo do primeiro digito verificador */
	for(i=0;i<9;i++){
		n=n-1;
		interno[i]=n*cpf[i];
	}
	for(i=0;i<9;i++){
		soma+=interno[i];
	}
	resto=soma%11;
	digito=11-resto;
	if(resto<2)
		digitoverificador=0;
	else
		digitoverificador=digito;
	if(digitoverificador!=cpf[9]){
		printf("\n * CPF invalido *");
	}

/* calculo do segundo digito verificador */
	n=12;
	for(i=0;i<9;i++){
		n=n-1;
		interno[i]=n*cpf[i];
	}
	for(i=0;i<9;i++){
		soma+=interno[i];
	}
	resto=soma%11;
	digito=11-resto;
	if(resto<2)
		digitoverificador=0;
	else
		digitoverificador=digito;
	if(digitoverificador!=cpf[10]){
		printf("\n * CPF invalido **");
	}
	else
		printf("\n * CPF valido *");
	return(0);
}

O CPF utiliza o módulo 11 duas vezes seguidas, obtendo dois dígitos verificadores.

Qualquer melhoramento/correção/comentário será bem-vindo.

One comment

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.