wat doe ik fout?

Status
Niet open voor verdere reacties.

ultimate14

Gebruiker
Lid geworden
10 nov 2009
Berichten
13
ik heb dit programma
de bedoeling is dat hij het gemiddelde berekend van een reeks ingevoerde getallen, behalve het kleinste, en het grootste getal.

ik heb deze code tot nu toe:
Code:
#include <stdio.h>
#include <conio.h>
float gemiddeld_for(void); 

int main(void){ 
	printf("Voer een aantal positieve getallen in, afgesloten met een negatieve waarde: "); 
	printf("De gemiddelde waarde is: %4.2f",gemiddeld_for());
	
	getch();
} 

float gemiddeld_for(void){ 

float som, hulp; 
int aantal=0;som=0;
	scanf("%f", &hulp); 
int	kleinste_getal = hulp;
int    grootste_getal = hulp;

	for (;hulp >= 0;) {
        if(hulp < kleinste_getal){
        kleinste_getal = hulp;}
        else{
             if(hulp > grootste_getal){
             grootste_getal = hulp;}
             else{
                  kleinste_getal = kleinste_getal;
                  grootste_getal = grootste_getal;
                  aantal=aantal+1;
                  som=som+hulp;
                  }}
               
        scanf("%f", &hulp);
	} 
	return som/aantal;
}

wat doe ik fout? :confused:
het programma werkt wel, alleen klopt het gemiddelde niet
 
Laatst bewerkt:
Het probleem zit in je if:
Code:
if(hulp < kleinste_getal){
        kleinste_getal = hulp;}
        else{
             if(hulp > grootste_getal){
             grootste_getal = hulp;}
             else{
                  kleinste_getal = kleinste_getal;
                  grootste_getal = grootste_getal;
                  aantal=aantal+1;
                  som=som+hulp;
                  }}
De variabele "som" wordt alleen verhoogd met het ingevoerde getal als het ingevoerde getal niet groter is dan "grootste_getal" en niet kleiner dan "kleinste_getal". Ook wordt in alle andere gevallen "aantal" niet verhoogd. Dit kan je oplossen door het laatste deel (dat nu in de laatste "else" staat) buiten de if-structuur te zetten, zodat het altijd wordt uitgevoerd.

Overigens zijn twee regels die er nu in staan:
Code:
kleinste_getal = kleinste_getal;
grootste_getal = grootste_getal;
zinloos.
 
Het is toch de bedoeling dat het kleinste getal en het grootste getal niet bij de som opgeteld worden, en dus ook niet bij het aantal.

als je bijvoorbeeld deze reeks hebt
1 3 6 8 3 6 9 -1
-1 is om te eindigen
1 is de kleinste
9 de grootste
hou je over: 3 6 8 3 6 -> som : 26 -> gemiddelde 5.2
 
Sorry, vraag niet goed gelezen. Het probleem is dat, als er een nieuw grootste/kleinste getal wordt ingevoerd, het oude grootste/kleinste getal wordt "vergeten". Dit oude grootste/kleinste getal moet je op dat moment optellen bij "som". Ook moet je dan "aantal" verhogen met 1.

Alleen klopt het dan nog steeds niet als ik het met deze wijziging uitprobeer?


Laat anders eens aan het einde van de lus de waardes van "som" en "aantal" op het scherm printen. Dan kan je zien wanneer/waar het misgaat.
 
Laatst bewerkt:
als ik het programma uitvoer zoals ik het had, komt het eerste getal dat ik ingevuld had als gemiddelde er uit, misschien heb je daar iets aan?
want ik zie de fout nog steeds niet.


[edit]
nu heb ik
printf("\naantal = %f", aantal);
printf("\nsom = %f", som);
onderaan de loop gezet,

dan krijg ik als uitvoer:
aantal = 0
som = 2
aantal = 2
som = 2
aantal = 2
som = 2
gemiddelde waarde = 2

dit bij een invoer van 2 3 4 -1

hij gaat dus op het begin al fout.
aantal = 0
dat klopt
alleen som moet ook 0 zijn, omdat 2 het kleinste getal is dan.
 
Laatst bewerkt:
Dit is het probleem dat ik in mijn vorige post noemde: 3 is groter dan 2 (grootste_getal) en wordt dus niet opgeteld bij "som". 4 is groter dan 3 (dan grootste_getal) en wordt dus ook niet opgeteld bij "som".

