13 svar
322 visningar
dajamanté behöver inte mer hjälp
dajamanté 5139 – Fd. Medlem
Postad: 28 jun 2018 16:42

dela filer

Hej!

Nu har jag börjat c++, det är ganska roligt så länge man fastnar inte i en infinite loop som varnar "don't f... with the Nasa!". (lång story)

Jag vill dela enkla program med er som är duktiga på c++ för förbättringar. Hur brukar ni göra det? Program har flera funktioner och  .h filer, bör jag kopiera det en efter den andra? AlvinB har visat hastebin, hantera den program som kommer i flera bitar?

Lindehaven 820 – Lärare
Postad: 28 jun 2018 18:12

Github så får du versionshantering också

dajamanté 5139 – Fd. Medlem
Postad: 28 jun 2018 20:18 Redigerad: 28 jun 2018 20:42

Okej, nu har jag en github konto:

 

Jag har gjort en liten program baserat på how to design your first program i Learn c++ men jag har läggt header filer.  Programmet gör enkla operationer (jag har bara använt heltal så divisionen blir utan rest).

 Jag har följt den exempel program, jag har bara läggt på headerfil, hälsning, tids hantering för drama, while loopen som skulle förbjuda användningen av andra operationer än dem 4 enkla räkneoperationer.

Programmet hälsar ''hello Kathrine" och frågar om två tal och en operation. Om ni väljer en operation som är otillåtet, då svarar den lite otrevligt.

 

 

Jag tar allt feedback eller råd eller kommentar som vanligt :D! Jag lär mig jättemycket på PA så kör på bara!

 

Också:

Programmet har en funktion som heter calculateResult. Den linje som är i bold har jag ersätt med 

''cout<< "This should never happen. Not at the NASA!"<<endl;''

 

...för att jag har gjort en while loop i en annan funktion (getMathematicalOperations) som hanterar alla fall där user input är skillt från ett till fyra.

 

while (op < 1 || op > 4) {

blblablablabla

int calculateResult(int x, int op, int y)
{
// note: we use the == operator to compare two values to see if they are equal
// we need to use if statements here because there's no direct way to convert op into the appropriate operator

if (op == 1) // if user chose addition (#1)
return x + y; // execute this line
if (op == 2) // if user chose subtraction (#2)
return x - y; // execute this line
if (op == 3) // if user chose multiplication (#3)
return x * y; // execute this line
if (op == 4) // if user chose division (#4)
return x / y; // execute this line

return x + y; // if the user passed in an invalid op, we'll do addition.

// we discuss better error handling in future chapters
}

Finns det fall var detta fall kommer att hända? Eller är min loop obrytbart?

 

 

PS: Katherine Johnson och Nasa lägg jag på efter att jag såg hidden figures; som jag älskade 🚀🛰😀😀!

kodbert 4 – Fd. Medlem
Postad: 28 jun 2018 21:06

Som ett tips så skulle du kunna använda en `do`-`while` loop i funktionen `getMathematicalOperation()` eftersom du alltid vet att den kommer köra minst en gång.

dajamanté 5139 – Fd. Medlem
Postad: 29 jun 2018 05:49

 Hej o tack för svaret!

Jag förstår inte vart du menar att jag ska ha "do":en.

Lindehaven 820 – Lärare
Postad: 29 jun 2018 09:57

Som din kod är skriven så kommer din while loop i getMathematicalOperation() endast att brytas om värden mellan 1 och 4 anges.

Funktionen calculateResult() bör ändå förbättras så att den behandlar odefinierade värden på op med t ex en assert.

Några fler tips:

Använd enum för att definiera betydelsen av värden istället för att använda "magic numbers" för att välja räknesätt, t ex enum MathOperation {ADDITION=1, SUBTRACTION, MULTIPLICATION, DIVISION} 

Skriv if ... else if ... else if ... else istället för upprepade if ... if ... if. Du kan även använda switch ... case ... default istället för många upprepade if ... else if ... else.

Försök att ha endast en return i varje funktion utan att för den skull göra funktionen svårläst.

dajamanté 5139 – Fd. Medlem
Postad: 30 jun 2018 08:02
Lindehaven skrev:

Som din kod är skriven så kommer din while loop i getMathematicalOperation() endast att brytas om värden mellan 1 och 4 anges.

Funktionen calculateResult() bör ändå förbättras så att den behandlar odefinierade värden på op med t ex en assert.

Inte kommit här än :)

Usch fick min första konflikt mellan Github och Clion... fruktansvärt...

Några fler tips:

Använd enum för att definiera betydelsen av värden istället för att använda "magic numbers" för att välja räknesätt, t ex enum MathOperation {ADDITION=1, SUBTRACTION, MULTIPLICATION, DIVISION}

Lol jag trodde i början att du glömde SUBSTRACTION = 2, MULTIPLICATION =3... Men dem assignas automatiskt eller?

Skriv if ... else if ... else if ... else istället för upprepade if ... if ... if. Du kan även använda switch ... case ... default istället för många upprepade if ... else if ... else.

