Diskuze: Řetězec
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 33 zpráv z 33.
//= 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.
private int ConvertToBinary(int decimalNumber)
{
string build = "";
do
{
build = decimalNumber % 2 + build;
decimalNumber = (decimalNumber - (decimalNumber % 2)) / 2;
}
while (decimalNumber != 0);
return int.Parse(build);
}
Tak jsem trochu zagooglil...
public static string ReverseString(string s) {
char[] arr = s.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
... a pak se divíme, proč jsou dnešní aplikace tak líné. S kvadratickými algoritmy na nás nechoď.
A takto se to dá zobecnit:
private string ConvertToAnySystem(int decimalNumber, int system)
{
string build = "";
do
{
int parse = decimalNumber % system;
build = (parse > 9 ? Convert.ToChar(55 + parse).ToString() : parse.ToString()) + build;
decimalNumber = (decimalNumber - (decimalNumber % system)) / system;
}
while (decimalNumber != 0);
return build;
}
Absolutně libovolná soustava - třeba 64:
MessageBox.Show(ConvertToAnySystem(2000, 64) + "");
Co je na tom špatného?
Pořád tam máš dobu zpracování závislou na druhé mocnině délky čísla. Je to stejné, jako bys propagoval Bubble Sort jako nejlepší algoritmus pro řazení. Neumíš použít zásobník?
No já jsem to zkusil tou tvojí metodou a jaksi mi to stále píše
třeba
50 DEC = 010011BIN; místo 110010BIN se tu přetahujete co je lepší ale mě by stačilo jen říct jak to
obrátit
Tak mi vysvětli toto (příloha).
Je přímo nemožné, aby to moje nefungovalo...
To Kit - jaká druhá mocnina - kde ji vidíš? (Proč bych to dělal a pak otáčel? - 2 operace jsem nahradil jednou - rozhodně lepší...)
Jo doba - to ano - ale nemyslím si, že by to byla taková katastrofa.
Jee - já zase četl frontu (pardon) - toto není zásobník?
build = (parse > 9 ? Convert.ToChar(55 + parse).ToString() : parse.ToString()) + build;
Spokojen?
private string ConvertToAnySystem(int decimalNumber, int system)
{
Stack<char> build = new Stack<char>();
do
{
int parse = decimalNumber % system;
build.Push((parse > 9 ? Convert.ToChar(55 + parse) : parse.ToString()[0]));
decimalNumber = (decimalNumber - (decimalNumber % system)) / system;
}
while (decimalNumber != 0);
return new string(build.ToArray());
}
Doporučuji 2000 do 100 soustavy...
Jo a opačný proces:
private int ConvertFromAnySystem(string number, int system)
{
int build = 0;
for (int index = number.Length - 1; index > -1; index--)
{
int who = 0;
if (!int.TryParse(number[index].ToString(), out who))
who = (int)number[index] - 55;
build += (int)(who * Math.Pow(system, number.Length - 1 - index));
}
return build;
}
Hmm, to by už šlo. Jen si marně lámu hlavu nad tím, proč máš proměnné pojmenované takovým zvláštním způsobem. decimalNumber není v desítkové soustavě. V zásobníku build se nic nestaví a system neobsahuje nic ze systému, ale základ soustavy, což se překládá jako base. V proměnné parse máš zase zbytek po dělení, ale to slovo má jiný význam.
Možná by bylo lepší, kdybys názvy proměnných měl anglicky.
No jo - tak to první je zbytek z minula, a ostatní - Google Translate...
(Spěchám - škola - takže nemám čas myslet - jinak bych to přeložit
dokázal... (Je jednodušší hodit to do translatoru.))
private string ConvertToAnyBase(int number, int numberOfBase)
{
Stack<char> converted = new Stack<char>();
do
{
int remainder = number % numberOfBase;
converted.Push((remainder > 9 ? Convert.ToChar(55 + remainder) : remainder.ToString()[0]));
number = (number - (number % numberOfBase)) / numberOfBase;
}
while (number != 0);
return new string(converted.ToArray());
}
private int ConvertFromAnyBase(string number, int numberOfBase)
{
int converted = 0;
for (int index = number.Length - 1; index > -1; index--)
{
int who = 0;
if (!int.TryParse(number[index].ToString(), out who))
who = (int)number[index] - 55;
converted += (int)(who * Math.Pow(numberOfBase, number.Length - 1 - index));
}
return converted;
}
A co tam dělá ten Math.Pow()? Neznáš Hornerovo schéma?
BTW: Převody mezi soustavami nejsou špatné jako cvičení, ale pro praktické použití bude lepší se spolehnout na standardní metodu ToString().
Ještě bych se chtěl zeptat... chtěl bych si tu funci dát vlastně do
jiného souboru Vypocet.cs normálně v kódu to funguje ale když to dám do
nějakého souboru třeba do toho Vypocet.cs tak mi to nefunguje
class Vypocet
{
private string Decibin(int decimalnicislo, int delitel)
{
Stack<char> build = new Stack<char>();
do
{
int parse = decimalnicislo % delitel;
build.Push((parse > 9 ? Convert.ToChar(55 + parse) : parse.ToString()[0]));
decimalnicislo = (decimalnicislo - (decimalnicislo % delitel)) / delitel;
}
while (decimalnicislo != 0);
return new string(build.ToArray());
}
}
Takhle to mam v Vypocet.cs
a v program.cs mám
Vypocet vypocet = new Vypocet();
MessageBox.Show(vypocet.Decibin(10,2));
a to mi už háže chybku že ta funkce je nepřístupná
Error 1'Kalkulačka.Vypocet.Decibin(int, int)' is inaccessible due to its
protection level
Poradil by mi někdo co mám špatně?
Je tam private - Google - C# modifikátory přístupu...
Místo private použíj public...
public string Decibin(int decimalnicislo, int delitel)
{
Stack<char> build = new Stack<char>();
do
{
int parse = decimalnicislo % delitel;
build.Push((parse > 9 ? Convert.ToChar(55 + parse) : parse.ToString()[0]));
decimalnicislo = (decimalnicislo - (decimalnicislo % delitel)) / delitel;
}
while (decimalnicislo != 0);
return new string(build.ToArray());
}
Proč nepoužiješ můj obecný zápis? A proč jsi to pojmenoval tak blbě?
(Minimálně alespoň
DecToBin...)
jo jsem ten zbytek přečetl až pak no takhle jsem si to udělal
protože první jsem zkusil jestli to jde
a pak jsem zkoumal čím to je že
moje verze nešla a tvoje jde
tak jsem to zkoumal
a až jsem
to pobral tak jsem si změnil proměnné pro mojí přehlednost
V OOP se píše obecně - pak si jen dosadíš svoje - jde o to, že pak daný soubor / objekt / třídu můžeš používat i v jiných projektech...
To nic nemění, na tom že jsou to jen proměnné ty se v OOP můžou psát uplný kraviny pokud vím... a ve výsledném souboru program.cs akorát název té funkce a parametry nevím proč by to mělo tak vadit
A jak se v tom pak vyznáš? A jak se v tom vyzná jiný programátor - chcěš-li být programátor, tak k výměně zdrojáků docházet bude. (V práci, teamu...) Ne-li budeš-li chtít to pulikovat - pro méně zkušené...
Většinou si projekt rozdělíš na komponenty (teď myslím třídy), nějaké budou samozřejmě jen pro ten projekt, ale měl by ses to snažit vymyslet tak, abys jich co nejvíce mohl použit i jinde nebo alespoň po menší úpravě. Třeba tyhle převody by se krásně daly dát do nějaké třídy pro práci s formáty.
Tyhle metody s převody přece už dávno jsou v systémových třídách.
Ale to je přeci moc jednoduché - sám jsi psal, že se na tom dá dobře
procvičit...
Už to k tomuhle vůbec nepatří ale nechci spamovat fórum takže mám další otázečku.
Udělal jsem si 2.Form do něj jsem se dostal pomocí :
private void změnaNickuToolStripMenuItem_Click(object sender, EventArgs e)
{
Zmena_nicku myForm2 = new Zmena_nicku();
myForm2.ShowDialog();
myForm2.Dispose();
}
v novém souboru jsem si tedy změnil nick a zapsal do souboru pomocí:
private void potvrzeni_Click(object sender, EventArgs e)
{
string nick;
nick = zmenanicku.Text;
using (StreamWriter sw = new StreamWriter(@"Data/nick.txt"))
{
sw.WriteLine(nick);
sw.Flush();
}
A nyní bych potřeboval zase z5 do Form1 protože mi nefunguje vlastně label v main formu. Zkoušel jsem to normálně
using (StreamReader sr = new StreamReader(@"Data/nick.txt"))
{
string s;
while ((s = sr.ReadLine()) != null)
{
Main hlavni = new Main();
nick.Text = s;
}
}
Ale v nick.Text mi to píše že nick.Text není poradil by mi někdo ? Vím že je to
úplná blbost a asi se mi budete smát
ale já se stim peru už hodinu
a zkoušim všechno možné
BTW : potřebuju to aby se mi vlastně po zadaní nového nicku přepsal v
souboru ten starý a nahradil se okamžitě i v aplikaci novým.
Moc tomu nerozumím, ale koukám, že nemáš definován objekt
nick
.
Coo - chceš se spojit s mateřským formem? Máš 2 možnosti - vzít druhý form jako mateřský, ale nezobrazovat jej - a label přidat do Formu prvního:
Ve Formu druhém:
private Label nick = nev Label();
private Form1 xxx = new Form1();
public Form2()
{
xxx.Show();
xxx.Controls.Add(nick);
nick.Text = "...";
...
Ovšem pokud chceš něco měnit i ve Formu1 (v tom labelu), tak opět ve formu druhém:
private Form1 mum = null;
public Form2(Form1 mum)
{
this.mum = mum;
...
mum.nick.Text = "";
A v mateřském:
new Form2(this).Show();
Jenže v té druhé možnosti by musel být label public. Leda by jsi udělal most (V mateřském.):
public string Nic
{
get { return nick.Text; }
set { nick.Text = value; }
}
A pak skoro stejně:
private Form1 mum = null;
public Form2(Form1 mum)
{
this.mum = mum;
...
mum.Nick = "";
\---
nev = new,
nic = nick...
Vůbec nejlepší ale je, když takováto potřeba ani nenastane... (Dá se to tak vymyslet snad vždy.)
Píšeš, že nick je třídy Label. V jedné metodě vytváříš objekt
nick
třídy String. V jiné metodě přistupuješ k jeho atributu
Text, který ve třídě String není, ale je ve třídě Label. Jak to tedy
je?
Tak už jsem to vyřešil trošku jiným způsobem od tebe jsem to moc nepochopil tak
jsem si vzal jen tu větu "Vůbec nejlepší ale je, když takováto potřeba
ani nenastane... (Dá se to tak vymyslet snad vždy.)"
a udělal jsem to jinak a už to
funguje
Dík
Zobrazeno 33 zpráv z 33.