Buscar

Conversão de bases

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

/* Integrantes: Igor Bagnara
				Nícolas Alexandre
				Víctor Vatgas
				
				
 Professor:	Matheus
*/
	#include<stdlib.h>
	#include<stdio.h>
	#include<conio.h>
	#include<string.h>
	#include<math.h>
// VARIAVEL GLOBAL
 
 int i, cont, escolha, escolha1, trans=1, numfinal=0,quant=0, j;
 char num[70];
 
// PROTOTIPO DAS ROTINAS
 int fun_conv(int i);//Passa os caracteres de char para numeros inteiros
 void entrada();
 void escolhaa (char e1[11], char e2[11], char e3[11]);//Escolha da conversao (Binario,Octal,Decimal ou Hexadecimal)
 void transbi(int vet[], int base, int TAMvetor);//Transforma binario para hexadecimal e octal
 int dec_bin();// Transforma de decimal para binário
 void tam_vetor (int vet[]);//Pega o tamanho do vetor que será transformado de decimal pra binário
 void oct_hex(int base,int vet[]);//Transforma de octal para hexadecimal
 
 
 
 
 
 
 
 
 
 
 
// MAIN 
 main(){
 
 //obter informações sobre a transformação
 while(escolha<1 || escolha>4){
		
 printf("\nDigite a base de seu numero:\n1 - Binario\n2 - Octal\n3 - Decimal\n4 - Hexadecimal\n");
 scanf("%d", &escolha);	
	 }
	 //ler o numero
	 entrada();
	 //preencher o vetor
 int vet[cont];
 for (i=0;i<cont;i++){
 vet[i]=fun_conv(i);//entrando na função com i e um vetor do tamanho do numero digitado, para pegar seu valor em inteiro.
 }
 //
 switch(escolha){
 case 1:{ 
		 //BINÁRIO 
 escolhaa ("Octal", "Decimal", "Hexadecimal");
 switch(escolha1){
 case 1:{
 	//BINÁRIO-OCTAL
 transbi(vet, 3, cont);
 break;}
 case 2:{
 	//BINÁRIO-DECIMAL
			 	int trans=0;
 for(i=0;i<cont;i++){
						trans+=pow(2,i)*vet[i];		
					}
					printf("%d", trans);
 break;}
 case 3:{
 	//BINÁRIO-HEXADECIMAL
 transbi(vet, 4, cont); 
 break;} 
 }
 
 break;}
 case 2 :{
 	//OCTAL
 escolhaa ("Binario", "Decimal", "Hexadecimal");
 switch(escolha1){
 case 1:{
 	//OCTAL-BINARIO
 oct_hex(3, vet);
 break;}
 case 2:{
 	//OCTALOCTAL-DECIMAL
 oct_hex(3, vet); 
 break;}
 case 3:{
 	//OCTAL-HEXADECIMAL
 oct_hex(3, vet); 
 break;} 
 }
 break;}
 case 3:{
 	//DECIMAL
 escolhaa ("Binario", "Octal", "Hexadecimal");
 switch(escolha1){
 case 1:{
 	//DECIMAL-BINARIO
 tam_vetor(vet);
 int bindecimal[quant];
 for(i=quant-1;i>=0;i--){
 bindecimal[i]=dec_bin();
 }
 for (i=0;i<quant;i++){ 
 printf("%d", bindecimal[i]);
 }
 break; 
 }
 case 2:{
 	//DECIMAL-OCTAL
 	
 //TRANSFORMAR DE DECIMAL PARA BINÁRIO
 tam_vetor(vet);
 int bindecimal[quant];
 for(i=0;i<quant;i++){
 bindecimal[i]=dec_bin();
 }
 //TRANSFORMA DE BINARIO PRA OCTAL
 transbi(bindecimal, 3, quant);
 
 break;}
 case 3:{
 	//DECIMAL-HEXADECIMAL
 	
 //TRANSFORMAR DE DECIMAL PARA BINÁRIO
 tam_vetor(vet);
 int bindecimal[quant];
 for(i=0;i<quant;i++){
 bindecimal[i]=dec_bin();
 }
 //TRANSFORMA DE BINARIO PRA HEXADECIMAL
 transbi(bindecimal, 4, quant);
 
 break;} 
 }
 break;}
 case 4:{
 	//HEXADECIMAL
 	escolhaa ("Binario", "Octal", "Decimal");
 switch(escolha1){
 case 1:{
 		//HEXADECIMAL-BINARIO
 	oct_hex(4, vet);
 
 break;}
 
 case 2:{
 		//HEXADECIMAL-OCTAL
 		oct_hex(4, vet);
 break;}
 case 3:{
 		//HEXADECIMAL-DECIMAL
 		oct_hex(4, vet);
 break;} 
 }
 
 break;}
 } 
 
 
 
 getch();
}
	
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//ROTINAS
//leitura do numero que deseja transformar
void entrada(){//função que lê o número
	while (trans!=0){//estrutura que repete caso o número digitado não corresponder ao informado.
 printf("Digite o numero desejado:\n");
 fflush(stdin);
 	 gets(num);
	 strupr(num);
	 cont=strlen(num);// obter o tamanho do vetor
	 strrev(num);//inverter o vetor com o numero (123 fica 321)
		switch(escolha){		
			case 1:{//conferir se o numero digitado realmente é binário.
				trans=0; // contador para verificar se tem erro no numero digitado
				for(i=0;i<cont;i++){
			 		if (num[i]!=48 && num[i]!=49){//48 e 49 sao os valores ASCII dos numeros 1 e 0
				 		trans++;
			 		}
				}
			break;
			}
			case 2:{ //conferir se o numero é realmente octal
				trans=0;
				for(i=0;i<cont;i++){
				 if (num[i]<48 || num[i]>55){//48 até 55 sao os números de 0 a 7 na tabela ASCII
					 trans++;
				 }
		 	 }
			break;
			}
			case 3:{//conferir se o numero e realmente decimal
				trans=0;
				for(i=0;i<cont;i++){
				 if (num[i]<48 || num[i]>57){//48 até 55 sao os números de 0 a 9 na tabela ASCII
					 trans++;
				 }
			 }
			break;
			}
			case 4:{//conferir se o numero e realmente hexadecimal
				trans=0;
				for(i=0;i<cont;i++){
				 if (num[i]<48 || num[i]>57 && num[i]<65 || num[i]>70){//48 até 57 sao os números de 0 a 9 na tabela ASCII 
					 trans++;											 //e de 65 a 70 são as letras de A a F
				 }
			 }
			break;
			}
 		 }
	}
}
 //TRANSFORMAÇÃO CARACTER PARA INTEIRO
int fun_conv(int i){
/*O codigo abaixo transforma o valor ASCII no número referente*/
		 switch(num[i]){
 case 48:{
 return 0;
 }
 case 49:{
 return 1;
 }
 
 case 50:{
 return 2;
 }
 case 51:{
 return 3;
 }
 case 52:{
 return 4;
 }
 case 53:{
 return 5;
 }
 case 54:{
 return 6;
 }
 case 55:{
 return 7;
 }
 case 56:{
 return 8;
 }
 case 57:{
 return 9;
 }
 case 65:{
 return 10;//A
 }
 case 66:{
 return 11;//B
 }
 case 67:{
 return 12;//C
 }
 case 68:{
 return 13;//D
 }
 case 69:{
 return 14;//E
 }
 case 70:{
 return 15;//F
 }
 
 
		 }
}
//obter informações sobre a transformação
void escolhaa (char e1[11], char e2[11], char e3[11]){
while(escolha1<1 || escolha1>3){		
 printf("\nDigite em que base deseja transformar:\n1 - %s\n2 - %s \n3 - %s\n", e1, e2, e3);
 scanf("%d", &escolha1);//É a base em que irá ser transformada
 }	
} 
 
 //TRANSFORMAÇÃO BINÁRIO PARA OCTAL OU HEXADECIMAL
 
