Vinnaren i pepparkakshustävlingen!
2021-07-25, 13:09
  #13
Medlem
hogerspokets avatar
Pseudokod, kan säkert vara något mindre presedens-fel, eller något kolon som saknas (har inte skrivit kod på en drös år) i det hela men i princip:

Kod:
int square_sum(int start, int end)
{
int sq_sum = 0;
for (int i=start, i<end+1, i++)
{
sq_sum+=i*i;
}
return sq_sum;
}

I övrigt håller jag med tidigare skribenter.

Skriv de enskilda funktionerna var & en för sig, så slipper du sitta med kodgröt.
--

Vill du göra det mer effektivt kör du med pekare, men det är nog överkurs...

(ed -- nä, det blir inte särskilt mycket mer effektivt, come to think of it.)
__________________
Senast redigerad av hogerspoket 2021-07-25 kl. 13:15.
Citera
2021-07-25, 13:19
  #14
Moderator
Protons avatar
Citat:
Ursprungligen postat av Flightmodee
Jag vet ärligt talat inte var jag ens ska börja för att beräkna det,

Testade med detta men det blir helt fel

Kod:
else if (op == 'k')
    
    {
        svar = 1;
        for (int x = tal1; x <= tal2; x++)
            svar = (x^x) + (x++^x++);
    }

Citat:
Ursprungligen postat av hogerspoket
Pseudokod, kan säkert vara något mindre presedens-fel i det hela men i princip:

Kod:
int square_sum(int start, int end)
{
int sq_sum = 0;
for (int i=start, i<end+1, i++)
{
sq_sum+=i*i;
}
return sq_sum;
}

I övrigt håller jag med tidigare skribenter.

Skriv de enskilda funktionerna var & en för sig, så slipper du sitta med kodgröt.
--

Vill du göra det mer effektivt kör du med pekare, men det är nog överkurs...
Som nybörjare är pekare overkill, det kan få komma sen.

Bortsett från det tycker jag det ser ut som om pseudokoden löser precis det problem du står inför. Kolla på vad den gör och vad för problem den ställs inför.

1. Du måste hålla rätt på tidigare beräkningar, om några eftersom du behöver addera på aktuell beräkning.
2. Du måste göra aktuell beräkning.

Som du ser handlar det HELA tiden om att dela upp problemen du står inför i mindre och mindre bitar tills du har något konkret att jobba med. I detta fallet var det ju alltså 2 problem du stod inför, som löstes med pseudokoden.

Det här sättet att koda på kommer du ALDRIG att kunna komma undan oavsett vilket språk du kodar i. En del av språken har inbyggda funktioner för att ta hand om det du vill göra, men oavsett vilket MÅSTE du vara på det klara med VAD för problem du behöver lösa innan du kastar dig över tangenterna.
Citera
2021-07-25, 13:21
  #15
Medlem
Uber0ns avatar
Citat:
Ursprungligen postat av Flightmodee
Jag vet ärligt talat inte var jag ens ska börja för att beräkna det,

Testade med detta men det blir helt fel

Kod:
else if (op == 'k')
    
    {
        svar = 1;
        for (int x = tal1; x <= tal2; x++)
            svar = (x^x) + (x++^x++);
    }
Det är stor skillnad på
Kod:
svar =
och
Kod:
svar +=
Sen verkar du öka värdet av x flera gånger per iteration i loopen här...

Ta en iteration i taget, så ska du se att du löser det enkelt.
Citera
2021-07-25, 13:27
  #16
Medlem
Nikolajevitjs avatar
Citat:
Ursprungligen postat av Flightmodee
Jag vet ärligt talat inte var jag ens ska börja för att beräkna det,

Testade med detta men det blir helt fel

Kod:
else if (op == 'k')
    
    {
        svar = 1;
        for (int x = tal1; x <= tal2; x++)
            svar = (x^x) + (x++^x++);
    }

Kolla vilka operatorer och funktioner som finns i C++. "^" är en bitvis XOR och inte upphöjt till som man först kan tänkas tro. Är man osäker på språket kan det vara lämpligt att skriva ett kortare program som _endast_ gör den biten man är osäker på (eller får fel på) så kan man studera det närmre och testa lite olika varianter för att se vad det ger för resultat och läsa på om _varför_ det ger resultatet. Oftast handlar det om att man gjort antaganden om språket som inte stämmer.
Citera
2021-07-25, 13:30
  #17
