webForumDet fria alternativet

komprimera kod

C/C++

6 svar · 255 visningar · startad av danii

Medlem sedan sep. 2004215 inlägg
Frågan#1

Hur kan denna kod förbättras?
Jag skulle även vilja veta vad som är så viktigt med &. Varför funkar inte koden utan &?

#include <iostream>
using namespace std;

void omvandling(int& h, int& min, int& sec);

int main(){
    int h = 0;
    int min = 0;
    int sec = 300;
    int t;
    
    omvandling(h, min, sec);
    
    cout << h << "h " << min << "min " << sec << "sec";
    
    cin >> t;
    return 0;
}    

void omvandling(int& h, int& min, int& sec){
    
    h = sec/3600;
    min = (sec%3600)/60; 
    sec = sec%60;
}
Medlem sedan nov. 20022 355 inlägg
#2

För att du skickar in variablerna som referenser till minnesplats och de ändras i funktionen "omvandling" tar du bort & så finns det ingen referens och då spelar det ingen roll att du manipulerar dem i din funktion (de finns endast i funktionen då).

Medlem sedan sep. 2004215 inlägg
#3

med andra ord så går det att manipulera/ändra ngt när man använder & medans man inte kan rucka variabeln om man inte har med &?

Medlem sedan juli 2004181 inlägg
#4

så kan man säga...

när du skickar in en referens i en funktion så är det samma objekt du manipulerar som det du skickar in.

om du inte skickar in en referens så får du en kopia av objektet som enbart "lever" så länge funktionen körs.

Medlem sedan nov. 20022 355 inlägg
#5

danii skrev:

med andra ord så går det att manipulera/ändra ngt när man använder & medans man inte kan rucka variabeln om man inte har med &?

Precis, vill du inte ha referenser till variabler (minnesplats), så måste du skapa funktioner som returnerar värdet och som du då tar hand om i funktionsanropet:


int main(){
 
    int h = 10;
    int x;
    x =   omvandling(h);

    return 0;
}  

int omvandling(int val){
    val = val - 5;
    return val;
}

Dåligt exempel kanske men jag är trött..
x kommer nu ha värdet 5 efter funktionsanropet :)

Medlem sedan sep. 2004215 inlägg
#6

Funkar inte & på fält?

#include <iostream>
using namespace std;

void statistik(int falt[]);
void mata_in(int& falt[]);

int falt[100];

int main(){
    
    int b;
    int t;
    
    do{
    cout << endl << "Meny\n___________________________" << endl;
    cout << "1 Presentera Statistik\n2 Mata in nya uppgifter\n3 Avsluta" << endl;
    cin >> b;
    
    switch(b){
        case 1:
            statistik(falt);
            break;
            
        case 2:
            mata_in(falt);
            break;
            
        default:
            break;
            
        
    }    
    }
    while(b != 3);    
    
    cin >> t;
    return 0;
}

void statistik(int falt[]){
    int i = 0;
    int b;
    int f;
    
    while(falt[i] > 0){     
        b += falt[i];
        i++;
    }
            
    f = (b == 0) ? 1 : i;
    cout << endl << "Antalet anst\x84llda : " << i << endl << "Medell\x94nen : " << b/f << endl;
}

void mata_in(int& falt[]){
    
    bool a = true;
    int c;
    int d;
    int j = 0;
    
    while(a){
        cout << "Mata in den anställdes lön : ";
        cin >> d;
        
        if(d == 0){
            a = false;
        }
        else{
            while(falt[j] > 0){
                    j++;
            }
            falt[j] = d;
        }
    }
}
Medlem sedan juli 2002581 inlägg
#7

danii skrev:

Funkar inte & på fält?

Jo då, men då skriver man

void minFunktion( int (&falt)[10] );

Dock är fält lite speciella och du kan ändra i dem även om du skriver

void minFunktion(int falt[]);
266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)