Vinnaren i pepparkakshustävlingen!
2017-07-22, 23:25
  #1
Medlem
Jag har gjort något fel och kan inte komma på vad. Kan någon se snabbt och rätta till det jag gjort så jag kan se och lära. Mitt problem just nu verkar vara att jag inte kommer in i funktionen eftersom "Sum is" där innifrån inte skrivs ut i konsolfönstret.

Kod:
#include <iostream>

using namespace std;

float medel(int v[], int n)
{
float sum 0;
for(
int n 010n++)
    {
    
sum = (float) sum v[n];
    
cout << "Sum is " << (float) sum << endl;
    }
sum = (float) sum 10;
cout << "Sum medel is " << (float) sum << endl;

    return (float) 
sum;
}

int main()
{
    
int heltalsvektor[10];

    
heltalsvektor[0] = 32;
    
heltalsvektor[1] = 65;
    
heltalsvektor[2] = 54;
    
heltalsvektor[3] = 11;
    
heltalsvektor[4] = 10;
    
heltalsvektor[5] = 20;
    
heltalsvektor[6] = 42;
    
heltalsvektor[7] = 28;
    
heltalsvektor[8] = 12;
    
heltalsvektor[9] = 32;

    
float medel(v);
    
cout << "Medel är " << medel(v);


    return 
0;

Citera
2017-07-23, 01:20
  #2
Medlem
Xploits avatar
Några ting jag spontant nu på rak arm kan se som du kanske önskar korrigera vore det följande:
1. Du definerar en funktion vid namn medel som tar en array av integers och en integer n som argument, alltså
Kod:
float medel(int v[], int n)
men du använder dig inte av det n-argumentet ö.h.t. i funktionen. Du kör över funktionsargumentet n med den lokala variabeln n i for-loopen så som den är skriven nu. Jag skulle rekommendera att for-loopen skrivs som (om jag har förstått vad du vill göra korrekt!)
Kod:
for(int i = 0; i<n ; i++)
istället, så att n blir ett meningsfullt argument till din funktion. Du får också byta ut n mot i i for-loopens kod.
2. Alla (float) är onödiga i din funktion. Du har redan definerat en variabel sum i din funktion som float. En float + en integer är en också en float, så det behöver du inte oroa dig för.
3. Vad du vill att
Kod:
float medel(v);
i din main() skall göra är jag lite osäker på. Det ser ut som om du definerar en variabel som heter medel(v) (men det är inte ett tillåtet variabelnamn eftersom det innehåller paranteser), och som du inte initialiserar med ett värde. Sedan skriver du ut värdet på denna oinitialiserade variabel i raden därefter. Jag tycker din kompilator borde ha sagt något här; din funktion som du definerade ovan tar ju två argument och inte bara ett och kommer därför inte att kunna bli kallad som medel(v). Ingenstans i main() definerar du heller variabeln v. Jag skulle skriva ta bort de två icke-tomma raderna innan ditt return 0 och skriva på följande sätt:
Kod:
int n=10;
cout << "Medel är "<< medel(heltalsvektor,n);
__________________
Senast redigerad av Xploit 2017-07-23 kl. 01:24.
Citera
2017-07-23, 01:27
  #3
Medlem
Citat:
Ursprungligen postat av Xploit
Några ting jag spontant nu på rak arm kan se som du kanske önskar korrigera vore det följande:
1. Du definerar en funktion vid namn medel som tar en array av integers och en integer n som argument, alltså
Kod:
float medel(int v[], int n)
men du använder dig inte av det n-argumentet ö.h.t. i funktionen. Du kör över funktionsargumentet n med den lokala variabeln n i for-loopen så som den är skriven nu. Jag skulle rekommendera att for-loopen skrivs som (om jag har förstått vad du vill göra korrekt!)
Kod:
for(int i = 0; i<n ; i++)
istället, så att n blir ett meningsfullt argument till din funktion. Du får också byta ut n mot i i for-loopens kod.
2. Alla (float) är onödiga i din funktion. Du har redan definerat en variabel sum i din funktion som float. En float + en integer är en också en float, så det behöver du inte oroa dig för.
3. Vad du vill att
Kod:
float medel(v);
i din main() skall göra är jag lite osäker på. Det ser ut som om du definerar en variabel som heter medel(v) (men det är inte ett tillåtet variabelnamn eftersom det innehåller paranteser), och som du inte initialiserar med ett värde. Sedan skriver du ut värdet på denna oinitialiserade variabel i raden därefter. Jag tycker din kompilator borde ha sagt något här; din funktion som du definerade ovan tar ju två argument och inte bara ett och kommer därför inte att kunna bli kallad som medel(v). Ingenstans i main() definerar du heller variabeln v. Jag skulle skriva ta bort de två icke-tomma raderna innan ditt return 0 och skriva på följande sätt:
Kod:
int n=10;
cout << "Medel är "<< medel(heltalsvektor,n);

Tack för svar! Ska läsa igenom det och se om jag förstår allt haha men jag har kommit vidare nu och får in min vektor in i funktionen och ut får jag medelvärdet av summan av alla tal. MEN! 308/10 är 30.8, så alltså är det int tal som kommer ut när jag vill ha float. I uppgiften så ska jag alltså lyckas konvertera int och float mellan funktionen och main-programmet. Såhär ser det ut nu då.

Kod:
#include <iostream>

using namespace std;

const 
float medel(int v[])
{
int sum 0;
for(
int n 010n++)
    {
    
sum = (const floatsum v[n];
    
cout << "Sum is " << sum << endl;
    }
    
sum = (const floatsum 10;
    
cout << "Sum medel is " << (const floatsum << endl;

    return (const 
floatsum;
}

int main()
{
    
int heltalsvektor[] = {32655411102042281234};

    
float medelmatta medel(heltalsvektor);

    
cout << "Medel är " << medelmatta;


    return 
0;


EDIT: Kirrade den här delen. Då är det bara n frågan i nästa inlägg kvar.

Kod:
#include <iostream>

using namespace std;

const 
float medel(int v[], int n)
{
float sum 0;
for(
int i 0ni++)
    {
    
sum sum v[i];
    
cout << "Sum is " << sum << endl;
    }
    
sum sum 10;
    
cout << "Sum medel is " << sum << endl;

    return 
sum;
}

int main()
{
    
int heltalsvektor[] = {32655411102042281234};
    
int n 10;

    
float medelmatta medel(heltalsvektorn);

    
cout << "Medel är " << medelmatta;


    return 
0;

__________________
Senast redigerad av gholiat 2017-07-23 kl. 01:45.
Citera
2017-07-23, 01:37
  #4
Medlem
Citat:
Ursprungligen postat av Xploit
Några ting jag spontant nu på rak arm kan se som du kanske önskar korrigera vore det följande:
1. Du definerar en funktion vid namn medel som tar en array av integers och en integer n som argument, alltså
Kod:
float medel(int v[], int n)
men du använder dig inte av det n-argumentet ö.h.t. i funktionen. Du kör över funktionsargumentet n med den lokala variabeln n i for-loopen så som den är skriven nu. Jag skulle rekommendera att for-loopen skrivs som (om jag har förstått vad du vill göra korrekt!)
Kod:
for(int i = 0; i<n ; i++)
istället, så att n blir ett meningsfullt argument till din funktion. Du får också byta ut n mot i i for-loopens kod.
Kod:
int n=10;
cout << "Medel är "<< medel(heltalsvektor,n);

Det här är en andra fråga då. Gjorde som du sa med i och n såhär:

Kod:
#include <iostream>

using namespace std;

const 
float medel(int v[], int n)
{
int sum 0;
for(
int i 0ni++)
    {
    
sum = (const floatsum v[i];
    
cout << "Sum is " << sum << endl;
    }
    
sum = (const floatsum 10;
    
cout << "Sum medel is " << (const floatsum << endl;

    return (const 
floatsum;
}

int main()
{
    
int heltalsvektor[] = {32655411102042281234};
    
int n 10;

    
float medelmatta medel(heltalsvektorn);

    
cout << "Medel är " << medelmatta;


    return 
0;


Och jag undrar om det går att göra så att istället för att jag skriver "int n = 10" så kan jag byta ut "10" mot något så att n alltid är lika högt nummer som antalet element i min vektor? Så om jag skulle lägga till en siffra till i int heltalsvektor[] = 32, etc. Så det är 11 element, så skulle "int n" automatiskt bli 11 utan att jag behöver skriva om den raden kod.
Citera
2017-07-23, 11:09
  #5
Moderator
Protons avatar
Citat:
Ursprungligen postat av gholiat
Det här är en andra fråga då. Gjorde som du sa med i och n såhär:

Kod:
#include <iostream>

using namespace std;

const 
float medel(int v[], int n)
{
int sum 0;
for(
int i 0ni++)
    {
    
sum = (const floatsum v[i];
    
cout << "Sum is " << sum << endl;
    }
    
sum = (const floatsum 10;
    
cout << "Sum medel is " << (const floatsum << endl;

    return (const 
floatsum;
}

int main()
{
    
int heltalsvektor[] = {32655411102042281234};
    
int n 10;

    
float medelmatta medel(heltalsvektorn);

    
cout << "Medel är " << medelmatta;


    return 
0;


Och jag undrar om det går att göra så att istället för att jag skriver "int n = 10" så kan jag byta ut "10" mot något så att n alltid är lika högt nummer som antalet element i min vektor? Så om jag skulle lägga till en siffra till i int heltalsvektor[] = 32, etc. Så det är 11 element, så skulle "int n" automatiskt bli 11 utan att jag behöver skriva om den raden kod.
Verkar inte finns något inbyggt trivialt sätt att göra det på enligt diskussionen i https://stackoverflow.com/questions/...th-of-an-array men du kan ju alltid prova raden

Kod:
int n0;
= (sizeof(heltalsvektor) / sizeof(heltalsvektor[0])); 

Idén är att enligt ovanstående SO dividera totalt antal bytes hela arayen tar upp med antalet bytes ett av elementen tar upp, då kan du eventuellt lösa det som du tänkt.

Läs dock igenom stackoverflow-grejen, det är alltså inte alldeles enkelt med vanliga arrayer att göra.
Citera
2017-07-23, 11:23
  #6
Medlem
Xploits avatar
Citat:
Ursprungligen postat av gholiat
Och jag undrar om det går att göra så att istället för att jag skriver "int n = 10" så kan jag byta ut "10" mot något så att n alltid är lika högt nummer som antalet element i min vektor? Så om jag skulle lägga till en siffra till i int heltalsvektor[] = 32, etc. Så det är 11 element, så skulle "int n" automatiskt bli 11 utan att jag behöver skriva om den raden kod.
Med en C-array så som heltalsvektor är nu så är känner den inte till sin egen storlek, utan det är något du som användare måste hålla koll på. Om du däremot använder en vector blir det något lättare, ty den kommer med en size()-funktion som returnerar mängden element vid anrop. Den skulle hjälpa dig här, men om allt ovan är som del av en kurs och ni ännu inte har kommit till vector skulle bruk av den antagligen vara mindre lämpligt. Om så inte är fallet använder du vector som genom
Kod:
#include <vector>
//massa kod...
vector<int> heltalsvektor {//alla tal du vill ha här...}
int n = heltalsvektor.size()
Men använder du en vector och size() behöver du ju inte längre n; du kan kalla på size() inne i din medel-funktion.
Citera
2017-07-23, 12:12
  #7
Moderator
RostigHinks avatar
Eftersom vi har C++ här så kan vi sannolikt ha tillgång till STL. Använd vector i stället för gamla klassiska C array.
Kod:
#include<iostream>
#include<vector>

using std::cout;
using std::endl;
using std::vector;

const float medel(const vector<int>& v)
{
  float sum = 0;
  for (size_t i = 0; i < v.size(); ++i)
  {
    sum = sum + v[i];
    cout << "Sum is " << sum << endl;
  }
  sum = sum / v.size();
  cout << "Sum medel is " << sum << endl;

  return sum;
}

int main()
{
  // Initialisering av vector i 1998 års standard suger hårt
  static const int init[] = {32, 65, 54, 11, 10, 20, 42, 28, 12, 34};
  vector<int> heltalsvektor(init, init + sizeof(init) / sizeof(init[0]));

  // använd detta i stället för ovanstående om
  // kompilatorn har 2011 års standard
  /*
     vector<int> heltalsvektor{32, 65, 54, 11, 10, 20, 42, 28, 12, 34};
   */
      
  cout << "Medel är " << medel(heltalsvektor) << endl;

  return 0;
}

sum måste vara en float i funktionen, annars trunkeras resultatet till närmast lägre heltal. Typecast i return hjälper inte. Fördelen med vector är att klassen har metoden size() för att ta reda på dess längd. Som sagts tidigare så promotas heltal till float i högerled om vänsterled är en float (egentligen double då det används bakom skynket).
Citera
2017-07-24, 13:49
  #8
Medlem
kaks avatar
Varför skriva något som redan finns i standardbiblioteket?
Kod:
double medel(const std::vector<int> &v) {
    return 
std::accumulate(v.begin(), v.end(), 0.0)/v.size();


eller mer generellt
Kod:
#include <iostream>
#include <vector>
#include <numeric>
#include <iterator>

template <typename Range>
auto medel(Range&& v) {
    return 
std::accumulate(std::begin(v), std::end(v), 0.0)/std::size(v);
}

int main()
{
    
std::vector<intv{0,1,2,3,4,5,6,7,8,9,11,109};
    
double dv[] = {0,3,7.8};
    
std::cout << "Medel = " << medel(v) << std::endl;
    
std::cout << "Medel = " << medel(dv) << std::endl;
    return 
0;

Citera
2017-07-24, 14:33
  #9
Moderator
RostigHinks avatar
Oj, nu fick jag lägga till g++ 6.3 i min xubuntu 16.04 för att det skulle kompilera (std::size() som är 2017). Den kompilatorn ligger ännu i testrepot. Senaste i 16.04 är annars 5.4 som saknar std::size().

Snyggt men frågan är vad som är mest pedagogiskt
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback