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
\ldots \ldots \ldots

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:
  1. Calcular a média de peças fabricadas pelos homens.
  2. Calcular a porcentagem de peças fabricadas pelas mulheres em relação ao total produzido.
  3. 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 1 + 0{,}03 \times (\text{np} - 30) salários mínimos.
    • Classe C (mais de 35 peças): recebe 1 + 0{,}05 \times (\text{np} - 35) salários mínimos.
  4. 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 e contMen 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;
}

Exercícios relacionados