Medlem
hogerspokets avatar
Citat:
Ursprungligen postat av Proton
Som nybörjare är pekare overkill, det kan få komma sen.
Självklart är det overkill -- det var lite upmanship

Sen insåg jag att effektivitetsvinsten var ganska försumbar (har själv huvudsakligen sysslat med embedded, så där var varje besparing viktig -- yrkesskada).
Citat:
Bortsett från det tycker jag det ser ut som om pseudokoden löser precis det problem du står inför. Kolla på vad den gör och vad för problem den ställs inför.

I tillägg: TS borde köra en sketen jävla step-trace. Vet inte kidsen vad en debugger är? Man baxnar...
Citera
2021-07-25, 13:57
  #18
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av Flightmodee
Hej!

Jag går just nu en kurs i C++ och vi har fått en uppgift att skapa ett program byggt med funktioner för att beräkna två stycken heltal.

man ska välja en av tre operatorer för att programmet ska välja vilken beräkning som ska användas.

vid a;
så ska de två heltalen adderas i följd,
t.ex om man har valt 1 och 5
så beräknas -->
1+2+3+4+5

vid m
så ska talen multipleceras
--> 1*2*3*4*5

vid k
--> 1^2^3^4^5


Jag har lyckats med alla funktioner förutom beräkna funktionen, har suttit fast i 2 veckor nu och kan verkligen inte förstå hur jag ska gå tillväga, någon här som har en idé hur man kan lösa detta?

Kod:
#include <iostream>
 
using namespace std;
void skrivInfo ();
int lasEttTal();
char lasOp();
void ordna (int tal1, int tal2, int& min, int& max);
int berakna(int& min, int& max);
void skrivResultat (int result);
int main()
{
    int tal1, tal2, min, max, svar;
char op;
skrivInfo();
 
tal1 = lasEttTal();
tal2 = lasEttTal();
op=lasOp();
ordna(tal1, tal2, min, max);
    svar = berakna(min,max);
 skrivResultat(svar);
return 0;
}
 
void skrivInfo ()
{
    cout << "Hej och välkommna! Programmet gör enkla beräkningar med de tal som matas in" << endl;
}
int lasEttTal()
{
    int nr;
    cout<<"Mata in tal ";
    cin>>nr;
     return nr;
}
 
char lasOp()
{
 
    char op;
    cout<<" Gör val för typ av beräkning."<<endl;
    cout<<"Skriv a för addera"<<endl;
    cout<<"Skriv m för multiplicera"<<endl;
    cout<<"Skriv k för kvadratsumman"<<endl;
    cin>>op;
    return op;
}
void ordna (int tal1, int tal2, int& min, int& max)
{
   
    if (tal1<tal2)
    {
        min=tal1;
        max=tal2;
    }
    else
    {
        min=tal2;
        max=tal1;
    }
    cout << min << " och " << max;
}
 
int berakna(int& min, int& max, char op)
{
    int svar = 0;
    
    for (int& min =1; min<max; min++)
    
        
    
    
    

    
    return svar;
}


    
    
    void skrivResultat (int svar)
{
    cout<<" Resultatet är: "<<svar<<endl;
}

Skulle rekommendera att du översätter pseudokoden till källkod ett steg i taget, samt testar varje del av koden i C++ för att säkerställa att du dels räknar rätt (undviker logiska fel) samt dels inte får komplieringsfel (dvs. fel i syntaxen). Det låter spontant som att du försöker göra för mycket på en gång och det är sällan en bra väg som nybörjare.
Citera
2021-07-25, 14:41
  #19
Medlem
Tack för hjälpen allihopa!

Nu är beräkningsfunktionen helt korrekt, ett problem uppstod dock.

Min Ordna funktion fungerar inte som den skall.
Syftet med funktionen är att den ska ordna de två heltalen i storleksordning, (lägst tal först)
Sedan ska beräkna funktionen beräkna de två talen med det lägsta talet först.

Jag har använt mig av referenser (&) men antar att jag inte gjort detta korrekt.

Kan ni se varför det inte fungerar?

Kod:
#include <iostream>
 
using namespace std;
void skrivInfo ();
int lasEttTal();
char lasOp();
void ordna (int tal1, int tal2, int& min, int& max);
int berakna(int tal1, int tal2, char op);
void skrivResultat (int result);
int main()
{
    int tal1, tal2, min, max, svar;
char op;
skrivInfo();
 
tal1 = lasEttTal();
tal2 = lasEttTal();
op=lasOp();
ordna(tal1, tal2, min, max);
    svar = berakna(tal1,tal2,op);
 skrivResultat(svar);
return 0;
}
 
void skrivInfo ()
{
    cout << "Hej och välkommna! Programmet gör enkla beräkningar med de tal som matas in" << endl;
}
int lasEttTal()  // här matar man in talen
{
    int nr;
    cout<<"Mata in tal ";
    cin>>nr;
     return nr;
}
 
char lasOp()  // här väljer man vad som ska beräknas
{
 
    char op;
    cout<<" Gör val för typ av beräkning."<<endl;
    cout<<"Skriv a för addera"<<endl;
    cout<<"Skriv m för multiplicera"<<endl;
    cout<<"Skriv k för kvadratsumman"<<endl;
    cin>>op;
    return op;
}
void ordna (int tal1, int tal2, int& min, int& max) // ordnar talen i följd, så att man får rätt ordning även om man väljer det stora talet först
{
   
    if (tal1<tal2)
    {
        min=tal1;
        max=tal2;
    }
    else
    {
        min=tal2;
        max=tal1;
    }
    cout << min << " och " << max;
}
 
int berakna(int tal1, int tal2, char op)  // beräknar svaret
{
    int svar = 0;
    
        if (op == 'a')
            {
            for (int x = tal1; x <= tal2; x++)
                svar += x;
            }
    
    else if (op == 'm')
    
    {
        svar = 1;
        for (int x = tal1; x <= tal2; x++)
            svar *= x;
    }
    
    else if (op == 'k')
    
    {
        for (int x = tal1; x <= tal2; x++)
                
                svar = svar+(x*x);
                
    }
    
    
    
        

    

    
    return svar;
}


    
    
    void skrivResultat (int svar)
{
    cout<<" Resultatet är: "<<svar<<endl;
}
Citera
2021-07-25, 18:06
  #20
Moderator
Protons avatar
Citat:
Ursprungligen postat av Flightmodee
Tack för hjälpen allihopa!

Nu är beräkningsfunktionen helt korrekt, ett problem uppstod dock.

Min Ordna funktion fungerar inte som den skall.
Syftet med funktionen är att den ska ordna de två heltalen i storleksordning, (lägst tal först)
Sedan ska beräkna funktionen beräkna de två talen med det lägsta talet först.

Jag har använt mig av referenser (&) men antar att jag inte gjort detta korrekt.

Kan ni se varför det inte fungerar?

Kod:
#include <iostream>
 
using namespace std;
void skrivInfo ();
int lasEttTal();
char lasOp();
void ordna (int tal1, int tal2, int& min, int& max);
int berakna(int tal1, int tal2, char op);
void skrivResultat (int result);
int main()
{
    int tal1, tal2, min, max, svar;
char op;
skrivInfo();
 
tal1 = lasEttTal();
tal2 = lasEttTal();
op=lasOp();
ordna(tal1, tal2, min, max);
    svar = berakna(tal1,tal2,op);
 skrivResultat(svar);
return 0;
}
 
void skrivInfo ()
{
    cout << "Hej och välkommna! Programmet gör enkla beräkningar med de tal som matas in" << endl;
}
int lasEttTal()  // här matar man in talen
{
    int nr;
    cout<<"Mata in tal ";
    cin>>nr;
     return nr;
}
 
char lasOp()  // här väljer man vad som ska beräknas
{
 
    char op;
    cout<<" Gör val för typ av beräkning."<<endl;
    cout<<"Skriv a för addera"<<endl;
    cout<<"Skriv m för multiplicera"<<endl;
    cout<<"Skriv k för kvadratsumman"<<endl;
    cin>>op;
    return op;
}
void ordna (int tal1, int tal2, int& min, int& max) // ordnar talen i följd, så att man får rätt ordning även om man väljer det stora talet först
{
   
    if (tal1<tal2)
    {
        min=tal1;
        max=tal2;
    }
    else
    {
        min=tal2;
        max=tal1;
    }
    cout << min << " och " << max;
}
 
int berakna(int tal1, int tal2, char op)  // beräknar svaret
{
    int svar = 0;
    
        if (op == 'a')
            {
            for (int x = tal1; x <= tal2; x++)
                svar += x;
            }
    
    else if (op == 'm')
    
    {
        svar = 1;
        for (int x = tal1; x <= tal2; x++)
            svar *= x;
    }
    
    else if (op == 'k')
    
    {
        for (int x = tal1; x <= tal2; x++)
                
                svar = svar+(x*x);
                
    }
    
    
    
        

    

    
    return svar;
}


    
    
    void skrivResultat (int svar)
{
    cout<<" Resultatet är: "<<svar<<endl;
}
Kudos för att dina beskrivningar av de problem du upplever faktiskt leder till att man mer eller mindre direkt kan börja leta efter felen.

Vad jag kan se av din ordna-funktion gör den förmodligen det den borde göra, men eftersom du ändå inte använder resultatet av den sen i din main spelar det ju ingen roll vad den har för sig, eller hur?

Kolla på koden, vad är det den gör egentligen?

Nästa fråga du behöver ställa dig är "Vad behöver min ordnafunktion kunna klara av"?

Jag klistrar loss lite så ser du...

Kod:
 int tal1, tal2, min, max, svar;
ordna(tal1, tal2, min, max);
svar = berakna(tal1,tal2,op);
//mer kod...

void ordna (int tal1, int tal2, int& min, int& max) // ordnar talen i följd, så att man får rätt ordning även om man väljer det stora talet först
{
   
    if (tal1<tal2)
    {
        min=tal1;
        max=tal2;
    }
    else
    {
        min=tal2;
        max=tal1;
    }
    cout << min << " och " << max;
}

I din ordnafunktion tilldelar du variabeln min och max något och det funkar förmodligen som det ska.

Vad är det för variabler du använder i din funktion berakna? Vilka värden kommer dessa variabler ha efter att du kört ordna?

__________________
Senast redigerad av Proton 2021-07-25 kl. 18:08.
Citera
2021-07-25, 19:04
  #21
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av Flightmodee
Tack för hjälpen allihopa!

Nu är beräkningsfunktionen helt korrekt, ett problem uppstod dock.

Min Ordna funktion fungerar inte som den skall.
Syftet med funktionen är att den ska ordna de två heltalen i storleksordning, (lägst tal först)
Sedan ska beräkna funktionen beräkna de två talen med det lägsta talet först.

Jag har använt mig av referenser (&) men antar att jag inte gjort detta korrekt.

Kan ni se varför det inte fungerar?

Kod:
#include <iostream>
 
using namespace std;
void skrivInfo ();
int lasEttTal();
char lasOp();
void ordna (int tal1, int tal2, int& min, int& max);
int berakna(int tal1, int tal2, char op);
void skrivResultat (int result);
int main()
{
    int tal1, tal2, min, max, svar;
char op;
skrivInfo();
 
tal1 = lasEttTal();
tal2 = lasEttTal();
op=lasOp();
ordna(tal1, tal2, min, max);
    svar = berakna(tal1,tal2,op);
 skrivResultat(svar);
return 0;
}
 
void skrivInfo ()
{
    cout << "Hej och välkommna! Programmet gör enkla beräkningar med de tal som matas in" << endl;
}
int lasEttTal()  // här matar man in talen
{
    int nr;
    cout<<"Mata in tal ";
    cin>>nr;
     return nr;
}
 
char lasOp()  // här väljer man vad som ska beräknas
{
 
    char op;
    cout<<" Gör val för typ av beräkning."<<endl;
    cout<<"Skriv a för addera"<<endl;
    cout<<"Skriv m för multiplicera"<<endl;
    cout<<"Skriv k för kvadratsumman"<<endl;
    cin>>op;
    return op;
}
void ordna (int tal1, int tal2, int& min, int& max) // ordnar talen i följd, så att man får rätt ordning även om man väljer det stora talet först
{
   
    if (tal1<tal2)
    {
        min=tal1;
        max=tal2;
    }
    else
    {
        min=tal2;
        max=tal1;
    }
    cout << min << " och " << max;
}
 
int berakna(int tal1, int tal2, char op)  // beräknar svaret
{
    int svar = 0;
    
        if (op == 'a')
            {
            for (int x = tal1; x <= tal2; x++)
                svar += x;
            }
    
    else if (op == 'm')
    
    {
        svar = 1;
        for (int x = tal1; x <= tal2; x++)
            svar *= x;
    }
    
    else if (op == 'k')
    
    {
        for (int x = tal1; x <= tal2; x++)
                
                svar = svar+(x*x);
                
    }
    
    
    
        

    

    
    return svar;
}


    
    
    void skrivResultat (int svar)
{
    cout<<" Resultatet är: "<<svar<<endl;
}

ordna()-funktionen funkar korrekt men problemet ligger i att du fortsätter att skicka talen tal1 och tal2 vidare till de andra funktionerna som körs efter ordna(), dvs. berakna() samt skrivResultat().

I berakna() skickar du tal1 och tal2 som argument, när ordna() har gjort att det istället är variablerna min och max som du vill ha. min och max används ej heller som globala variabler i funktionen berakna(). Du vill alltså ersätta de två första variablerna med de två senare, ej fortsätta jobba med de två första efter att ordna() har körts.

Vidare är det onödigt att ha dubbel uppsättning av variabler, det är betydligt enklare att bara sätta pekare till tal1 och tal2 direkt i ordna()-funktionen. Provade nedan att bygga om funktionen så att den byter plats på tal1 och tal2 om de har fel ordning, där en tillfällig (lokal) variabel används som övergång. tal1 och tal2 används sedan direkt i main() då de har pekare.

Citat:
#include <iostream>

using namespace std;
void skrivInfo ();
int lasEttTal();
char lasOp();
void ordna (int& tal1, int& tal2);
int berakna(int tal1, int tal2, char op);
void skrivResultat (int result);
int main()
{
int tal1, tal2, min, max, svar;
char op;
skrivInfo();

tal1 = lasEttTal();
tal2 = lasEttTal();
op=lasOp();
ordna(tal1, tal2);
svar = berakna(tal1,tal2,op);
skrivResultat(svar);
return 0;
}

void skrivInfo ()
{
cout << "Hej och välkommna! Programmet gör enkla beräkningar med de tal som matas in" << endl;
}
int lasEttTal() // här matar man in talen
{
int nr;
cout<<"Mata in tal ";
cin>>nr;
return nr;
}

char lasOp() // här väljer man vad som ska beräknas
{

char op;
cout<<" Gör val för typ av beräkning."<<endl;
cout<<"Skriv a för addera"<<endl;
cout<<"Skriv m för multiplicera"<<endl;
cout<<"Skriv k för kvadratsumman"<<endl;
cin>>op;
return op;
}
void ordna (int& tal1, int& tal2) // ordnar talen i följd, så att man får rätt ordning även om man väljer det stora talet först
{
int temp;

if (tal1>tal2)
{
temp = tal2;
tal2 = tal1;
tal1 = temp;
}

cout << tal1 << " och " << tal2;
}

int berakna(int tal1, int tal2, char op) // beräknar svaret
{
int svar = 0;

if (op == 'a')
{
for (int x = tal1; x <= tal2; x++)
svar += x;
}

else if (op == 'm')

{
svar = 1;
for (int x = tal1; x <= tal2; x++)
svar *= x;
}

else if (op == 'k')

{
for (int x = tal1; x <= tal2; x++)

svar = svar+(x*x);

}








return svar;
}




void skrivResultat (int svar)
{
cout<<" Resultatet är: "<<svar<<endl;
}
Citera
2021-07-25, 19:08
  #22
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av Proton
Din ordna-funktion behöver kunna ta 2 parametrar som intreferenser och du behöäver skicna in tal1 och 2 i denna funktion. Den behöver inte femhundra paramterar.

Var inne på samma spår. Se svaret ovan.
Citera
2021-07-25, 19:27
  #23
Medlem
hogerspokets avatar
Jamen ser man på -- det blev lite pekare trots allt...


I egenskap av person som undervisar på universitet kan det väl möjligen vara på sin plats att påpeka för TS att:

Att plocka upp/klistra in random lösningar på banala kod-frågor från ett forum är sannolikt inte något som leder till djupinlärning.

För att klara tentan bör TS faktiskt även sätta sig in i vad koden gör. Sagt i all välmening.
Citera
2021-07-25, 19:36
  #24
Moderator
Neksnors avatar
Lite sen, men jag skulle helst plocka ut beräkningarna ur funktionen berakna.
Pseudokod (helt utan koll på variabler mm):
Kod:
berakna(char operator){
  if(operator == 'a'{
    addera();
  }
  else if(operator == 'm'){
    multiplicera();
  }
  ...
  else{
    felhantering();
  }
{
Sedan kan en utvecklare jobba med multiplicera() i lugn och ro samtidigt som en annan filar på addera().

Som nybörjare tycker jag inte att man bör använda saker som += för mycket, det innebär mindre skrivande, men det gör det samtidigt svårare att hitta fel i sin kod.
Så vänta med att skriva x+=y tills du är jävligt säker på att det betyder
och inget annat.
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