Diskuze: Převod do binární soustavy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 50 zpráv z 61.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
To je příšerné, to smaž
Stačí v cyklu while dělit číslo dvojkou, dokud nevyjde nula. Na zbytek po dělení je tu operátor %, např (53 % 2) vrátí 1. Výsledky si přidávej do stringu jako s = s + zbytek.ToString(). String poté jen převrátíš metodou s = s.Reverse();
EDIT: Algoritmus máš tady: http://www.matweb.cz/prevod
Další EDIT: Abych ještě řekl, co je tam špatně, tak hlavně to
převádění na string (je zbytečné, pomalé, matoucí), navíc záleží na
OS jaký máš desetinný oddělovač, tu čárky by ti anglické Windows
nevzaly. Věčně tam něco konvertuješ, není to potřeba.
No tak převody mezi soustavami umím. Nehápu, jak tam zakomponovat %.
Tak mám problém i s opačným převodem:
public void ZBinarni()
{
float b = 0;
int f = z.ToString().Length; //// z je číslo k převodu do bin. soustavy,...;
string x = "";
while (z.ToString().Length - b > 0)
{
x = z.ToString().Substring(f - 1, f);
if (x == "1")
mezipocet = (float) (Math.Pow(2, b));
vysledek = vysledek + mezipocet;
f--;
b++;
}
}
Hlásí mi to, že Substring je mimo rozsah. Děkuji za pomoc.
Index a délka musí odkazovat na umístění v rámci řetězce.
Název parametru: length
Substring má dva argumenty a to index, od kterého chceš vybírat a počet znaků, které chceš vybrat. Zkus tam místo f dát 1. Pro převod z jakékoli soustavy do desítkové můžeš použít Hornerovo schéma. Spočívá v tom, že k výsledku přičítáš jednotlivé cifry čísla a vynásobíš je základem. vysledek = (vysledek+cifra)/zaklad; Tohle provedeš u každé cifry a nakonec vysledek vydělíš základem (pro dvojkovou soustavu 2, pro osmičkovou 8 apod.)
Děkuji - ale už jsem to vyřešil - problém byl v metodě - přepsal jsem ji na public a je to OK.
To je zajímavé, jsem něvěděl, že nějaké takovéhle schéma existuje
Jinak jsem někde míval metodu, která převedla z desítkové do libovolné a další z libovolné do desítkové, vlastně je to jednoduché, jen se tam musí řešit zástupné znaky za čísla > 9. Jestli tady matesax něco vytvoří, možná by se to mohlo dát do sekce algoritmy.
EDIT: Tady to je, ale nějak jsem to nedopsal koukám http://www.itnetwork.cz/index.php?… a tu zpáteční už
asi ani nemám.
Hornerovo schéma je velmi jednoduchý algoritmus. V Céčku jsem ho napsal tady: http://projects.drahak.eu/…i-algoritmu/
Ty první dva vypadají dobře, nechceš nám je přidat do sbírky?
Určitě. Mám napsat i vysvětlení nebo jen ten příklad?
Ideálně i to vysvětlení, podle mne je důležité, aby člověk
nejdříve pochopil co vlastně dělá, než vidí kód
Zdravím lidi.... pomůžete mi prosím někdo? mám podobný problém s
převodem do binární soustavy, mě však nefunguje vůbec příkaz string...
Takže to zkouším s přidáváním do pole... pracuji v programu MS Visual
Studio... vytvořil jsem něco takového:
#include <stdio.h>
int main(void) {
int z,a, *pole;
printf("Zadejte cislo: \n");
scanf("%d", &z);
while ((int) z != 0)
{
a = ((int) z % 2);
*pole = a;
z = z / 2;
printf("%d", *pole);
}
return 0;
}
ale stále mi to nefunguje... poradíte mi prosím někdo?
Pro vkladani kodu pouzivej tag code, takhle se to neda cist
aby jsi mohl pouzivat string, musis ho nejdriv nainkludovat
#include <string>
Podle kódu soudim že to píšeš v C, tam string nexistuje, jelikož string je třída a C třídy vůbec nemá.
Ano... píšu to v C... poradíš mi teda prosím, jak to rozchodit? potřebuju aby mi to klasicky převádělo číslo z desítkové do dvojkové soustavy... tak jsem si nastavil dělení se zbytkem a aby mi to zbytky ukládalo do pole, ale to mi nejde :/
Já se v tom kódu moc nevyznam, ale z toho co vidim zapisuješ ty zbytky pořád do prvního prvku (*pole), musíš první zapsat do pole[0], druhej do pole[1] atd. Navíc ten pointer neni inicializovanej, musíš mu přidělit paměť. A proč vůbec to pole děláš přes pointer, nemůžeš udělat klasický statický pole?
Prosím Tě, věděl bys, jak co nejjednodušeji napsat funkční převod z
desítkové do dvojkové soustavy?
Obecně je to takhle:
int vysledek = cislo;
int i = 0;
do
{
int v = vysledek / 2; // celočíselně
int zbytek = vysledek % 2;
vysledek = v;
pole[i] = zbytek; // tady si do pole uložíš zbytek
i++;
} while (vysledek != 0);
Do céčka si to převeď už sám, jistě to bude triviální úprava. Pole musíš pak otočit, jinak to bude pozpátku.
Tim že tu otázku napíšeš 3x si moc nepomůžeš.
#include <stdio.h>
char* dec_to_bin(int num)
{
char* binary;
int sub,length,i;
for(sub=1,i=0;num/sub>0;sub*=2,i++);
if(i == 0)
{
binary = "0";
return binary;
}
length = i;
binary = malloc(sizeof(char) * (length + 1));
binary[length] = '\0';
for(i=0;num>0;i++)
{
binary[length - i - 1] = (num % 2) + 48;
num /= 2;
}
return binary;
}
int main()
{
int num;
char* bin;
printf("Zadej cislo: ");
scanf("%i",&num);
bin = dec_to_bin(num);
printf("%s",bin);
free(bin);
/*getchar();
getchar();*/
}
A nepomohl bys mi prosím trochu víc? Já jsem už našel spoustu i v
jiných jazycích... ale když jsem zkoušel "přepsat" do Céčka, nikdy mi to
nefungovalo... natož otočení pole
Nikde v tom příkladu nevidím převod z desítkové soustavy. Pouze %d u scanf(). To tak zadávajícímu stačí?
Napsal jsem ti téměř celý program, nějakou minimální snahu budeš muset vyvinout, celé to za tebe psát nebudu, navíc v céčku nedělám.
To, že je to v C# ti nebrání to předělat do jiného jazyka...
Vylepšená verze:
private string ConvertToBase(int numberOfBase, int value)
{
Stack<char> result = new Stack<char>();
while (value > 0)
{
int rest = value % numberOfBase;
result.Push(rest > 9 ? Convert.ToChar(rest + 55) : rest.ToString()[0]);
value = (value - rest) / numberOfBase;
}
return new string(result.ToArray());
}
private int ConvertFromBase(int numberOfBase, string value)
{
int result = 0;
for (int index = 0; index < value.Length - 1; index++)
result = (result + GetNumber(value[index])) * numberOfBase;
return result + GetNumber(value[value.Length - 1]); ;
}
private int GetNumber(char val)
{
try
{
return int.Parse(val.ToString());
}
catch
{
return (int)val - 55;
}
}
To jsi asi nikdy neviděl céčko, tvá bilance užitečných a neužitečných příspěvků v diskuzích je dosti nevyvážená.
Chceš mi tím říci, že C nemůže násobit a sčítat? (A co se týče převodu čísel na znaky - to si může udělat třeba switchem...)
Převod z desítkové soustavy do interního formátu přece děláš funkcí
scanf("%d",&num);
Proto se ptám, zda to tak zadávajícímu
stačí. Vlastně jen řešíš výstup čísla ve dvojkové soustavě, ale ne
převod.
Já to číslo ale načítam v desítkový soustavě, k čemu myslíš že je tam ta funkce dec_to_bin? Vypisuje se to nakonec jako řetězec, kterej ta funkce vrací přes pointer.
Tvá funkce dec_to_bin()
s desítkovou soustavou vůbec
nepracuje.
Přebírá jako parametr proměnnou typu int (číslo v desítkový soustavě) a převede ho do textový podoby toho čísla v binární soustavě. Ten text pak vrátí. Nevim jak jinak to myslíš aby pracoval s desítkovou soustavou.
jakmile program spustis, tak se vytvori exe soubor ve slozce projektu/bin/debug
Datový typ int není v desítkové soustavě. Reprezentuje číslo ve dvojkovém doplňku.
To je sice pravda, ale když s nim pracuješ tak ho chápeš jako číslo v desítkový soustavě. Uživatel ho zadává v desítkový soustavě. Pochybuju že by to měl převádět z textovýho řetězce, reprezentujícího číslo. Myslim že přesně takhle to chtěl.
V desítkové soustavě je datový typ decimal, který je v C#, ale není v C. Když pracuji s datovým typem int, chápu ho jako číslo ve dvojkovém doplňku a podle toho s ním také pracuji.
Poradíte mi prosím??
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
int val, i, j;
char str[sizeof(int) * 8];
printf("Hodnota v desitkove soustave:");
scanf("%d", &val);
i = 0;
while (val > 0) {
str[i] = (val % 2) + 48;
val /= 2;
i++;
}
for (j = i - 1; j >= 0; j--) printf("%c", str[j]);
printf(" v binarni soustave\n");
printf ( "Press Enter to continue..." );
getchar ();
return 0;
}
s velkou pomocí už jsem nějak na takovéhle úrovni... potřeboval bych
pomoct s pár maličkostma... tak třeba potřeboval bych tam dát podmínku if
a else... protože potřebuju aby kdyžto bude například záporné číslo
nebo písmena, aby mi to napsalo chybovou hlášku... jenže jakmile tam dám
místo while if, přestane mi fungovat převod do binární soustavy a vždy mi
napíše výsledek 1
...potom bych ještě potřeboval pomoct s tím, že když tu aplikaci spustím
ještě v programu MS Visual studio, chce to po mě stisknutí klávesy pro
ukončení, ale ve vytvořené .exe aplikaci se ukončí automaticky spolu s
výsledkem, takže výsledek ani nejde přečíst....
...poradíte mi prosím?
Pořád ti nefunguje vkládání zdrojového kódu? Kdo to má po tobě číst?
Oprava
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
int val, i, j;
char str[sizeof(int) * 8];
printf("Hodnota v desitkove soustave:");
scanf("%d", &val);
i = 0;
while (val > 0) {
str[i] = (val % 2) + 48;
val /= 2;
i++;
}
for (j = i - 1; j >= 0; j--) printf("%c", str[j]);
printf(" v binarni soustave\n");
printf ( "Press Enter to continue..." );
getchar ();
return 0;
}
Zobrazeno 50 zpráv z 61.