Vinnaren i pepparkakshustävlingen!
2017-03-17, 23:40
  #3133
Medlem
Tjena flashback.

Blir lite galen på ett problem som jag stött på. Jag är inte jätte high inom programmering, så jag håller just nu på att leka runt med en telefonbok.

I programmet har jag än så länge 3 olika classer:

1. Klassen där main-metoden finns
2. Klass som har en metod som visar menyn
3. Klass med metod var i användaren kan lägga till kontakter till telefonboken, och ytterligare en metod som skrivet ut listan.

Mitt problem nu, är att när användare väljer val nummer 3, att lägga till kontakter, instansierar jag objektet för klassen, vilket skapar en tom array (se kod nedan). Användaren kan sedan välja att gå tillbaka till menyn efter detta. Tanken är ju sedan att användaren ska kunna anropa metoden igen för nummer 3, så att listan skrivs ut. Men när man gör detta, kommer arrayen bli "tom" igen eftersom objektet instansieras en gång till... hur löser jag detta???

Main
Kod:
namespace Telefonboken
{
    class Program
    {
        
        static void Main(string[] args)
        {
            Menu.container();

            
        }
    }
}

Meny
Kod:

namespace Telefonboken
{
    public static class Menu
    {
        public static void container()
        {

            Console.WriteLine("1. Add");
            Console.WriteLine("2. Show");
         


            string menuchoice = Console.ReadLine();
            if(menuchoice == "1")
            {
                Add add1 = new Add();
                add1.addContact();

            }
               

            
        }
    }
}


Add
Kod:

namespace Telefonboken
{
    public  class Add
    {
        

        

        public  void addContact()
        {
            Console.WriteLine("Hej! Vill du lägga till kontakter? (yes/y)");
            string userinput = Console.ReadLine();

            string[] arrayNew = new string[5];

            if (userinput == "yes" || userinput == "y")
            {
                

                for (int i = 0; i < arrayNew.Length; i++)
                {
                    Console.Write("Lägg till kontakt: ");
                    string adder = Console.ReadLine();

                    adder = arrayNew[i];
                }

            }

            else
            {
                Console.WriteLine("Alright, then push key to go back to menu...");
                Console.ReadKey();
                Menu.container();
            }
          

        }




    }
}

Citera
2017-03-18, 10:28
  #3134
Medlem
Citat:
Ursprungligen postat av Hingst1
Tjena flashback.

Blir lite galen på ett problem som jag stött på. Jag är inte jätte high inom programmering, så jag håller just nu på att leka runt med en telefonbok.

I programmet har jag än så länge 3 olika classer:

1. Klassen där main-metoden finns
2. Klass som har en metod som visar menyn
3. Klass med metod var i användaren kan lägga till kontakter till telefonboken, och ytterligare en metod som skrivet ut listan.

Mitt problem nu, är att när användare väljer val nummer 3, att lägga till kontakter, instansierar jag objektet för klassen, vilket skapar en tom array (se kod nedan). Användaren kan sedan välja att gå tillbaka till menyn efter detta. Tanken är ju sedan att användaren ska kunna anropa metoden igen för nummer 3, så att listan skrivs ut. Men när man gör detta, kommer arrayen bli "tom" igen eftersom objektet instansieras en gång till... hur löser jag detta???

Main
Kod:
namespace Telefonboken
{
    class Program
    {
        
        static void Main(string[] args)
        {
            Menu.container();

            
        }
    }
}

Meny
Kod:

namespace Telefonboken
{
    public static class Menu
    {
        public static void container()
        {

            Console.WriteLine("1. Add");
            Console.WriteLine("2. Show");
         


            string menuchoice = Console.ReadLine();
            if(menuchoice == "1")
            {
                Add add1 = new Add();
                add1.addContact();

            }
               

            
        }
    }
}


Add
Kod:

namespace Telefonboken
{
    public  class Add
    {
        

        

