Avatar billede nat Nybegynder
09. maj 2004 - 14:44 Der er 38 kommentarer og
1 løsning

Er det nogen der kan hjælpe med en consolapp.?

Hej

Jeg er ved at lave følgende (formegentligt) ret simple consol app.

Men jeg kan ikke få den til at køre, da den siger:
______________________________________________________________

MainClass.Bil indeholder ikke en definition af 'nyRentet'
MainClass.Bil indeholder ikke en definition af 'nyKmCounter'

MainClassBil.rentet er ikke tilgængelig pga. det angivne beskyttelse nivau

navnet 'index' findes ikke i klassen eller navneområdet 'MainClass.Bil'
______________________________________________________________

Min kode ser således ud:

_______________________________________________________________

using System;

class MainClass
{
    public class Bil
    {
        // erklære variable
        private int regNr; //bilen registreringnummer (identificering)
        private string category; // bilen kategori (A eller B)
        private string brand; // bilens mærke (Golf, Xsara, Passat eller Picasso)
        private int kmCounter; // bilens kilometertæller da den blev købt
        private int aktKmCounter; // bilens aktuelle kilometertæller
        private bool rentet; // om bilen er udlejet
       
        // tildeler de private medlemsvariable værdier
       
        public Bil(int nytRegNr, string nyCategory, string nyBrand, int nyKmCounter, int nyAktKmCounter, bool nyRentet)
        {
            regNr = nytRegNr;
            category = nyCategory;
            brand = nyBrand;
            kmCounter = nyKmCounter;
            aktKmCounter = nyAktKmCounter;
            rentet = nyRentet;           
        }
           
                       
        public virtual void HentBrand()
        {
            brand=brand;
        }
       
       
        public int HentRegNr()
        {
            return regNr;
        }
        public string HentCategory()
        {
            return category;
        }
        public int HentKmCounter
        {
            get
            {
                return kmCounter;
            }
        }
        public int AktKmCounter
        {
            get
            {
                return aktKmCounter;
            }
            set
            {
                aktKmCounter = value;
            }
        }
        public bool IsRentet()
        {
            return rentet;
        }
       
       
       
       
        //Hvor mange km har bilen kørt
        public void AntalKm()
        {
            aktKmCounter-=kmCounter;
        }
        public override string ToString()
        {
            string str;
            str="Registreringsnummer: ";
            str+=regNr.ToString();
            str="Kategori: ";
            str+=category.ToString();
            str="Mærke: ";
            str+=brand.ToString();
            str+="Kmtæller";
            str+=kmCounter.ToString();
            str="Aktueller kmtæller: ";
            str+=aktKmCounter.ToString();
            str="Udlejet: ";
            if(Ba[index].rentet == true)
            str="Udlejet".ToString();
            else
            str="Ikke udlejet".ToString();
            return str;
        }
       
               
    }//slut bil klasse
   
    class ABil:Bil
    {
        public ABil(int regnr, string nyCategory, string nyBrand, int nyKmCounter,int nyAktKmCounter, bool nyRentet):base(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter, nyRentet)//der skal sikkert flere argumenter på
        {
        }
        public override void HentBrand()
        {
                           
           
        }
           
    }// slut ABil klsse
    class BBil:Bil
    {
        public BBil(int regnr, string nyCategory, string nyBrand, int nyKmCounter,int nyAktKmCounter, bool nyRentet):base(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter, nyRentet)//der skal sikkert flere argumenter på
        {
        }
        public override void HentBrand()
        {
               
           
        }
    }
   
    // Hent reg.nr hvis registreringsnummer eksistrer
    public static int FindIndex(Bil[]ba, int RegNr, int antal)
    {
        bool excits=false;
        int index=-1;
        for (int i=0; i<antal; i++)
            if (RegNr==ba[i].HentRegNr())
            {
                excits=true;
                index=i;
            }
            if(excits)
                return index;
            else
                return -1;
    }
       
    //test af bilpark
    public static void Main(string[] args)
    {
        Bil[] ba = new Bil[100];
        string valg;
        int regnr; // det registreringsnummer brugeren indtaster
        int index;
        int nyKmCounter;
        string nyCategory;
        string nyBrand;
        int nyAktKmCounter;
        bool nyRentet;
       
        int antalIBrug=0;
       
        do
        {
            System.Console.WriteLine("1: Opret bil\n 2. Slet bil\n 3. Udskriv alle bilers info\n 4. Udskriv alle info for ledige biler i kat. A\n 5. Udlej bil\n 6. Indlever bil\n 7. Er bil udlejet?\n 8. Returner golf\n 9. Slette alle biler > 200000 km\n 10. Luk program");
            valg=Console.ReadLine();
           
            switch(valg)
            {
                case"1":Console.Write("Indtast bilens registreringsnummer: ");
                        regnr=Convert.ToInt32(Console.ReadLine());
                        //findes det indtastede regnr i forvejen
                        if(FindIndex(ba, regnr, antalIBrug)!=-1)
                            Console.WriteLine("En bil med dette registreringsnummer er allerede registreret");
                        else
                        {
                            Console.Write("Indtast bilen kategori a eller b:");
                            nyCategory=Console.ReadLine();
                            Console.Write("Indtast Bilens mærke pa for Passat pi for Picasso g for Golf x for Xsara: ");
                            nyBrand=Convert.ToString(Console.ReadLine());
                            Console.Write("Indtast bilens kilometertæller: ");
                            nyKmCounter=Convert.ToInt32(Console.ReadLine());
                            if (nyCategory=="a")
                                ba[antalIBrug++]= new ABil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                            else
                                ba[antalIBrug++]= new BBil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                            if (nyBrand=="pa" || nyBrand=="pi")
                                ba[antalIBrug++]= new ABil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                            else
                                ba[antalIBrug++]= new BBil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                                                   
                        }
                break;
                case"2":Console.Write("Hvilken bil skal slettes: ");
                        regnr=Convert.ToInt32(Console.ReadLine());
                        index=FindIndex(ba, regnr, antalIBrug);
                        if(index==-1)
                            Console.WriteLine("Denne bil er ikke registreret");
                            else
                            {
                                ba[index]=ba[antalIBrug-1];
                                antalIBrug--;
                            }
                break;
                case"3":for(int i=0; i<antalIBrug; i++)
                        Console.WriteLine(ba[i]);
                break;
                case"4":for(int i=0; i<antalIBrug; i++)
                        if(nyCategory=="a")
                            Console.WriteLine(ba[i]);
                break;
                //udleje en bil udfra bilens regnr.
                case"5":while (index==-1)//Hent bilens regnr
                        {
                            Console.WriteLine("Hvilken bil skal udlejes? Indtast reg.nr.: ");
                            regnr=Convert.ToInt32(Console.ReadLine());
                            //undersøg om bilen findes
                            index = FindIndex(ba, regnr, antalIBrug);
                            if (index==-1)
                            Console.WriteLine("Denne bil er ikke registreret");
                        }
                        //Bilen er fundet og kan sættes til rentet
                        ba[index].nyRentet=false;
                        // registrer hvad den nye kmtæller står på
                        Console.WriteLine("Hvad står bilens km tæller på?: ");
                        ba[index].nyKmCounter=Convert.ToInt32(Console.ReadLine());
                break;
                //registrere at bilen tilbageleveres
                case"6":while (index==-1)//hent bilens regnr.
                        {
                            Console.WriteLine("Hvilken bil skal indleveres: ");
                            regnr=Convert.ToInt32(Console.ReadLine());
                            //undersøg om bilen findes
                            index=FindIndex(ba, regnr, antalIBrug);
                            if(index == -1)
                                Console.WriteLine("Denne bil er ikke registreret");
                        }
                        //Bilen er fundet og kan sættes til ledig
                        ba[index].nyRentet=false;
                        Console.WriteLine("Hvad står bilens kmtæller på?: ");
                        ba[index].nyKmCounter= Convert.ToInt32(Console.ReadLine());
                       
                break;
                //returnere om en bil er udlejet udfra regnr.
                case"7": while (index==-1)//hent bilens regnr.
                        {
                            Console.WriteLine("Hvilken bil skal checkes? Indtast regnr.: ");
                            regnr=Convert.ToInt32(Console.ReadLine());
                            //undersøg om bilen findes
                            index=FindIndex(ba, regnr, antalIBrug);
                            if(index == -1)
                                Console.WriteLine("Denne bil er ikke registreret");
                        }
                        //Her checkes om den funde bils udlejnings "flag" er sat til sand, hvis sand så udlejes den ellers ikke
                            if(ba[index].rentet==true)
                                Console.WriteLine("Bilen er udlejet");
                            else
                                Console.WriteLine("Bilen er ledig");
                break;
                case"8":;
                break;
                case"9":;
                break;
                case"10":;
                break;
            }
        }
        while(valg!="10");
   
    }
}
_________________________________________________________________

Nogen forslag til hvad jeg skal ændre for at få den til køre???
Avatar billede arne_v Ekspert
09. maj 2004 - 14:57 #1
Første fejl:

                        ba[index].nyRentet=false;

ret til

                        ba[index].IsRentet=false;

og lave en property IsRentet med både get og set.
Avatar billede arne_v Ekspert
09. maj 2004 - 14:58 #2
Anden fejl:

                        ba[index].nyKmCounter=Convert.ToInt32(Console.ReadLine());

ret til:

                        ba[index].HentKmCounter=Convert.ToInt32(Console.ReadLine());

og lav set til den property.
Avatar billede arne_v Ekspert
09. maj 2004 - 14:59 #3
Og så er der mange fejl tilbage.

Jeg vil kraftigt anbefale at du ikke taster 250 linier ind og så gå rigang med at
oversætte, men at du løbende oversætter, så der aldrig er mere end nogle få fejl.
Avatar billede nat Nybegynder
09. maj 2004 - 15:02 #4
Jeg har skret følgende nu
public bool IsRentet()
        {
            get
            {
                return rentet;
            }
            set
            {    rentet=value;
            }
        }

og rettet til ba[index].IsRentet=false;

Men så siger den:

"Der referes til metoden 'MainClass.Bil.IsRentet()' uden parenteser"
Avatar billede nat Nybegynder
09. maj 2004 - 15:03 #5
åhh undskyld, har fået fjernet () fra IsRentet, og der ser ud til at fungere
Avatar billede arne_v Ekspert
09. maj 2004 - 15:04 #6
public bool IsRentet // <---- ingen parenteser her
        {
            get
            {
                return rentet;
            }
            set
            {    rentet=value;
            }
        }
Avatar billede lifo Nybegynder
09. maj 2004 - 15:09 #7
nyRentet er en variabel i Main og ikke Bil
du mangler også en set metode til Rentet i din Bil classe
i steden for denne ville jeg lave en get set 
public bool IsRentet()
        {
            return rentet;
        }
public bool IsRentet
{
  get{return rentet;}
  set{rentet=value;}
}
Avatar billede nat Nybegynder
09. maj 2004 - 15:11 #8
jeg er begynder med stort B, så jeg har ikke helt så meget kodeerfaring.

Nu har jeg følgende fejl tilbage:
____________________________

MainClassBil.rentet er ikke tilgængelig pga. det angivne beskyttelse nivau

navnet 'index' findes ikke i klassen eller navneområdet 'MainClass.Bil'
_______________________________________

Nogen idéer???

og 10000000 tak for hjælpen
Avatar billede arne_v Ekspert
09. maj 2004 - 15:13 #9
Ja rentet er private bug den nye public property IsRentet
Avatar billede arne_v Ekspert
09. maj 2004 - 15:14 #10
index er simpelthen ikke rerklæret der hvor du bruger den og får fejlem
Avatar billede arne_v Ekspert
09. maj 2004 - 15:15 #11
Måske skal ToString bare se ud som:

        public override string ToString()
        {
            string str;
            str="Registreringsnummer: ";
            str+=regNr.ToString();
            str="Kategori: ";
            str+=category.ToString();
            str="Mærke: ";
            str+=brand.ToString();
            str+="Kmtæller";
            str+=kmCounter.ToString();
            str="Aktueller kmtæller: ";
            str+=aktKmCounter.ToString();
            str="Udlejet: ";
            if(rentet) // <----- rettet her
            str="Udlejet".ToString();
            else
            str="Ikke udlejet".ToString();
            return str;
        }
Avatar billede nat Nybegynder
09. maj 2004 - 15:24 #12
Det ser også ud til at gå godt :-)

Men nu kommer følgende fejl:
_______________________________-

Ikke-tildelt lokal variabel 'nyAktKmCounter' blev anvendt
Ikke-tildelt lokal variabel 'nyRentet' blev anvendt
Ikke-tildelt lokal variabel 'nyCategory' blev anvendt
Ikke-tildelt lokal variabel 'index' blev anvendt
______________________________________________________

Hvorfor det? for hvis man fjerne dem, så brokker den sig også...
Avatar billede arne_v Ekspert
09. maj 2004 - 15:26 #13
ikke-tildelt betyder at variablen eksisterer, men at den ikke har fået nogen værdi
tildelt

du bliver nødt til at checke program flowet
Avatar billede nat Nybegynder
09. maj 2004 - 15:35 #14
Arve_v: Jeg ved godt at det er meget at forlange, men kan du hjælpe??? Jeg er virkeligt kørt fast.
Avatar billede nat Nybegynder
09. maj 2004 - 15:58 #15
Har fiflet lidt med koden, og får nu kun følgende fejl:

Ikke-tildelt lokal variabel 'nyRentet' blev anvendt

jeg kan ikke se, hvorfor den ikke får tildelt en værdi. Nogen idéer?

Tak :-)
Avatar billede arne_v Ekspert
09. maj 2004 - 16:05 #16
public static void Main(string[] args)
...
bool nyRentet;  // erklæres
...
ba[antalIBrug++] = new ABil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet); // <--- bruges
ba[antalIBrug++]= new BBil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet); // <---- bruges
...
Avatar billede arne_v Ekspert
09. maj 2004 - 16:05 #17
Jge kan ikke se hvor den skulle få en værdi.
Avatar billede nat Nybegynder
09. maj 2004 - 16:14 #18
Jeg kunne godt tænke mig at få bilen til at være ledig, når bilen oprettes, dvs. nyRentet=false.

Så der hvor brugeren opretter bilen ved at indtaste regnr, km og alt det andet (i case "1":) skal det derfault komme med, evt. ved at brugeren indtaster om hvorvidt bilen er ledig eller ej. Jeg kan bare ikke gennemsku hvordan. Nogen idé??
Avatar billede nat Nybegynder
09. maj 2004 - 16:29 #19
Kan man ikke få det med ind her i "Case1":

____________________________________________________________________________
case"1":Console.Write("Indtast bilens registreringsnummer: ");
                        regnr=Convert.ToInt32(Console.ReadLine());
                        //findes det indtastede regnr i forvejen
                        if(FindIndex(ba, regnr, antalIBrug)!=-1)
                            Console.WriteLine("En bil med dette registreringsnummer er allerede registreret");
                        else
                        {
                            Console.Write("Indtast bilen kategori a eller b:");
                            nyCategory=Console.ReadLine();
                            Console.Write("Indtast Bilens mærke pa for Passat pi for Picasso g for Golf x for Xsara: ");
                            nyBrand=Convert.ToString(Console.ReadLine());
                            Console.Write("Indtast bilens kilometertæller: ");
                            nyKmCounter=Convert.ToInt32(Console.ReadLine());
                            Console.Write("Indtast bilens aktuelle kilometertæller: ");
                            nyAktKmCounter=Convert.ToInt32(Console.ReadLine());
                            if (nyCategory=="a")
                                ba[antalIBrug++]= new ABil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                            else
                                ba[antalIBrug++]= new BBil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                            if (nyBrand=="pa" || nyBrand=="pi")
                                ba[antalIBrug++]= new ABil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                            else
                                ba[antalIBrug++]= new BBil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                               
                        }
Avatar billede nat Nybegynder
09. maj 2004 - 16:34 #20
På en eller anden måde sætte:

nyRentet=(ba[index].IsRentet==false);

ind i else sætningen til sidst, men det jeg lige har skrevet går ikke godt. Hvad skal jeg skrive istedet?
Avatar billede arne_v Ekspert
09. maj 2004 - 16:44 #21
Du kunne jo starte med:

nyRentet = false;
Avatar billede arne_v Ekspert
09. maj 2004 - 16:45 #22
nyRentet=(ba[index].IsRentet==false);

kan skrives som:

nyRentet = !ba[index].IsRentet;
Avatar billede arne_v Ekspert
09. maj 2004 - 16:45 #23
Men problemt ligger nok i at index ikke har en værdi.
Avatar billede arne_v Ekspert
09. maj 2004 - 16:47 #24
Jeg kan ikke lige gennemskue logikken i hele dit program.

Måske kan du bare sætte nyRentet til false eller true.

Måske kan du indlæse y/n fra bruger og sætte ud fra det.

Måske skal du noget helt tredie.
Avatar billede nat Nybegynder
09. maj 2004 - 16:55 #25
Ja jeg får bare at vide at nyRentet og index ikke har nogen værdier. Jeg vil gerne kunne indlæse input fra bruger, men problemet er at nyRentet er en bool, og ikke vil tage imod. Eller også er det igen fordi jeg ikke gør det rigtigt...

Har du et forslag?

Jeg tror også at jeg selv er ved at miste overblikket og logikken :-(

P.s. Jeg syntes virkeligt at du har gjort et stort arbejde, og skal selvfølgelig have pointne
Avatar billede arne_v Ekspert
09. maj 2004 - 16:58 #26
Console.Write("Indtast om ny rentet (true/false): ");
nyRentet=Convert.ToBoolean(Console.ReadLine());

bør virke.
Avatar billede arne_v Ekspert
09. maj 2004 - 16:59 #27
Ellers:

Console.Write("Indtast om ny rentet (j/n): ");
nyRentet=(Console.ReadLine().ToLower() == "y");
Avatar billede arne_v Ekspert
09. maj 2004 - 17:00 #28
Og et svar
Avatar billede nat Nybegynder
09. maj 2004 - 17:06 #29
Det går også godt, og programmet kan køre :-)

Problemet er nu bare at når jeg vælger case3, dvs. vil have alle info udskrevet (om den ene bil jeg har oprettet)
Udskriver programmet bare:
______________________________________
Ikke Udlejet
Ikke Udlejet
______________________________________

Er det ikke lidt mærkeligt? og hvorfor to gange?
Avatar billede arne_v Ekspert
09. maj 2004 - 17:09 #30
I case 3 har du en for løkke, så det er vel det som er skyld i de 2 output,
Avatar billede nat Nybegynder
09. maj 2004 - 17:11 #31
okay 2 gange kan jeg vist så godt greje, det er nok pgr. af den nedarvede klasse - hvor jeg ikke helt kan finde ud af at tildele de kategorier 2 forskellige mærke biler hver.

Men hvorfor returnere den ikke alle de data der er blevet indtastet? det ser ud til at de andre valg virker :-)
Avatar billede arne_v Ekspert
09. maj 2004 - 17:12 #32
Og ToString skal nok rettes til:

        public override string ToString()
        {
            string str;
            str="Registreringsnummer: ";
            str+=regNr.ToString();
            str+=" Kategori: ";
            str+=category.ToString();
            str+=" Mærke: ";
            str+=brand.ToString();
            str+=" Kmtæller";
            str+=kmCounter.ToString();
            str=" Aktueller kmtæller: ";
            str+=aktKmCounter.ToString();
            str+=" Udlejet: ";
            if(rentet)
            str+="Udlejet";
            else
            str+="Ikke udlejet";
            return str;
        }
Avatar billede arne_v Ekspert
09. maj 2004 - 17:13 #33
Jeg prøver igen:

        public override string ToString()
        {
            string str;
            str="Registreringsnummer: ";
            str+=regNr.ToString();
            str+=" Kategori: ";
            str+=category.ToString();
            str+=" Mærke: ";
            str+=brand.ToString();
            str+=" Kmtæller";
            str+=kmCounter.ToString();
            str+=" Aktueller kmtæller: ";
            str+=aktKmCounter.ToString();
            str+=" Udlejet: ";
            if(rentet)
            str+="Udlejet";
            else
            str+="Ikke udlejet";
            return str;
        }
Avatar billede arne_v Ekspert
09. maj 2004 - 17:13 #34
en =
resten +=
Avatar billede nat Nybegynder
09. maj 2004 - 17:16 #35
Nu kommer alle info, men igen 2 gange :-)

Nogen forslag til hvad jeg skal gøre med for løkken i valg 3

P.s. Skal jeg oprette nyt spørgsmål med flere point, syntes det er fortjent. Og der nu kommer nogle andre problemstillinger...
Avatar billede arne_v Ekspert
09. maj 2004 - 17:19 #36
Hvis der kommer to linier så er der vel to biler eller ?
Avatar billede nat Nybegynder
09. maj 2004 - 17:44 #37
Hmm nej, har kun oprettet 1 bil..
Avatar billede nat Nybegynder
09. maj 2004 - 18:01 #38
Ved at modificere lidt i case1:
_________________________________________
if (nyCategory=="a")
                                if(nyBrand=="pa" || nyBrand=="pi")
                                ba[antalIBrug++]= new ABil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
                                                       
                            else
                                ba[antalIBrug++]= new BBil(regnr,nyCategory,nyBrand,nyKmCounter,nyAktKmCounter,nyRentet);
_________________________________________
Får jeg kun 1 linje ud :-)
Avatar billede nat Nybegynder
09. maj 2004 - 18:11 #39
arne_v: 1000 tak for hjælpen :-) Putter mine evt. kommende spørgsmål i et nyt spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester