Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
laney10
Člen
Avatar
laney10:31.10.2014 19:03

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:31.10.2014 19:23

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ý
Tvůrce
Avatar
Odpovídá na laney10
Jan Vargovský:31.10.2014 19:47

Asi myslíš progtest.

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

:), 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:31.10.2014 19:57

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ý
Tvůrce
Avatar
Odpovídá na laney10
Jan Vargovský:31.10.2014 20:24

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:31.10.2014 20:51

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ý
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Jan Vargovský:31.10.2014 20:54

On chce spíše C/C++ :)

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

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ý
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Jan Vargovský:31.10.2014 21:10

Proč by tam nebyl reverse stringu? :D

 
Nahoru Odpovědět
31.10.2014 21:10
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
tomisoka:31.10.2014 21:11

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
Tvůrce
Avatar
Odpovídá na laney10
tomisoka:31.10.2014 21:29

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ý
Tvůrce
Avatar
Odpovídá na tomisoka
Jan Vargovský:31.10.2014 21:41
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:1.11.2014 20:42

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
Tvůrce
Avatar
Odpovídá na laney10
tomisoka:1.11.2014 22:25

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:1.11.2014 22:27

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.