Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: anonimo12121 en 18 Marzo 2012, 17:28 pm



Título: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 18 Marzo 2012, 17:28 pm
[C++][Opiniones] Qué os parece esta forma de generar números aleatorios?

Bueno lo que he querido hacer es generar 9 números aleatorios y que ninguna coincida que os parece.?
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. using namespace std;
  5. time_t tiempo;
  6. struct tm *pt;
  7. int semilla;
  8. int numeros[10];
  9. int numero;
  10. int main(int argc,char *argv[]){
  11.    tiempo=time(NULL);
  12.    pt=localtime(&tiempo);
  13.    for(int c=0,fin=0,i=0;fin<9;i++){
  14.        ////////////////////////////////////////////////////////////////////
  15.        semilla= pt->tm_sec+pt->tm_min+pt->tm_hour+pt->tm_mday+pt->tm_yday+i;
  16.        srand(semilla);
  17.        numero=rand() % 10;
  18.        ////////////////////////////////////////////////////////////////////
  19.        for(int x=0;x<9;x++)if(numero!=numeros[x])c++;
  20.        if(c==9){
  21.            numeros[fin]=numero;
  22.            fin++;
  23.        }
  24.        c=0;
  25.    }
  26.    for(int i=0;i<9;i++)cout << numeros[i] << "-";
  27.    return 0;
  28. };
  29.  


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 18 Marzo 2012, 17:47 pm
Mmm no conozco C++ pero creo que te mataste mucho, ya que lo que se hace es meter los numeros en un array entonces con un Do-While vas generando numeros randoms "mientras" ese numero generado no se encuentre en la lista. Y te queda mas facil de leer y mas corto.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 18 Marzo 2012, 17:56 pm
puede ser xDD es que soy de los que nunca usa switch ni do while xDD


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Sagrini en 18 Marzo 2012, 18:43 pm
Mmm... no me gusta. Las primeras líneas son innecesarias, no hay que darle tantas vueltas, con un srand (time (0)) basta.
Te dejo mi código en C (tal vez un poco más enrevesado jaja)
Código
  1. #include <stdio.h>
  2. #define TAM 10
  3. #define RAND 20
  4.  
  5. int main ()
  6. { srand (time (0)); int nums [TAM], a, b, flag, cont;
  7. for (a=0; a<TAM; a++)
  8. { do
  9. { nums [a]=rand ()%RAND+1; flag=0; cont=0;
  10. for (b=0; b<cont; b++) { if (nums [b]==nums [a]) flag=1; cont++;}
  11. } while (flag == 1);
  12. }
  13. for (a=0; a<TAM; a++) printf ("%d ", nums [a]);
  14. printf ("\n");return 0;
  15. }
  16.  


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 18 Marzo 2012, 18:50 pm
sagrini en tu code se me repiten números corrigelo xD


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 18 Marzo 2012, 19:39 pm
Código
  1. int num;
  2. int lista de 9;
  3.  
  4. for (int i = 0; i<9; i++) {
  5.  
  6. do { num = Random } while Existe(num);
  7. lista[i] = num;
  8.  
  9. }
  10.  
  11.  
  12.  
  13.  
  14. bool Existe(int num)
  15. {
  16.  
  17. for (int i = 0; i<9; i++)
  18. if (lista[i] == num) return true;
  19.  
  20. }
  21.  

Algo asi y se entiende mejor.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Sagrini en 19 Marzo 2012, 15:47 pm
Sí, tiene un error muuy gordo de diseño ;)
Os dejo el corregido. Le he añadido un break; y le he quitado cont;
Código
  1. #include <stdio.h>
  2. #define TAM 10
  3. #define RAND 20
  4.  
  5. int main ()
  6. { srand (time (0)); int nums [TAM], a, b, flag;
  7. for (a=0; a<TAM; a++)
  8. { do
  9. { nums [a]=rand ()%RAND+1; flag=0;
  10. for (b=0; b<a; b++) if (nums [b]==nums [a]) { flag=1; break; }
  11. } while (flag == 1);
  12. }
  13. for (a=0; a<TAM; a++) printf ("%d ", nums [a]);
  14. printf ("\n");return 0;
  15. }
  16.  


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Anastacio en 19 Marzo 2012, 20:18 pm
Un par de preguntas.

Soy un novato, pero opino (y mi opinion vale casi nada, ya que he empezado hace bastante poco,), que esos codigos son muy complicados.

Código:
#include <stdio.h>
int main()
{

int a, b;
a = 0;
b = 0;

do{
srand( (unsigned)time( NULL ) );
a = rand();
printf("%d",&a);
b = b++;
while(b <= 9);
getchar();
return 0;
}




me dan su opinion?
Por alguna razon, este codigo no me lo compila


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 19 Marzo 2012, 20:53 pm
Pero tu codigo Anastacio puede repetirse los numeros y la idea es que no


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Anastacio en 19 Marzo 2012, 23:09 pm
Aaaa, claro, porque en algun momento puede ser la misma hora de ayer (a eso te refieres), pero como, entonces, podria usarse getpid, o no?

Tambien podria guardar todos los numeros que se producen, y revisar si son iguales, si no, que lo modifique de algun modo (+1).

Una pregunta que a ustedes les parecera tonta si duda, pero bueno, la verdad, entiendo poco (si no quieren no la conteste pero plis que nadie me banee), para que se usa #define?



Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Eternal Idol en 19 Marzo 2012, 23:19 pm
Una pregunta que a ustedes les parecera tonta si duda, pero bueno, la verdad, entiendo poco (si no quieren no la conteste pero plis que nadie me banee), para que se usa #define?

Ya que no sos capaz de conseguir un libro del tema y leerlo al menos aprende a usar:
Google (http://lmgtfy.com/?q=%23define).


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Anastacio en 19 Marzo 2012, 23:27 pm
Bueno, buscare en google.

Al parecer no se permiten novatos.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Eternal Idol en 19 Marzo 2012, 23:28 pm
Bueno, buscare en google.

Al parecer no se permiten novatos.

En todo caso:
No se permiten vagos.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 20 Marzo 2012, 18:59 pm
He generado un segundo código aun lo tengo que mejorar xD, pero no se si sabéis por donde van los tiros xDD. Se que algunos lo haríais rápido xD
Fallo 1: aveces no crea nada, por qué el numero generado sigue siempre un patrón...
Fallo 2: aveces se cuela un mismo numero en un cuadrante X(...
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. using namespace std;
  5. time_t tiempo;
  6. struct tm *pt;
  7. int semilla;
  8. int lista[9][9];
  9. int numero;
  10. void Generator(){
  11.    for(int z=0,x=0,y=0,c1=0,c2=0;y<9;z++){
  12.        tiempo=time(NULL);
  13.        pt=localtime(&tiempo);
  14.        semilla=pt->tm_sec+pt->tm_yday+pt->tm_min+z;
  15.        srand(semilla);
  16.        numero=rand() % 10;
  17.        for(int i=0;i<9;i++){
  18.            if(numero!=lista[y][i]){
  19.                c1++;
  20.            }
  21.        }
  22.        if(c1==9){
  23.            for(int i=0;i<9;i++){
  24.                if(numero!=lista[i][x]){
  25.                    c2++;
  26.                }
  27.            }
  28.        }
  29.        if(c1==9 && c2==9){
  30.            lista[y][x]=numero;
  31.            x++;
  32.        }
  33.        if(x==9){
  34.            x=0;
  35.            y++;
  36.        }
  37.        c1=0;
  38.        c2=0;
  39.    }
  40. }
  41. int main(int argc,char *argv[]){
  42.    Generator();
  43.    //////////////////////////////////////
  44.    //// IMPRIMIR /////////////////////////
  45.    for(int y=0;y<9;y++){
  46.        cout << "\nLine -> ";
  47.        for(int x=0;x<9;x++){
  48.            cout << lista[y][x] << "-";
  49.        }
  50.    }
  51.    cout << endl;
  52.    cout << "GAME OVER";
  53.    return 0;
  54. };



Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 21 Marzo 2012, 00:10 am
No te gustaron las soluciones mia y de Sagrini que es parecida?


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 21 Marzo 2012, 10:57 am
no jijiji. aún así la mía esta mal. tengo que arreglarla.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 21 Marzo 2012, 13:33 pm
Por eso te digo, la idea es mirar codigos de otros programadores y tratar de modificarlos para optimizarlos no para empeorarlos. Es solo un consejo, no te lo tomes a mal. Saludos


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 21 Marzo 2012, 19:22 pm
no ya. solo que quiero primero intentar hacer el código que busco y luego mejorarlo.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 21 Marzo 2012, 19:57 pm
xDD


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Xandrete en 21 Marzo 2012, 20:57 pm
¡Hola!

Tu manera de hacerlo es correcta (y eso es lo más importante). Otra manera sería mantener un vector de booleanos en el que marques los elementos que ya has cogido (así no tienes que hacer una búsqueda entre los elementos que ya han salido).

Propongo también esto otro, con listas circulares (y aprovechando que generas elementos entre 0 y 9 únicamente). Me he hecho una clase llamada clist que básicamente es eso, una lista circular. Aquí como resuelvo el problema usando esa clase:

Código
  1. #include <iostream>
  2. #include "circlist/clist.hpp"
  3.  
  4. int main() {
  5. clist<int> cl;
  6. for (int i = 0; i < 10; ++i) {
  7. cl.insert(i);
  8. cl.rand_sel();
  9. }
  10. for (int i = 0; i < 10; ++i) {
  11. cout << cl.elem() << endl;
  12. ++cl;
  13. }
  14. }

Y aquí el fichero de cabecera de la clase:

Código
  1. #ifndef NULL
  2. #define NULL 0
  3. #endif
  4.  
  5. template <class T>
  6. class clist {
  7.  
  8. private:
  9.  
  10. struct Node {
  11. T info;
  12. Node* next;
  13. Node* prev;
  14. };
  15. T hola;
  16. Node* act;
  17. int s;
  18.  
  19. public:
  20.  
  21. clist();
  22.  
  23. ~clist();
  24.  
  25. // Returns the element pointed by act
  26. T elem() const;
  27.  
  28. // Returns the number of elements of the circular list
  29. int size() const;
  30.  
  31. // Returns true if there isn't any element in the list. False otherwise
  32. bool empty() const;
  33.  
  34. // Overloaded = operator
  35. clist& operator=(const clist& cl);
  36.  
  37. // Insert element inf before the element pointed by act
  38. void insert(const T& inf);
  39.  
  40. // Erases the element pointed by act from the list
  41. void erase();
  42.  
  43. // Makes act := act->next
  44. void operator++();
  45.  
  46. // Makes act := act->prev
  47. void operator--();
  48.  
  49. // Makes act point to a random element of the list
  50. void rand_sel();
  51.  
  52. };
  53.  
  54. #include "clist.cpp"
  55.  

Si alguien quiere la implementación de las funciones (clist.cpp), ya me lo hará saber. No lo pongo aquí para no hacer el post demasiado largo.

De hecho, he utilizado este mismo método para hacer un pequeño buscaminas y decidir en que casillas estarán las minas ^^. Aunque, de todas formas, lo más eficiente en tiempo es lo del vector de booleanos.

Saludos.

PS: por cierto, un detalle. No hace falta que cambies la semilla en cada iteración. No ganas casi nada y pierdes tiempo. Es mejor hacer el srand al principio del programa y ya está.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 21 Marzo 2012, 21:04 pm
haber ponlo aquí no te preocupes por el tamaño del post. Ahora mismo estoy haciendo un diseño que valga para el sudoku :) y estoy usando un método  bas de unos cuantos if que comprueba en el cuadrante que esta Y.X cada vez para que no haya ningun número similar ni el fila ni el la columna ni en el cuadrante.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Xandrete en 21 Marzo 2012, 22:57 pm
Bien. Aquí la implementación:

Código
  1. #include <cstdlib>
  2. #include <ctime>
  3. using namespace std;
  4.  
  5. template <class T>
  6. clist<T>::clist() {
  7. srand(time(NULL));
  8. act = NULL;
  9. s = 0;
  10. }
  11.  
  12. template <class T>
  13. clist<T>::~clist() {
  14. while (act != NULL) erase();
  15. }
  16.  
  17. template <class T>
  18. T clist<T>::elem() const {
  19. return act->info;
  20. }
  21.  
  22. template <class T>
  23. int clist<T>::size() const {
  24. return s;
  25. }
  26.  
  27. template <class T>
  28. bool clist<T>::empty() const {
  29. return s == 0;
  30. }
  31.  
  32. template <class T>
  33. clist<T> &clist<T>::operator=(const clist& cl) {
  34. while (act != NULL) erase();
  35. if (cl.act != NULL) {
  36. insert(cl.act->info);
  37. Node* aux = cl.act->next;
  38. while (aux != cl.act) {
  39. insert(aux->info);
  40. aux = aux->next;
  41. }
  42. s = cl.s;
  43. }
  44. return *this;
  45. }
  46.  
  47. template <class T>
  48. void clist<T>::insert(const T& inf) {
  49. Node* n = new Node;
  50. n->info = inf;
  51. if (act != NULL) {
  52. n->next = act;
  53. n->prev = act->prev;
  54. act->prev->next = n;
  55. act->prev = n;
  56. }
  57. else {
  58. n->next = n;
  59. n->prev = n;
  60. act = n;
  61. }
  62. ++s;
  63. }
  64.  
  65. template <class T>
  66. void clist<T>::erase() {
  67. if (act != NULL) {
  68. if (act == act->next) {
  69. delete act;
  70. act = NULL;
  71. }
  72. else {
  73. act->next->prev = act->prev;
  74. act->prev->next = act->next;
  75. Node* aux = act->prev;
  76. delete act;
  77. act = aux;
  78. }
  79. --s;
  80. }
  81. }
  82.  
  83. template <class T>
  84. void clist<T>::operator++() {
  85. if (act != NULL) act = act->next;
  86. }
  87.  
  88. template <class T>
  89. void clist<T>::operator--() {
  90. if (act != NULL) act = act->prev;
  91. }
  92.  
  93. template <class T>
  94. void clist<T>::rand_sel() {
  95. if (s > 0) {
  96. int r = rand()%s;
  97. while (r--) act = act->next;
  98. }
  99. }
  100.  

Quiero aclarar que esta clase no la he hecho sólo para esto.

¡Saludos!


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 21 Marzo 2012, 23:53 pm
Gran código has puesto desde luego le voy a echar mi tiempo para verlo y aprenderlo puesto que he visto mientras bajaba la pantalla para darle a responder clases XD.

Aquí pongo el código que buscaba terminado, aunque me decepciona puesto que Xeracker, ya lo había echo antes  y con 14 años xD.
Es para generar sudoku

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. using namespace std;
  5. int lista[10][10];
  6. int num=0;
  7. void Generator(){;
  8.    srand(time(0));
  9.    for(int y=1;y<10;y++){
  10.        for(int x=1;x<10;x++){
  11.            int c=0;
  12.            for(bool ok=false ;ok==false;c++){
  13.                num=0;ok=true;
  14.                while(num==0)num=rand()%10;
  15.                for(int i=x;i>0;i--)if(lista[y][i]==num)ok=false;
  16.                for(int i=y;i>0;i--)if(lista[i][x]==num)ok=false;
  17.                if((y%3==2) && (x%3==1) && ((num==lista[y-1][x+1]) || (num==lista[y-1][x+2]) ))ok=false;
  18.                if((y%3==2) && (x%3==2) && ((num==lista[y-1][x-1]) || (num==lista[y-1][x+1]) ))ok=false;
  19.                if((y%3==2) && (x%3==0) && ((num==lista[y-1][x-2]) || (num==lista[y-1][x-1]) ))ok=false;
  20.                if((y%3==0) && (x%3==1) && ((num==lista[y-2][x+1]) || (num==lista[y-2][x+2]) || (num==lista[y-1][x+1]) || (num==lista[y-1][x+2])))ok=false;
  21.                if((y%3==0) && (x%3==2) && ((num==lista[y-2][x-1]) || (num==lista[y-2][x+1]) || (num==lista[y-1][x-1]) || (num==lista[y-1][x+1])))ok=false;
  22.                if((y%3==0) && (x%3==0) && ((num==lista[y-2][x-2]) || (num==lista[y-2][x-1]) || (num==lista[y-1][x-2]) || (num==lista[y-1][x-1])))ok=false;
  23.  
  24.                if(c==50){
  25.                    x=1;
  26.                    y=1;
  27.                }
  28.            }
  29.            lista[y][x]=num;
  30.        }
  31.    }
  32. }
  33. int main(int argc,char *argv[]){
  34.    Generator();
  35.    //////////////////////////////////////
  36.    //// IMPRIMIR /////////////////////////
  37.    for(int y=1;y<10;y++){
  38.        cout << "\nLine -> ";
  39.        for(int x=1;x<10;x++){
  40.            cout << lista[y][x] << "-";
  41.        }
  42.    }
  43.    return 0;
  44. };

Que !! bonito queda .
(http://img35.imageshack.us/img35/6729/mysudok.png) (http://imageshack.us/photo/my-images/35/mysudok.png/)

Haber si mañana ya termino este proyecto :) .


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Xandrete en 22 Marzo 2012, 10:47 am
Claro, es bastante código. Pero ten en cuenta que es la implementación completa de una lista circular. Cuando usas los vectores o las listas de la STL es verdad que tu programa queda muy bonito y tal, pero detrás está la implementación de esas clases que es mucho más grande y compleja que ésta (que, en comparación, es bastante simplona).

Suerte con el proyecto  ;D

¡Saludos, jefe!


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: maxim_o en 24 Marzo 2012, 01:24 am
Estaba viendo el post, e intente generar los numeros aleatorios, estilo como el sudoku en una matriz que no se repitan en filas y columnas para ir cogiendo practica otra vez pero puff algo no funciona, se mete en un bucle infinito o algo y no se por que :(


Código:
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define TAM 9
using namespace std;
bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j );
int main(int argc , char *argv[]){
srand((unsigned)time(NULL));
int aleatorio,matriz[TAM][TAM];
bool norepite=false;
for (int i=0;i<TAM;i++)
{
for(int j=0;j<TAM;j++){
do{
aleatorio=rand()%9+1;
norepite=repite(aleatorio , matriz , i , j);
}while(norepite!=true);
matriz[i][j]=aleatorio;
}

}
for (int i=0;i<TAM;i++){
for(int j=0;j<TAM;j++)
cout << " " << matriz[i][j];
cout << "\n";
}
return 0;
}

bool repite (int aleatorio , int matriz[TAM][TAM] , int i, int j){

int cont=0;


for(int p=0;p<TAM;p++)
if(matriz[p][j]!=aleatorio){
cont++;
}
for(int p=0;p<TAM;p++)
if(matriz[i][p]!=aleatorio)
cont++;

if(cont==18)
return true;

return false;


}

Por cierto, como añadir las librerias estandar de c/c++ en qt creator, cuando escribo el código ahi, me dice que no estan en el directorio, como puedo añadirlas (el g++ si compila)? Gracias de Antemano


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 25 Marzo 2012, 01:43 am
El problema se deberá a que en un punto del bucle se genera siempre el mismo numero entonces no puede pasar por que ya existe en la array el número. eso creo yo, no he mirado tu código pero me paso muchas veces :)


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: maxim_o en 25 Marzo 2012, 06:58 am
Si, algo de eso tiene que ser pero pufff no se por que  :(
No encuentro la solucion por mas que le doy vueltas , sigo viendo "lógico" el codigo aunque igual esté mal implementado o mal echo y no "haga" lo que pienso....


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 25 Marzo 2012, 16:51 pm
No se C++ pero desde hace tiempo he visto codigos aca en el foro y nunca vi que pongan como pusiste vos:

bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j );

Asi, como declarando la funcion y luego la dejas abajo con su cuerpo. Si fue esa linea la que hiciste mal entonces es que te esta tomando esa linea como la funcion "repite" y entonces devolvera falso siempre, lo que entonces no terminara mas el bucle do-while que hiciste luego.

Si estoy equivocado quiero que me expliquen el porque de "declarar" la funcion antes.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: maxim_o en 25 Marzo 2012, 21:04 pm
Pues esa linea creo que está bien (la declaracion)
En C/C++ las funciones deben estar declaradas antes del main.
Esto se debe a que el compilador entra en el main y llega a la funcion y no la conoce entonces da error.
Al estar declarada le estás diciendo al compilador que esa función está.
Si la funcion la pones antes del main no hace falta declararla....

Creo que esto es así, si me equivoco, retifiquenme please!


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 25 Marzo 2012, 22:58 pm
Esque si, eso lo he visto a lo que dices, pero hace la prueba, quita esa linea que dije y copia tu funcion "repite" con todo el cuerpo y ponela antes del main y ahi si compila y corre la aplicacion a ver si por lo menos deja de entrar en un bucle infinito, si es asi, tengo razon.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: maxim_o en 26 Marzo 2012, 00:04 am
Pasa exactamente lo mismo, no es el problema de la declaracion de la funcion y el cuerpo de la funcion.
Eliminando la declaracion y poniendo la funcion antes del main pasa lo mismo ...


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 26 Marzo 2012, 16:57 pm
No se C++ pero desde hace tiempo he visto codigos aca en el foro y nunca vi que pongan como pusiste vos:

bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j );

Asi, como declarando la funcion y luego la dejas abajo con su cuerpo. Si fue esa linea la que hiciste mal entonces es que te esta tomando esa linea como la funcion "repite" y entonces devolvera falso siempre, lo que entonces no terminara mas el bucle do-while que hiciste luego.

Si estoy equivocado quiero que me expliquen el porque de "declarar" la funcion antes.
me acabo de dar cuenta de lo que dices XD nunca he visto esto de blabla
  • como parametro


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: maxim_o en 26 Marzo 2012, 19:01 pm
A que te refieres?¿ O_o


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 27 Marzo 2012, 13:40 pm
a esto XD
bool repite (int aleatorio , int matriz[TAM][TAM] , int i , int j );


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 27 Marzo 2012, 14:23 pm
Alguien que sepa C++ y nos venga a retar de que hablamos sin saber y nos explique esto?


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: Xandrete en 27 Marzo 2012, 22:34 pm
Alguien que sepa C++ y nos venga a retar de que hablamos sin saber y nos explique esto?

No es difícil de entender. La declaración de la función en la que no se especifica el cuerpo de la misma (hablando en plan rudo, la que acaba en punto y coma) se llama prototipo. Se utilizan mucho cuando se quiere separar la implementación de la especificación. Por ejemplo, imagínate que tienes una función foo(). En C/C++ puedes tener la definición de la función en un archivo, junto a una descripción exhaustiva de su comportamiento (precondiciones, postcondiciones, invariantes, análisis de eficiencia, justificación, etc) y en otro fichero puedes tener el código de la función, que puedes ir cambiando para mejorar (o empeorar, según lo que hagas) cosas. La función hace siempre lo mismo, lo que cambia es la manera en que lo hace. Otra utilidad de la declaración de prototipos es cuando tienes dos funciones que se llaman la una a la otra. Por ejemplo:

