{"id":814,"date":"2020-04-16T18:05:22","date_gmt":"2020-04-16T21:05:22","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=814"},"modified":"2021-06-18T11:03:12","modified_gmt":"2021-06-18T14:03:12","slug":"solicitacao-algoritmo4","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/solicitacao-algoritmo4\/","title":{"rendered":"Solicita\u00e7\u00e3o de algoritmo 4"},"content":{"rendered":"\n<p>Solicita\u00e7\u00e3o recebida de Caio da Silva Caetano. O problema encontrado no c\u00f3digo dele \u00e9 que a execu\u00e7\u00e3o do c\u00f3digo n\u00e3o gerava a m\u00e9dia correta. Segue o enunciado e o c\u00f3digo enviado.<\/p>\n\n\n\n<p><strong>Enunciado:<\/strong> fazer um programa para obter o nome e as 2 notas dos 28 alunos de uma turma. As notas ser\u00e3o informadas pelo professor. O programa deve calcular a m\u00e9dia das 2 notas de cada aluno e exibir &#8220;Aprovado&#8221; caso a m\u00e9dia seja igual ou superior a 7.0 e reprovado, caso contr\u00e1rio. Armazenar os valores em vari\u00e1vel vetorial.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n#include &lt;stdlib.h&gt;\nchar vetor [3][3][28];\nint main(void) {\n    float nota1;\n    float nota2;\n    float media;\n    int i,j;\n    char nome[28];\n    for(i=0;i&lt;3;i++){\n        printf(\"\\nEntre com o nome do aluno: \");\n        fflush(stdin);\n        gets(vetor[i][0]);\n        for(j=1;j&lt;3;j++){\n            printf(\"Informe a %da. nota:\",j);\n            fflush(stdin);\n            gets(vetor[i][j]);\n        }\n    }\n    for(i=0;i&lt;3;i++){\n        nota1=atof(vetor[i][1]);nota2=atof(vetor[i][2]);;\n        media = (nota1 + nota2 ) \/ 2;\n        printf(\"\\nMedia final = %.2f\", media);\n        if (media &gt;= 7.0)\n            printf(\" ( aluno %s aprovado ).\",vetor[i][0]);\n        else if ((media &gt;= 4.0) &amp;&amp; (media &lt; 7.0))\n            printf(\" ( aluno %s em recuperacao ).\",vetor[i][0]);\n        else\n            printf(\" ( aluno %s reprovado ).\",vetor[i][0]);\n    }\n    getch();\n}<\/code><\/pre>\n\n\n\n<p>O c\u00f3digo enviado mostra que foi pensado em utilizar uma matriz tridimensional para armazenar os alunos e suas notas. Como a matriz somente pode ser de um tipo e ela armazena dados num\u00e9ricos e alfanum\u00e9ricos, foi decidido corretamente em criar uma matriz de caracteres. Obviamente, ao armazenar os n\u00fameros nela, foi necess\u00e1rio fazer a convers\u00e3o deles posteriormente para os c\u00e1lculos.<\/p>\n\n\n\n<p>Aqui vem uma primeira recomenda\u00e7\u00e3o. A matriz criada \u00e9 3x3x28 e fica \u00f3bvio que uma dimens\u00e3o de tamanho 3 \u00e9 para guardar as 2 notas e o nome do aluno, outra dimens\u00e3o de tamanho 3 \u00e9 porque o algoritmo cumpre o enunciado apenas para 3 alunos (e n\u00e3o 28 como \u00e9 pedido) e a dimens\u00e3o de tamanho 28 se refere ao tamanho m\u00e1ximo do nome do aluno. Veja que esse tamanho 28 se confunde com o n\u00famero de alunos do enunciado e por isso eu colocaria outro valor (eu coloquei o tamanho 30 no meu c\u00f3digo). Tamb\u00e9m recomendo especificar o n\u00famero de alunos como uma constante, para depois alterar somente o valor da constante e ter o meu c\u00f3digo funcionando para 3 alunos durante os testes e 28 alunos para a conclus\u00e3o do algoritmo.<\/p>\n\n\n\n<p>Outra coisa \u00e9 o uso da fun\u00e7\u00e3o gets(). \u00c9 comum os compiladores mostrarem um <em>warning <\/em>ao utilizar essa fun\u00e7\u00e3o. Isso porque, se for informado um nome maior do que o definido (no caso, um nome com mais de 27 letras &#8211; isso porque o \u00faltimo caractere de uma string deve ser o &#8216;\\0&#8217;), isso gerar\u00e1 um overflow do buffer (estouro de buffer). Uma fun\u00e7\u00e3o alternativa e que previne essa possibilidade de falha \u00e9 a fun\u00e7\u00e3o fgets(). Muitos usam a fun\u00e7\u00e3o gets() porque aparece em material mais antigo sobre a linguagem C e tamb\u00e9m porque precisa receber apenas de um par\u00e2metro (no caso, a vari\u00e1vel a ser lida), mas a fgets() n\u00e3o \u00e9 t\u00e3o mais dif\u00edcil de utilizar.<\/p>\n\n\n\n<p>Para a fun\u00e7\u00e3o fgets(), informe a vari\u00e1vel string a ser lida, o tamanho da string a ser lida e, considerando a entrada padr\u00e3o (normalmente o teclado), o par\u00e2metro <em>stdin<\/em>. No c\u00f3digo do caso ficar\u00e1 fgets(vetor[i][0], 29, stdin). Lembrando que o tamanho 29 \u00e9 porque o tamanho da vari\u00e1vel para o nome est\u00e1 em \u00e9 30, mas \u00e9 preciso deixar um caractere para receber o &#8216;\\0&#8217;.<\/p>\n\n\n\n<p>Veja que eu inicialmente fiz recomenda\u00e7\u00f5es de melhorias. Agora vamos falar sobre o erro. Veja que no c\u00f3digo foi corretamente utilizada a fun\u00e7\u00e3o atof() para converter a string no n\u00famero. <\/p>\n\n\n\n<p>Alterando o c\u00f3digo para funcionar com a constante e a fun\u00e7\u00e3o fgets() teremos pouca diferen\u00e7a do anterior, mas ele segue a seguir. Eu tamb\u00e9m tirei a vari\u00e1vel de nome vetor do escopo global e coloquei no escopo local porque n\u00e3o faz sentido ela no escopo global.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n#include &lt;stdlib.h&gt;\n\n#define ALUNOS 3\n\nint main(void) {\n    float nota1;\n    float nota2;\n    float media;\n    char vetor [ALUNOS][3][30];\n    int i,j;\n    \/\/char nome[30];  --remover porque n\u00e3o \u00e9 utilizada\n    for(i=0;i&lt;ALUNOS;i++){\n        printf(\"\\nEntre com o nome do aluno: \");\n        fflush(stdin);\n        fgets(vetor[i][0],29,stdin);\n        for(j=1;j&lt;3;j++){\n            printf(\"Informe a %da. nota:\",j);\n            fflush(stdin);\n            fgets(vetor[i][j],5,stdin); \/\/pensando na entrada 09.55\n        }\n    }\n    for(i=0;i&lt;ALUNOS;i++){\n        nota1=atof(vetor[i][1]);\n        nota2=atof(vetor[i][2]);;\n        media = (nota1 + nota2 ) \/ 2;\n        printf(\"\\nMedia final = %.2f\", media);\n        if (media &gt;= 7.0)\n            printf(\" ( aluno %s aprovado ).\",vetor[i][0]);\n        else\n            printf(\" ( aluno %s reprovado ).\",vetor[i][0]);\n    }\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Teste o c\u00f3digo em: <a rel=\"noreferrer noopener\" href=\"https:\/\/ideone.com\/yFRf93\" target=\"_blank\">https:\/\/ideone.com\/yFRf93<\/a><\/p>\n\n\n\n<p>Particularmente eu n\u00e3o teria utilizado a solu\u00e7\u00e3o com a matriz tridimensional e sim com uma matriz para notas e outra para os nomes. Isso porque a estrutura tridimensional vai ser subutilizada. Para cada nota ser\u00e3o alocados 30 caracteres, sendo que 6 seria o m\u00e1ximo poss\u00edvel para elas. Al\u00e9m disso \u00e9 preciso fazer a convers\u00e3o de string para n\u00famero o que, embora seja somente usar uma fun\u00e7\u00e3o, possui custo computacional associado. O c\u00f3digo abaixo mostra essa op\u00e7\u00e3o de codifica\u00e7\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n#include &lt;stdlib.h&gt;\n \n#define ALUNOS 3\n \nint main(void) {\n    float notas[ALUNOS][2], media;\n    char  nomes[ALUNOS][30];\n    int i,j;\n    for(i=0;i&lt;ALUNOS;i++){\n        printf(\"\\nEntre com o nome do aluno: \");\n        fgets(nomes[i],29,stdin);\n        for(j=0;j&lt;2;j++){\n            printf(\"Informe a %da. nota:\", j);\n            scanf(\"%f \", &amp;notas[i][j]);\n        }\n    }\n    for(i=0;i&lt;ALUNOS;i++){\n        media = (notas[i][0] + notas[i][1]) \/ 2;\n        printf(\"\\nMedia final = %.2f\", media);\n        if (media &gt;= 7.0)\n            printf(\" ( aluno %s aprovado ).\",nomes[i]);\n        else\n            printf(\" ( aluno %s reprovado ).\",nomes[i]);\n    }\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Teste o c\u00f3digo em: <a rel=\"noreferrer noopener\" href=\"https:\/\/ideone.com\/wdsXif\" target=\"_blank\">https:\/\/ideone.com\/wdsXif<\/a><\/p>\n\n\n\n<p>Complementando a solu\u00e7\u00e3o proposta, segue a solu\u00e7\u00e3o utilizando fun\u00e7\u00f5es. Elaborei 3 fun\u00e7\u00f5es para a solu\u00e7\u00e3o, sendo uma para ler os dados, outra para calcular a m\u00e9dia de cada aluno e uma terceira para mostrar se aluno est\u00e1 aprovado ou reprovado.<\/p>\n\n\n\n<p>A fun\u00e7\u00e3o leituraDados() \u00e9 um copia e cola de um trecho da fun\u00e7\u00e3o main(). Essa fun\u00e7\u00e3o e a mostraAprovacao() s\u00e3o fun\u00e7\u00f5es que precisam receber as duas matrizes. <\/p>\n\n\n\n<p>A fun\u00e7\u00e3o calcularMedias() somente precisa receber a matriz com as notas. Veja que para as m\u00e9dias foi necess\u00e1rio aumentar uma coluna na matriz de notas. Isso porque a matriz agora armazena as duas notas do aluno e a m\u00e9dia das notas. Poderia ter feito o c\u00e1lculo das m\u00e9dias na fun\u00e7\u00e3o mostraAprovacao(), dispensando inclusive a coluna adicional na matriz de notas, mas preferi dessa forma para facilitar o entendimento de todo o c\u00f3digo (foi uma decis\u00e3o pessoal e tamb\u00e9m achei did\u00e1tico mostrar que a fun\u00e7\u00e3o calcularMedias() precisa de menos par\u00e2metros do que as demais). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n#include &lt;stdlib.h&gt;\n     \n#define ALUNOS 3\n    \nvoid leituraDados(char nomes[ALUNOS][30], float notas[ALUNOS][3]) {\n    int i,j;\n    for(i=0;i&lt;ALUNOS;i++){\n        printf(\"\\nEntre com o nome do aluno: \");\n        fgets(nomes[i],29,stdin);\n        for(j=0;j&lt;2;j++){\n            printf(\"Informe a %da. nota:\", j);\n            scanf(\"%f \", &amp;notas[i][j]);\n        }\n    }\n}        \n\nvoid calcularMedias(float notas[ALUNOS][3]) {\n    int i;\n    for(i=0;i&lt;ALUNOS;i++){\n        notas[i][2] = (notas[i][0] + notas[i][1]) \/ 2;\n    }\n}\n    \nvoid mostraAprovacao(char nomes[ALUNOS][30], float notas[ALUNOS][3]) {\n    int i;\n    for(i=0;i&lt;ALUNOS;i++){\n        printf(\"\\nMedia final = %.2f\", notas[i][2]);\n        if (notas[i][2] &gt;= 7.0)\n            printf(\" ( aluno %s aprovado ).\",nomes[i]);\n        else\n            printf(\" ( aluno %s reprovado ).\",nomes[i]);\n    }\n}\n    \nint main(void) {\n    float notas[ALUNOS][3], media;\n    char  nomes[ALUNOS][30];\n    \n    leituraDados(nomes, notas);\n    calcularMedias(notas);\n    mostraAprovacao(nomes, notas);\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Gosto sempre de destacar a vantagem na legibilidade do c\u00f3digo que o uso de fun\u00e7\u00f5es traz. Olhando para a fun\u00e7\u00e3o main(), fica claro ler o que o algoritmo faz.<\/p>\n\n\n\n<p>Teste o c\u00f3digo em: <a rel=\"noreferrer noopener\" href=\"https:\/\/ideone.com\/e6Se8c\" target=\"_blank\">https:\/\/ideone.com\/e6Se8c<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Solicita\u00e7\u00e3o recebida de Caio da Silva Caetano. O problema encontrado no c\u00f3digo dele \u00e9 que a execu\u00e7\u00e3o do c\u00f3digo n\u00e3o gerava a m\u00e9dia correta. Segue o enunciado e o c\u00f3digo enviado. Enunciado: fazer um programa para obter o nome e as 2 notas dos 28 alunos de uma turma. As notas ser\u00e3o informadas pelo professor. [&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":[60,52],"class_list":["post-814","post","type-post","status-publish","format-standard","hentry","category-c","category-codigo-com-analise","tag-exercicio-resolvido","tag-solicitacao-de-algoritmo"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/814","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=814"}],"version-history":[{"count":7,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/814\/revisions"}],"predecessor-version":[{"id":1035,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/814\/revisions\/1035"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=814"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}