        public  void addContact()
        {
            Console.WriteLine("Hej! Vill du lägga till kontakter? (yes/y)");
            string userinput = Console.ReadLine();

            string[] arrayNew = new string[5];

            if (userinput == "yes" || userinput == "y")
            {
                

                for (int i = 0; i < arrayNew.Length; i++)
                {
                    Console.Write("Lägg till kontakt: ");
                    string adder = Console.ReadLine();

                    adder = arrayNew[i];
                }

            }

            else
            {
                Console.WriteLine("Alright, then push key to go back to menu...");
                Console.ReadKey();
                Menu.container();
            }
          

        }




    }
}



Tjo, ett object/en variabel som du skapar lever endast inom det block du skapar den, så skapar du en array i en function som finns i en klass, kommer den arrayen att tas bort när du väl kommer ut ur den functionen. Likväl blir det ifall du skapar ett object av en klass i en function, objectet försvinner.

Alltså får du lägga till den som en medlemsvariable i classen.
T.ex.
Kod:
public static class Menu
    {
        static Add add1 = new Add();
       
         public static void container()
        {
            Console.WriteLine("1. Add");
            Console.WriteLine("2. Show");

            string menuchoice = Console.ReadLine();
            if(menuchoice == "1")
            {
                
                add1.addContact();
            }
        }
    }
Dock får du ha i åtanke med vad 'static' betyder, att alla instanser av klassen har tillgång till SAMMA variabel/object. Och då klassen även den är static, behöver du inte ens skapa en instans av den, så som du gjort med Menu.container()

Ett tips är också att tänka lite över om du verkligen behöver en klass Add? Kan inte de functionerna ligga i Menu istället?
Citera
2017-03-18, 19:06
  #3135
Medlem
Citat:
Ursprungligen postat av Gottisborgen
Tjo, ett object/en variabel som du skapar lever endast inom det block du skapar den, så skapar du en array i en function som finns i en klass, kommer den arrayen att tas bort när du väl kommer ut ur den functionen. Likväl blir det ifall du skapar ett object av en klass i en function, objectet försvinner.

Alltså får du lägga till den som en medlemsvariable i classen.
T.ex.
Kod:
public static class Menu
    {
        static Add add1 = new Add();
       
         public static void container()
        {
            Console.WriteLine("1. Add");
            Console.WriteLine("2. Show");

            string menuchoice = Console.ReadLine();
            if(menuchoice == "1")
            {
                
                add1.addContact();
            }
        }
    }
Dock får du ha i åtanke med vad 'static' betyder, att alla instanser av klassen har tillgång till SAMMA variabel/object. Och då klassen även den är static, behöver du inte ens skapa en instans av den, så som du gjort med Menu.container()

Ett tips är också att tänka lite över om du verkligen behöver en klass Add? Kan inte de functionerna ligga i Menu istället?


Hej!

Tack för svar!

Angående static - jag vet egentligen inte varför jag har valt att ha vissa klasser static. Tror det var något jag läste på stackoverflow som skulle lösa problemet som jag beskrev ovan, men jag måste ha missförstått det helt. Sen orkade jag inte ändra tillbaka .

Nej, så klart behöver jag inte ha olika klasser egentligen. Jag tänkte bara att jag ville testa och se hur det fungerade, och för att få mer struktur. Angående struktur förresten, visst kan man dela upp de olika metoderna i olika cs-filer, även fast det är i samma klass?. Det ger ju också lite överblick kanske. Tack!
Citera
2017-03-18, 20:51
  #3136
Medlem
Citat:
Ursprungligen postat av Hingst1
Hej!

Tack för svar!

Angående static - jag vet egentligen inte varför jag har valt att ha vissa klasser static. Tror det var något jag läste på stackoverflow som skulle lösa problemet som jag beskrev ovan, men jag måste ha missförstått det helt. Sen orkade jag inte ändra tillbaka .

Nej, så klart behöver jag inte ha olika klasser egentligen. Jag tänkte bara att jag ville testa och se hur det fungerade, och för att få mer struktur. Angående struktur förresten, visst kan man dela upp de olika metoderna i olika cs-filer, även fast det är i samma klass?. Det ger ju också lite överblick kanske. Tack!


Hej!

Kunde inte editera min post. Angående det fetade ovan - det verkar inte som att detta är möjligt? Alltså det jag vill göra är att separera de olika metoderna i olika cs-filer, och metoderna finns i samma class. Men om jag försöker skapa ytterligare en cs-fil och anger samma namespace och samma klass som den andra, så får jag följande error
Citat:

Error CS0101 The namespace 'Telefonbok' already contains a definition for 'Menu' Telefonbok

Alltså går inte detta, eller?
Citera
2017-03-19, 10:53
  #3137
Medlem
Citat:
Ursprungligen postat av Hingst1
Hej!

Kunde inte editera min post. Angående det fetade ovan - det verkar inte som att detta är möjligt? Alltså det jag vill göra är att separera de olika metoderna i olika cs-filer, och metoderna finns i samma class. Men om jag försöker skapa ytterligare en cs-fil och anger samma namespace och samma klass som den andra, så får jag följande error

Alltså går inte detta, eller?


static är bra att använda i många fall, speciellt klasser. Men som nybörjare behöver man ha koll på vad det faktiskt innebär. När jag var handledare var många av problemen studenterna hade, att de hade någon variabel satt till static, och förstod inte att den variabeln gäller för alla instanser. T.ex. om du har ett bankkonto och totala summan är static, då blir det strul då du ändrar summan ifrån ett annat objekt, då det även ändrar i första objektet.
Staticklassen tycker jag som sagt är bra att använda sig utav, ifall du har funktioner som inte behöver ha tillgång till den egna klassens variabler, eller ens behöver instantieras. Hur man nu ska förklara det bra. T.ex. om vi har en klass som heter Math, och i den en funktion som heter addition. Är den inte static skulle vi behöva skapa en instans av mat, Math math = new Math. Väldigt jobbigt och onödigt, är den static kan vi istället bara skriva Math.addition(1,2), så som du gjort.


Ja, du kan dela upp dina klasser i flera olika filer och projekt.
För att dela upp en klass behöver du benämna den som 'shared'. Dvs, 'public shared class Menu'. För att dela upp enkelt i olika projekt skapar du istället ett shared project. Detta används t.ex. mycket i xamarin som skapar appar för t.ex. android och iphone. I grunden är ju apparna lika, men de har viss specifik kod för varje platform. Alltså har man två project, android och iphone, och sedan länkar man in det delade projektet som innehåller allt det andra.
Citera
2017-03-19, 21:27
  #3138
Medlem
Citat:
Ursprungligen postat av Gottisborgen
static är bra att använda i många fall, speciellt klasser. Men som nybörjare behöver man ha koll på vad det faktiskt innebär. När jag var handledare var många av problemen studenterna hade, att de hade någon variabel satt till static, och förstod inte att den variabeln gäller för alla instanser. T.ex. om du har ett bankkonto och totala summan är static, då blir det strul då du ändrar summan ifrån ett annat objekt, då det även ändrar i första objektet.
Staticklassen tycker jag som sagt är bra att använda sig utav, ifall du har funktioner som inte behöver ha tillgång till den egna klassens variabler, eller ens behöver instantieras. Hur man nu ska förklara det bra. T.ex. om vi har en klass som heter Math, och i den en funktion som heter addition. Är den inte static skulle vi behöva skapa en instans av mat, Math math = new Math. Väldigt jobbigt och onödigt, är den static kan vi istället bara skriva Math.addition(1,2), så som du gjort.


Ja, du kan dela upp dina klasser i flera olika filer och projekt.
För att dela upp en klass behöver du benämna den som 'shared'. Dvs, 'public shared class Menu'. För att dela upp enkelt i olika projekt skapar du istället ett shared project. Detta används t.ex. mycket i xamarin som skapar appar för t.ex. android och iphone. I grunden är ju apparna lika, men de har viss specifik kod för varje platform. Alltså har man två project, android och iphone, och sedan länkar man in det delade projektet som innehåller allt det andra.

Hej!

Tack för bra info!

Angående det med att dela upp klasser i olika filer och projekt. Anlednigen till att jag vill göra det är att jag kan känna att det blir lite rörigt när en cs-fil, innehållandes en klass, blir så himla stor. Är det vanligt att man tänker så och delar upp klasserna? Hur gör du själv?
Citera
2017-03-20, 17:54
  #3139
Medlem
Citat:
Ursprungligen postat av Hingst1
Hej!

Tack för bra info!

Angående det med att dela upp klasser i olika filer och projekt. Anlednigen till att jag vill göra det är att jag kan känna att det blir lite rörigt när en cs-fil, innehållandes en klass, blir så himla stor. Är det vanligt att man tänker så och delar upp klasserna? Hur gör du själv?

Behöver allt vara i en klass då? Är bra att dela upp efter vad saker och ting gör, kanske inte skriva ut meny och läsa in kvällens bingolott i samma klass. Är även bra att dela upp så att en funktion bara gör en sak. Se till att saker och ting har låg koppling mellan varandra så att man får så lågt beroende som möjligt, t.ex. ska inte klassen som laddar in filer behöva använda sig utav ett objekt av menyn osv. Finns mycket att läsa om detta, sedan finns det massa olika designmönster. Objektorienterat är heller inte alltid det bästa alternativet, beror på vad det är du ska göra.

Men viktigast av allt, försök inte att optimera för tidigt, se till att du har det fungerandes först, sedan kan man titta på förbättringar. Att hålla på och kolla på varje liten grej kommer att ödsla tid och till slut göra så att man tappar suget för att man inte kommer någonvart.

Brukar dela upp klasserna i sina olika ansvarsområden. T.ex. handlar många av de verktyg jag gjort om att ladda upp och ner filer från olika servrar och hårddiskar, samtidigt som jag har t.ex. ftp nerladdningen i en annan klass. Filhanteringsklassen har då beroende på ftp klassen, men ftp klassen är helt fristående, och kan användas av andra klasser eller andra program utan problem.
Sedan har de flesta verktygen också mycket av samma kod, t.ex. ett som laddar ner från ftp och lägger upp lokalt på en server, och ett annat som gör samma saker, men även laddar ner från lokala servern till en usb sticka, osv. Detta gör att jag enkelt kan lägga den kod som är samma i ett annat delat projekt och bara bry mig om själva påkallningen av de olika funktionerna, samt gui't. Speciellt bra är detta då det är flera olika verktyg, och de ska finnas i olika versioner för olika kontor i olika länder. Poof, några enkla ändringar i guit, några ändrade strängar som pekar till nån server, så har du ett verktyg för ett nytt kontor. Osv. Grymt trevligt att arbeta med visual studio.

En annan grej jag försöker att arbeta efter är olika designmönster, som sagt ovan. För C# är nog MVVM, Model, View, Viewmodel. Handlar om att man splittrar upp programmer i huvudsak tre delar, Model, klasser som innehåller data, t.ex. en 'Person'-klass, men innehåller inte någon hantering av datan. Detta är istället ViewModelens jobb, hanterar skapandet av personer, vilken person som är markerad, osv. Detta visas sedan i View, gui't. Att koppla bort de olika delarna på detta sätt är jobbigt att lära sig i början, men gör det mer strukturerat. Tillsammans med WPF så är det gudomligt.

tl;dr. Som nybörjade kan du omöjligt ha för många funktioner redan för att göra det rörigt. Se till att namnge dem rätt, se till att de gör sin sak, inte spretar iväg, osv. Optimera och förbättra inte i förtid.
Citera
2017-03-20, 20:59
  #3140
Medlem
Citat:
Ursprungligen postat av Gottisborgen
Behöver allt vara i en klass då? Är bra att dela upp efter vad saker och ting gör, kanske inte skriva ut meny och läsa in kvällens bingolott i samma klass. Är även bra att dela upp så att en funktion bara gör en sak. Se till att saker och ting har låg koppling mellan varandra så att man får så lågt beroende som möjligt, t.ex. ska inte klassen som laddar in filer behöva använda sig utav ett objekt av menyn osv. Finns mycket att läsa om detta, sedan finns det massa olika designmönster. Objektorienterat är heller inte alltid det bästa alternativet, beror på vad det är du ska göra.

Men viktigast av allt, försök inte att optimera för tidigt, se till att du har det fungerandes först, sedan kan man titta på förbättringar. Att hålla på och kolla på varje liten grej kommer att ödsla tid och till slut göra så att man tappar suget för att man inte kommer någonvart.

