Baixe o app para aproveitar ainda mais
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; } } } }
Compartilhar