csharp array inhoud tellen

  • Onderwerp starter Onderwerp starter baws
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

baws

Terugkerende gebruiker
Lid geworden
9 apr 2010
Berichten
1.258
Hallo,

Voor school ben ik bezig met een opdracht.
deze opdracht is in c sharp.
graag wil ik de arrays met inhoud tellen, zodat als ik een nieuwe model wil toevoegen verder ga met de volgende.
ik heb een array
model[20]
dus de eerste komt bij model[0]
als ik add type moet dit gebeuren dit lukt maar ik blijf model[0] vullen.
als ik een model wil toevoegen moet er dus eerst gekeken worden of deze als vol is en als deze al vol is dus array[1] vullen.
en als model[1] vol is dat model[2] wordt gevult
Code:
 if (commando == "add")  //add functie
                {
                    int c = 0;
                    while (Merk[c] == "")
                    {
                        c++;
                    }
                    
                    Console.WriteLine("Geef een merk voor de auto op.");
                    Merk[c] = Console.ReadLine();
                    Console.WriteLine("Geef een model voor de auto op.");
                    Model[c] = Console.ReadLine();
                    Console.WriteLine("Geef een bouwjaar voor de auto op.");
                    Jaar[c] = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine("Het merk is {0} het model {1} en het bouwjaar is {2}", Merk[c], Model[c], Jaar[c]);
dit heb ik maar dit werkt niet, hij blijft model[0] vullen.
 
Ben je verplicht om meerdere arrays te gebruiken? Anders zou je ook gewoon een klasse "Auto" kunnen schrijven die een auto voorstelt (met dus een merk, model en bouwjaar). Iets als:

[cpp]
public class Auto {
private string merk;
private string model;
private int bouwjaar;

public Auto(string merk, string model, int bouwjaar)
{
this.merk = merk;
this.model = model;
this.bouwjaar = bouwjaar;
}

public string Merk
{
get { return merk; }
}

public string Model
{
get { return model; }
}

public int Bouwjaar
{
get { return bouwjaar; }
}

public override string ToString()
{
return string.Format("Het merk is {0}, het model {1} en het bouwjaar is {2}", merk, model, bouwjaar);
}
}
[/cpp]

Dan hoef je bij het commando "add" alleen maar het volgende te doen:

[cpp]
List<Auto> autos = new List<Auto>();
// ...
if (commando == "add") {
string merk, model;
int bouwjaar;
// ... haal gegevens op
autos.Add(new Auto(merk, model, bouwjaar));
}
[/cpp]

Het afdrukken van de gegevens kan nu eenvoudig met ToString():

[cpp]
foreach(Auto a in autos) Console.WriteLine(a.ToString());
[/cpp]
 
En wat moet ik in de program.cs zetten zodat ik daar die auto kan aanmaken. ik heb nu nog niets dus in de program.cs
 
Ik heb nu dus dit in de prorgram

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Autolijst
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Auto> autos = new List<Auto>();

            
            if (commando == "add")
            {
                string merk, model;
                int bouwjaar;
                // ... haal gegevens op
                autos.Add(new Auto(merk, model, bouwjaar));
            }
        }
    }
}

maar hij zegt dat commando niet bestaat omdat ik die niet heb aangemaakt.
als ik nu
Code:
string commando = "";
boven
Code:
            if (commando == "add")

zet krijg ik use of unassigned local variable bowjaar
use of unassigned local variable merk
use of unassigned local variable model
 
Laatst bewerkt:
Het is nu gelukt bedankt,
maar kun je dit stukje even uitleggen dit snap ik nog niet.

public override string ToString()
{
return string.Format("Het merk is {0}, het model {1} en het bouwjaar is {2}", merk, model, bouwjaar);
}
 
Natuurlijk moet je uw bouwjaar, merk en model variable nog opvullen. Als je een array met grootte 20 wilt opvullen kan je toch eenvoudig een for lus gebruiken?

Code:
            if (commando == "add")
            {
                string merk, model;
                int bouwjaar;
                for(int i = 0; i < model.length() - 1; i++) {
                     Console.WriteLine("Geef een merk voor de auto op.");
                     merk = Console.ReadLine();
                     Console.WriteLine("Geef een model voor de auto op.");
                     model = Console.ReadLine();
                     Console.WriteLine("Geef een bouwjaar voor de auto op.");
                     bouwjaar = Convert.ToInt32(Console.ReadLine());

                     autos.Add(new Auto(merk, model, bouwjaar));
                 }

                foreach(Auto a in autos) Console.WriteLine(a.ToString());

            }
 
Het is nu gelukt bedankt,
maar kun je dit stukje even uitleggen dit snap ik nog niet.

public override string ToString()
{
return string.Format("Het merk is {0}, het model {1} en het bouwjaar is {2}", merk, model, bouwjaar);
}

Er is automatisch al een ToString methode bij elke klasse. Deze moet je dus override. Zoals je kan zien kan je dan gewoon een ToString() methode gebruiken om de output van die klasse te laten tonen. (a.toString();).. Ik snap niet goed wat er niet te begrijpen valt aan dat stukje code :P.
 
hoe kan ik dan bijvoorbeeld alleen de 2e auto laten zien of alleen de 1e.
want ik moet ze na het invoeren ook kunnen verwijderen.
nadat ik 3 autos heb moet het dus mogelijk zijn om de 2e auto te verwijderen.
Zou het niet makkelijker zijn als ze allemaal een id hebben, auto1 auto2 auto3 enz
 
Laatst bewerkt:
Baws,

Deze zitten in een List. Je kan uit deze list auto's verwijderen. bv autos.RemoveAt(1) zal de tweede auto verwijderen, je moet dan wel zeker weten dat deze bestaat. Anders krijg je een error. (een list begint zoals een array te tellen van 0, om de tweede auto te verwijderen zal je '1' moeten invullen bij remove).

MVG Dieter
 
Laatst bewerkt:
ok ik heb nu dit toegevoegd,
Code:
else if (commando == "del") // een auto verwijderen
                {
                    int delete = 0;
                    Console.WriteLine("welke auto verwijderen");
                    delete = Convert.ToInt32(Console.ReadLine());
                    autos.RemoveAt(delete);
                    Console.WriteLine("auto {0} is verwijdert", delete);
                }

dit werkt goed, is het ook mogelijk om elke auto een id toe te kennen beginnend bij 0, zodat ik erna op de list zie welke auto ik verwijder als ik het commando del gebruik
 
Baws,

Je kan in je klasse het volgende toevoegen

Code:
public class Auto {
private string merk;
private string model;
private int bouwjaar, id;
 
public Auto(string merk, string model, int bouwjaar, int id)
{
    this.merk = merk;
    this.model = model;
    this.bouwjaar = bouwjaar;
    this.id = id;
}
public int GetId
{
    get { return id; }
}
public string Merk
{            
    get { return merk; }
}
 
public string Model
{            
    get { return model; }
}
 
public int Bouwjaar
{
    get { return bouwjaar; }
}
 
public override string ToString()
{
    return string.Format("Het ID is {3} en het het merk is {0}, het model {1} en het bouwjaar is {2}", merk, model, bouwjaar, id);                
}
}

je kan nu het ID opvragen met de methode autos[0].GetId() (dit vraagt van de eerste auto het ID op).
 
Baws,

Je kan in je klasse het volgende toevoegen
[...]
je kan nu het ID opvragen met de methode autos[0].GetId() (dit vraagt van de eerste auto het ID op).

Een id heeft echter niks met een auto te maken en hoort mijns inziens daarom dan ook niet in de klasse thuis. De positie binnen de list (de index) kan daarvoor beter gebruikt worden (gezien dat eigenlijk ook de bedoeling is, want dan blijven de id's ook kloppen bij bijvoorbeeld het sorteren van de list).

En mocht je toch besluiten om id bij de klasse te laten horen, dan lijkt het me niet bedoeling dat je overal handmatig alle id's gaat toevoegen maar dat deze automatisch een waarde krijgen toegekend:

[cpp]
class Auto {
static int aantal_objecten = 0;
// ...
private int id;

public Auto(string merk, string model, int bouwjaar) {
this.merk = merk;
this.model = model;
this.bouwjaar = bouwjaar;
this.id = aantal_objecten++;
}
// ...
}
[/cpp]
 
Een id heeft echter niks met een auto te maken en hoort mijns inziens daarom dan ook niet in de klasse thuis. De positie binnen de list (de index) kan daarvoor beter gebruikt worden (gezien dat eigenlijk ook de bedoeling is, want dan blijven de id's ook kloppen bij bijvoorbeeld het sorteren van de list).

En mocht je toch besluiten om id bij de klasse te laten horen, dan lijkt het me niet bedoeling dat je overal handmatig alle id's gaat toevoegen maar dat deze automatisch een waarde krijgen toegekend:

[cpp]
class Auto {
static int aantal_objecten = 0;
// ...
private int id;

public Auto(string merk, string model, int bouwjaar) {
this.merk = merk;
this.model = model;
this.bouwjaar = bouwjaar;
this.id = aantal_objecten++;
}
// ...
}
[/cpp]

Daar hebje wel een punt..! Bedankt voor de correctie, zo leer ik ook nog eens wat bij!
 
Daar hebje wel een punt..! Bedankt voor de correctie, zo leer ik ook nog eens wat bij!

Daar is dit forum voor. Bij de property GetId ga je trouwens (wederom mijns inziens) ook de mist in. De implementatie is goed, maar de gekozen naam niet. Je moet namelijk in gedachte houden dat voor de gebruikers van een klasse een property qua syntax gewoon een variabele/field is en geen functie/method. Klopt de betekenis van GetId bijvoorbeeld nog wanneer je ook nog de setter moet implementeren? :p
 
Mja, we zijn op school nu bezig met java. Wij moeten ons aan de naamgeving houden, beetje automatische denk ik. Maar je hebt gelijk! Het is niet logisch =)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan