Questão 3 ( 3,5 pontos): struct (em linguagem C)
Uma fábrica tem operários que fabricam peças. Quem fabrica até 30 peças é classe A. Quem fabrica de 31 a
35 peças é classe B. E quem fabrica mais de 35 peças é classe C. Os operários classe A ganham 1 salário
mínimo. Classe B ganha 1 salário mínimo mais 3% de salário mínimo a cada peça adicional que fabricam além das 30. E classe C ganha 1 salário mínimo mais 5% de salário mínimo a cada peça adicional que fabricam além das 35.
É pra fazer um struct com nome completo do operário (nc), sexo, número do operário (uma identificação, que
é chamada de “nop”) e número de peças fabricadas no mês (np).
Para sair do “while”, é necessário digitar “@@@@” como nome do operário.
Além disso, o número máximo de operários é de 15000. Não se deve ler o número de funcionários.
Foi pedido para calcular:
Número médio de peças fabricadas por homens;
Porcentagem de peças fabricadas por mulheres em relação ao total produzido (por homens e mulheres);
O total da folha da fatura no mês para a fábrica.
Além disso tudo, é para mostrar o nome, número de identificação e o número de peças fabricadas de todos,
e tem que ter uma aparência assim:
Nome completo
N. do operário
N. de peças produzidas no mês
Tomás Silva
1111
35
Patrícia de Almeida
1234
35
Uma fábrica tem operários que fabricam peças. Quem fabrica até 30 peças é classe A. Quem fabrica de 31 a
35 peças é classe B. E quem fabrica mais de 35 peças é classe C. Os operários classe A ganham 1 salário
mínimo. Classe B ganha 1 salário mínimo mais 3% de salário mínimo a cada peça adicional que fabricam além das 30. E classe C ganha 1 salário mínimo mais 5% de salário mínimo a cada peça adicional que fabricam além das 35.
é chamada de “nop”) e número de peças fabricadas no mês (np).
Para sair do “while”, é necessário digitar “@@@@” como nome do operário.
Além disso, o número máximo de operários é de 15000. Não se deve ler o número de funcionários.
Foi pedido para calcular:
Número médio de peças fabricadas por homens;
Porcentagem de peças fabricadas por mulheres em relação ao total produzido (por homens e mulheres);
Além disso tudo, é para mostrar o nome, número de identificação e o número de peças fabricadas de todos,
e tem que ter uma aparência assim:
Nome completo | N. do operário | N. de peças produzidas no mês |
Tomás Silva | 1111 | 35 |
Patrícia de Almeida | 1234 | 35 |
|
|
|
Passo 1
O enunciado pede que a gente monte um programa em C que armazene, para até 15000 operários, os seguintes dados: nome completo (nc), sexo (sexo), número de identificação (nop) e número de peças fabricadas no mês (np). A leitura dos dados deve continuar até que o nome lido seja “@@@@” ou até atingir 15000 registros. A partir daí, devemos:
- Calcular a média de peças fabricadas pelos homens.
- Calcular a porcentagem de peças fabricadas pelas mulheres em relação ao total produzido.
- Calcular o total da folha de pagamento em salários mínimos, sabendo que:
- Classe A (até 30 peças): recebe 1 salário mínimo.
- Classe B (31 a 35 peças): recebe
salários mínimos. - Classe C (mais de 35 peças): recebe
salários mínimos.
- Imprimir uma tabela com “Nome completo”, “N. do operário” e “N. de peças produzidas no mês” para cada operário.
Passo 2
Definimos um
struct
para guardar os dados de cada operário:typedef struct {
char nc[100]; // nome completo
char sexo; // 'M' ou 'F'
int nop; // número de identificação
int np; // número de peças no mês
} Operario;
Passo 3
Fazemos a leitura em um laço
while
controlado por um contador n = 0
e pela comparação do nome lido com o sentinel “@@@@”. Usamos scanf(" %[^\n]", ...)
para ler linhas com espaços:Operario vet[15000];
int n = 0;
while (n < 15000) {
scanf(" %[^\n]", vet[n].nc);
if (strcmp(vet[n].nc, "@@@@") == 0) break;
scanf(" %c %d %d", &vet[n].sexo, &vet[n].nop, &vet[n].np);
n++;
}
Passo 4
Percorremos os
n
registros para acumular:somaMen
econtMen
para as peças de homens.somaMulher
para as peças de mulheres.totalPecas = somaMen + somaMulher
.folha
somando, para cada operário, o número de salários mínimos que ele recebe, conforme a classe.
O cálculo de salário (em salários mínimos) para cada
vet[i]
é:float sal;
if (vet[i].np <= 30) {
sal = 1.0f;
} else if (vet[i].np <= 35) {
sal = 1.0f + 0.03f * (vet[i].np - 30);
} else {
sal = 1.0f + 0.05f * (vet[i].np - 35);
}
folha += sal;
Passo 5
Depois de acumular:
- Média de peças por homens:
float mediaHomens = contMen > 0 ? (float)somaMen / contMen : 0.0f;
- Porcentagem de peças das mulheres:
float pctMulheres = totalPecas > 0
? (float)somaMulher / totalPecas * 100.0f
: 0.0f;
Passo 6
Imprimimos os resultados e, em seguida, a tabela de todos os operários:
printf("Media de pecas por homens: %.2f\n", mediaHomens);
printf("Porcentagem de pecas por mulheres: %.2f%%\n", pctMulheres);
printf("Total da folha (em salarios minimos): %.2f\n\n", folha);
printf("Nome completo N. do operario N. de pecas\n");
for (int i = 0; i < n; i++) {
printf("%-24s %-16d %d\n",
vet[i].nc, vet[i].nop, vet[i].np);
}
Resposta
#include <stdio.h>
#include <string.h>
typedef struct {
char nc[100];
char sexo;
int nop;
int np;
} Operario;
int main() {
Operario vet[15000];
int n = 0;
// Leitura dos dados
while (n < 15000) {
scanf(" %[^\n]", vet[n].nc);
if (strcmp(vet[n].nc, "@@@@") == 0) break;
scanf(" %c %d %d", &vet[n].sexo, &vet[n].nop, &vet[n].np);
n++;
}
// Acumuladores
int somaMen = 0, contMen = 0, somaMulher = 0;
float folha = 0.0f;
for (int i = 0; i < n; i++) {
// soma de peças por sexo
if (vet[i].sexo == 'M' || vet[i].sexo == 'm') {
somaMen += vet[i].np;
contMen++;
} else {
somaMulher += vet[i].np;
}
// cálculo do salário em salários mínimos
float sal;
if (vet[i].np <= 30) {
sal = 1.0f;
} else if (vet[i].np <= 35) {
sal = 1.0f + 0.03f * (vet[i].np - 30);
} else {
sal = 1.0f + 0.05f * (vet[i].np - 35);
}
folha += sal;
}
int totalPecas = somaMen + somaMulher;
// Média de peças fabricadas por homens
float mediaHomens = contMen > 0 ? (float)somaMen / contMen : 0.0f;
// Porcentagem de peças fabricadas por mulheres
float pctMulheres = totalPecas > 0
? (float)somaMulher / totalPecas * 100.0f
: 0.0f;
// Impressão dos resultados
printf("Media de pecas por homens: %.2f\n", mediaHomens);
printf("Porcentagem de pecas por mulheres: %.2f%%\n", pctMulheres);
printf("Total da folha (em salarios minimos): %.2f\n\n", folha);
// Tabela de todos os operários
printf("Nome completo N. do operario N. de pecas\n");
for (int i = 0; i < n; i++) {
printf("%-24s %-16d %d\n",
vet[i].nc, vet[i].nop, vet[i].np);
}
return 0;
}