void transbi(int vet[], int base, int TAMvetor){
//obter o tamanho do vetor resultante.
 	int res=TAMvetor/base;
 		if(TAMvetor%base>0){ // se a divisao nao for exata, o tamanho do vetor resultante deve aumentar em 1
 		res++; 
 	}
				
					int veti[res];//vetor com o tamanho exato do binario em octal ou hexadecimal
					int pos=0;// variavel que determina a posição do vetor resultante
					int pot=0;//variavel que controla a quanto elevar as posiçoes do vetor de acordo com o numero digitado
					for (i=0;i<res;i++){//preenchendo veti[res] com 0, para que suas posiçoes possam ser somadas
 		veti[i]=0;
 	}
					//percorrer o vetor, elevando 2 a pot e multiplicando por vet[i], para obtermos os respectivos resultados
					for(i=0;i<TAMvetor;i++){	
			 		vet[i] = pow(2,pot)*vet[i];
						// Como transformamos para a base 8, elevamos a 0, 1 e 2. Quando o pot esta valendo 2, ele volta a valer 0
					 if(pot==base-1){ //controlando a potenciação
					 pot=-1; //-1, porém 9 linhas abaixo ele é adicionado em 1 e fica 0
					 }
						//mudar a posição de armazenamento do vetor resultante
 		 			if(i!=0){
							if (i%base==0){
					 	pos++;
					 	}
 	 }
 						veti[pos]+=vet[i]; // vetor resultante				 
						pot++;// -1+1=0
					}
					//escrever vetor resultante
				 for (i=res-1;i>=0;i--){//decrescendo, pois os numeros estao invertidos.
 if(veti[i]<10){ 
					 	printf("%d", veti[i]);
 }
 else{//se o valor da posicao for de 10 a 15, ele deve imprimir as seguintes letras:
 if(veti[i]==10){ 
					 	printf("A");
 }
 else{
 if(veti[i]==11){ 
					 	printf("B");
 }
 else{
 if(veti[i]==12){ 
					 		printf("C");
 } 
 else{
 if(veti[i]==13){ 
					 		printf("D");
 } 
 else{
 if(veti[i]==14){ 
 	printf("E");
 } 
 else{
 if(veti[i]==15){ 
					 	printf("F");
 } 
 } 
 } 
 } 
 } 
 } 
 }
				 }
}
 
 
 //TRANSFORMAÇÃO DECIMAL PARA BINARIO
	void tam_vetor (int vet[]){ /*entra com vet, que é o vetor do numero digitado
	// esta funçao transforma o numero contido em todo o vetor em apenas um numero e retorna qual o tamanho que iremos precisar para 
	transformarmos em binário.*/
	quant=0; // contandor do tamanho do vetor resultante
	int vetor[cont]; //criando um vetor do mesmo tamanho do vetor do numeero digitado 
	int pot=cont-1;// variavel correspondente à potencia de 10, para determinar o valor das posiçoes do vetor(vetor)
	int teste, troca, j=cont-1;
	for(i=0;i<j;i++){//estrutura para inverter o número. ex: 123 vira 321
	 	troca=vet[j];
	 vet[j]=vet[i];
	 vet[i]=troca;
	 j--;
	}
	for (i=0;i<cont;i++){//Determina a unidade de cada posição
		vetor[i]=pow(10,pot);
		vetor[i]*=vet[i];
		numfinal+=vetor[i];
		pot--;
		}
	teste=numfinal;
	while(teste!=0){
		teste/=2;
		quant++;//tamanho do vetor binario
	}
	}
int dec_bin(){//funcao para retornar os numeros decimal em binario
	int valor;	
	if (numfinal>1){
			valor=numfinal%2;
			numfinal/=2;
			return valor;
				
	}	
		else{
			return 1;
		}	
	}
	
 //TRANSFORMAÇÃO OCTAL/HEXADECIMAL EM BINARIO