Brukar dela upp klasserna i sina olika ansvarsområden. T.ex. handlar många av de verktyg jag gjort om att ladda upp och ner filer från olika servrar och hårddiskar, samtidigt som jag har t.ex. ftp nerladdningen i en annan klass. Filhanteringsklassen har då beroende på ftp klassen, men ftp klassen är helt fristående, och kan användas av andra klasser eller andra program utan problem.
Sedan har de flesta verktygen också mycket av samma kod, t.ex. ett som laddar ner från ftp och lägger upp lokalt på en server, och ett annat som gör samma saker, men även laddar ner från lokala servern till en usb sticka, osv. Detta gör att jag enkelt kan lägga den kod som är samma i ett annat delat projekt och bara bry mig om själva påkallningen av de olika funktionerna, samt gui't. Speciellt bra är detta då det är flera olika verktyg, och de ska finnas i olika versioner för olika kontor i olika länder. Poof, några enkla ändringar i guit, några ändrade strängar som pekar till nån server, så har du ett verktyg för ett nytt kontor. Osv. Grymt trevligt att arbeta med visual studio.

En annan grej jag försöker att arbeta efter är olika designmönster, som sagt ovan. För C# är nog MVVM, Model, View, Viewmodel. Handlar om att man splittrar upp programmer i huvudsak tre delar, Model, klasser som innehåller data, t.ex. en 'Person'-klass, men innehåller inte någon hantering av datan. Detta är istället ViewModelens jobb, hanterar skapandet av personer, vilken person som är markerad, osv. Detta visas sedan i View, gui't. Att koppla bort de olika delarna på detta sätt är jobbigt att lära sig i början, men gör det mer strukturerat. Tillsammans med WPF så är det gudomligt.

tl;dr. Som nybörjade kan du omöjligt ha för många funktioner redan för att göra det rörigt. Se till att namnge dem rätt, se till att de gör sin sak, inte spretar iväg, osv. Optimera och förbättra inte i förtid.

Hej!

Jättetack!
Citera
2017-03-23, 15:03
  #3141
Medlem
Exclamation-marks avatar
Hej!

Jag håller på med ett frågespel.

Har enbart hållt på med C# i 5h så är helt grön inom området.

Kod:
Console.WriteLine("1. Vilken kvinna har skrivit dom allra roligaste böckerna?");

            String frågaEtt= Console.ReadLine();
            if (frågaEtt == "Donald Trump")
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Korrekt");
                Console.ForegroundColor = ConsoleColor.White;

            }

            else
            {
                return;
            }

Nu vill jag lägga till ett alternativt svar.

Citat:
if (frågaEtt == "Donald Trump" || "Ernst Kirchsteiger")

Jag får dock inte detta till att fungera. Kan någon hjälpa mig?

Är det bara INT som kan ha ett alternativt svar? Hur gör jag om jag vill göra samma sak på STRING?
Citera
2017-03-23, 15:48
  #3142
Medlem
Citat:
Ursprungligen postat av Exclamation-mark
Hej!

Jag håller på med ett frågespel.

Har enbart hållt på med C# i 5h så är helt grön inom området.

Kod:
Console.WriteLine("1. Vilken kvinna har skrivit dom allra roligaste böckerna?");

            String frågaEtt= Console.ReadLine();
            if (frågaEtt == "Donald Trump")
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Korrekt");
                Console.ForegroundColor = ConsoleColor.White;

            }

            else
            {
                return;
            }

Nu vill jag lägga till ett alternativt svar.



Jag får dock inte detta till att fungera. Kan någon hjälpa mig?

Är det bara INT som kan ha ett alternativt svar? Hur gör jag om jag vill göra samma sak på STRING?

det ska det vara, if(string== "donald" || string == "hejsan")
Citera
2017-03-23, 16:02
  #3143
Medlem
Exclamation-marks avatar
Citat:
Ursprungligen postat av Oscillation
det ska det vara, if(string== "donald" || string == "hejsan")

Så enkelt men så effektivt.

Tack! Fungerar klockrent.
Citera
2017-03-24, 11:35
  #3144
Medlem
Citat:
Ursprungligen postat av Exclamation-mark
Så enkelt men så effektivt.

Tack! Fungerar klockrent.
Switch case fungerar också bra
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback