IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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
marcelmraz
Člen
Avatar
marcelmraz:13.10.2014 20:39

Ahoj, jsem úplný začátečník a zkouším udělat do školy program na převod z dvojkové do desítkové soustavy. Napsal jsem si to na papíře a měl bych to mít logicky dobře, ale poté co jsem to přepsal do VS, my to hned spadne. Můžete mi pomoct v čem bude nejspíš velmi triviální chyba? Mám pocít že je něco špatně s tím int b = Convert.ToInt32(j­.Substring(++n, 1))
Zdroják:

Console.WriteLine("Program na převádění čísel z dvojkové do desítkové soustavy");
            Console.WriteLine("Napište číslo ve dvojkové soustavě");
            string j = Console.ReadLine(); //zadaný řetězec od uživatele př. 1100010
            int l = j.Length; //délka znaků př. 7
            double výsledek = 0; //pomocná proměnná
            int n = 0; // pomocná proměnná
            Console.WriteLine("Počet znaků je: {0}", l);
            for (int i = 0; i < l; i++) //cyklus by se měl opakovat 7x - když je délka znaků 7
            {
                    int b = Convert.ToInt32(j.Substring(++n, 1)); //b by měl být první znak v zadaným řetezci př. (1)100010, po proběhnutí cyklu 1(1)00010 atd.
                    výsledek = b * Math.Pow(2, i) + výsledek;   //výsledek = 1. znak * 2 na i (i=0), potom se bude zvětšovat (viz. hlavní cyklus) + výsledek (pomocná proměnna zatím 0)

            }
            Console.WriteLine("Výsledek je ", výsledek); //po proběhnutí cyklu 7x by to mělo vypsat výsledek, co je špatně? :D
            Console.ReadKey();
Editováno 13.10.2014 20:40
 
Odpovědět
13.10.2014 20:39
Avatar
Odpovídá na marcelmraz
Neaktivní uživatel:13.10.2014 20:46

Mysím si že C# nezná ++n (vím že to zná C, ale C# nevím). Každopádně jestli se snažíš inkrementovat n o jedna, tak to má být n++ :)

// A ten algoritmus podle mě nebude fungovat

Editováno 13.10.2014 20:47
Nahoru Odpovědět
13.10.2014 20:46
Neaktivní uživatelský účet
Avatar
g1ml1
Člen
Avatar
Odpovídá na Neaktivní uživatel
g1ml1:13.10.2014 20:49

Ja myslím, že zná. Mělo by to fungovat stejně jako v C.

 
Nahoru Odpovědět
13.10.2014 20:49
Avatar
Odpovídá na Neaktivní uživatel
Lukáš Křehula:13.10.2014 20:50

C# to zná, ale ono to přičte jedničku okamžitě, takže by se ten string začal "lámat" od 2. znaku

 
Nahoru Odpovědět
13.10.2014 20:50
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na marcelmraz
gcx11:13.10.2014 20:52

Čau,
pokud převádíš čísla z dvojkové do desítkové, tak se ty mocniny násobí opačně. Poslední číslo se vynásobí 1 (20), další předposlední 2 (21), předpředposlední 4 (22), ty to děláš opačně.

Editováno 13.10.2014 20:53
 
Nahoru Odpovědět
13.10.2014 20:52
Avatar
marcelmraz
Člen
Avatar
marcelmraz:13.10.2014 20:53

no ale já tam mám nulu, takže by tam měla naskočit jednička když je to ++n ne? :) a přihazuju screen, co mi to píše, když to spadne.

 
Nahoru Odpovědět
13.10.2014 20:53
Avatar
Odpovídá na marcelmraz
Neaktivní uživatel:13.10.2014 20:54

A jestli C# zná ++x, tak se omlouvám, moje neznalost :)

Nahoru Odpovědět
13.10.2014 20:54
Neaktivní uživatelský účet
Avatar
g1ml1
Člen
Avatar
Odpovídá na marcelmraz
g1ml1:13.10.2014 20:55

Pro získání číselné hodnoty z řetězce musíš použít metodu Parse().

int.Parse("5")

Convert se používá na číselné operace.
V C# k řezězci můžes přistupovat jako k poli znaků, takže

j[i].ToString()

a opdadne ti ten Substring().
Pak už by to mělo fungovat.

Editováno 13.10.2014 20:57
 
Nahoru Odpovědět
13.10.2014 20:55
Avatar
Odpovídá na marcelmraz
Lukáš Křehula:13.10.2014 20:57

Už jsem to tu psal, každopádně, gcx11 to tu už psal, musíš ten string převrátit. Doporučuji použít ToCharArray(), následně Array.Reverse
Projeď to cyklem foreach a pokud na daném místě je jednička, tak přičti k hodnotě nějakou další hodnotu.

Console.WriteLine("Program na převádění čísel z dvojkové do desítkové soustavy");
Console.WriteLine("Napište číslo ve dvojkové soustavě");
string j = Console.ReadLine(); //zadaný řetězec od uživatele př. 1100010
char[] c = j.ToCharArray(); // převedeme na char
Array.Reverse(c); // obrátíme řetězec
int i = 0; // pro zjištění aktuální pozice
double result = 0; // výsledek
foreach(char s in c)
{
    if (s == '1') // pokud se na daném místě nacházi jednička
        result += Math.Pow(2, i); // tak k výsledku přidáme hodnotu
    i++;
}
Console.WriteLine(result);
Console.ReadKey();
 
Nahoru Odpovědět
13.10.2014 20:57
Avatar
Michal Žůrek - misaz:13.10.2014 21:04

1.) vymýšlíš kolo :)

Convert.ToInt32(j, 2).ToString(); // vrátí výsledek

2.) pokud se chceš striktně držet algoritmického postupu, tak bych to řešil, tak že ten cykl obrátím. Půjdu od počet znaků mínis 1 k 0 a v každém kroku vynásobím číslo na daném indexu s druhou mocninou 2,ta k aby pro posledí číslici bylo 2 na 0.

string zadaneCislo = "1010";
int mezivysledek = 0;

for (int i = zadaneCislo.Length - 1; i >= 0; i--)
{
        string s = zadaneCislo[i].ToString();
        mezivysledek += int.Parse(s) * ((int)Math.Pow(2, zadaneCislo.Length - 1 - i));
}

Console.WriteLine(mezivysledek);
Console.ReadKey();

3.) pokud ten cykl potřebuješ mít striktně klasický:

for (int i = 0; i < zadaneCislo.Length; i++)
{
        int mocnina = (int)Math.Pow(2, zadaneCislo.Length - 1 - i);
        int cislice = int.Parse(zadaneCislo[i].ToString());
        mezivysledek += mocnina * cislice;
}

Note: místo toho šíleného convertu používej int.Parse a C# zná ++n.

Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět
13.10.2014 21:04
Avatar
marcelmraz
Člen
Avatar
marcelmraz:13.10.2014 21:04

Super, ano měl jsem to obráceně, díky vám kluci moc! Ještě jsem to udělal takto:

Console.WriteLine("Program na převádění čísel z dvojkové do desítkové soustavy");
            Console.WriteLine("Napište číslo ve dvojkové soustavě");
            string j = Console.ReadLine(); //zadaný řetězec od uživatele př. 1100010
            int l = j.Length; //délka znaků př. 7
            double výsledek = 0; //pomocná proměnná
            int c = 1; //pomocná proměnná
            Console.WriteLine("Počet znaků je: {0}", l);
            for (int i = 0; i < l; i++) //cyklus by se měl opakovat 7x - když je délka znaků 7
            {
                int n = l - c++;
                int b = Convert.ToInt32(j.Substring(n, 1)); //b by měl být poslední znak v zadaným řetezci př. 110001(0), po proběhnutí cyklu 11000(1)0 atd.
                výsledek = b * Math.Pow(2, i) + výsledek;   //výsledek = 1. znak * 2 na i (i=0), potom se bude zvětšovat (viz. hlavní cyklus) + výsledek (pomocná proměnna zatím 0)

            }
            Console.WriteLine("Výsledek je {0}", výsledek); //po proběhnutí cyklu 7x by to mělo vypsat výsledek
            Console.ReadKey();
 
Nahoru Odpovědět
13.10.2014 21:04
Avatar
Ondřej Kábrt:1.3.2022 12:16

Moje řešení:

using System;

namespace _2_do_10
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Zadej číslo v binarní soustavě:");
            string cislo = Console.ReadLine();
            double pomocna = 0;
            int n = cislo.Length - 1;

            for(int i=0; i <= cislo.Length-1; i++){
                pomocna += (cislo[i] - '0') * (Math.Pow(2, n));
                n--;
     }
            Console.WriteLine("{0}", pomocna);


        }

    }
    }
 
Nahoru Odpovědět
1.3.2022 12:16
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 12 zpráv z 12.