Försök att ha endast en return i varje funktion utan att för den skull göra funktionen svårläst.

Nu har jag modifierad (och fick konflikt på Github för att jag modifierade min repositary!!)

Men nu funkar det.

Tack för allt hjälp och tips!


using namespace std;

enum MathOperation {
ADDITION = 1, SUBSTRACTION, MULTIPLICATION, DIVISION
};

int calculateResult(int x, int op, int y) {
switch (op) {
case ADDITION:
return x + y;
case SUBSTRACTION:
return x - y;
case MULTIPLICATION:
return x * y;
case DIVISION:
return x / y;
default:
cout << "This should never happen. Not at the NASA!" << endl;
}
return 0;
}

Lindehaven 820 – Lärare
Postad: 30 jun 2018 11:57

getMathematicalOperation() har fortfarande "magic numbers". Du behöver använda din enum-typ även där.

Utskrifterna bör också använda din enum-typ istället för att hårdkodas.

Du bör använda enum-typen istället för int när du deklarerar op.

Lindehaven 820 – Lärare
Postad: 30 jun 2018 14:18

Om du jobbar från endast ett lokalt repository så bör du inte få merge conflict. Jobbar du från olika lokala repon så kan detta hända. Om du hämtar senaste versionen av din kod från github innan du ändrar koden så ska det inte hända heller.

dajamanté 5139 – Fd. Medlem
Postad: 30 jun 2018 14:38

Jag förstår inte en rad!

Lindehaven skrev:

getMathematicalOperation() har fortfarande "magic numbers". Du behöver använda din enum-typ även där.

Vad menar du med magic numbers?

Utskrifterna bör också använda din enum-typ istället för att hårdkodas.

och hårdkodas?

Du bör använda enum-typen istället för int när du deklarerar op.

Du menar att jag måste ta bort ersätta int med enum framför ''op'' överallt i programmet?

Lindehaven 820 – Lärare
Postad: 30 jun 2018 18:47

"Magic numbers" är nummer som man inte enkelt kan förstå vad de står för. Det är inte självklart eller enkelt att förstå t ex att siffran 4 betyder division. Därför är det bättre att använda ett beskrivande namn - i detta fallet DIVISION - överallt där man menar division. Om du eller någon annan ändrar i koden så behöver ni inte söka igenom all kod efter siffran 4 och avgöra om den betyder division.

Med "hårdkodad" menar jag att statiskt ange siffran 4 istället för att dynamiskt använda DIVISION i en formatterad sträng. På det sättet behöver koden inte ändras om exvis DIVISION istället får värdet 3.

Flytta enum MathOperationtill en header-fil och använd den typen istället för int när du deklarerar op.

dajamanté 5139 – Fd. Medlem
Postad: 2 jul 2018 10:04
Lindehaven skrev:

"Magic numbers" är nummer som man inte enkelt kan förstå vad de står för. Det är inte självklart eller enkelt att förstå t ex att siffran 4 betyder division. Därför är det bättre att använda ett beskrivande namn - i detta fallet DIVISION - överallt där man menar division. Om du eller någon annan ändrar i koden så behöver ni inte söka igenom all kod efter siffran 4 och avgöra om den betyder division.

Okaj, 4 var i uppgiften men det kan bytas mot ''d''.

MEN.

Loopen under inte fungerar lägre. När operationen som föreslås är INTE a, s, m eller d, får jag en oändlig loop!

 

#include "getMathematicalOperation.h"

#include <iostream>

#include <zconf.h>


using namespace std;

int getMathematicalOperation() {
int op{};

cout << "Please enter the operation you want :" << endl;
cout << " a is addition, s = substraction, m is multiplication and d is division." << endl;

cin >> op;

while (op != 'a' && op != 's' && op != 'm' && op != 'd'){
cout << "Don't ..." << endl;
usleep(400000);
cout << "..fuck..." << endl;
usleep(400000);
cout << "...with..." << endl;
usleep(400000);
cout << "the NASA!" << endl;
usleep(400000);

cout << "Please enter the operation you want :" << endl;
cout << " a is addition, s = substraction, m is multiplication and d is division." << endl;

cin >> op;
}
return op;

}

Lindehaven 820 – Lärare
Postad: 2 jul 2018 13:26

Jag var otydlig i min förklaring.

Att skriva 'a' istället för 1 gör koden mer svårläst. Du använder både siffror, bokstäver OCH din enum.

Du bör använda endast den enum-typ du deklarerat. Överallt. Ungefär så här:

cout << ADDITION << " is addition, " << SUBTRACTION << " is substraction " ...

while (op < ADDITION || op > DIVISION) ...

Du får en oändlig loop för att du programmerat den att bli det om operationen INTE är a, s, m eller d.

dajamanté 5139 – Fd. Medlem
Postad: 3 jul 2018 17:09

Ok, så hur hanterar jag att programmet kräver att jag använder a/s/m/d eller 1/2/3/4 som user input?

Oändlig loop löste sig med char istället för int i implementationen av av op, pust...

Svara
Close