Diskuze: Hexadecimal to decimal
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Je to úkol do školy a nechce se mi to dělat pomocí polí a cyklů, proto hledám alternativu jako je funkce.
, jsem na dálkovém studiu
a musím se z ničeho naučit všechno.
Nějak nechápu ty cykly na konverzi z hex na dec.
Třeba 77f = 7162+7161+15 = 1919.
Měl by to být cyklus pospátku na to jsem našel v <algorithm> reverse
ale jak dál? to nevím.
Mám tu nápovědu: https://github.com/…est_07_1.cpp
ale nechce se mi opisovat protože se tak nic nenaučím.
7*162 + 7*161 + 15*^160 = 1919. Tvůj způsob trošku nechápu. Jinak můžeš to vzít odpředu i odzadu. Vykašli se na nějaké kontroly (špatný vstup) a prostě to zkonvertuj, pošli nějaký kód, který aspoň něco dělá a pak ti klidně dál pomůžu.
Můj vlastní převaděč jsem dělal na konci prváku. Měl jsem několik
verzí, nakonec jsem to zmenšil asi na 1/3 z prvního pokusu.
Ono vlastně jde o to, že na vstupu dostaneš hex číslo, které projedeš
cyklem (můžeš použít deterministický nebo foreach) a budeš zjišťovat
znaky a podle toho vypočítávat hodnotu a sčítat a takhle pořád dokola.
Nejdůležitější je ale nejdřív ten vstup obrátit.
Následující kód je napsán v C#, ale snad tomu porozumíš a nějak si to přebereš.
string mozneVstupy = "0123456789ABCDEF";
int vyslednaHodnota = 0; int mocnina = 0;
Console.WriteLine("Zadej vstup: ");
string vstup; vstup = Console.ReadLine();
char[] obracenyVstup = vstup.ToCharArray();
Array.Reverse(obracenyVstup);
foreach(char c in obracenyVstup)
{
vyslednaHodnota += mozneVstupy.IndexOf(c) * (int)Math.Pow(16, mocnina);
mocnina++;
}
Console.WriteLine(vyslednaHodnota);
Console.ReadKey();
Samozřejmě mám i kontrolu, jestli uživatel zadal vstup správně, ale to snad zvládneš sám. Pokud by bylo něco nejasné, tak napiš.
Tím jsem si vědom, jen jsem mu nabídl alternativu řešení toho příkladu. V C++ to lze napsat obdobně, jen tam není už reverse stringu. Tím pádem může použít for a číst od konce.
Trochu nechápu k čemu ti tam je ten reverse, není jednoduší a rychlejší to číst od začátku a vždy při dalším znaku to vynásobit 16?
Můžeš to napsat třeba takto:
int i, result = 0;
char input[] = "DEBAF39";
for(i=0; i<strlen(input);++i){
result*=16;
result+=(input[i]>='0' && input[i] <='9')?input[i]-'0':input[i]-'A'+10;
}
int i, result = 0;
char input[] = "DEBAF39";
for(i=0; i<strlen(input);++i){
result <<= 4;
result+=(input[i]>='0' && input[i] <='9')?input[i]-'0':input[i]-'A'+10;
}
Vytvo5il jsem toto:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
char hex[25];
int i,cislo,len,pocitadlo = 0;
long int sum = 0;
cout << "Zadej hexadecimalni cislo:" << endl;
gets(hex);
strupr(hex);
len = strlen(hex);
for(i = len - 1; i >=0; i--)
{
if(hex[i] >= '0' && hex[i] <= '9')
cislo = hex[i] - '0';
else
{
if(hex[i] >= 'A' && hex[i] <= 'F')
cislo = hex[i] - 55;
else
{
cout << "Nespravny vstup." << endl;
return 0;
}
}
sum = sum + pow(16,pocitadlo) *cislo;
pocitadlo++;
}
cout << "Desitkove : " << sum << endl;
return 0;
}
Slo by to nejak zkratit?
Tak místo:
if(...){
...
else{
if(...){
...
else{
...
}
}
se používá :
if(...){
...
}else if(...){
...
}else{
...
}
také můžeš zjednodušit toto:
sum = sum + ...; // je to samé jako
sum+= ...;
a potom je zbytečně náročné vypočítávat mocninu, jednodušší a rychlejší je ta moje verze.
http://en.cppreference.com/…_string/stol
std::cout << std::stoi("FF", 0, 16);
Zobrazeno 17 zpráv z 17.