c_cpp EstudodeConversãodebases - OrganizaçãodeComputadores

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp EstudodeConversãodebases - OrganizaçãodeComputadores相关的知识,希望对你有一定的参考价值。

/*Estudo pratico de conversão de bases
  Autor: Antônio Abrantes
  Disciplina: Organização de Computadores - 3º Semestre */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

//Declaração das funções do sistema
void menu();
void converte(char *str, int num, int idx);
void converteUmBinario(int dividendo, char *vet, int base);
void converteDecimal(char *str, int op);
char hexadecimal(int num);
int hexadecimalNum(char num);
void converteHexadecimal(char *str);
void converteOctal(char *str);
void conveteHexaDecimal(char *str);
void converteHexaDecimal2(char *str);
void converteOctalDecimal(char *str);
void converteBinario(int dividendo, char *conver, char *strBinario);

//Função que retorna a letra correspodente ao numero em Hexadecimal
char hexadecimal(int num){
	if(num == 10){
		return 'A';
	}
	if(num == 11){
		return 'B';
	}
	if(num == 12){
		return 'C';
	}
	if(num == 13){
		return 'D';
	}
	if(num == 14){
		return 'E';
	}
	if(num == 15){
		return 'F';
	}
	return 0;
}

//Função que retorna o numero correspondente a letra do Hexadecimal
int hexadecimalNum(char num){
	if(num == 'A'){
		return 10;
	}
	if(num == 'B'){
		return 11;
	}
	if(num == 'C'){
		return 12;
	}
	if(num == 'D'){
		return 13;
	}
	if(num == 'E'){
		return 14;
	}
	if(num == 'F'){
		return 15;
	}
	return 0;
}

/* Função 1 para converter de um Hexadecimal para Decimal
Versão que converte cada caracter de acordo com o conjunto de de 4 bits
definido atravez a operação da função "converteUmBinario" */
void conveteHexaDecimal(char *str){
	int i;
	char strTemp[100], decimal[100];
	for(i = strlen(str)-1; i >= 0 ; i--){
		int temp;
		if(str[i] >= '0' && str[i] <= '9'){			
			strTemp[0] = str[i];
			strTemp[1] = '\0';
			temp = atoi(strTemp);
		}else{
			temp = hexadecimalNum(str[i]);
		}			
		converteUmBinario(temp, strTemp, 4);
		strcat(decimal, strTemp);			
	}
	printf("Decimal correspondente.: ");
	converteDecimal(decimal, 2);
	printf("\n");
}

/* Função 2 para converter de um Hexadecimal para Decimal
Versão mais simplificada, onde o valor de cada caracter é multiplicado 
pela base 16 elevado ao numero correspondente a sua posição*/
void converteHexaDecimal2(char *str){
	int i, j, temp, soma = 0;
	j = 0;
	char strTemp[100];
	
	for(i = strlen(str)-1; i >= 0 ; i--){
		if(str[i] >= '0' && str[i] <= '9'){			
			strTemp[0] = str[i];
			strTemp[1] = '\0';
			temp = atoi(strTemp);
		}else{
			temp = hexadecimalNum(str[i]);
		}			
		soma += temp * pow(16, j);
		j++;			
	}
	printf("Decimal correspondente.: %d\n", soma);
}

//Função para converter Binario para Hexadecimal
void converteHexadecimal(char *str){
	int i, j, o = 0, soma;
	int hexa[100];
	printf("\n");
	for(i = 0; i < strlen(str); i++){		
		soma = 0;
		for(j = 0; j < 4; j++){
			if(str[i+j] == '1'){
				soma += 1 * pow(2, j);
			}
		}
		i += j-1;		
		hexa[o] = soma;
		o++;
	}
	printf("Hexadecimal..: ");
	for(i = o-1; i >= 0; i--){
		if(hexa[i] < 10){
			printf("%d", hexa[i]);
		}else{
			printf("%c", hexadecimal(hexa[i]));
		}
	}	
}

//Função para converter Binario para Octal
void converteOctal(char *str){
	int i, j, o = 0, soma;
	int octal[100];
	printf("\n");
	for(i = 0; i < strlen(str); i++){		
		soma = 0;
		for(j = 0; j < 3; j++){
			if(str[i+j] == '1'){
				soma += 1 * pow(2, j);
			}
		}
		i += j-1;
		
		octal[o] = soma;
		o++;
	}
	printf("Octal........: ");
	for(i = o-1; i >= 0; i--){
		printf("%d", octal[i]);
	}	
	printf("\n");
}

//Função para converter de um Octal para um Decimal
void converteOctalDecimal(char *str){
	int i;
	char strTemp[100], decimal[100];
	for(i = strlen(str)-1; i >= 0 ; i--){
		strTemp[0] = str[i];
		strTemp[1] = '\0';	
		int temp = atoi(strTemp);
		converteUmBinario(temp, strTemp, 3);
		strcat(decimal, strTemp);			
	}
	printf("Decimal correspondente.: ");
	converteDecimal(decimal, 2);
	printf("\n");	
}

//Converte um termo de uma base Octal ou Hexadecimal para binario
void converteUmBinario(int dividendo, char *binario, int base){	
	int i = 0, divisor = 2, resto, temp[100];
	while(dividendo > 1){
		resto = dividendo % divisor;
		dividendo = dividendo / divisor;
		temp[i] = resto;
		converte(binario, temp[i], i);
		i++;
	}		
	temp[i] = dividendo;
	converte(binario, temp[i], i);	
	if(i < base){
		for(i = i+1 ; i < base ; i++){
			binario[i] = '0';
		}
		binario[i] = '\0';
	}else{
		binario[i+1] = '\0';
	}
}

//Função para converter Binario para Decimal
void converteDecimal(char *str, int op){
	int i, num = 1, soma = 0;
	
	for(i = 0; i < strlen(str); i++){
		if(str[i] == '1'){
			soma += num;
		}
		num = num * 2;
	}
	if(op == 1){		
		printf("Decimal......: %d\n", soma);
	}else if(op == 3){
		printf("Decimal correspondente.: %d\n", soma);
	}else{
		printf("%d", soma);
	}	
}

//Converte o numero Decimal em binario
void converteBinario(int dividendo, char *conver, char *strBinario){	
	int i = 0, divisor = 2, resto;
	while(dividendo > 1){
		resto = dividendo % divisor;
		dividendo = dividendo / divisor;
		//envia para a função que concatena os restos do vetor para string
		converte(conver, resto, i);
		i++;
	}		
	//envia para a função que concatena os restos do vetor para string
	converte(conver, dividendo, i);
	conver[i+1] = '\0';	
	//Inverte o conteudo da string para a exibição correta do numero Binario	
	int j = 0;	
	for( ; i >= 0; i--){
		strBinario[j] = conver[i];
		j++;
	}
	strBinario[j] = '\0';
	printf("Binario......: %s", strBinario);
}

//Função MAIN
int main()
{	
	int dividendo, op;
	char conver[100];
	char strBinario[100];
	char vet[100];
	
	while(1){
		menu();
		scanf("%d", &op);
		if(op == 0)
			break;
		
		switch(op){
		case 1:
			printf("Digite um Decimal: ");
			scanf("%d", &dividendo);
			converteBinario(dividendo, conver, strBinario);
			converteHexadecimal(conver);
			converteOctal(conver);
			system("pause");
			break;
		case 2:
			printf("\nDigite um Octal: ");
			scanf("%s", vet);
			converteOctalDecimal(vet);
			system("pause");
			break;
		case 3:
			printf("\nDigite um Hexadecimal: ");
			scanf("%s", vet);
			//conveteHexaDecimal(vet);
			converteHexaDecimal2(vet);
			system("pause");
			break;
		case 4:
			printf("\nDigite um Binario: ");
			scanf("%s", vet);
			converteDecimal(vet,3);
			system("pause");
			break;
		default:
			break;
		}	
	}
	
	printf("\n>>>Encerrando o sistema<<<\n");
	system("PAUSE");
		
	return 0;
}

//Função do menu do sistema de conversão de bases
void menu(){	
	system("CLS");
	printf("\n+--------------------------+\n");
	printf("|    Conversao de Bases    |\n");
	printf("+--------------------------+\n\n");
	printf("	OPCOES:\n");
	printf("  0 - Sair do sistema\n");
	printf("  1 - Decimal para Binario, Hexadecimal e Octal\n");
	printf("  2 - Ocatal para Decimal\n");
	printf("  3 - Hexadecimal para Decimal\n");
	printf("  4 - Binario para Decimal\n");
	//printf("  5 - \n");
	//printf("  6 - \n\n");
	printf(" Digite a opcao: ");
}

/*Função recebe os restos em cada interação e concatena em
  uma string que define o numero em Binario*/
void converte(char *str, int num, int idx){
	if(num == 0){
		str[idx] = '0';
	}else{
		str[idx] = '1';
	}	
}

以上是关于c_cpp EstudodeConversãodebases - OrganizaçãodeComputadores的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp CLASE-22-02

c_cpp 22.c

c_cpp dht22.comment.ino

c_cpp DHT22_ThingSpeak.ino

c_cpp esp8266.read.dht22.ino

c_cpp ep8266.arduino.dht22.ino