Pomoc v c#

Programovacie jazyky, rady, poradňa...
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Pomoc v c#

Príspevok od používateľa samsara »

mam takyto program, nic zloziteho.

//zdrojáky patria do code tagu

Problem je ye ked dam program spustit tak normalne ide, ale ked sa dostane k zvyraznenemu napise mi mi chybu:Unable to cast object of type 'System.ConsoleKeyInfo' to type 'System.IConvertible'.

Prosim pomoooooc. ak som nieco napisal nejasne doplnim. v c# som zaciatocnik, takze opatrne na mna
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: Pomoc v c#

Príspevok od používateľa manager666 »

premenna "volba" je deklarovana ako Integer a ty do nej chces vlozit Char a navyse Console.ReadKey vracia vysledok ako ConsoleKeyInfo, ktory nejde skonvertovat na premennu typu Char... myslis, ze je to spravne ? :wink:

odporucam ti pouzit premennu "volba" deklarovanu ako String a dalej pouzit funkciu Console.ReadLine :wink:
alebo
ak chces pouzit funkciu ReadKey, tak si zadeklarovat premmenu "volba" ako ConsoleKeyInfo a v cykle budes potom overovat vlastnost premmenej "volba" s nazvom KeyChar, cize:
while (volba.KeyChar != 'n');
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Re: Pomoc v c#

Príspevok od používateľa samsara »

diky za odpoved, pomohla mi, aj ked som to nakoniec nedokazal urobit sam, pretoze mi zacalo hadzat dalsie chyby, problem bol v tom ze som plietol readkey a read line.

Ale k dasliemu, teraz sa pokusam urobit program ktory by vypocital obvod kruhu a mam problem so stanovenim konstany pi. tak sa chcem spytat ci je to takto spravne const float pi = 3.1415926535f; a pripadne mi pomozte ze ako by mal vyzerat ten program. diky za odpovedi
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Re: Pomoc v c#

Príspevok od používateľa bart11 »

konštanta pí je definovaná v System.Math.PI, takže nemusíš si ju písať sám
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Re: Pomoc v c#

Príspevok od používateľa samsara »

takze bude stacit ked to napisem do prietoru kde zadavam premenne? a ked budem chciet aby sa s nou pocitalo v priklade mam do prikladu napisat System.Math.PI? napr. v = 2* System.Math.PI* polomer?
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Re: Pomoc v c#

Príspevok od používateľa bart11 »

áno, alebo:
using System;

niekde v zdrojáku:
v = Math.PI * polomer;
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Re: Pomoc v c#

Príspevok od používateľa samsara »

diky za radu. ale zase mam problem, kto by to cakal? :-D
napisal som tento zdrojovy kod

//zdrojáky patria do code tagu

a pri deklaracii pi mi pise chybu :Error 1 Only assignment, call, increment, decrement, and new object expressions can be used as a statement a neviem co mam urobit aby to bolo spravne
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Re: Pomoc v c#

Príspevok od používateľa bart11 »

Ako prvé:
http://www.hojko.com/citajte-pred-zaloz ... 23064.html

Aby si mohol použiť konštantu pí triety Math (čiže Math.PI) je potrebné vložiť
-buď kľúčové slovo using a za ním menný priestor v ktorom sa požadovaná trieda nachádza, čiže using System; hneď na začiatok zdrojového súboru (nie metódy, ako to tam máš)
-alebo vložiť celú cestu ku konštante (bez použitia using), čiže double mojePí = System.Math.PI;

Kód: Vybrať všetko