[edit]Dat "som" 2 is na de eerste invoer klopt volgens de code. "som" is namelijk niet kleiner dan kleinste_getal (ook 2) en niet groter dan grootste_getal (ook 2). Je programma komt dan dus in de laatste "else" terecht waar de invoer bij "som" wordt opgeteld.[/edit]
 
Laatst bewerkt:
hee ja, dat is het!
alleen, hoe los ik dat dan op?
ik moet het oude grootste getal bij de som optellen,
maar als ik dat in men code zou zetten, dan telt hij elke x het grootste getal er bij op, dus ook de laatste x wanneer het niet moet.

suggesties?
 
Je kan het oplossen door het oude grootste/kleinste getal op te tellen bij "som" als er een nieuw grootste/kleinste getal is:
Code:
if(hulp < kleinste_getal)
{
  som+=kleinste_getal;
  kleinste_getal = hulp;
  aantal++;
}
else
{
  if(hulp > grootste_getal)
  {
    som+=grootste_getal;
    grootste_getal = hulp;
    aantal++;
  }
  else
  {
    aantal=aantal+1;
    som=som+hulp;
  }
}
(ik heb de if-structuur ook meteen in een wat leesbaarder formaat gezet)

Een ander probleem is dat met de eerste twee ingevoerde getallen niets moet worden gedaan. Immers zijn die twee getallen het grootste en het kleinste getal. Daarom zou ik dat voor de for-lus zetten:
Code:
scanf("%f", &hulp);
int kleinste_getal = hulp;
int grootste_getal = hulp;
scanf("%f", &hulp);
kleinste_getal = hulp < kleinste_getal ? hulp : kleinste_getal;  /* inline if-statement omdat ik geen zin heb het helemaal uit te typen */
grootste_getal = hulp > grootste_getal ? hulp : grootste_getal; /* idem */
scanf("%f", &hulp);
De laatste scanf voor de lus is nodig, omdat de eerste twee ingevoerde getallen (het grootste en het kleinste) genegeerd moeten worden. Daarom moet pas vanaf het derde getal gekeken worden of het het grootste/kleinste/middelste getal is en iets bij "som" opgeteld moet worden.
 
Waarom deel je het probleem niet gewoon op in meerdere kleine stukjes?

[cpp]
void LeesArrayIn(int *pArray, int *lengte) {
int i = 0;
for (; i < MAX_ARRAY; i++) {
scanf("%i", &pArray);
if (pArray < 0) break;
}
*lengte = i;
}

int Cmp(const void *a, const void *b) {
return (const int *)a - (const int *)b;
}

void SorteerArray(int *pArray, int lengte) {
qsort(pArray, lengte, sizeof(int), Cmp);
}

// na het aanroepen van SorteerArray bevat het eerste elemenet de laagste waarde en het laatste element de hoogste waarde
[/cpp]
 
Het lukte me niet om in slaap te komen dus hier een volledige oplossing:

[cpp]
#include <stdio.h>
#include <stdlib.h>

const unsigned int MAX_ARRAY = 1024;

void LeesArrayIn(int *pArray, int *lengte);
void SorteerArray(int *pArray, int lengte);
float SpeciaalGemiddeldeVanArray(int *pArray, int lengte);

int main(int argc, char **argv) {
int *pArray = malloc(sizeof(int)*MAX_ARRAY);
if (pArray != NULL) {
int lengte;
LeesArrayIn(pArray, &lengte);
if (lengte > 0) {
float gemiddelde = SpeciaalGemiddeldeVanArray(pArray, lengte);
printf("%4.2f\n", gemiddelde);
}
free(pArray);
}
system("PAUSE");
return 0;
}

void LeesArrayIn(int *pArray, int *lengte) {
int i = 0;
for (; i < MAX_ARRAY; i++) {
scanf("%i", &pArray);
if (pArray < 0) break;
}
*lengte = i;
}

int Cmp(const void *a, const void *b) {
return (const int *)a - (const int *)b;
}

void SorteerArray(int *pArray, int lengte) {
qsort(pArray, lengte, sizeof(int), Cmp);
}

float SpeciaalGemiddeldeVanArray(int *pArray, int lengte) {
int som = 0, i;
if (lengte <= 2) {
for (i = 0; i < lengte; i++) som += pArray;
return (float)som/lengte;
} else {
SorteerArray(pArray, lengte);
for (i = 1; i < lengte-1; i++) som += pArray;
return (float)som/(lengte-2);
}
}[/cpp]
 
is het niet mogelijk om een aanpassing te maken op mijn versie,
ipv een geheel nieuwe code?
 
De code in mijn laatste post is een aanpassing van jouw versie, al is CoD_NLs versie netter.
 
is het niet mogelijk om een aanpassing te maken op mijn versie,
ipv een geheel nieuwe code?

Supersnail heeft jouw code volgens mij al verbeterd zover ik kan lezen, alleen je moet er zelf nog een geheel van maken.

Verder heb je de float datatypes in je code niet nodig, enkel op het einde met de deling zou ik een cast doen.

[cpp]
float som, hulp;
int aantal=0;som=0;
scanf("%f", &hulp);
int kleinste_getal = hulp;
int grootste_getal = hulp;
[/cpp]

edit: ik had het venster te lang open staan voordat ik het bericht postte, Supersnail was me al voor :p
 
Laatst bewerkt:
als ik de stukjes code van supersnail in mijn code plak, dan gebeurd er helemaal niks
geen uitvoer iig..

ik heb dan dit:
Code:
#include <stdio.h>
#include <conio.h>
float gemiddeld_for(void); 

int main(void){ 
	printf("Voer een aantal positieve getallen in, afgesloten met een negatieve waarde: "); 
	printf("De gemiddelde waarde is: %4.2f",gemiddeld_for());
	
	getch();
} 

float gemiddeld_for(void){ 

float som, hulp; 
int aantal=0;som=0;
	scanf("%f", &hulp);
int kleinste_getal = hulp;
int grootste_getal = hulp;
scanf("%f", &hulp);
kleinste_getal = hulp < kleinste_getal ? hulp : kleinste_getal;  /* inline if-statement omdat ik geen zin heb het helemaal uit te typen */
grootste_getal = hulp > grootste_getal ? hulp : grootste_getal; /* idem */
scanf("%f", &hulp);
	for (;hulp >= 0;) {
        if(hulp < kleinste_getal)
        {
        som+=kleinste_getal;
        kleinste_getal = hulp;
        aantal++;
        }
        else
            {
            if(hulp > grootste_getal)
            {
            som+=grootste_getal;
            grootste_getal = hulp;
            aantal++;
            }
            else
            {
                aantal=aantal+1;
                som=som+hulp;
            }
            }
            }printf("\naantal = %f", aantal);
        printf("\nsom = %f", som);   
            }
of doe ik weer wat verkeerd nu? :$






[edit]
ik heb het nu zelf opgelost
met mijn eigen code
hier komt ie:
Code:
#include <stdio.h>
#include <conio.h>
float gemiddeld_for(void); 

int main(void){ 
	printf("Voer een aantal positieve getallen in, afgesloten met een negatieve waarde: "); 
	printf("\nDe gemiddelde waarde is: %4.2f",gemiddeld_for());
	
	getch();
} 

float gemiddeld_for(void)
{ 

float som, hulp; 
int aantal=0;som=0;
	scanf("%f", &hulp); 
int	kleinste_getal = hulp;
int grootste_getal = hulp;

	for (;hulp >= 0;) {
        if(hulp < kleinste_getal){
        kleinste_getal = hulp;
        aantal=aantal+1;
        som=som+hulp;}
        else{
             if(hulp > grootste_getal){
             grootste_getal = hulp;
             aantal=aantal+1;
             som=som+hulp;}
             else{
                  aantal=aantal+1;
                  som=som+hulp;
             }    }
             
        scanf("%f", &hulp);
        	} 
	som=som-kleinste_getal-grootste_getal;
	aantal=aantal-2;
	return som/aantal;
}
ik heb nu gewoon elke x het kleinste en grootste getal bij de som opgeteld
en ook gewoon 1 bij het aantal

en dan na de lus, het laatste kleinste_getal & grootste_getal er weer afgetrokken
en 2 van het aantal
en nu werkt hij zoals hij moet.

iedereen bedankt voor de moeite!
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan