Avatar billede coldermars Nybegynder
16. december 2005 - 22:15 Der er 2 kommentarer

a/b = 0 for a,b ikke 0

/*
  Name: Usikkerheden
  Copyright:
  Author:
  Date: 16-12-05 21:55
  Description: Udregner gennemsnittet, spredningen og usikkerheden for et
              vilkårligt antal værdier brugeren indtaster
*/


#include <iostream>
#include <ios>
#include <iomanip>
#include <vector>
#include <string>
#include <algorithm>

using std::cout; using std::cin; using std::endl;
using std::string; using std::vector; using std::streamsize;
using std::setprecision;

int main()
{
  cout << "Indtast de enkelte værdier: ";
 
  //definere nogle variable
  vector<double> xvalues;
  double x;
  double sum;
  int n = 0;
 
  //loop: indsætter værdierne i en vektor og adderer alle værdierne ind i sum
  while (cin >> x) {
      xvalues.push_back(x);
      sum += x;
      cout << "xvalues[" << n << "] har værdien " << xvalues[n] << endl;;
      ++n;
     
  }
 
  //definerer et synonym for en en "double vector type" og
  //putter størrelsen af vektoren ind i en variable
  typedef vector<double>::size_type vec_size;
  vec_size size = xvalues.size();
 
  //checker om vektoren er nulvektoren
  if (size == 0) {
      cout << "Indtast nogle vaerdier!" << endl;
      return 1;
  }
 
  cout << "Stoerrelsen af vektoren: " << size << endl;     
 
  cout << n << " tal er laest og skrevet." << endl;
 
  //finder gennemsnittet af de indtassede tal
  double snit = sum/n;
 
  cout << "Gennensnittet <x>: " << snit << endl;;
 
  //sorterer værdierne efter størrelse: starter med de små
  sort(xvalues.begin(), xvalues.end());
 
  cout << "xvaerdierne er sorteret således " << endl;
 
  //definere endnu en variable
  double kvad = 0;
 
  //skriver værdierne i vektoren ud
  //bestemmer summen af kvadratet på differensen af de enkelte vaerdier og gennemsnittet
  for (int m = 0; m != n; m++) {
      cout << xvalues[m] << endl;
      kvad += (xvalues[m]-snit)*(xvalues[m]-snit);
  }
 
  cout << "Summen af kvadratet på differensen af de enkelte vaerdier og gennemsnittet: " << kvad << endl;
 
  //beregner spredning og usikkerhed
  double spred = sqrt(kvad/(n-1));
  double usik = spred/sqrt(n);
 
  streamsize prec = cout.precision();
  cout << "Spredningen: " << setprecision(7) << spred << endl;
  cout << "Usikkerheden: " << usik << setprecision(prec) << endl;
 
  //definere variable
  int temp = 0;
 
  //virker ikke: burde bestemme antallet værdier i intervallet +-usikkerhed om gennemsnittet
  //else: skriver de koordinater ud, der ikke ligger i intervallet
  for (int m = 0; m != n; m++) {
      if ((xvalues[m] >= snit - spred) && (xvalues[m] <= snit + spred)) {
          ++temp;       
      } else {
          cout << "xvalues[" << m << "]: not" << endl;
      }   
     
  }
 
  //jeg forsøger at finde fejlen, men forgæves
  cout << "temp er " << temp << endl;
  cout << "n er " << n << endl;
  double cent = (temp/n);
  cout << cent << endl;
 
  /*burde fortælle brugeren om det er en god fordeling eller en dårlig,
  men da den ovenstående loop ikke virker, er der heller ikke meget mening i denne*/
  if (temp/n >= 2/3) {
      cout << "2/3 af maalingerne eller mere ligger i intervallet [" << snit-spred << "," << snit+spred << "], da er udgoer datapunkterne en normalfordeling: " << endl;
      cout << cent << endl; 
  }
  else {
      cout << "mindre end 2/3 af maalingerne ligger i intervallet [" << snit-spred << "," << snit+spred << "]: " << cent << endl; 
  }       
 
  system("PAUSE");   
  return 0;
}

--------
Jeg har problemer med værdien af variablen temp (tror jeg).

Prøv programmet ved indtastning af værdierne 4, 5, 6, 7.

cout << temp; giver en talværdien 2.
cout << n; giver talværdien 4.
Hvilket er rimeligt.

Problemet er at idet
double cent = (temp/n);
så giver
cout << cent << endl;
værdien 0.
Hvilket er helt forkert. Kvotienten af to tal, der ikke er 0 giver aldrig 0.

Hvad er der galt med mit program.
Avatar billede polle007 Nybegynder
16. december 2005 - 22:24 #1
Det giver helt mening, hvis den laver beregning med integers. Prøv at typecaste

double cent = ((double)temp/n);
Avatar billede polle007 Nybegynder
16. december 2005 - 22:29 #2
jeg tror forresten, at dine gamle spørgsmål venter på dig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester