Gå til innhold

Kan noen se litt på denne?


Anbefalte innlegg

Skrevet (endret)

Heisan!

Lurer på en liten ting her:

case 3: {
          cout << "Tast inn navnet du vil søke etter:  ";
          string navn1;
          cin >> navn1; cin.ignore();
          for (int i=0;i<100;i++)
          {
              for (int k=0;k<100;k++)
              {
                   if (navn1 == kordin[i][k].navn)
                   {
                        cout << navn1 << " har kordinat " << kordin[i][k].posisjon;
                        goto hopp;
                   }
               }   
          }
          break;
        }

Dette er koden. Hvorfor skriver den alltid ut "Navnet har kordinat 0" når jeg kjører denne biten?

 

På forhånd, takk for alle svar :)'

Edit: Tok noen redigeringer å få koden nogen lunde oversiktlig.

Endret av zirener
Videoannonse
Annonse
Skrevet (endret)

Det ville vært fint å se definisjonen til kordin-typen og objektet ditt.. Tipper du har glemt å initialisere posisjonen.

 

Edit: Bruker du goto én gang til denger jeg deg. Du burde dessuten bruke medlemsfunksjoner som såkalte "accessors", framfor public members.

 

Eksempel:

 

class my_class {
    int its_variable;
public:
    int get_variable() const { return its_variable; }
};

Endret av Myubi
Skrevet (endret)

Vet det ikke er noe bra å bruke hoppsetninger med mindre man må.

Jeg fant ingen annen utvei så jeg brukte goto(please ikke deng meg) Det er sikkert en annen vei ut men, er ikke så god i C++ vet du.

struct kordinat
{
int posisjon;
string navn;
};

 

Jeg er ikke så stø på klasser(har ikke fått jobbet så mye med det fordi jeg jo begynte fra starten på en annen bok, men jeg kommer snart til det(har nettopp begynt med struct).

 

Edit: Har ikke intialisert posisjon nei, får prøve det da.

Endret av zirener
Skrevet

Jeg vet at det som ny programmerer virker veldig fristende med goto, så jeg har forsåvidt forståelse for det. Hvis du vil kan vi ta dette her privat, så kan jeg gi deg et forslag om hvordan du kan restrukturere koden din for å unngå goto. Send privat melding hvis du er interessert..

Skrevet (endret)

Break bryter bare ut av den nærmeste løkka ja, å bryte ut av nøstede løkker er så vidt jeg vet nevnt som et mulig (om ikke anbefalt) bruksområde for goto av B. Stroustrup.

Endret av A_N_K
Skrevet

Det beste er å unngå goto, som allerede nevnt kan du sette tellevariablene til 100, så løkketesten evaluerer til false, og stoppe på den måten. Eller du kan ha en ekstra boolsk variabel du kan evaluere i den ytterste løkketesten, doLoop f.eks, når du ønsker å bryte ut kan du sette den til false og så bruke break for å bryte ut av den innerste løkka. Dvs. for (int i=0;i<100;i++) blir til for (int i=0;i<100 && doLoop;i++)

Skrevet
Det beste er å unngå goto, som allerede nevnt kan du sette tellevariablene til 100, så løkketesten evaluerer til false, og stoppe på den måten. Eller du kan ha en ekstra boolsk variabel du kan evaluere i den ytterste løkketesten, doLoop f.eks, når du ønsker å bryte ut kan du sette den til false og så bruke break for å bryte ut av den innerste løkka. Dvs. for (int i=0;i<100;i++) blir til for (int i=0;i<100 && doLoop;i++)

Urk.. :)

 

Legg inn en label etter den ytre loopen du, og bruk goto. Blir stygt å hoppe til et vilkårlig sted i koden, men for å bare komme ut av en nestet loop er vel goto en del klarere enn å endre variabler eller whatever..

 

Er jo som regel bedre å ordne koden slik at man slipper bruke goto, men i noen tilfeller er det beste løsning.

Skrevet (endret)

{ 
   bool coord_found = false;
               cout << "Tast inn navnet du vil søke etter:  ";  
    string navn1;  
    cin >> navn1;  
    for (int i=0;i<100;i++)
    {
   	for (int k=0;k<100;k++)
   	{
     if (navn1 == kordin[i][k].navn)
     {
     	cout << navn1 << " har kordinat "
        << kordin[i][k].posisjon_x << " "
        << kordin[i][k].posisjon_y << endl;
     	coord_found = true;
     }
   	}
   }
   if (!coord_found)
   	cout << "Fant ingen koordinater med navn " << navn1 << endl;
   break;  
               } 

 

Sånn er koden nå(rettere sagt:den biten som jeg hadde problemer med.).

Etter litt hjelp og sånn som jeg nevnte ovenfor.

Edit: Redigerte så koden så litt bedre ut. Jeg har heller ikke tatt med inrykk(som jeg egentlig har på koden siden det ble så mye styr).

Endret av zirener
Skrevet

Jeg kan ikke se at du har erstattet goto i koden? For å bryte ut av den ytre løkka kan du legge til coord_found i for-testen. Dvs. for (int i=0;i<100 && !coord_found;i++).

Skrevet (endret)

Det behøves jo ingen goto der nå?

Edit:Det at den går gjennom begge løkkene helt ut gjør jo bare at den bruker litt lengere tid? Gjør det ikke? Og så får man jo også skrevet ut hvis det er noen flere navn på samme koordinat(ble jeg fortalt, det ser man jo også).

Endret av zirener
Skrevet

Ja, hvis meningen hele tiden var å søke videre etter et treff har selvfølgelig goto ingenting der å gjøre. Men hvorfor brukte du goto i utgangspunktet?

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...