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 warning “the `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