Algoritmo solicitado 1

Esse algoritmo foi solicitado pela Jeanne e envolve a leitura de strings e seu armazenamento array (nesse caso, uma matriz). Respondi as dúvidas levantadas e também completei o algoritmo, avançando um pouco a solução para o uso de estruturas, que se adequam bem ao problema.

Um detalhe que somente percebi depois é que a solicitação era para utilizar C++ e acabei utilizando a linguagem C. Os códigos funcionarão nas duas linguagens, apenas sendo necessário alterar as bibliotecas utilizadas.

O enunciado enviado foi o seguinte: “Construa um programa em C para armazenar o nome (string) e o salário de certa quantidade de pessoas em um vetor. Seu algoritmo deve calcular e armazenar o novo salário sabendo-se ocorreu um reajuste de 8% para salários inferiores a R$1.500,00 e de 5% para salários iguais ou superiores a este valor. A quantidade de pessoas deve ser previamente informada pelo usuário. O resultado deverá ser impresso em um novo vetor.

Eu tenho que usar, gets e puts. Estou fazendo uma tentativa, mas empaquei no vetor. Ele está inicializando com um valor e não estou achando o erro”.

Abaixo, o código enviado pela solicitante:

#include <stdio.h>
#include <stdlib.h>

int qtdFunc=0;
int main() {
  printf("Informe a quantidade de funcionarios: \n\n");
  scanf("%i", &qtdFunc);

  char nFunc[qtdFunc][100];
  int i=0;

  printf("Informe o nome do funcionario: \n");
  for (i=0; i<=qtdFunc;i=i++) {
    // recebendo nomes funcionários
    gets(nFunc[i]);
    fflush(stdin);
  }
  for (i=0; i<=qtdFunc;i=i++)
    printf ("Nome dos funcionarios:%d\t %s\n", i+1, nFunc[i]); 
         
  return(0);
}

Primeiramente, na linha 4, não entendo o porque da necessidade de ter uma variável global para o problema. Sendo assim, o primeiro passo é transferir a declaração da variável para dentro do escopo da função main().

Outra questão menor é o incremento aplicado na instrução for. Não faz sentido usar “i=i++”. Com o operação utilizada, se está atribuindo o valor da variável i a ela mesmo e depois incrementado o valor em uma unidade. Deve ser utilizado apenas “i++” ou então “i=i+1”.

Outro cuidado com relação ao for é na condição de parada. Considerando o valor 3 para a variável qtdFunc, a condição “i<=qtdFunc” gerará 4 iteração do loop (a iteração correrá com os valores para i iguais a 0, 1, 2 e 3) e o correto é fazer apenas 3. Com isso, a condição deveria ser “i<qtdFunc”.

Para receber o nome dos funcionários, foi utilizado a função gets(). Essa função normalmente gera um warningthe `gets’ function is dangerous and should not be used” e por isso recomendo utilizar outra função, a fgets(). Tudo bem que a questão pediu para utilizar gets(), mas isso acontece quando a questão foi elaborada muitos anos atrás e não deve ter problema utilizar uma alternativa melhor.

A função fgets() é muitas vezes associada com a leitura de arquivos, mas pode ser utilizada em substituição da gets(). A função fgets() permite incluir o caractere de nova linha e também especifica o tamanho máximo da string de entrada (esse é o motivo do warning da função gets() que, por não permitir definir o tamanho máximo, pode causar um estouro de buffer). E veja bem, tanto a fgets() e gets() dispensam o uso de fflush(stdin), já que elas leem o caractere de nova linha.

A função fgets() espera 3 parâmetros: (1) a variável de string que vai armazenar o valor; (2) o tamanho máximo da string, subtraído de 1 por causa do ‘\0’; e (3) valor stdin, para informar que é para considerar a entrada do teclado.

Veja também que na linha 7, para ler a quantidade de funcionários, eu adicionei um “\n” junto com a máscara para inteiro. Isso foi para que o enter pressionado ao digitar o número não seja lido posteriormente como um nome de funcionário. Retire o “\n” para perceber o problema e ver que um dois nomes ficará em branco.

Com as alterações, o código ficará o seguinte:

#include <stdio.h>
#include <stdlib.h>

int main() {
  int qtdFunc=0;
  printf("Informe a quantidade de funcionarios: \n\n");
  scanf("%i\n", &qtdFunc);

  char nFunc[qtdFunc][100];
  int i=0;

  printf("Informe o nome do funcionario: \n");
  for (i=0; i<qtdFunc;i++) {
    // recebendo nomes funcionários
    fgets (nFunc[i], 99, stdin);
  }
  for (i=0; i<qtdFunc;i++)
    printf ("Nome dos funcionarios:%d\t %s\n", i+1, nFunc[i]); 
         
  return(0);
}

Para testar o código online, utilize o link: https://ideone.com/FBicCy

Dando continuidade ao restante da solicitação, segue o restante do código:

#include <stdio.h>
#include <stdlib.h>
 
int main() {
  int qtdFunc=0;
  printf("Informe a quantidade de funcionarios: \n\n");
  scanf("%i\n", &qtdFunc);
 
  char nFunc[qtdFunc][100];
  float salario[qtdFunc];
  int i=0;
 
  //realiza a leitura dos valores
  printf("Informe o nome do funcionario: \n");
  for (i=0; i<qtdFunc;i++) {
    fgets (nFunc[i], 99, stdin);
    scanf("%f\n", &salario[i]);
  }
  
  //aplica o aumento salarial
  for (i=0; i<qtdFunc;i++) {
    if (salario[i] < 1500) {
    	salario[i] = salario[i] * 1.08;
    } else {
    	salario[i] = salario[i] + (salario[i] * 0.05);
    }
  }
  
  //mostra os novos salarios
  for (i=0; i<qtdFunc;i++)
    printf ("Funcionario%d:\t %s (R$ %.2f)\n", i+1, nFunc[i], salario[i]); 
 
  return(0);
}

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ém desperdiçar processamento computacional, tem o cálculo utilizado para o aumento de 5%.

Para testar o código online, utilize o link: https://ideone.com/FBicCy

Uma recomendação importante a fazer sobre a solução apresentada é que ela deveria utilizar uma struct para armazenar o nome e o salário de cada funcionário e não fazer isso utilizando dois vetores. Logicamente isso depende da pessoa saber utilizar structs e já ter visto o assunto na disciplina, mas segue a solução com a estrutura:

#include <stdio.h>
#include <stdlib.h>

struct funcionario {
  char nome[100];
  float salario;
};

int main() {
  int qtdFunc=0;
  printf("Informe a quantidade de funcionarios: \n\n");
  scanf("%i\n", &qtdFunc);
  struct funcionario func[qtdFunc];

  int i=0;
  //realiza a leitura dos valores
  printf("Informe o nome do funcionario: \n");
  for (i=0; i<qtdFunc;i++) {
    fgets (func[i].nome, 99, stdin);
    scanf("%f\n", &func[i].salario);
  }
  
  //aplica o aumento salarial
  for (i=0; i<qtdFunc;i++) {
    if (func[i].salario < 1500) {
    	func[i].salario = func[i].salario * 1.08;
    } else {
    	func[i].salario = func[i].salario + (func[i].salario * 0.08);
    }
  }
  
  //mostra os novos salarios
  for (i=0; i<qtdFunc;i++)
    printf ("Funcionario%d:\t %s (R$ %.2f)\n", i+1, func[i].nome, func[i].salario); 
 
  return(0);
}

Essa solução pode ser testada online através do link: https://ideone.com/lUXVDX

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.