void oct_hex(int base,int vet[]){
		i=0;//contador para percorrer vet(vetor com o numero digitado).
		int vetu[cont*base]; //tamanho necessário para o futuro vetor com números binários.
 for (j=(cont*base)-1;j>=0;j--){//contador para decrescer o vetor que receberá o número binário.
 if(vet[i]==7){
 		vetu[j]=1;
 		vetu[j-1]=1;
 		vetu[j-2]=1;
 		 j-=2; 
 }
 
 else{
 if(vet[i]==6){
 		 vetu[j]=0;
 		 vetu[j-1]=1;
 		 vetu[j-2]=1;
 		 j-=2;
 }
				 else{
 if(vet[i]==5){
 				vetu[j]=1;
 				vetu[j-1]=0;
 				vetu[j-2]=1;
 				 j-=2; 
 	 }	 
 
 else{
 if(vet[i]==4){
 		 vetu[j]=0;
 		 vetu[j-1]=0;
 		 vetu[j-2]=1;
 		 j-=2;
 }
 else{
 	if(vet[i]==3){
 			 	vetu[j]=1;
 			 	vetu[j-1]=1;
 			vetu[j-2]=0;
 			j-=2;
 	}
 	else{
 		if(vet[i]==2){
 				vetu[j]=0;
 				vetu[j-1]=1;
 				vetu[j-2]=0;
 				j-=2;
 	 }
 		else{
 			if(vet[i]==1){
 					vetu[j]=1;
	 				vetu[j-1]=0;
	 				vetu[j-2]=0;
 					j-=2;
 			
 	 }
 	 else{
 	 	if(vet[i]==0){
 	 			vetu[j]=0;
 	 			vetu[j-1]=0;
 	 			vetu[j-2]=0;
 	 			j-=2;
 	 	}
 	 	else{
 	 		if(vet[i]==8){
 	 				vetu[j]=0;
 	 				vetu[j-1]=0;
 	 				vetu[j-2]=0;
 	 				vetu[j-3]=1;
 	 				j-=3;
 	 		}
											else{
 	 			if(vet[i]==9){
 	 					vetu[j]=1;
 	 					vetu[j-1]=0;
 	 					vetu[j-2]=0;
 	 					vetu[j-3]=1;
 	 					j-=3;
 	 			}
												else{
 	 				if(vet[i]==10){
 	 						vetu[j]=0;
 	 						vetu[j-1]=1;
 	 						vetu[j-2]=0;
 	 						vetu[j-3]=1;
 	 						j-=3;
 	 				}
													else{
 	 					if(vet[i]==11){
vetu[j]=1;
 	 							vetu[j-1]=1;
 	 							vetu[j-2]=0;
 	 							vetu[j-3]=1;
 	 							j-=3;
 	 					}
														else{
 	 						if(vet[i]==12){
 	 								vetu[j]=0;
 	 								vetu[j-1]=0;
 	 								vetu[j-2]=1;
 	 								vetu[j-3]=1;
 	 								j-=3;
 	 						}
															else{
 	 							if(vet[i]==13){
 	 									vetu[j]=1;
 	 									vetu[j-1]=0;
 	 									vetu[j-2]=1;
 	 									vetu[j-3]=1;
 	 									j-=3;
 	 							}
																else{
 	 								if(vet[i]==14){
 	 										vetu[j]=0;
 	 										vetu[j-1]=1;
 	 										vetu[j-2]=1;
 	 										vetu[j-3]=1;
 	 										j-=3;
 	 								}
																	else{
 	 									if(vet[i]==15){
 	 											vetu[j]=1;
 	 											vetu[j-1]=1;
 	 											vetu[j-2]=1;
 	 											vetu[j-3]=1;
 	 											j-=3;
 	 									}
																	}
																}
															}
														}
													}
												}
															
											}
										}
									
									}
 		}
 		}
				 	 } 
 		}
 }
 }
 //para passar um octal para binario, sao necessarias 3 posições de um novo vetor para cada posição do vetor em octal
 //já para passar de hexadecimal para binario, sao necessarias 4 posicoes de um novo vetor para cada posição do vetor em hexadecimal
 if(vet[i]<8&&base==4){// esse comando coloca um 0 uma posicao abaixo de "j", caso o numero desejado seja hexadecimal
						vetu[j-1]=0;
						j-=1;
				}
 i++; 
 }
 if(escolha==2){ // o numero digitado é octal
 	switch (escolha1){
 		case 1:{//o numero desejado é binário
 			for (j=0;j<=(cont*base)-1;j++){ // função apenas imprime o codigo executado acima(binário)
 				printf("%d", vetu[j]);
 				}
 			break;
 		}
	 	case 2:{// o numero desejado é decimal
 	 		int trans=0;// variavel que reecebe o valor total do numero em decimal
 	 		int elev=0; //variável que controla o qualnto elevar
 	 for(i=(cont*base)-1;i>=0;i--){
							trans+=pow(2,elev)*vetu[i];
							elev++;	
						}
						printf("%d", trans);
 	 	break;
 		}
	 	case 3:{// o numero desejado é hexadecimal
 	 		int entrada=cont*base; // tamanho do vetor em binário
 	 		int vetucopia[entrada]; // vetucopia(declarando-o do mesmo tamanho de vetu)
 			int j=0;
 			for (i=entrada-1;i>=0;i--){//copiando vetor, porem com os numeros invertidos
 				vetucopia[j]=vetu[i];
							j++;	
	 		}
 	 		transbi(vetucopia,4,entrada);//chamando a função que transforma de binário em hexadecimal;
 	 	break;
 		}
	 }
 	 }
 	 if(escolha==4){//o numero digitado é hexadecimal
 	switch (escolha1){
 		case 1:{//o número desejado é binário
 			for (j=0;j<=(cont*base)-1;j++){
 				printf("%d", vetu[j]);
 				}
 			break;
 		}
	 	case 2:{//o numero desejado é octal
	 		int entrada=cont*base;
 	 		int vetucopia[entrada];
 			int j=0;
 			for (i=entrada-1;i>=0;i--){
 				vetucopia[j]=vetu[i];
							j++;	
	 		}
 	 		transbi(vetucopia,3,entrada);
 	 	break;
 	 		
 		}
	 	case 3:{// o numero desejado é decimal
 	 		int trans=0;
 	 		int elev=0;
 	 	for(i=(cont*base)-1;i>=0;i--){
							trans+=pow(2,elev)*vetu[i];
							elev++;	
						}
						printf("%d", trans);
 	 	break;
 		}
	 }
 	 }
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais