Toon posts:

[TC++] cout / array probleempje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ben voor school bezig met een proggie. Dit proggie is zo goed asl af ware het niet dat ik 1 klein probleempje in de uitvoering heb.

Hieronder zal een stuk van begin van mij broncode staan en het eind gedeelte:

//---- begin stukje ------
char namen [Aantal_Leerlingen] [20] = { "leerling 01", "leerling 02", "leerling 03",
"leerling 04", "leerling 05", "leerling 06",
"leerling 07", "leerling 08", "leerling 09",
"leerling 10", "leerling 11", "leerling 12",
"leerling 13", "leerling 14", "leerling 15",
"leerling 16", "leerling 17", "leerling 18",
"leerling 19", "leerling 20", "leerling 21",
"leerling 22", "leerling 23" };

void main (void)
{
clrscr();

for (X=0; X < Aantal_Leerlingen; X++)
leerling[X] = vrij;

cout << "Dit programma stelt willekeurige groepen samen,";
cout << "\n bla bla bla.";

// ------ eind stukje -----
do
{
while (teller <= GroepGrote)
{
if (leerling[X] == groep)
{
cout << "In groep: " << leerling[X] << " zit " << namen[X] << endl;
teller++;
}
else X++;
}
teller = 1;
groep--;
} while (groep > 0);

getch();
}
//---------------------------
dit programma maakt van de leerlingen uit de klas willekeurige groepjes, voor projecten.
als ik het laatste gedeelte vervang door dit:
// ---- vervanging ----
for (X=0; X < Aantal_Leerlingen; X++)
cout << "In groep: " << leerling[X] << " zit " << namen[X] << endl;
getch();
//--------------
dan krijg ik gewoon keurig netjes het nummer van de groep en daarna naast welke leerling er in zit
voorbeeld :
In groep 5 zit leerling 01
In groep 3 zit leerlnig 02
In groep 7 zit leerling 03
In groep 5 zit leerling 04

proggie werkt dus gewoon goed.
Dacht ik zou wel netjes zijn als alle groepnummers netjes opvolg orde worden weergegeven.

Als ik mijn progaama nu run met dat eerste eind stukje krijg ik als uitkomst:
In groep 5 zit willekeurige groepen samen,
In groep 3 zit willekeurige groepen samen,
In groep 7 zit willekeurige groepen samen,
In groep 5 zit willekeurige groepen samen,

De naam van de leerling is dus vervangen door:
willekeurige groepen samen,
dat is het laatste gedeelte van het eerste stukje cout in het begin gedeelte.

Heeft iemand enig idee waar de fout kan liggen?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Je zal dit echt even duidelijker moeten uitleggen, en aub beter uitlijnen van de code dmv de {code} en {/code} tags met rechte haken.

Professionele website nodig?


Verwijderd

Inderdaad, dit nodigt niet uit tot nader onderzoek.

(ik word er zo alleen moe van :Z..)

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 11-09 10:38

Killemov

Ik zoek nog een mooi icooi =)

Hier klopt bitter weinig van en zoals het er staan kan het ook gewoon niet werken. Je definieert nl een 2D-Array en je doet verder alles met een normale array. Errug vreemd. :?

Hey ... maar dan heb je ook wat!


Verwijderd

Topicstarter
Maak een programma dat random groepjes maakt van leerlingen uit een klas. De docent hoeft alleen aan te geven uit hoeveel leerlingen zo'n groep moet bestaan.

Het samen stellen van de random groepen is geen probleem dit werkt gewoon. Het proleem zit hem in het weergeven van het resultaat.

Ik werk in dit programma werk ik met 2 array's 1 2D-array (char namen [X] [X]) en de ander een normale array (int leerling [])

Als ik de lijst met namen en groep nummer weergeef op de volgen de manier is er niks aan de hand:
code:
1
2
3
4
for (X=0; X < Aantal_Leerlingen; X++)
    cout << "In groep: " << leerling[X] << " zit " << namen[X] << endl;
// leerling[X] is normale array
// namen[X] is een 2D-array

Resultaat hiervan is dat de 1ste leerling van de lijst als eerste met groepnummer wordt weergegeven en de laatste leerling van de lijst als laatste wordt weergegeven met groepnummer. Hier door staan de groep leden verspreid. Nou leek het mij netter om de groepsleden bij elkaar te weergeven. Dus met het hoogste groepnummer beginnen en met het laagste groepnummer eindigen.

Ik dacht dit zo te doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
teller = 1;
  groep = Aantal_Leerlingen / GroepGrote; // groep bevat het aantal gemaakte groepen
  if (keuze == 2) // het gaat om oneven aantal leerlingen
     groep += 1;  /* door keuze 2 worden de overgebleven leerlingen in een aparte groep gezet */

  do
     {
     while (teller <= GroepGrote)
        {
        if (leerling[X] == groep)
        {
          cout << "In groep: " << leerling[X] << " zit " << namen[X] << endl;
          teller++;
        }
        else X++;
        }
        teller = 1;
        groep--;
     } while (groep > 0);

Nu wordt ipv de naam van de leerling (namen[X]) weergegeven dit weergegeven: "willekeurige groepen samen,"

Dit is een stukje van een zin wat in de eerste cout van mijn programma staat.
begin van programma:
code:
1
2
3
4
5
6
7
8
9
void main (void)
{
clrscr();

for (X=0; X < Aantal_Leerlingen; X++) //leerling[X] is normale array
leerling[X] = vrij; //om bij te houden of iemand al is ingedeeld

cout << "Dit programma stelt willekeurige groepen samen,"; //LET OP DEZE ZIN!!
cout << "\n bla bla bla.";

Mijn vraag is waarom gebeurt dit? Ik heb de cout om de lijst af te drukken niet verandert maar alleen in een loop gezet en gelijk gebeurt er iets "vreemds"

Hoop dat het nu een stuk duidelijker is.

Verwijderd

Ja, het is duidelijker, en er gaat een heleboel fout. Ten eerste: de fout wordt veroorzaakt omdat je de variabele X niet initialiseert. X kan dus elke willekeurige waarde hebben, en als die waarde groter of gelijk is aan de grootte van de arrays, dan gebeuren er gekke dingen. Daarnaast kan het nog fout gaan als bij keuze 2 je laatste groep niet volledig vol is.
code:
1
2
3
4
5
6
7
8
9
10
groep= Aantal_Leerlingen / GroepGrote;
if(keuze == 2) ++groep;
for(; groep > 0; --groep) {
  for(X= 0, teller= 1; teller <= GroepGrote && X < Aantal_Leerlingen; ++X) {
    if(leerling[X] == groep) {
    cout << "In groep: " << leerling[X] << " zit " << namen[X] << endl;
    ++teller;
    }
  }
}

Verwijderd

Topicstarter
Probleempje opgelost. Kwam inderdaad door de variabele X. Als hij begon aan de loop had hij al een waarde gelijk aan de array. Was me wel bewust van dat keuze 2 verhaal. Test mijn proggies meestal tussen tijds zo dat ik niet verschillende bugs er tegelijk moet uit halen.

Kan je op een 1 of andere manier nog beredeneren. Wat de gevolgen zouden kunnen zijn als je dat soort fouten maakt als ik deed met de variable X. Of is daar geen touw aan vast te knopen?

Wist trouwens niet dat je de for functie ook zo kon gebruiken door het init-statement weg te laten en alleen de ; te laten staan. Kan best wel makkelijk zijn.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op dinsdag 02 oktober 2001 21:08 schreef s.p.o.o.k.j.e het volgende:
Wist trouwens niet dat je de for functie ook zo kon gebruiken door het init-statement weg te laten en alleen de ; te laten staan. Kan best wel makkelijk zijn.
Je kunt ze allemaal weglaten als je een eindeloze loop wilt, alhoewel ik daarvoor while(true) netter vind staan:
code:
1
2
3
4
5
6
7
8
9
for(;;)
  {
  ...
  }

while(true)
  {
  ...
  }

Met for kun je wel meer creatief spul, je kunt nl. zelfs meerdere statements per 'blokje' geven, bijv.:
code:
1
for(int i = 0, short j = 5; i++, i < j && j < 20; );

Leef je uit 8-)

Professionele website nodig?


Verwijderd

Op dinsdag 02 oktober 2001 21:08 schreef s.p.o.o.k.j.e het volgende:
Kan je op een 1 of andere manier nog beredeneren. Wat de gevolgen zouden kunnen zijn als je dat soort fouten maakt als ik deed met de variable X. Of is daar geen touw aan vast te knopen?
Dat kan wel ja, maar dat is redelijk ingewikkeld:
Je leerlingen[] en namen[] arrays staan globaal gedefinieerd, en komen dus in het datasegment (een speciaal stuk geheugen) van het programma terecht. Alle literal strings in je programma, zoals bv. "Dit programma stelt willekeurige groepen samen,", worden ook in dat datasegment geplaatst. Als je index in zo'n array hoger is dan het hoogste element, dan komt het uitgerekende geheugenadres dus niet in het array maar in een variabele terecht die na dat array gedefinieerd is, of in zo'n literal string (zoals in jouw geval).
Pagina: 1