Avatar billede joggy Nybegynder
21. januar 2006 - 16:26 Der er 7 kommentarer og
1 løsning

Unikke numre & arrays

Jeg har 2 spørgsmål:

1: Jeg leder efter en måde hvorpå jeg kan generere numrene fra 1-9 random.

Altså f.eks: 2 6 1 9 3 7 4 8 5 Der er altså ikke 2 tal der må være ens.

----------

2: Er der en måde i C++ hvor man kan søge et array igennem og når man finder det man søgte, så skal den slette det tal man søgte efter OG index pladsen?
Avatar billede bertelbrander Novice
21. januar 2006 - 16:52 #1
F.ex:
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

class RandomClass
{
public:
  RandomClass()
  {
      srand(time(0));
  }

  int operator()(int aRange)
  {
      return int(1.0*aRange*rand()/RAND_MAX);
  }
};


int main()
{
  std::vector<int> MyVector;
  int i;
  for(i = 0; i < 10; i++)
  {
      MyVector.push_back(i);
  }
  RandomClass Random;
  std::random_shuffle(MyVector.begin(), MyVector.end(), Random);
  std::copy(MyVector.begin(), MyVector.end(), std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;

  for(i = 0; i < 10; i++)
      if(MyVector[i] == 5)
        MyVector.erase(MyVector.begin() + i);

  std::copy(MyVector.begin(), MyVector.end(), std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
}

Det starter med at putte tallene fra 0 til og med 9 ind i en vector
Så blander den tallene.
Og udskriver dem
Så finder den tallet 5, og sletter
Og udskriver dem der er tilbage
Avatar billede joggy Nybegynder
21. januar 2006 - 18:37 #2
Det er ikke muligt at sætte tallene ind i et array vel?
Avatar billede bertelbrander Novice
21. januar 2006 - 18:44 #3
Det er ca. det samme:

#include <iostream>
#include <algorithm>
#include <iterator>

class RandomClass
{
public:
  RandomClass()
  {
      srand(time(0));
  }

  int operator()(int aRange)
  {
      return int(1.0*aRange*rand()/RAND_MAX);
  }
};


int main()
{
  int Array[10], i;
  for(i = 0; i < 10; i++)
  {
      Array[i] = i;
  }
  RandomClass Random;
  std::random_shuffle(Array, &Array[10], Random);
  std::copy(Array, &Array[10], std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;

  for(i = 0; i < 10; i++)
      if(Array[i] == 5)
        std::copy(&Array[i + 1], &Array[9], &Array[i]);

  std::copy(Array, &Array[9], std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
}

Bemærk at koden går ud fra at der fjernes netop 1 5 tal.
Avatar billede joggy Nybegynder
24. januar 2006 - 13:22 #4
Nu fik jeg endelig tid til at kigge på det, men koden virker ikke helt:

Får dette output:
2 1 9 0 4 5 7 6 8 3
2 1 9 0 4 7 6 8 8

Den laver ganske rigtigt 10 random tal, og den fjerner også 5'eren, hvis altså at 5 ikke er til sidst i arrayet. Men udover dette, så ved jeg ikke helt hvorfor der pludselig er kommet to 8 taller, og at 3 tallet er forsvundet.
Avatar billede bertelbrander Novice
24. januar 2006 - 19:09 #5
Ups, koden "glemmer" at kopiere det sidste element. Linien med copy skal være:
        std::copy(&Array[i + 1], &Array[10], &Array[i]);

(En af mine kollegaer sagde en gang at 50% af alle fejl var +/- 1 fejl, jeg tror at han har ret)
Avatar billede joggy Nybegynder
04. februar 2006 - 13:27 #6
Tak for hjælpen Bertel, hvis du ønsker point, så smid et svar :)
Avatar billede bertelbrander Novice
04. februar 2006 - 14:39 #7
Jeg samle ikke på point
Avatar billede joggy Nybegynder
05. februar 2006 - 20:58 #8
Jamen så takker jeg mange gange for hjælpen, og lukker hermed spørgsmålet :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester