oefening array

Status
Niet open voor verdere reacties.

tommantic

Nieuwe gebruiker
Lid geworden
31 jan 2010
Berichten
4
ik heb deze week een oefening gekregen om op te lossen met array's

namelijk deze ==>

Oefeningen arrays:

Gebruik waar mogelijk een array.

1. Het aantal leerlingen van een klas is zeker niet groter dan 42. We voeren het aantal punten van de leerlingen in (max. is 100) en wensen de standaardafwijking te berekenen. De invoer wordt afgesloten met een negatief getal (laatste getal – dat niet geldig is – is negatief). Als n het aantal leerlingen voorstelt en p[1], p[2], … p[n] de punten en g het rekenkundig gemiddelde van deze punten, dan krijgt men de standaardafwijking met volgende formule:

SA = vierkantswortel( ((p[1]-g)²+(p[2])²+...+(p[n]-g)²) / n )

mijn grootste probleem is dat we nog nooit echt een oefening op arrays gemaakt hebben en dat de gebruikelijk for lus die bij veel voorbeeld arrays te zien is hier niet van toepassing zal zijn vermits er een stop van gegevens is bij punt die negatief zijn bv -6 en punten boven de 100

hopelijk kan iemand me helpen of op de juiste weg zetten

alvast bedankt


#include <stdio.h>
#include <conio.h>


void main()
{
int p[4]; // begin met 4 plaatsen i.p.v. 42 voor testen gemakkelijk te maken
int n,som;

do
{
for (n= 1;n<5;n++)
{
printf("\nGeef zijn score in: %d:",n);
scanf("%d",&p[n]);
}


}
while( n>0//n<101) ;

som=0 ;
for(n=0;n<5;n++)
{
som += p[n];
printf(" de gemis %d",som/(n-1)); // moet de formule nog aanpassen is maar als test
getch();
}
}

dit heb ik nu voorlopig maar mijn while wilt niet werken als ik mijn programma test geeft hij geen reactie bij getallen die negatief zijn of groter dan 100
 
Laatst bewerkt:
hopelijk kan iemand me helpen of op de juiste weg zetten

dit heb ik nu voorlopig maar mijn while wilt niet werken als ik mijn programma test geeft hij geen reactie bij getallen die negatief zijn of groter dan 100
[/quote]

Als het goed is blijft jouw do-while lus gewoon in een eeuwige lus hangen, aangezien n > 0 altijd true oplevert met de huidige code.

do {
for (n= 1;n<5;n++)
{
printf("\nGeef zijn score in: %d:",n);
scanf("%d",&p[n]);
}
} while( n>0//n<101) ;

Verder sla je het ingevoerde getal meteen op in de array, terwijl je eigenlijk eerst wil controleren of het binnen het juiste bereik valt.

[cpp]
int input = 0; // tijdelijke variabele
while (n < 42 && input >= 0)
{
printf("\nGeef zijn score in: %d:", n);
scanf("%d", &input);

if (input >= 0 && input <= 100)
p[n++] = input;
}
[/cpp]

Iets als bovenstaande zou moeten werken.
 
do
{
for (n= 1;n<5;n++)
{
printf("\nGeef zijn score in: %d:",n);
scanf("%d",&p[n]);
}

Nog even een opmerking over bovenstaand stukje. Je gaat hier buiten de array schrijven! Arrays beginnen altijd met 0, dus een array met vier plaatsen (p[4]) bestaat uit p[0], p[1], p[2] en p[3]. Bovenstaande code schrijft naar p[1], p[2], p[3] en p[4]. Dit kan leiden tot een crash of vreemd gedrag van het programma.
 
Nog even een opmerking over bovenstaand stukje. Je gaat hier buiten de array schrijven! Arrays beginnen altijd met 0, dus een array met vier plaatsen (p[4]) bestaat uit p[0], p[1], p[2] en p[3]. Bovenstaande code schrijft naar p[1], p[2], p[3] en p[4]. Dit kan leiden tot een crash of vreemd gedrag van het programma.

Mijn bedoeling was om zo op mijn scherm een normale nummering te zien
vermits een klasselijst van leerlingen begint bij 1,... maar hoe kan ik dan best zorgen dat leerling nr 1 opslaat bij p[0]
 
Mijn bedoeling was om zo op mijn scherm een normale nummering te zien
vermits een klasselijst van leerlingen begint bij 1,... maar hoe kan ik dan best zorgen dat leerling nr 1 opslaat bij p[0]

Door bij het begin van de for-loop de waarde van n in te stellen op 0 i.p.v. op 1? En voor het afdrukken van het leerlingnummer kun je n+1 als argument opgeven.
 
alvast bedankt voor jullie tips

dit is mijn oefening tot nu toe
maar heb nog enkele foutjes

zoals: ==> mijn sqrt en pow willen niet werken
==> mijn while zorgtnu wel dat hij negatieve waarden niet aanvaardmaar vraagt ze
opnieuw in plaats de verder berekening te starten

hopelijk kunnen jullie helpen

alvast bedankt


#include <stdio.h>
#include <conio.h>


void main()
{
int p[42];
int som;
float sa,g;
int n = 0;

do
{


printf("\nGeef zijn score in: %d:",n);
scanf("%d",&p[n]);

if (p[n] >= 0 && p[n] <= 100)
p[n++] =n ;

} while (n < 42 && n >= 0);

som=0;

for(n=0;n<5;n++)

som += p[n];
g=som/n ;


sa =sqrt(pow( (p[n]-g),2)+sa/(n )); // hier moet normaal (p[n]-g) in het kwadraat en dan de wortel sqrt van het geheel
printf (" de sprijding is %d",sa);
getch();
}
 
Laatst bewerkt:
zoals: ==> mijn sqrt en pow willen niet werken

Ze werken wel wanneer je de header math.h toevoegt.

[cpp]#include <math.h>[/cpp]

==> mijn while zorgtnu wel dat hij negatieve waarden niet aanvaardmaar vraagt ze
opnieuw in plaats de verder berekening te starten

[cpp]
do
{


printf("\nGeef zijn score in: %d:",n);
scanf("%d",&p[n]);

if (p[n] >= 0 && p[n] <= 100)
p[n++] =n ;

} while (n < 42 && n >= 0);
[/cpp]


Het laatste ingevoerde getal sla je op in p[n], maar de conditie waaraan je while-loop moet voldoen is n >= 0. Dit moet je dus veranderen naar p[n] >= 0.

Maar alsnog bewaar je de waarde direct in de array. Wanneer er nu een negatief getal wordt ingevoerd komt het alsnog in de array terecht. Daarvoor kun je dus beter een tijdelijke variabele gebruiken en deze dan alleen in de array stoppen wanneer deze aan je eisen voldoet.

[cpp]
int temp;
do
{
printf("\nGeef zijn score in: %d:",n);
scanf("%d",&temp);

if (temp >= 0 && temp <= 100)
p[n++] = temp;
} while (n < 42 && temp >= 0);
[/cpp]

edit:
[cpp]
if (p[n] >= 0 && p[n] <= 100)
p[n++] =n ;
[/cpp]

Dit doet trouwens ook niet wat je wilt bereiken. Het kent gewoon het leerlingnummer aan de locatie toe, en dus niet het ingevoerde getal. (want je constateert juist dat het een geldige waarde is die ongewijzigd moet blijven. Je zou dus pas actie moeten ondernemen wanneer de waarde negatief is, of de negatieve waardes gewoon niet meenemen wanneer je de data uit de array gebruikt)
 
Laatst bewerkt:
Dit doet trouwens ook niet wat je wilt bereiken. Het kent gewoon het leerlingnummer aan de locatie toe, en dus niet het ingevoerde getal. (want je constateert juist dat het een geldige waarde is die ongewijzigd moet blijven. Je zou dus pas actie moeten ondernemen wanneer de waarde negatief is, of de negatieve waardes gewoon niet meenemen wanneer je de data uit de array gebruikt)

oké, alvast bedankt voor de sqrt en pow en de tips

voor de rest zal in nog eens goed moeten verderzoeken



als u of iemand anders nog een oplossing of tip heeft is dat nog altijd welkom
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan