Do nového roku jako lepší programátoři? Znovu otevíráme večerní školu programování. Nette framework, návrhové vzory, testování nebo vůbec poprvé kurzy ASP.NET dostupné odkudkoli v republice.
Avatar
marcelmraz
Člen
Avatar
marcelmraz:

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
Jiří Gracík
Redaktor
Avatar
Odpovídá na marcelmraz
Jiří Gracík:

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
Creating websites is awesome till you see the result in another browser ...
Avatar
g1ml1
Člen
Avatar
Odpovídá na Jiří Gracík
g1ml1:

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

 
Nahoru Odpovědět 13.10.2014 20:49
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Jiří Gracík
Lukáš Křehula:

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
Redaktor
Avatar
Odpovídá na marcelmraz
gcx11:

Č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:

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
Jiří Gracík
Redaktor
Avatar
Odpovídá na marcelmraz
Jiří Gracík:

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

Nahoru Odpovědět 13.10.2014 20:54
Creating websites is awesome till you see the result in another browser ...
Avatar
g1ml1
Člen
Avatar
Odpovídá na marcelmraz
g1ml1:

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  +1 13.10.2014 20:55
Avatar
Lukáš Křehula
Redaktor
Avatar
Odpovídá na marcelmraz
Lukáš Křehula:

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  +1 13.10.2014 20:57
Avatar
Michal Žůrek (misaz):

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
Nesnáším {}, proto se jim vyhýbám.
Avatar
marcelmraz
Člen
Avatar
marcelmraz:

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
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 11 zpráv z 11.