» »

[C#]naloga iz metod!

[C#]naloga iz metod!

krastača ::

Poskušam in poskupam spraviti skup nalogo:
/* 6. Napiši program, ki v zanki kliče metodo Vpis. Ta prebere celo število in ga vrne v glavni program.
Slednji računa skupno vsoto le pozitivnih števil, zato v metodi AbsSt najprej določi pozitivni predznak (absolutno vrednost). Vpis števila 0 prekine zanko. Pred končanjem programa izpiše vsoto vseh vpisanih števil. */

Program sem zasnovala tako:
static int Vpis(int st)
        {
            int vsota = 0;
            do
            {
                Console.Write("Vpiši število: ");
                st = int.Parse(Console.ReadLine());
                Console.WriteLine();
            }
            while (st != 0);
            return st = vsota + st; 
        }

        static void AbsSt(int st)
        {
            if (st > 0) st += Math.Abs(st);
        }

        static void Main(string[] args)
        {
            int vsota = 0;
            int x;
            x = Vpis();
            AbsSt(x);
            Console.WriteLine("Vsota vseh vpisanih števil je {0}!", x);
            Console.ReadKey(true);
        }

Nevem pa, kaj počnem narobe in če sem nalogo sploh dobro zasnovala, ker je malo nejasno zasnovana.

win64 ::

argument st v metodi AbsSt je klican po vrednosti, kar pomeni, da se spremembe na st, ne bodo poznale izven funkcije.
Za ta efekt bi morala določiti klicanje po reference(ključna beseda ref) ali pa uporabiti pristop enak kot v prvi funkciji(vračanje spremenjene vrednosti).

več o referencah si lahko pogledaš na: http://msdn.microsoft.com/en-us/library..., ta stran ti bo v veliko pomoč tudi v prihodnje.

Tudi funkcija ti narobe računa:
if(st>0) st += Math.Abs(st); 

to pomeni:
if(st>0) st = st + Math.Abs(st);

Zaradi pogoja st>0, je Math.Abs(st) enak st v kateremkoli primeru. Torej velja:
if(st>0) st = st + st;

Kar pa je:
if(st>0) st += st;

ali
if(st>0) st = 2*st;
.

Za namig premisli, kako bi spremenila številko iz -5 v 5 ter 13 v -13. Za oboje je potrebna ena operacija.

Zgodovina sprememb…

  • spremenil: win64 ()

krastača ::

za spremembo 5 v -5 uporabim : n < 0 ? n: -n - sem ravno to delala včeraj ker je ena naloga tudi ta. Problem Zgornje naloge je, da jo povsem ne razumem. Zakaj računam vsoto absolutne vrednost če na koncu želi izpis celotno vsoto vseh vpisanih števil? A želi da negativne spravim v absolutne ter nato vse skupaj seštejem?

Spura ::

Navodila so v osnovi narobe. Naloga zahteva vsoto le pozitivnih stevil, ne pa vsoto absolutnih vrednosti stevil. Pravilno torej je, da se negativna stevila docela preskoci, ne pa da se spreminja predznak. Potem pa v navodilu zacne govorit o spreminjanju predznaka, torej kontradiktirajo se. Predvidoma zahteva vsoto absolutnih vrednosti.

Metoda Vpis prebere ENO STEVILO in ga vrne. Tocno pise v navodilih. Ocitno krastaca malo copy pastea kodo in ne razmislja zraven o dejanskem pomenu kode, kaj ta pocne.
To je vidno iz primera:
static int Vpis(int st)
....
x = Vpis();

To ze sintakticno ni pravilno in kaze na copy paste kodiranje. Vpis mora bit deklariran brez parametra.

        static int Vpis()
        {
            Console.Write("Vpiši število: ");
            return int.Parse(Console.ReadLine());
        }
        static int AbsSt(int st)
        {
            return st < 0 ? -st : st;
        }
        static void Main(string[] args)
        {
            int vsota = 0;
            int x = Vpis();
            while(x != 0) 
            {
                vsota += AbsSt(x);
                x = Vpis();
            }
            Console.WriteLine("Vsota vseh vpisanih števil je {0}!", x);
            Console.ReadKey(true);
        }


Drugace se pa naceloma, ce ima funkcija en rezultat, vedno vraca rezultat iz funkcije. Ref in out parametri se uporabljajo izjemoma, na splosno so "bad code smell".

krastača je izjavil:

za spremembo 5 v -5 uporabim : n < 0 ? n: -n

pogoj ? vrednost ce je pogoj true : vrednost ce je pogoj false

-5 -> n < 0 = true -> prva klavzula -> n -> -5
5 -> n < 0 = false -> druga klavzula -> -n -> -5

Kontra si napisala kot je pravilno.

Zgodovina sprememb…

  • spremenil: Spura ()

krastača ::

vendar z vsoto še vedno ni vse v redu

krastača ::

A bi mi lahko nekdo razložil, zakaj v programu ki ga bom dodala - vsoto in produkt 2 števil normalno izpiše v main če ba bi jih rada izpisala v metodi izpis pa ne deluje?
{
        static void Vpis(ref int x, out int y)
        {
            Console.Write("Vpiši prvo celo število: ");
            x = int.Parse(Console.ReadLine());
            Console.Write("Vpiši drugo celo število: ");
            y = int.Parse(Console.ReadLine());
        }
        static void Izpis (int vsota, int produkt)
        {
            Console.WriteLine("Vsota števil je {0}!", vsota);
            Console.WriteLine("Produkt števil je {0}!", produkt);
        }
    
        static void Main(string[] args)
        {
            int st1 = 0;
            int st2;
            Vpis(ref st1, out st2);
            
            int vsota = st1 + st2;
            int produkt = st1 * st2;

            Console.ReadKey();
            
        }

krastača ::

Presvetlilo se mi je, da sploh metodo Izpis ne kličem. Ignorirajte zgornji koment prosim

Spura ::

Z vsoto je ze vse uredu, samo sem skopiral tvojo napako, da izpisujes x ne pa vsote.

Ziga Dolhar ::

https://dolhar.si/


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C#] do - while

Oddelek: Programiranje
81250 (972) garamond
»

Sode ter Lihe(C Sharp)

Oddelek: Programiranje
161550 (1348) detroit
»

[C#] Reševanje domačih nalog

Oddelek: Programiranje
173049 (2553) krastača
»

[C#] razlaga

Oddelek: Programiranje
161530 (1247) krastača
»

Naloga v C#

Oddelek: Programiranje
72543 (2043) Hardstyle

Več podobnih tem