class Program
{
    static void Main(string[] args)
    {
        System.Math.PI; // <-- TOTO JE TÁ CHYBA
        double polomer;
Má byť:

Kód: Vybrať všetko

using System;
class Program
{
    static void Main(string[] args)
    {
        double polomer;
        ...
// úprava:
Console.WriteLine("vysl_sprava + v");
Dobre si pozri či je to naozaj to, čo si chcel aby bolo. S tou chybou to nemá nič spoločné.
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Re: Pomoc v c#

Príspevok od používateľa samsara »

dik za upozornenie na ten kod, po pravde som pravidla necital a ocividne to bola chyba, diky za pomoc s pí, a do tretice diky za tu vyslednu spravu, tie uvodzovky tam byt nemaju. keby som isch tam nechal vypisalo by iba vysl_sprava+v a nie vysledok.

ESTE RAZ DAKUJEEEEEEEEEEEEM

//autoeditácia príspevku (27 Feb 2010, 17:45)
Teraz by som chcel urobit program, ktory vie pocitat aj obvod, ale aj obsah kruhu a rad by som to rozdelil do roznych tried. ze najprv by som napisal tu zakladnu tam by ste si vybrali ze o aku funkciu mate zaujem a potom v roznych class by boli definovane mozne varianty. v jednej obsah, v druhej obvod,... len neviem ako to spravit ze v tom zaklade by ste mali na vyber a ten by odkazoval na tie varianty. fuuu. niesom si isty ci som to popisal spravne, tak ako som to myslel.
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Re: Pomoc v c#

Príspevok od používateľa bart11 »

V tvojom prípade je to zbytočné rozdeľovať do tried. Daj to do jednej triedy, a tá bude obsahovať funkcie nesúce názov, ktorý určí čo by mala robiť. Konštrukciu metód si už definuj sám.
Ako to spraviť s možnosťou výberu?
-po spustení programu nechaj vypísať ponuku (voľby môžeš označiť napr. číslami). Po načítaní porovnaj čo daný užívateľ zvolil (napr. pomocou klauzule switch alebo podmienky if else a podľa toho vykonaj danú operáciu (zavolaj požadovanú metódu).
Aby si docielil nekonečný cyklus môžeš to hodiť do while.

Takýchto príkladov je na (tomto) fóre plno. Aj keď sa nevzťahujú na C#, syntax bude podobná (napr. pre C++).
A pomocou triviálnych znakov konštruujúcich slová (c# console menu), aplikované na vyhľadávač google.com som dostal očakávaný výsledok.
http://www.java2s.com/Code/CSharp/Langu ... lemenu.htm
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Re: Pomoc v c#

Príspevok od používateľa samsara »

teraz som zacal robit program ktory vie vypocitat obvody a obsahy rovinnych obrazcov. obdlznik, stvorec, ....
zacal som tym ze som sa spytal ze aky obrazec chces? stvorec, obdlznik, ... a pokracoval som podmienkami if. ak stalcite s pocitate stvorec, ak stlacite o obdlznik, k kruh. a potom som zacal za jednotlive if rozoberat priklady. napisal som cod pre stvorec a normalne ho vypocitalo. vsetko ok, lenze ked som pokracoval a napisal za druhu podmienku if detaily obdlznika, stale pocitalo stvorec.

Kód: Vybrať všetko

 string druh;
            string vysl_sprava1 = "Obsah Stvorca je: ";
            string vysl_sprava2 = "Obvod Stvorca je: ";
            //string stvorec;
            //string obdlznik;
            //string kruh;
            //string lichobeznik;
            double a;
            double b;
            double polomer;
            double mojePí = System.Math.PI;
            double v;
            double v1;


            Console.WriteLine("zadaj rovinny utvar: Obdlznik - O, Stvorec - S, Kruh - K, Lichobeznik - L ");
            druh = Console.ReadLine();

   
         if (druh == "s") Console.WriteLine("Pocitas stvorec");
            
                Console.Write("zadaj stranu a: ");
                a = double.Parse(Console.ReadLine());
                v = a * a;
                Console.WriteLine(vysl_sprava1 + v);
                v = 4 * a;
                Console.WriteLine(vysl_sprava2 + v);
        


               
            if (druh == "o") Console.WriteLine("Pocitas obdlznik");
            
                Console.Write("zadaj stranu a: ");
                Console.Write("zadaj stranu b: ");
                a = double.Parse(Console.ReadLine());
                b = double.Parse(Console.ReadLine());
                v = a * b;
                Console.WriteLine(vysl_sprava1 + v);
                v = 2 * (a + b);
                Console.WriteLine(vysl_sprava2 + v);

                if (druh == "k") Console.WriteLine("Pocitas kruh");
                if (druh == "l") Console.WriteLine("Pocitas lichobeznik");
            

            Console.ReadKey();
vedeli by ste mi pomoct?
bart11
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 91
Registrovaný: 13 okt 2006, 20:11
Kontaktovať používateľa:

Re: Pomoc v c#

Príspevok od používateľa bart11 »

Dobre si pozri logiku programu. Ak stlačí niekto voľbu o tak sa vypočíta nielen obsah, ale aj obvod. Pevne dúfam, že si nemyslíš, že prázdny riadok je pre prekladač oddelenie blokov kódu (nato súžia zložené zátvorky {}). A to ani nespomínam, že na veľkosti písmen (S != s) záleží.
Toto vyzerá na (opätovné?) prečítanie si základov programovania.
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Re: Pomoc v c#

Príspevok od používateľa samsara »

hmm opatovne prectanie si zakladov programovania. ty si chytrak. dik za nic

//autoeditácia príspevku (28 Feb 2010, 16:47)
ale v podstate si mi poradil. zamyslel som sa nad tym. a problem bez problemov vyriesil.
btw co sa tyka tyho precitania zakladov. v programovaniu sa venujem asi druhy mesiac, bez akychkolvek predchadzajucich skusenosti. moja anglictina je na urovni bezneho dohovoru v zivote. takze som odkazany na navody v ceskom, pripadne slovenskom jazyku. zatial vyhradne cerpam z tychto stranok http://www.inet.sk/clanok/2131/programu ... imavosti-i a som rad ze som schopny zosmolit aspon takyto primitivny priklad!

//autoeditácia príspevku (28 Feb 2010, 17:04)
ale nech robim co robim stale neviem prist na to ako urobit to aby pocitalo to co si vyberiem. pretoze teraz to ide za radom od vrchu smerom dole. takze nech zadas na zaciatku hocico stale bude pocitat najprv stvorec, potom obdlznik.
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: Pomoc v c#

Príspevok od používateľa manager666 »

Dobre si pozri syntax podmienky IF:

Kód: Vybrať všetko

bool flagCheck = true;
if (flagCheck == true)
{
    Console.WriteLine("The flag is set to true.");
}
else 
{
    Console.WriteLine("The flag is set to false.");
}
Ak este stale nechapes, v com mas chybu, tak si radsej kup knihu a neuc sa zaklady z nejakych clankov. Nehovorim, ze nemoze existovat niekde stranka, kde budu dokonale vysvetlene zaklady, ale moj osobny nazor je, ze taka stranka snad ani nejestvuje(ak neratam Language Reference od vyrobcu :mrgreen: )
p.s. v C# som nikdy nerobil...aby si si nemyslel, ze som dalsi podla teba chytrak :wink:
p.s.2 bart11 ti poradil a vlastne aj napisal, kde mas chybu
samsara
Light Expert
Light Expert
Príspevky: 47
Registrovaný: 15 feb 2010, 10:05

Re: Pomoc v c#

Príspevok od používateľa samsara »

ja chapem, ze tam mam v programe mam if a ze nemam else. lenze ja som do teraz nechapal ako mam pouzit tieto podmienky na x variant. nevedel som ze sa to da rozvetvit(to som sa dozvedel az teraz).
Ak vas to zaujima zakoncil som to metodou switch .
Co sa tyka knizky asi ju kupovat nebudem, raz som si kupil pascal pre zaciatocnikov a nejak som ju nevyuzil.
hlavne na knizku podla ktorej sa clovek vie naucit je tazke najst, nejake som si stiahol z netu, ale su relativne zlozite.
Diky Vam za rady obidvom, bez rad by som bol bohvie kde v uceni. Zase sa ozvem ked nebudem tusit ako dalej, takze dufam ze aj na buduce budete mat pre mna cas.


tu je kod, ktory je funkcny

Kód: Vybrať všetko

string druh;
            string volba;
            string vysl_sprava1 = "Obsah Stvorca je: ";
            string vysl_sprava2 = "Obvod Stvorca je: ";
            string vysl_sprava3 = "Obvod Obdlznika je: ";
            string vysl_sprava4 = "Obsah Obdlznika je: ";
            //string stvorec;
            //string obdlznik;
            //string kruh;
            //string lichobeznik;
            double a;
            double b;
            double polomer;
            double mojePí = System.Math.PI;
            double v;
            double v1;


            Console.WriteLine("zadaj rovinny utvar: Stvorec - S, Obdlznik - O, , Kruh - K, Lichobeznik - L ");
            druh = Console.ReadLine();
            switch(druh)
            {
                case "s" :Console.WriteLine("Pocitas stvorec");
            {
                
                Console.Write("zadaj stranu a: ");
                a = double.Parse(Console.ReadLine());
                v = a * a;
                Console.WriteLine(vysl_sprava1 + v);
                v = 4 * a;
                Console.WriteLine(vysl_sprava2 + v);
                Console.Write(" este raz?n/a+enter>");
                volba = Console.ReadLine();
            }
                break;

                case "o": Console.WriteLine("Pocitas obdlznik");
            {
                Console.Write("zadaj stranu a: ");
                a = double.Parse(Console.ReadLine());
                Console.Write("zadaj stranu b: ");
                b = double.Parse(Console.ReadLine());
                v = a * b;
                Console.WriteLine(vysl_sprava4 + v);
                v = 2 * (a + b);
                Console.WriteLine(vysl_sprava3 + v);

            }
                    break;
            }
//autoeditácia príspevku (02 Mar 2010, 11:42)
mam tu teraz tento program, lenze zase nepracuje ako chcem. Ten prikaz break vzdy zastavi program a ja chcem aby program zase isiel od znova. Aby zase vyzval uzivatela na zadanie rovinneho utvaru a pokracoval.

Kód: Vybrať všetko

  Console.WriteLine("zadaj rovinny utvar: Stvorec - S, Obdlznik - O, Kruh - K, Lichobeznik - L ");
            druh = Console.ReadLine();
           
            switch(druh)
            {
                    case "s" :Console.WriteLine("Pocitas stvorec");
                {
                
                          Console.Write("zadaj stranu a: ");
                          a = double.Parse(Console.ReadLine());
                          v = a * a;
                          Console.WriteLine(vysl_sprava1 + v);
                          v = 4 * a;
                          Console.WriteLine(vysl_sprava2 + v);
                          Console.Write(" este raz?n/a+enter>");
                          volba = Console.ReadLine();
                }
                 break;
                    case "o": Console.WriteLine("Pocitas obdlznik");
                {
                          Console.Write("zadaj stranu a: ");
                          a = double.Parse(Console.ReadLine());
                          Console.Write("zadaj stranu b: ");
                          b = double.Parse(Console.ReadLine());
                          v = a * b;
                          Console.WriteLine(vysl_sprava4 + v);
                          v = 2 * (a + b);
                          Console.WriteLine(vysl_sprava3 + v);
                          Console.Write(" este raz?n/a+enter>");
                          volba = Console.ReadLine();

                }
                break;
                    case "k": Console.WriteLine("Pocitas Kruh");
                {
                    Console.Write("zadaj polomer: ");
                    polomer = double.Parse(Console.ReadLine());
                    v = 2 * mojePí * polomer;
                    Console.WriteLine(vysl_sprava5 + v);
                    v = mojePí * polomer * polomer;
                    Console.WriteLine(vysl_sprava6 + v);
                    Console.Write(" este raz?n/a+enter>");
                    volba = Console.ReadLine();

                }
                break;             
//autoeditácia príspevku (02 Mar 2010, 11:58)
bude stacit ked to dam do cyklu napr. do while?

//autoeditácia príspevku (02 Mar 2010, 12:13)
hehehehehehe ja som na to prisiel sam, iba som to dal cyklu do while. myslel som si ze to fungovat nebude. ze ten break to zastavi natvrdo a nepokracuje, ale break zastavi a hlada dalsi prikaz. PARADa ani ste mi pomahat nemuseli

//autoeditácia príspevku (02 Mar 2010, 12:14)
ale teraz by som sa nieoc spytal, co naozaj neviem. ked vytvorim program tak ten exe subor ma tu klasicku ikonku. ako sa da urobit aby tam obrazok aky zvolim?
Napísať odpoveď