webForumDet fria alternativet

Söka i en array eller vektor

17 svar · 636 visningar · startad av tosses

tossesMedlem sedan aug. 2003190 inlägg
#1

Hej!

Jag har en array eller vektor(nybörjare) med en massa tal.
ex:

vec[0]=2
vec[1]=2
vec[2]=4
vec[3]=4
vec[4]=4
vec[5]=6
vec[6]=8
vec[7]=9

Nu vill jag leta igenom vektorn och kolla vilka tal som saknas.

ex:
Talen 3,5,7 finns inte i vektorn.

jag vill leta efter tal mellan 2 och 200 och ta fram de som inte finns.

HJÄLP!!!

PeWMedlem sedan juni 200010 432 inlägg
#2

Tja, med två loopar kan du ju stega igenom intervallet och för varje steg kolla igenom vektorn efter samma tal.. i sin enklaste och kanske slösaktigaste form:

 loop 2..200 do
     loop 0..vect_size
        if range_index equals vect_index then do something

Typ ;)

tossesMedlem sedan aug. 2003190 inlägg
#3

Hmm jag fattar hur du menar men jag tror jag behöver mer hjälp med hur koden ska skrivas.

for(int a=2;a<=20;a++){
for(b=0;b<=22;b++){
if(a==vec**){
cout<<a;
}
}
}

Eller ?? hjälpppp**

PeWMedlem sedan juni 200010 432 inlägg
#4

Jo så kan man göra. Det är iofs inte särskilt effektivt vid stora arrays, men det kan ju duga. Ifall det är sorterade arrays kan du ju precisera sökningen och bara söka av ett litet intervall i arrayen.

tossesMedlem sedan aug. 2003190 inlägg
#5

Kruxet är att med den koden hittar jag siffror som finns. Jag vill hitta de som inte finns!

Vektor innehåller:
2
4
5
6
8
9

Jag vill ha en utskrift på att 3 och 7 inte finns med i vektorn

PeWMedlem sedan juni 200010 432 inlägg
#6

Men byt bara ut == mot != så får du det resultatet :)

tossesMedlem sedan aug. 2003190 inlägg
#7

Fast det går inte.

for(int a=2;a<=20;a++){
for(b=0;b<=22;b++){
if(a!=vec**){
cout<<a;
}
}
}

Om jag jämför vec[1] med 1,2,3,4,5,6,7,8,9 så kommer 8 siffror att vara != från vec[1]. Jag vill veta vilka siffror som saknas.

Det måste gå att lösa!!!**

Mc FettoMedlem sedan nov. 20022 355 inlägg
#8

du kan ju alltid fylla en lista av ngt slag med 2-200 sedan går du igenom vectorn, för varje index i vectorn tar du bort den siffran i från listan...
Kanske inte den bästa lösningen men dock en lösning!

PeWMedlem sedan juni 200010 432 inlägg
#9

tosses skrev:

Fast det går inte.

for(int a=2;a<=20;a++){
for(b=0;b<=22;b++){
if(a!=vec**){
cout<<a;
}
}
}

Om jag jämför vec[1] med 1,2,3,4,5,6,7,8,9 så kommer 8 siffror att vara != från vec[1]. Jag vill veta vilka siffror som saknas.

Det måste gå att lösa!!!**

Visst går det att lösa. Till att börja med blir det till att låta yttre och inre loop byta plats och sen kastar vi in lite fler villkor. Vet inte om du menar intervallet som ska kontrolleras ligger mellan 2 till 20 eller mellan högsta och minsta värde i arrayen. Båda alternativen kan dock lösas med nedan exempel:

int lookahead;
int higher = 200;
int vect[xxx] = {x...x};

  for(int i=0;i<VECTSIZE;i++)
    for(int j=vect[i];j<=higher;j++){
        if(i+1<VECTSIZE)
          lookahead = vect[i+1];
         //ta bort nedan två rader ifall intervallet är inom minsta/högsta i arrayen
         //är det inom din limit upp till 200 som gäller ska de vara kvar
        else              
          lookahead = higher+1;

        if(lookahead<=j)
      	   break;
        if(vect[i]<j)
        cout << "följande tal saknades  " << j << endl;  
      }

Förutsätter dock att vektorn är sorterad.

tossesMedlem sedan aug. 2003190 inlägg
#10

Oj !! :) Ska kolla detta så fort jag har tid och kommer åt filerna!!!!

Hoppas hoppas hoppas!!!

tossesMedlem sedan aug. 2003190 inlägg
#11

Skulle du kunna förklara hur din sökning fungerar!! Hur du tänker. Skulle vara väldigt tacksam!!

Förresten så fungerar det bra!!

PeWMedlem sedan juni 200010 432 inlägg
#12

Okej..

Vi har en array och vi har ett intervall av naturliga tal. Vi behöver veta om nästa tal i arrayen är lika eller är nästa tal i ordningen av de naturliga talen. Är det lika så är allt okej och vi gör ingenting utan vi stegar till nästa position och utför samma koll en gång till. Om det skulle vara ett glapp skriver vi ut glappet (eller gör vad som helst med det talet) och stegar till nästa. Ifall vi når slutet av arrayen men har mer att hämta från vårt intervall sätter vi kontrollen (lookahead) till ovanför intervallet och därmed skrivs resterande tal i intervallet ut. Ifall man inte vill ha det så utan bara vill ha talen inom arrayens intervall är det bara att låta bli att sätta kontrollen till steget ovanför intervallet.

Btw.. sätt gärna mitt svar som svaret accepterat ;)

tossesMedlem sedan aug. 2003190 inlägg
#13

Hmm så här borde jag kunna göra istället::

for(p=0;p<vektorstorlek;p++){
if(vec[p+1]-vec[p]>=2){
cout<<vec[p]+1<<" ";
}
}

PeWMedlem sedan juni 200010 432 inlägg
#14

Men då blir det inte samma sak. :)

För det första så har du då inte samma intervall och sen skriver du inte ut glapp större än ett, även om du noterar dem, detta pga av du endast loopar arrayen inte ett intervall av naturliga tal. För det andra måste du ha en koll på indexeringen av arrayen, som det är ovan blir det utanför index vid det sista elementet.

tossesMedlem sedan aug. 2003190 inlägg
#15

ja men då kan jag loopa ut det tomma intervallet heller hur!

om resultatet>=2 t.ex. 5 så loopar jag ut:
vec[p]+1
vec[p]+2
vec[p]+3
vec[p]+4

Så har jag exakt samma funktion

om res är t.ex 2 så loopar jag ut
vec[p]+1

Funkar klockrent eller :)

PeWMedlem sedan juni 200010 432 inlägg
#16

Ifall du bygger ut

for(p=0;p<vektorstorlek;p++){
if(vec[p+1]-vec[p]>=2){
cout<<vec[p]+1<<" ";
}
}

med det du skriver ovan så får du ungefär det som jag skrev längre upp - ja :)

tossesMedlem sedan aug. 2003190 inlägg
#17

Kul!!!!!!!!!! Och tack så mycket!!!

fantastiskt att man kan få experthjälp utan att vara inskriven på något universitet!!!!

KANOON! :e

PeWMedlem sedan juni 200010 432 inlägg
#18

Kul att det funkar. Sånt här är roligare att diskutera än att bara hänvisa till standardfunktioner :)

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)