Código
  1. int spam(int n) {
  2. return n+foo(n-2);
  3. }
  4.  
  5. int foo(int n) {
  6. return n+spam(n-1);
  7. }

Si intentaras compilar un programa con estas funciones, obtendrías un error. Cuando  foo llama a spam, este ya está definido. Sin embargo, no sucede lo mismo cuando spam llama a foo (la declaración de la función está más abajo). Esto se soluciona añadiendo el prototipo de la función foo antes de spam:

Código
  1. int foo(int n);
  2.  
  3. int spam(int n) {
  4. return n+foo(n-2);
  5. }
  6.  
  7. int foo(int n) {
  8. return n+spam(n-1);
  9. }

Como ves, en la mayoría de las situaciones, no hace falta declarar los prototipos antes de definir el cuerpo de la función. La única tesitura en que es necesario es en la que te he descrito anteriormente. Por lo demás, puedes hacerlo o no (depende del procedimiento y el estilo que estilo sigas a la hora de programar, y de si documentas o no tus programas).

Saludos


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: $Edu$ en 27 Marzo 2012, 22:48 pm
Gracias, entonces maxim_o, te toca debuggear bien el codigo para ver si tu codigo hace lo que tiene que hacer o no. Yo deje una forma de hacer los numeros aleatorios sin repetir, es cosa de crear la funcion y luego modificar el vector por partes.


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: maxim_o en 2 Abril 2012, 14:58 pm
Ya, a ver ahora con las vacaciones que tengo mas tiempo saco el fallito, que seguro que es alguna tonteria que pase por alto o similar!
Gracias a todos!


Título: Re: [C++][Opiniones] Qué os parece esta forma de generar números aleatorios?
Publicado por: anonimo12121 en 3 Abril 2012, 12:04 pm
Yo en cuanto termine mi web os la pongo para que veáis que pro me ha quedado mi primera versión del sudöku. (gráfico)