Faça um programa que receba como entrada o ano corrente e o nome de dois arquivos: um de entrada e outro de saída. Cada linha do arquivo de entrada contém o nome de uma pessoa (ocupando 40 caracteres) e o seu ano de nascimento. O programa deverá ler o arquivo de entrada e gerar um arquivo de saída onde aparece o nome da pessoa seguida por uma string que representa a sua idade.
  • Se a idade for menor do que 18 anos, escreva “menor de idade”
  • Se a idade for maior do que 18 anos, escreva “maior de idade”
  • Se a idade for igual a 18 anos, escreva “entrando na maior idade”

Passo 1

Receber como entrada o ano corrente e os nomes dos arquivos de entrada e saída.

Passo 2

Abrir o arquivo de entrada em modo leitura e o de saída em modo escrita, verificando erros.

Passo 3

Para cada linha do arquivo de entrada: ler os primeiros 40 caracteres como nome (incluindo espaços) e em seguida o ano de nascimento. Calcular a idade subtraindo o ano de nascimento do ano corrente. Comparar a idade com 18: se menor, preparar a string “menor de idade”; se igual, “entrando na maior idade”; se maior, “maior de idade”.

Passo 4

Escrever no arquivo de saída o nome da pessoa seguido da string de categorização. Repetir até o fim do arquivo de entrada e, por fim, fechar ambos os arquivos.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int ano_corrente;
char nome_arquivo_entrada[100];
char nome_arquivo_saida[100];
// 1. Ler ano corrente e nomes dos arquivos
if (scanf("%d %99s %99s", &ano_corrente,
          nome_arquivo_entrada, nome_arquivo_saida) != 3) {
    fprintf(stderr, "Erro na leitura dos parâmetros de entrada.\n");
    return 1;
}

// 2. Abrir arquivos
FILE *fp_in = fopen(nome_arquivo_entrada, "r");
if (!fp_in) {
    perror("Erro ao abrir arquivo de entrada");
    return 1;
}
FILE *fp_out = fopen(nome_arquivo_saida, "w");
if (!fp_out) {
    perror("Erro ao abrir arquivo de saída");
    fclose(fp_in);
    return 1;
}

// 3. Processar cada linha
char nome[41];
int ano_nasc;
while (1) {
    // ler exatamente 40 caracteres de nome e o ano de nascimento
    int lidos = fscanf(fp_in, "%40c%d", nome, &ano_nasc);
    if (lidos == EOF || lidos != 2) break;
    nome[40] = '\0';  // garantir terminação

    // 4. Calcular idade
    int idade = ano_corrente - ano_nasc;

    // 5. Determinar categoria
    const char *categoria;
    if (idade < 18) {
        categoria = "menor de idade";
    } else if (idade == 18) {
        categoria = "entrando na maior idade";
    } else {
        categoria = "maior de idade";
    }

    // 6. Escrever no arquivo de saída
    fprintf(fp_out, "%s %s\n", nome, categoria);
}

// 7. Fechar arquivos
fclose(fp_in);
fclose(fp_out);

return 0;
}

Exercícios relacionados