Otro

Matrices de Mac C ++ y números aleatorios

iBookG4user

Poster original
27 de junio de 2006
Seattle, WA
  • Sep 20, 2009
Pusieron a los tutores de C ++ en los momentos más inconvenientes en mi universidad ... De todos modos, el instructor publicó las siguientes instrucciones:

'Escribe una función que llene una matriz con 25 números aleatorios entre 1 y 10. Luego escribe una función que imprima la matriz. Escribe un código en main para probar tus funciones. A veces, este código de prueba se llama * controlador

No utilice aquí variables globales. Pase la matriz a la función a través de la lista de parámetros '

Mi código actual no da como resultado ningún error en el depurador, pero no genera la matriz. Y no sé qué quiere decir con escribir el controlador, ¿qué se supone que debo probar? Todos ustedes han demostrado ser de gran ayuda en el pasado y estoy seguro de que esta vez me ayudarán a orientarme en la dirección correcta.

Código: #include #include using namespace std; double print(double array); double produce(); int main() { double produce(); double print(); } double produce() { srand(time(0)); double array[25]; for(int i=0; i<25; i++) { array[i] = (rand()%10)+1; cout << array[i] << endl; } return *array; } double print (int array) { cout << array << endl; }

lee1210

10 de enero de 2005


Dallas, TX
  • Sep 20, 2009
Algunas cosas: su matriz debe ser de tipo int [], no doble []. Debe aceptar una matriz int para producir e imprimir. Debe declarar un int [] en main, pasarlo a producir, completarlo allí y luego pasarlo a imprimir. los<< operator of ofstream does not deal with arrays as you'd hope, so you'll need to loop to display in print.

Además, y estoy seguro de que es un error honesto, estoy seguro de que su profesor quiso decir seudo- aleatorio.

Además, en main, está declarando nuevos dobles (), sin invocar producir e imprimir. Quite el doble allí y pase un argumento como se discutió anteriormente, y cambie el tipo de retorno de ambos a void.

-Lee

gnasher729

Suspendido
25 de noviembre de 2005
  • Sep 20, 2009
¿Cómo escribiría un prototipo de función para la función 'producir'?
¿Y cómo escribirías una llamada a la función 'producir'?

Y dentro de su función 'principal', ¿cuál de las dos ha escrito, un prototipo de función o una llamada a función?

iBookG4user

Poster original
27 de junio de 2006
Seattle, WA
  • Sep 20, 2009
lee1210 dijo: Algunas cosas: su matriz debe ser de tipo int [], no doble []. Debe aceptar una matriz int para producir e imprimir. Debe declarar un int [] en main, pasarlo a producir, completarlo allí y luego pasarlo a imprimir. los<< operator of ofstream does not deal with arrays as you'd hope, so you'll need to loop to display in print.

Además, y estoy seguro de que es un error honesto, estoy seguro de que su profesor quiso decir seudo- aleatorio.

Además, en main, está declarando nuevos dobles (), sin invocar producir e imprimir. Quite el doble allí y pase un argumento como se discutió anteriormente, y cambie el tipo de retorno de ambos a void.

-Lee

Ok, hice los cambios que sugirió y el código parece más lógico. Aunque ahora recibo tres errores en los bucles for.

Código: #include #include using namespace std; double print(int array); double produce(int array); int main() { int array[25]; produce(*array); } double produce(int array) { srand(time(0)); for(int i=0; i<25; i++) { array[i] = (rand()%10)+1; cout << array[i] << endl; } print(array); } double print (int array) { for(int i=0; i<25; i++) { cout << array[i] << endl; } return array; }

Archivos adjuntos

  • Captura de pantalla 20-09-2009 a las 5.42.31 PM.png Captura de pantalla 20-09-2009 a las 5.42.31 PM.png'file-meta '> 178.1 KB · Vistas: 1,941

lee1210

10 de enero de 2005
Dallas, TX
  • Sep 20, 2009
Cambie el tipo de argumento de producir a int [] o int *. En este momento es solo int, por lo que no puede usar [], etc. Lo mismo ocurre con la impresión. Además, no es necesario que devuelva nada de productos o impresos. Cambie su tipo de devolución a anulado.

Creo que la intención es que vuelvas a llamar a print en main, lo que debería estar bien.

Además, cuando pase una matriz para producir, simplemente use matriz, no * matriz.

-Lee

iBookG4user

Poster original
27 de junio de 2006
Seattle, WA
  • Sep 20, 2009
lee1210 dijo: Cambie el tipo de argumento de produce a int [] o int *. En este momento es solo int, por lo que no puede usar [], etc. Lo mismo ocurre con la impresión. Además, no es necesario que devuelva nada de productos o impresos. Cambie su tipo de devolución a anulado.

Creo que la intención es que vuelvas a llamar a print en main, lo que debería estar bien.

Además, cuando pase una matriz para producir, simplemente use matriz, no * matriz.

-Lee

Funcionó
Ahora, ¿sabes lo que quiso decir con escribir el código para probar las funciones? ¿Qué quiere decir él con eso? ¡Y muchas gracias por tu ayuda hasta ahora!

Código: #include #include using namespace std; double print(int *array); double produce(int *array); int main() { int array[25]; produce(array); print(array); } double produce(int *array) { srand(time(0)); for(int i=0; i<25; i++) { array[i] = (rand()%10)+1; cout << array[i] << endl; } return *array; } double print (int *array) { for(int i=0; i<25; i++) { cout << array[i] << endl; } return *array; }

chown33

Moderador
Miembro del equipo
9 de agosto de 2009
el plano abismal
  • Sep 20, 2009
iBookG4user dijo: Ahora, ¿sabes lo que quiso decir con escribir el código para probar las funciones? ¿Qué quiere decir él con eso?

La especificación dice que los números en la matriz deben estar entre 1 y 10. Podría escribir una prueba que lo confirme.

También dijo que los números deben ser aleatorios. Si bien la aleatoriedad puede ser más difícil de probar de lo que parece, la simple no aleatoriedad puede ser fácil de probar. La más simple es confirmar que todos los números no tienen el mismo valor. Las pruebas de aleatoriedad más complejas utilizan análisis estadísticos.

Otra prueba que puede escribir es confirmar que la función produce () devuelve valores diferentes cada vez que se llama. Esta es una forma simple de análisis estadístico, es decir, garantizar que las invocaciones consecutivas tengan resultados independientes.

También debe considerar inicializar la matriz con valores no válidos conocidos, como -1 o 0, antes de llamar a produce (). De lo contrario, una matriz local no inicializada ya puede contener valores impredecibles, que una prueba podría interpretar como aleatorios incluso si produce () no hace nada en absoluto.

Como especificación, la declaración del trabajo es algo vaga. Por un lado, no especifica qué pruebas debe pasar. Créame, si deja que la mayoría de los programadores elijan las pruebas de calificación, es un gran error. El código puede funcionar en un solo caso, que fue el caso que el programador utilizó para desarrollar el código. Si eso parece una locura, les puedo asegurar que sucedió.

iBookG4user

Poster original
27 de junio de 2006
Seattle, WA
  • Sep 20, 2009
¡Eso fue bastante simple, gracias!
Esto funcionó de maravilla:
Código: if (print(array) 10) // driver { cout << 'Numbers are not between 1 and 10!' << endl; } S

Lijadora

a
24 de abril de 2008
  • Sep 21, 2009
iBookG4user dijo: ¡Eso fue bastante simple, gracias!
Esto funcionó de maravilla:

Intente poner un número 'inválido' en su matriz (digamos, 11) y vea si esta función detecta eso.

iBookG4user

Poster original
27 de junio de 2006
Seattle, WA
  • Sep 21, 2009
Sander dijo: Intente poner un número 'inválido' en su matriz (digamos, 11) y vea si esta función detecta eso.

Configuré temporalmente la matriz para permitir números superiores a 10 y lo detectó, gracias S

Lijadora

a
24 de abril de 2008
  • Sep 22, 2009
iBookG4user dijo: Configuré temporalmente la matriz para permitir números superiores a 10 y lo detectó, gracias

Incluso si no es el primer elemento de la matriz ...?

La razón por la que pregunto es porque su función print () (al menos la última versión que se muestra en este hilo) solo devuelve el primer elemento de la matriz (convertido en un doble).