De Outros

Matrizes e números aleatórios do Mac C ++

iBookG4user

Pôster original
27 de junho de 2006
Seattle, WA
  • 20 de setembro de 2009
Eles colocam os tutores de C ++ nos momentos mais inconvenientes da minha faculdade ... De qualquer forma, o instrutor postou as seguintes instruções:

'Escreva uma função que irá preencher um array com 25 números aleatórios entre 1 e 10. Em seguida, escreva uma função que irá imprimir o array. Escreva algum código em main para testar suas funções. Às vezes, esse código de teste é chamado de * driver

Não use variáveis ​​globais aqui. Passe a matriz para a função por meio da lista de parâmetros '

Meu código atual não resulta em nenhum erro no depurador, mas não produz a matriz. E não sei o que ele quis dizer com escrever o driver, o que devo testar? Todos vocês se mostraram extremamente úteis no passado e tenho certeza de que vão me ajudar a apontar a direção certa desta vez

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 janeiro de 2005


Dallas, TX
  • 20 de setembro de 2009
Algumas coisas: Seu array deve ser do tipo int [], não double []. Você precisa aceitar uma matriz int para produzir e imprimir. Você precisa declarar um int [] no main, passá-lo para produzir, preenchê-lo lá e depois passá-lo para impressão. o<< operator of ofstream does not deal with arrays as you'd hope, so you'll need to loop to display in print.

Além disso, e tenho certeza que é um erro honesto, tenho certeza que seu professor quis dizer pseudo- aleatória.

Além disso, em main, você está declarando new double () s, não invocando produzir e imprimir. Retire o duplo lá e passe um argumento conforme discutido acima e altere o tipo de retorno de ambos para nulo.

-Leitura

gnasher729

Suspenso
25 de novembro de 2005
  • 20 de setembro de 2009
Como você escreveria um protótipo de função para a função 'produzir'?
E como você escreveria uma chamada para a função 'produzir'?

E dentro de sua função 'principal', qual das duas você escreveu, um protótipo de função ou uma chamada de função?

iBookG4user

Pôster original
27 de junho de 2006
Seattle, WA
  • 20 de setembro de 2009
lee1210 disse: Algumas coisas: Seu array deve ser do tipo int [], não double []. Você precisa aceitar uma matriz int para produzir e imprimir. Você precisa declarar um int [] no main, passá-lo para produzir, preenchê-lo lá e depois passá-lo para impressão. o<< operator of ofstream does not deal with arrays as you'd hope, so you'll need to loop to display in print.

Além disso, e tenho certeza que é um erro honesto, tenho certeza que seu professor quis dizer pseudo- aleatória.

Além disso, em main, você está declarando new double () s, não invocando produzir e imprimir. Retire o duplo lá e passe um argumento conforme discutido acima e altere o tipo de retorno de ambos para nulo.

-Leitura

Ok, fiz as alterações que você sugeriu e o código parece mais lógico. Embora agora eu esteja recebendo três erros nos loops 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; }

Anexos

  • Captura de tela 20/09/2009 às 5.42.31 PM.png Captura de tela 20/09/2009 às 5.42.31 PM.png'file-meta '> 178,1 KB · Exibições: 1.941

lee1210

10 de janeiro de 2005
Dallas, TX
  • 20 de setembro de 2009
Altere o tipo de argumento de produto para int [] ou int *. No momento é apenas int, então você não pode usar [], etc. O mesmo vale para impressão. Além disso, você não precisa devolver nada do produto ou da impressão. Altere o tipo de retorno para nulo.

Acho que a intenção é que você retorne a chamada de impressão no principal, o que deve funcionar.

Além disso, quando você passa array para produzir, apenas use array e não * array.

-Leitura

iBookG4user

Pôster original
27 de junho de 2006
Seattle, WA
  • 20 de setembro de 2009
lee1210 disse: Altere o tipo de argumento de produto para int [] ou int *. No momento é apenas int, então você não pode usar [], etc. O mesmo vale para impressão. Além disso, você não precisa devolver nada do produto ou da impressão. Altere o tipo de retorno para nulo.

Acho que a intenção é que você retorne a chamada de impressão no principal, o que deve funcionar.

Além disso, quando você passa array para produzir, apenas use array e não * array.

-Leitura

Funcionou
Agora, você sabe o que ele quis dizer com escrever o código para testar as funções? O que ele quer dizer com isso? E muito obrigado por sua ajuda até agora!

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; }

chown 33

Moderador
Membro da equipe
9 de agosto de 2009
o plano abismal
  • 20 de setembro de 2009
iBookG4user disse: Agora, você sabe o que ele quis dizer com escrever o código para testar as funções? O que ele quer dizer com isso?

A especificação dizia que os números na matriz deveriam estar entre 1 e 10. Você poderia escrever um teste que confirme isso.

Ele também disse que os números deveriam ser aleatórios. Embora a aleatoriedade possa ser mais difícil de testar do que parece, a não aleatoriedade simples pode ser fácil de testar. O mais simples é confirmar que todos os números não têm o mesmo valor. Testes mais complexos de aleatoriedade usam análises estatísticas.

Outro teste que você pode escrever é confirmar se a função produz () retorna valores diferentes cada vez que é chamada. Esta é uma forma simples de análise estatística, ou seja, garantir que invocações consecutivas tenham resultados independentes.

Você também deve considerar a inicialização da matriz com valores inválidos conhecidos, como -1 ou 0, antes de chamar o produto (). Caso contrário, uma matriz local não inicializada pode já conter valores imprevisíveis, que um teste poderia interpretar como aleatórios mesmo se o produto () não fizer nada.

Como especificação, a descrição do trabalho é um tanto vaga. Por um lado, ele não especifica em quais testes ele deve passar. Acredite em mim, se você deixar para a maioria dos programadores a escolha dos testes de qualificação, é um grande erro. O código pode funcionar em apenas um caso, que foi o caso que o programador usou para desenvolver o código. Se isso parece loucura, posso garantir que aconteceu.

iBookG4user

Pôster original
27 de junho de 2006
Seattle, WA
  • 20 de setembro de 2009
Isso foi bastante simples, obrigado!
Isso funcionou muito bem:
Código: if (print(array) 10) // driver { cout << 'Numbers are not between 1 and 10!' << endl; } S

Sander

para
24 de abril de 2008
  • 21 de setembro de 2009
iBookG4user disse: Isso foi bastante simples, obrigado!
Isso funcionou muito bem:

Tente colocar um número 'inválido' em seu array (digamos, 11) e veja se esta função detecta isso.

iBookG4user

Pôster original
27 de junho de 2006
Seattle, WA
  • 21 de setembro de 2009
Sander disse: Tente colocar um número 'inválido' em seu array (digamos, 11) e veja se esta função detecta isso.

Eu temporariamente configurei o array para permitir números maiores que 10 e ele o detectou, obrigado S

Sander

para
24 de abril de 2008
  • 22 de setembro de 2009
iBookG4user disse: Eu configurei temporariamente o array para permitir números maiores que 10 e ele o detectou, obrigado

Mesmo que não seja o primeiro elemento da matriz ..?

Estou perguntando porque sua função print () (pelo menos a última versão mostrada neste tópico) retorna apenas o primeiro elemento da matriz (convertido em um duplo).