Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tietuetaulukko c++

LauriN [06.10.2006 01:51:55]

#

Eli minulla on struct-tietueeseen tehty taulukko, ongelma on taulukon ensimmäisen tyhjän paikan etsiminen. Tämä koska myöhemmin käyttäjä syöttää tietoja taulukkoon loopissa, pitäisi joka kerran syöttää tyhjään taulukon riviin.

struct Ajoneuvo
{
	char merkki[25];
	int vuosimalli;
};
Ajoneuvo Auto[20];

Seuraavan tyylisen koodinpätkän pitäisi palauttaa normaalista taulusta ensimmäinen tyhjä paikka, mutta ei toimi tietuetaulun kanssa.
Sanoo vain "binary '!=' : 'struct Ajoneuvo' does not define this operator or a conversion to a type acceptable to the predefined operator".

int i = 0;
int vapaa = 0;

for( i=0;i<taulun_koko;i++)
{
if( taulu[i] != '\0')
	vapaa = i + 1;
}

Paras tietysti olisi jos saisi tehtyä funktion joka palauttaa taulukon ensimmäisen tyhjän paikan, jota voisi kutsua loopin alussa tms.

Metabolix [06.10.2006 05:44:30]

#

No jotenkin sinun pitää määritellä, milloin se on vapaa. Laita sinne vaikka int vapaa, josta voit sitten tarkistaa. Tuo kuvaamasi silmukka ei toimi, koska se ensimmäisellä kerralla valitsee vapaaksi kohdan taulukon ulkopuolelta, muita kertoja en edes viitsisi ajatella. Kannattaisi tehdä silmukka niin, että se päättyy ensimmäiseen vapaaseen:

vapaa_kohta = -1;
for (i = 0; i < taulukon_koko; ++i) {
    if (on_vapaa(taulu[i])) {
        vapaa_kohta = i;
        break; // Lopetetaan tähän
    }
}
if (vapaa_kohta == -1) {
    printf("Ei ollut vapaita!\n");
}

Toinen erittäin suositeltava ja käyttökelpoinen väline on vector-luokka, jonka kanssa pääsee mukavasti aimo harppauksen kauemmaksi taulukon kokorajoituksista ynnä muista. (Oma-aloitteisuutta tässä asiassa, seuraavassa viestissä ei toivottavasti lue "mikäs se on" tai muuta vastaavaa.) Myös list tai map voisivat sopia tähän.

A-P [06.10.2006 09:18:29]

#

Oletan, että kyse on C:stä. Joko rakenteeseen on lisättävä lipui tai sitten käytettävä ulkopuolista laskuria.

struct Ajoneuvo
{
    int vapaa;
    char merkki[25];
    int vuosimalli;
};
Ajoneuvo Auto[20];

Nyt voidaan tarkistaa lipun avulla onko taulukon kohta vapaa. Taulukko on muistettava alustaa ennen käyttöä, sillä C ei anna takuita muuttujien alustuksesta.

for (i = 0; i < taulukon_koko; i++) {
    if (taulu[i].vapaa) {
        vapaa_kohta = i;
        break; // Lopetetaan tähän
    }
}

Toinen vaihtoehto on käyttää laskuria, joka kasvaa aina, kun taulukkoon listätään uusi tieto.

int vapaa=0;

/* lisätään taulukkoon */
strcpy(taulu[vapaa].merkki, "Morgan");
taulu[vapaa].vuosimalli=2006;
vapaa++;

Jos kyse olikin C++:sta, niin silloin kannattaa käyttää vektoria.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta