-
Notifications
You must be signed in to change notification settings - Fork 0
/
coversor.cpp
249 lines (201 loc) · 8.38 KB
/
coversor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#include <stdio.h>
#include <math.h>
#include <string.h>
//Chamadas das funções
int converterBin2Dec(long long valor_binario);
long long converterDec2Bin(int valor_decimal);
int converterDec2Oct(int valor_decimal);
long long converterOct2Dec(int valor_octal);
int main()
{
//Variáveis usadas
char opc = ' ';
int valor_octal;
long long valor_binario;
int valor_decimal, cociente;
int sequencial, valor_temp, tamanho_string;
char valor_hexa[100];
//Enquanto não for a opção 0 (Sair)
while (opc != '0') {
//Mostra o menu principal
printf("\n----------------------\n");
printf("Digite a Opcao\n");
printf("1 - Binario para Decimal\n");
printf("2 - Binario para Octal\n");
printf("3 - Decimal para Binario\n");
printf("4 - Decimal para Octal\n");
printf("5 - Decimal para Hexa\n");
printf("6 - Octal para Decimal\n");
printf("7 - Hexa para Decimal\n");
printf("0 - Sair\n");
printf("Resposta: ");
scanf("%c", &opc);
getchar();
//Opção 1 - Binário -> Decimal
if (opc == '1') {
printf("Digite numero binario: ");
scanf("%lld", &valor_binario);
printf("[%lld] em binario = [%d] em decimal\n", valor_binario, converterBin2Dec(valor_binario));
}
//Opção 2 - Binário -> Octal
else if (opc == '2') {
printf("Digite numero binario: ");
scanf("%lld", &valor_binario);
valor_decimal = converterBin2Dec(valor_binario);
valor_octal = converterDec2Oct(valor_decimal);
printf("[%lld] em binario = [%d] em octal\n", valor_binario, valor_octal);
}
//Opção 3 - Decimal -> Binário
else if (opc == '3') {
printf("Digite o numero decimal: ");
scanf("%d", &valor_decimal);
printf("[%d] em decimal = [%lld] em binario\n", valor_decimal, converterDec2Bin(valor_decimal));
}
//Opção 4 - Decimal -> Octal
else if (opc == '4') {
printf("Digite o numero decimal: ");
scanf("%d", &valor_decimal);
printf("[%d] em decimal = [%d] em octal\n", valor_decimal, converterDec2Oct(valor_decimal));
}
//Opção 5 - Decimal -> Hexadecimal
else if (opc == '5') {
printf("Digite o numero decimal: ");
scanf("%d", &valor_decimal);
//Zerando variáveis
sequencial = 0;
cociente = valor_decimal;
//Enquanto tiver cociente
while (cociente != 0) {
//Pega o resto da divisão por 16
valor_temp = cociente % 16;
//Se for menor que 10, soma com 48 (tabela ascii - parte de números)
if( valor_temp < 10)
valor_temp = valor_temp + 48;
//Senão, soma com 55 (tabela ascii - parte de letras)
else
valor_temp = valor_temp + 55;
//Joga o caracter na sequência da string
valor_hexa[sequencial++] = valor_temp;
//Divide o resto por 16
cociente = cociente / 16;
}
//Encerra a string e mostra a mensagem
valor_hexa[sequencial++] = '\0';
printf("[%d] em decimal = [%s] em hexa", valor_decimal, valor_hexa);
}
//Opção 6 - Octal -> Decimal
else if (opc == '6') {
printf("Digite o numero octal: ");
scanf("%d", &valor_octal);
printf("[%d] em octal = [%lld] em decimal\n", valor_octal, converterOct2Dec(valor_octal));
}
//Opção 7 - Hexa -> Decimal
else if (opc == '7') {
//Zera a variável de valor Decimal
valor_decimal = 0;
//Mostra mensagem para inserir valor hexa
printf("Insira o valor hexa: ");
gets(valor_hexa);
//Pega o tamanho da string
tamanho_string = strlen(valor_hexa);
tamanho_string--;
//Percorre todas as posições da string
for(sequencial=0; valor_hexa[sequencial]!='\0'; sequencial++)
{
//Se for maior ou igual a 0 e menor ou igual a 9, será o valor retirando 48 (tabela ascii)
if(valor_hexa[sequencial]>='0' && valor_hexa[sequencial]<='9')
{
valor_temp = valor_hexa[sequencial] - 48;
}
//Se for maior ou igual a a e menor ou igual a f, será o valor retirando 97 (tabela ascii) + 10 (0 a 9)
else if(valor_hexa[sequencial]>='a' && valor_hexa[sequencial]<='f')
{
valor_temp = valor_hexa[sequencial] - 97 + 10;
}
//Se for maior ou igual a A e menor ou igual a F, será o valor retirando 65 (tabela ascii) + 10 (0 a 9)
else if(valor_hexa[sequencial]>='A' && valor_hexa[sequencial]<='F')
{
valor_temp = valor_hexa[sequencial] - 65 + 10;
}
//Incrementa o valor decimal multiplicando o valor por 16 elevado à potência
valor_decimal += valor_temp * pow(16, tamanho_string);
tamanho_string--;
}
printf("[%s] em hexa = [%d] em decimal", valor_hexa, valor_decimal);
}
//Opção desconhecida
else {
printf("Opcao desconhecida [%c]\n", opc);
}
}
return 0;
}
//Função para converter Binário para Decimal
int converterBin2Dec(long long valor_binario)
{
int valor_decimal = 0, sequencial = 0, resto;
//Enquanto existir valor no binário
while (valor_binario != 0)
{
//Pega o resto da divisão do valor binário por 10
resto = valor_binario % 10;
//Divide o valor binário por 10
valor_binario /= 10;
//Incrementa o valor decimal com o resto da divisão multiplicado por 2 elevado ao sequencial
valor_decimal += resto * pow(2, sequencial);
//Incrementa a sequencial
++sequencial;
}
return valor_decimal;
}
//Função para converter Decimal para Binário
long long converterDec2Bin(int valor_decimal)
{
long long valor_binario = 0;
int resto, sequencial = 1;
//Enquanto o valor decimal for diferente de zero
while (valor_decimal != 0)
{
//Pega o resto da divisão
resto = valor_decimal % 2;
//Divide o valor decimal por 2
valor_decimal /= 2;
//Incrementa o valor binário, multiplicando o resto da divisão pelo sequencial
valor_binario += resto * sequencial;
//Multiplica o sequencial por 10
sequencial *= 10;
}
return valor_binario;
}
//Função para converter Decimal para Octal
int converterDec2Oct(int valor_decimal)
{
int valor_octal = 0, sequencia = 1;
//Enquanto o valor decimal for diferente de zero
while (valor_decimal != 0)
{
//Incrementa o valor octal com o resto da divisão do decimal por 8 multiplicado pelo sequencial
valor_octal += (valor_decimal % 8) * sequencia;
//O valor decimal será dividido por 8
valor_decimal /= 8;
//O sequencial sera multiplicado por 10
sequencia *= 10;
}
return valor_octal;
}
//Função para converter Octal para Decimal
long long converterOct2Dec(int valor_octal)
{
int valor_decimal = 0, sequencia = 0;
//Enquanto o valor octal for diferente de zero
while(valor_octal != 0)
{
//Incrementa o valor decimal com o resto da divisão do valor octal por 10 multiplicado por 8 elevado pelo sequencial
valor_decimal += (valor_octal % 10) * pow(8, sequencia);
//Incrementa o sequencial
++sequencia;
//Divide o valor octal por 10
valor_octal /= 10;
}
return valor_decimal;
}