Avatar
laney10
Člen
Avatar
laney10:

Ahojte,
Hledám funkci na převod šestnáctkového čísla na desítkové.Nevíte o něčem?

 
Odpovědět 31.10.2014 19:03
Avatar
laney10
Člen
Avatar
Odpovídá na Jan Vargovský
laney10:

Je to úkol do školy a nechce se mi to dělat pomocí polí a cyklů, proto hledám alternativu jako je funkce.

 
Nahoru Odpovědět 31.10.2014 19:23
Avatar
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět 31.10.2014 19:47
Avatar
laney10
Člen
Avatar
Odpovídá na Jan Vargovský
laney10:

:), 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.

 
Nahoru Odpovědět 31.10.2014 19:53
Avatar
laney10
Člen
Avatar
Odpovídá na laney10
laney10:

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.

 
Nahoru Odpovědět 31.10.2014 19:57
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na laney10
Jan Vargovský:

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.

 
Nahoru Odpovědět 31.10.2014 20:24
Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

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š.

Editováno 31.10.2014 20:53
 
Nahoru Odpovědět 31.10.2014 20:51
Avatar
Jan Vargovský
Redaktor
Avatar
 
Nahoru Odpovědět 31.10.2014 20:54
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Jan Vargovský
Lukáš Křehula:

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.

 
Nahoru Odpovědět 31.10.2014 21:02
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Lukáš Křehula
Jan Vargovský:

Proč by tam nebyl reverse stringu? :D

 
Nahoru Odpovědět 31.10.2014 21:10
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na Lukáš Křehula
tomisoka:

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?

 
Nahoru Odpovědět 31.10.2014 21:11
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na laney10
tomisoka:

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;
}
 
Nahoru Odpovědět 31.10.2014 21:29
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na tomisoka
Jan Vargovský:
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;
}
:)
 
Nahoru Odpovědět 31.10.2014 21:41
Avatar
laney10
Člen
Avatar
laney10:

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?

 
Nahoru Odpovědět 1.11.2014 20:42
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na laney10
tomisoka:

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.

 
Nahoru Odpovědět 1.11.2014 22:25
Avatar
vitamin
Člen
Avatar
vitamin:

http://en.cppreference.com/…_string/stol

std::cout << std::stoi("FF", 0, 16);
 
Nahoru Odpovědět 1.11.2014 22:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.