{"id":746,"date":"2018-10-23T20:35:35","date_gmt":"2018-10-23T22:35:35","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=746"},"modified":"2021-06-18T14:58:53","modified_gmt":"2021-06-18T17:58:53","slug":"algoritmo-solicitado1","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/algoritmo-solicitado1\/","title":{"rendered":"Algoritmo solicitado 1"},"content":{"rendered":"\n<p>Esse algoritmo foi solicitado pela Jeanne e envolve a leitura de strings e seu armazenamento array (nesse caso, uma matriz). Respondi as d\u00favidas levantadas e tamb\u00e9m completei o algoritmo, avan\u00e7ando um pouco a solu\u00e7\u00e3o para o uso de estruturas, que se adequam bem ao problema.<\/p>\n\n\n\n<p>Um detalhe que somente percebi depois \u00e9 que a solicita\u00e7\u00e3o era para utilizar C++ e acabei utilizando a linguagem C. Os c\u00f3digos funcionar\u00e3o nas duas linguagens, apenas sendo necess\u00e1rio alterar as bibliotecas utilizadas.<\/p>\n\n\n\n<p><strong>O enunciado enviado foi o seguinte:<\/strong> &#8220;Construa um programa em C para armazenar o nome (string) e o sal\u00e1rio de certa quantidade de pessoas em um vetor. Seu algoritmo deve calcular e armazenar o novo sal\u00e1rio sabendo-se ocorreu um reajuste de 8% para sal\u00e1rios inferiores a R$1.500,00 e de 5% para sal\u00e1rios iguais ou superiores a este valor. A quantidade de pessoas deve ser previamente informada pelo usu\u00e1rio. O resultado dever\u00e1 ser impresso em um novo vetor.<\/p>\n\n\n\n<p>Eu tenho que usar, gets e puts. Estou fazendo uma tentativa, mas empaquei no vetor. Ele est\u00e1 inicializando com um valor e n\u00e3o estou achando o erro&#8221;.<\/p>\n\n\n\n<p><strong>Abaixo, o c\u00f3digo enviado pela solicitante:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n\nint qtdFunc=0;\nint main() {\n  printf(\"Informe a quantidade de funcionarios: \\n\\n\");\n  scanf(\"%i\", &amp;qtdFunc);\n\n  char nFunc[qtdFunc][100];\n  int i=0;\n\n  printf(\"Informe o nome do funcionario: \\n\");\n  for (i=0; i&lt;=qtdFunc;i=i++) {\n    \/\/ recebendo nomes funcion\u00e1rios\n    gets(nFunc[i]);\n    fflush(stdin);\n  }\n  for (i=0; i&lt;=qtdFunc;i=i++)\n    printf (\"Nome dos funcionarios:%d\\t %s\\n\", i+1, nFunc[i]); \n         \n  return(0);\n}<\/code><\/pre>\n\n\n\n<p>Primeiramente, na linha 4, n\u00e3o entendo o porque da necessidade de ter uma vari\u00e1vel global para o problema. Sendo assim, o primeiro passo \u00e9 transferir a declara\u00e7\u00e3o da vari\u00e1vel para dentro do escopo da fun\u00e7\u00e3o main().<\/p>\n\n\n\n<p>Outra quest\u00e3o menor \u00e9 o incremento aplicado na instru\u00e7\u00e3o <em>for<\/em>. N\u00e3o faz sentido usar &#8220;i=i++&#8221;. Com o opera\u00e7\u00e3o utilizada, se est\u00e1 atribuindo o valor da vari\u00e1vel <em>i<\/em> a ela mesmo e depois incrementado o valor em uma unidade. Deve ser utilizado apenas &#8220;i++&#8221; ou ent\u00e3o &#8220;i=i+1&#8221;.<\/p>\n\n\n\n<p>Outro cuidado com rela\u00e7\u00e3o ao <em>for<\/em> \u00e9 na condi\u00e7\u00e3o de parada. Considerando o valor 3 para a vari\u00e1vel qtdFunc, a condi\u00e7\u00e3o &#8220;i&lt;=qtdFunc&#8221; gerar\u00e1 4 itera\u00e7\u00e3o do <em>loop<\/em>&nbsp;(a itera\u00e7\u00e3o correr\u00e1 com os valores para <em>i<\/em> iguais a 0, 1, 2 e 3) e o correto \u00e9 fazer apenas 3. Com isso, a condi\u00e7\u00e3o deveria ser &#8220;i&lt;qtdFunc&#8221;.<\/p>\n\n\n\n<p>Para receber o nome dos funcion\u00e1rios, foi utilizado a fun\u00e7\u00e3o gets(). Essa fun\u00e7\u00e3o normalmente gera um <em>warning<\/em> &#8220;<em>the `gets&#8217; function is dangerous and should not be used<\/em>&#8221; e por isso recomendo utilizar outra fun\u00e7\u00e3o, a fgets(). Tudo bem que a quest\u00e3o pediu para utilizar gets(), mas isso acontece quando a quest\u00e3o foi elaborada muitos anos atr\u00e1s e n\u00e3o deve ter problema utilizar uma alternativa melhor.<\/p>\n\n\n\n<p>A fun\u00e7\u00e3o fgets() \u00e9 muitas vezes associada com a leitura de arquivos, mas pode ser utilizada em substitui\u00e7\u00e3o da gets(). A fun\u00e7\u00e3o fgets() permite incluir o caractere de nova linha e tamb\u00e9m especifica o tamanho m\u00e1ximo da string de entrada (esse \u00e9 o motivo do <em>warning<\/em> da fun\u00e7\u00e3o gets() que, por n\u00e3o permitir definir o tamanho m\u00e1ximo, pode causar um estouro de buffer). E veja bem, tanto a fgets() e gets() dispensam o uso de fflush(stdin), j\u00e1 que elas leem o caractere de nova linha.<\/p>\n\n\n\n<p>A fun\u00e7\u00e3o fgets() espera 3 par\u00e2metros: (1) a vari\u00e1vel de string que vai armazenar o valor; (2) o tamanho m\u00e1ximo da string, subtra\u00eddo de 1 por causa do &#8216;\\0&#8217;; e (3) valor <em>stdin<\/em>, para informar que \u00e9 para considerar a entrada do teclado.<\/p>\n\n\n\n<p>Veja tamb\u00e9m que na linha 7, para ler a quantidade de funcion\u00e1rios, eu adicionei um &#8220;\\n&#8221; junto com a m\u00e1scara para inteiro. Isso foi para que o enter pressionado ao digitar o n\u00famero n\u00e3o seja lido posteriormente como um nome de funcion\u00e1rio. Retire o &#8220;\\n&#8221; para perceber o problema e ver que um dois nomes ficar\u00e1 em branco.<\/p>\n\n\n\n<p><strong>Com as altera\u00e7\u00f5es, o c\u00f3digo ficar\u00e1 o seguinte:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n\nint main() {\n  int qtdFunc=0;\n  printf(\"Informe a quantidade de funcionarios: \\n\\n\");\n  scanf(\"%i\\n\", &amp;qtdFunc);\n\n  char nFunc[qtdFunc][100];\n  int i=0;\n\n  printf(\"Informe o nome do funcionario: \\n\");\n  for (i=0; i&lt;qtdFunc;i++) {\n    \/\/ recebendo nomes funcion\u00e1rios\n    fgets (nFunc[i], 99, stdin);\n  }\n  for (i=0; i&lt;qtdFunc;i++)\n    printf (\"Nome dos funcionarios:%d\\t %s\\n\", i+1, nFunc[i]); \n         \n  return(0);\n}<\/code><\/pre>\n\n\n\n<p>Para testar o c\u00f3digo online, utilize o link: <a href=\"https:\/\/ideone.com\/FBicCy\" target=\"_blank\" rel=\"noopener\">https:\/\/ideone.com\/FBicCy<\/a><\/p>\n\n\n\n<p><strong>Dando continuidade ao restante da solicita\u00e7\u00e3o, segue o restante do c\u00f3digo:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n \nint main() {\n  int qtdFunc=0;\n  printf(\"Informe a quantidade de funcionarios: \\n\\n\");\n  scanf(\"%i\\n\", &amp;qtdFunc);\n \n  char nFunc[qtdFunc][100];\n  float salario[qtdFunc];\n  int i=0;\n \n  \/\/realiza a leitura dos valores\n  printf(\"Informe o nome do funcionario: \\n\");\n  for (i=0; i&lt;qtdFunc;i++) {\n    fgets (nFunc[i], 99, stdin);\n    scanf(\"%f\\n\", &amp;salario[i]);\n  }\n  \n  \/\/aplica o aumento salarial\n  for (i=0; i&lt;qtdFunc;i++) {\n    if (salario[i] &lt; 1500) {\n    \tsalario[i] = salario[i] * 1.08;\n    } else {\n    \tsalario[i] = salario[i] + (salario[i] * 0.05);\n    }\n  }\n  \n  \/\/mostra os novos salarios\n  for (i=0; i&lt;qtdFunc;i++)\n    printf (\"Funcionario%d:\\t %s (R$ %.2f)\\n\", i+1, nFunc[i], salario[i]); \n \n  return(0);\n}<\/code><\/pre>\n\n\n\n<p>Observe que eu utilizei duas formas diferentes de calcular o aumento salarial. Eu prefiro a que utilizei para aplicar o aumento de 8%, mas para quem gosta de complicar e tamb\u00e9m desperdi\u00e7ar processamento computacional, tem o c\u00e1lculo utilizado para o aumento de 5%.<\/p>\n\n\n\n<p>Para testar o c\u00f3digo online, utilize o link: <a href=\"https:\/\/ideone.com\/EeWHjM\" target=\"_blank\" rel=\"noopener\">https:\/\/ideone.com\/FBicCy<\/a><\/p>\n\n\n\n<p>Uma recomenda\u00e7\u00e3o importante a fazer sobre a solu\u00e7\u00e3o apresentada \u00e9 que ela deveria utilizar uma <em>struct<\/em> para armazenar o nome e o sal\u00e1rio de cada funcion\u00e1rio e n\u00e3o fazer isso utilizando dois vetores. Logicamente isso depende da pessoa saber utilizar <em>structs<\/em> e j\u00e1 ter visto o assunto na disciplina, mas segue a solu\u00e7\u00e3o com a estrutura:<\/p>\n\n\n\n<pre class=\"wp-block-code lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n\nstruct funcionario {\n  char nome[100];\n  float salario;\n};\n\nint main() {\n  int qtdFunc=0;\n  printf(\"Informe a quantidade de funcionarios: \\n\\n\");\n  scanf(\"%i\\n\", &amp;qtdFunc);\n  struct funcionario func[qtdFunc];\n\n  int i=0;\n  \/\/realiza a leitura dos valores\n  printf(\"Informe o nome do funcionario: \\n\");\n  for (i=0; i&lt;qtdFunc;i++) {\n    fgets (func[i].nome, 99, stdin);\n    scanf(\"%f\\n\", &amp;func[i].salario);\n  }\n  \n  \/\/aplica o aumento salarial\n  for (i=0; i&lt;qtdFunc;i++) {\n    if (func[i].salario &lt; 1500) {\n    \tfunc[i].salario = func[i].salario * 1.08;\n    } else {\n    \tfunc[i].salario = func[i].salario + (func[i].salario * 0.08);\n    }\n  }\n  \n  \/\/mostra os novos salarios\n  for (i=0; i&lt;qtdFunc;i++)\n    printf (\"Funcionario%d:\\t %s (R$ %.2f)\\n\", i+1, func[i].nome, func[i].salario); \n \n  return(0);\n}<\/code><\/pre>\n\n\n\n<p>Essa solu\u00e7\u00e3o pode ser testada online atrav\u00e9s do link: <a href=\"https:\/\/ideone.com\/lUXVDX\">https:\/\/ideone.com\/lUXVDX<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esse algoritmo foi solicitado pela Jeanne e envolve a leitura de strings e seu armazenamento array (nesse caso, uma matriz). Respondi as d\u00favidas levantadas e tamb\u00e9m completei o algoritmo, avan\u00e7ando um pouco a solu\u00e7\u00e3o para o uso de estruturas, que se adequam bem ao problema. Um detalhe que somente percebi depois \u00e9 que a solicita\u00e7\u00e3o [&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":[52,14],"class_list":["post-746","post","type-post","status-publish","format-standard","hentry","category-c","category-codigo-com-analise","tag-solicitacao-de-algoritmo","tag-vetor"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/746","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=746"}],"version-history":[{"count":7,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/746\/revisions"}],"predecessor-version":[{"id":1044,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/746\/revisions\/1044"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=746"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}