1
resposta

Não consegui resolver ainda e marquei como solucionada sem querer

Prof. Augusto passou um conjunto de problemas aos alunos, e deu um mês para que eles os resolvessem. No final do mês os alunos mandaram o número de problemas resolvidos corretamente. A promessa do brilhante didata era reprovar sumariamente o último colocado da competição, ou seja, sem que ele tivesse a oportunidade de fazer a prova N2 ou a Sub.

Os alunos seriam ordenados conforme o número de problemas resolvidos, com empates resolvidos de acordo com a ordem alfabética dos nomes (não há homônimos na turma).

Isso fez com que alunos com nomes iniciados nas últimas letras do alfabeto se esforçassem muito nas tarefas, e não compartilhassem suas soluções com colegas (especialmente aqueles cujos nomes começassem com letras anteriores).

Sua tarefa neste problema é escrever um programa que lê os resultados dos alunos do professor e imprima o nome do infeliz reprovado.

Entrada A entrada é composta de diversas instâncias. A primeira linha de cada instância consiste em um inteiro n (1 <= n <= 100) indicando o número de alunos na competição.

Cada uma das n linhas seguintes contém o nome do aluno e o número de problemas resolvidos por ele. O nome consiste em uma sequência de letras [a-z] com no máximo 20 letras e cada time resolve entre 0 a 10 problemas.

A entrada termina com o valor 0 para a variável n.

Saída Para cada instância, você deverá imprimir um identificador Instancia k, onde k é o número da instância atual. Na linha seguinte imprima o nome do infeliz reprovado. Após cada instância imprima uma linha em branco.

#include<stdlib.h>
#include<stdio.h>
#include<locale.h>
int main()
{setlocale(LC_ALL, "Portuguese");
    int n;
    printf("Digite o numero de alunos na competição\n");
    scanf("%d", &n);

    while(n < 1 && n >= 100){
    printf("Digite o numero de alunos na competição\n");
    scanf("%d", &n);
    }
    char alunos[20][n];
    int problemas[1][n];

    for(int i = 0; i < n; i++){
            printf("Digite o nome do aluno\n");
            gets(alunos+i);
    }
    for(int i = 0; i < n; i++){
            printf("Digite o nome do aluno %s", (alunos+i));
            gets(alunos+i);
    }

    return 0;
}

minha ideia é salvar todos participantes em alunos, mas não consigo atribuir nota a eles, o que me impede de fazer a comparação e caso coloque em ordem alfabética, as notas vão ficar trocadas

1 resposta

Olá Pedro. Fazendo algumas modificações no seu código você consegue chegar no seu objetivo. Essa é a parte do código que recebe o nome e a nota, utilize a função scanf, ela consegue pegar uma string e depois um inteiro separados por um espaço em branco.

    for(int i = 0; i < n; i++){
            printf("Digite o nome do aluno (space) nota ");
            scanf("%s %d", *(alunos+i),(problemas+i));
            puts("");
    }

Essa parte do código é a responsável pela ordenação, o primeiro for é para garantir que vamos checar todos os alunos. o segundo for é para verificar um aluno de cada vez e tentar levar ele para o final da lista se ele for o menor.

    for(int i=0; i<n;i++)
        for(int j=0; j<n-1; j++)

Esse if verifica se a nota do aluno é menor ou se a nota for igual e a letra menor ele troca, dessa maneira colocamos o aluno com a menor nota no final

   if(problemas[j] < problemas[j+1] || ((problemas[j] == problemas[j+1]) && (alunos[j][0] > alunos[j+1][0]))){

Esse bloco é responsável por trocar as notas e os nomes de posição nas listas. Ele utiliza uma variável auxiliar para fazer as trocas.

                int aux_nota = problemas[j+1];
                problemas[j+1] = problemas[j];
                problemas[j] = aux_nota;

                char aux_nome[20];
                strcpy(aux_nome,alunos[j+1]);
                strcpy(alunos[j+1],alunos[j]);
                strcpy(alunos[j],aux_nome);

Resultado final com as modificações:

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

int main()
{
    setlocale(LC_ALL, "Portuguese");

    int n;
    printf("Digite o numero de alunos na competição\n");
    scanf("%d", &n);
    fflush(stdin);

    char alunos[n][20];
    int problemas[n];

    getc(stdin);
    for(int i = 0; i < n; i++){
            printf("Digite o nome do aluno (space) nota ");
            scanf("%s %d", *(alunos+i),(problemas+i));
            puts("");
    }

    for(int i=0;i<n;i++)
        printf("aluno %s tirou %d\n",alunos[i],problemas[i]);
    puts("");

    for(int i=0; i<n;i++)
        for(int j=0; j<n-1; j++)
            if(problemas[j] < problemas[j+1] || ((problemas[j] == problemas[j+1]) && (alunos[j][0] > alunos[j+1][0]))){
                int aux_nota = problemas[j+1];
                problemas[j+1] = problemas[j];
                problemas[j] = aux_nota;

                char aux_nome[20];
                strcpy(aux_nome,alunos[j+1]);
                strcpy(alunos[j+1],alunos[j]);
                strcpy(alunos[j],aux_nome);
            }

    for(int i=0;i<n;i++)
        printf("aluno %s tirou %d\n",alunos[i],problemas[i]);
    puts("");

    return 0;
}

Esse código ainda não faz o que foi proposto no enunciado, mas já mostra o caminho para a solução. Espero ter ajudado e qualquer duvida não hesite em perguntar. Bons estudos.