{"id":1121,"date":"2021-08-11T10:10:09","date_gmt":"2021-08-11T13:10:09","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=1121"},"modified":"2021-08-11T10:10:12","modified_gmt":"2021-08-11T13:10:12","slug":"solicitacao-de-algoritmo-5","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/solicitacao-de-algoritmo-5\/","title":{"rendered":"Solicita\u00e7\u00e3o de algoritmo 5"},"content":{"rendered":"\n<p>Nessa solicita\u00e7\u00e3o de algoritmo feita por Neidson Jr, o enunciado \u00e9 simples, embora a solu\u00e7\u00e3o nem tanto.<\/p>\n\n\n\n<p>Enunciado: desenvolver um algoritmo que receba valores aleat\u00f3rios entre -20 at\u00e9 20&nbsp;e atrav\u00e9s de uma fun\u00e7\u00e3o preencha uma matriz de inteiros 8&#215;3. Retorne quantas vezes aparecer o n\u00famero dois.<\/p>\n\n\n\n<p>O algoritmo que ele me enviou segue a seguir. Veja que <em>while <\/em>iniciado na linha 14 \u00e9 desnecess\u00e1rio, uma vez que, desde o primeiro teste efetuado, o resultado ser\u00e1 <em>false <\/em>e o la\u00e7o de repeti\u00e7\u00e3o nunca executar\u00e1 (20 nunca ser\u00e1 menor do que -20).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n\nint main(void) {\n    int k, l, i, j, min, max,intervalo;\n    k=8;\n    l=3;\n    float mat[k][l];\n\n    \/\/preenche a matriz em um intervalo de -20 ate 20\n    printf(\"Com intervalo de -20 ate 20. \\n\");\n    min=-20;\n    max=20;\n    while (max &lt; min) {\n        printf(\"Intervalo invalido. Digite novos valores: \\n\");\n        scanf(\"%i%i\", &amp;min, &amp;max);\n    }\n\n    intervalo = max - min;\n    printf(\"O tamanho do intervalo e de: %i \\n\", intervalo);\n\n    \/\/registra o valor do intervalo aleatorio\n    for (i = 0; i &lt; k; i++) {\n        for (j = 0; j &lt; l; j++) {\n            mat[i][j] = rand()%intervalo + min;\n        }\n    }\n\n    \/\/mostra a matriz\n    for (i = 0; i &lt; k; i++) {\n        for (j = 0; j &lt; l; j++) {\n            printf(\"%.1f \", mat[i][j]);\n        }\n        printf(\"\\n\");\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n\n\n\n<p>Na linha 25 a matriz \u00e9 preenchida com os valores aleat\u00f3rios. O valor da vari\u00e1vel intervalo \u00e9 definido na linha 19 e ter\u00e1 o valor 40. Com isso,  rand()%intervalo  gerar\u00e1 valores entre 0 e 39. A soma com -20 transformar\u00e1 o intervalo de valores para entre -20 e 19. Veja que n\u00e3o atende realmente o enunciado, por isso \u00e9 preciso ajuste na linha 19 (existem 41 valores no intervalo [-20,20]: 20 valores positivos + 20 valores negativos + o zero).<\/p>\n\n\n\n<p>Outro detalhe importante \u00e9 que a matriz estar\u00e1 sendo preenchida com valores aleat\u00f3rios, mas se o algoritmo executar v\u00e1rias vezes consecutivas, os valores sempre ser\u00e3o os mesmo. Com isso \u00e9 importante plantar a semente para gerar novos n\u00fameros aleat\u00f3rios. Isso \u00e9 feito com a fun\u00e7\u00e3o <em>srand()<\/em>.<\/p>\n\n\n\n<p>Abaixo segue o c\u00f3digo com os ajustes comentados. Tamb\u00e9m aproveitei e fiz a atribui\u00e7\u00e3o de alguns valores j\u00e1 na declara\u00e7\u00e3o das vari\u00e1veis (apenas para economizar algumas linhas). O enunciado tamb\u00e9m pedia uma matriz de inteiros, ent\u00e3o alterei tamb\u00e9m o c\u00f3digo nessa quest\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;time.h>\n\nint main(void) {\n    srand(time(NULL));\n    int k=8, l=3, i, j, min=-20, max=20,intervalo;\n    int mat[k][l];\n\n    intervalo = max - min + 1;\n    printf(\"O tamanho do intervalo e de: %i \\n\", intervalo);\n\n    \/\/registra o valor do intervalo aleatorio\n    for (i = 0; i &lt; k; i++) {\n        for (j = 0; j &lt; l; j++) {\n            mat[i][j] = rand()%intervalo + min;\n        }\n    }\n\n    \/\/mostra a matriz\n    for (i = 0; i &lt; k; i++) {\n        for (j = 0; j &lt; l; j++) {\n            printf(\"%i \", mat[i][j]);\n        }\n        printf(\"\\n\");\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n\n\n\n<p>Veja que o Neidson conseguiu fazer a primeira parte do algoritmo. Vou fazer outra parte, para identificar quantas vezes aparece o n\u00famero 2 na matriz.<\/p>\n\n\n\n<p>Essa parte \u00e9 bastante simples e o trecho de c\u00f3digo a seguir deve ser adicionado depois de ter mostrado a matriz (antes do <em>return 0<\/em>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">    \/\/conta quantos 2\n    int cont=0;\n    for (i = 0; i &lt; k; i++) {\n        for (j = 0; j &lt; l; j++) {\n            if (mat[i][j] == 2) {\n                cont++;\n            }\n        }\n    }\n    printf(\"Qtde de dois: %i\", cont);<\/code><\/pre>\n\n\n\n<p>Outro detalhe importante no enunciado \u00e9 que ele pediu para a solu\u00e7\u00e3o ser feita utilizando fun\u00e7\u00f5es. O preenchimento da matriz por uma fun\u00e7\u00e3o est\u00e1 expl\u00edcito, enquanto a contagem est\u00e1 impl\u00edcito pelo pedido de retornar a quantidade de n\u00fameros dois. O c\u00f3digo alterado para o uso da fun\u00e7\u00f5es \u00e9 mostrado abaixo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;time.h>\n\n#define LIN 3\n#define COL 5\n\n\/\/preenche a matriz\nvoid preencheMatriz(int mat[LIN][COL]) {\n    srand(time(NULL));\n    int i, j, min=-20, max=20;\n    int intervalo = max - min + 1;\n    printf(\"O tamanho do intervalo e de: %i \\n\", intervalo);\n\n    \/\/registra o valor do intervalo aleatorio\n    for (i = 0; i &lt; LIN; i++) {\n        for (j = 0; j &lt; COL; j++) {\n            mat[i][j] = rand()%intervalo + min;\n        }\n    }\n}\n\n\/\/conta numeros dois\nint contaRepeticao(int lin, int col, int mat[lin][col], int num) {\n    int i, j, cont=0;\n    for (i = 0; i &lt; lin; i++) {\n        for (j = 0; j &lt; col; j++) {\n            if (mat[i][j] == num) {\n                cont++;\n            }\n        }\n    }\n    return cont;\n}\n\nint main(void) {\n\n    int k=COL, l=LIN, i, j;\n    int mat[k][l];\n\n    preencheMatriz(mat);\n\n    \/\/mostra a matriz\n    for (i = 0; i &lt; k; i++) {\n        for (j = 0; j &lt; l; j++) {\n            printf(\"%i \", mat[i][j]);\n        }\n        printf(\"\\n\");\n    }\n\n    printf(\"Qtde de dois: %i\", contaRepeticao(LIN,COL,mat,2));\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Na fun\u00e7\u00e3o para preenchimento da matriz fiquei com um pouco de pregui\u00e7a e n\u00e3o fiz bons ajustes, mas no de contagem de repeti\u00e7\u00e3o me dediquei um pouco mais. Veja que a fun\u00e7\u00e3o <em>contaRepeticao()<\/em> est\u00e1 gen\u00e9rica e funcionar\u00e1 para qualquer tamanho de matriz e para contar qualquer valor passado por par\u00e2metro. Por conta de deixar a fun\u00e7\u00e3o  <em>contaRepeticao()<\/em> gen\u00e9rica, a quantidade de par\u00e2metros ficou extensa (preciso dizer inicialmente o tamanho da matriz com a quantidade de linhas e colunas, e tamb\u00e9m preciso dizer ao final qual o valor que deve ser contado), n\u00e3o bastando apenas dizer qual a matriz, como fiz no caso da fun\u00e7\u00e3o <em>preencheMatriz()<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nessa solicita\u00e7\u00e3o de algoritmo feita por Neidson Jr, o enunciado \u00e9 simples, embora a solu\u00e7\u00e3o nem tanto. Enunciado: desenvolver um algoritmo que receba valores aleat\u00f3rios entre -20 at\u00e9 20&nbsp;e atrav\u00e9s de uma fun\u00e7\u00e3o preencha uma matriz de inteiros 8&#215;3. Retorne quantas vezes aparecer o n\u00famero dois. O algoritmo que ele me enviou segue a seguir. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3,58],"tags":[12,13,8,52],"class_list":["post-1121","post","type-post","status-publish","format-standard","hentry","category-c","category-codigo-com-analise","tag-funcao","tag-matriz","tag-modularizacao-funcoes","tag-solicitacao-de-algoritmo"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=1121"}],"version-history":[{"count":4,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1121\/revisions"}],"predecessor-version":[{"id":1125,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1121\/revisions\/1125"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=1121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=1121"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=1121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}