I need help on this competitive programming issue

Asked

Viewed 89 times

-1

I’m asking the question Low Frequency I have tested the cases of Udebug but the online judge only returns me Runtime error, for what I know when this happens and when it tries to use memory position that was not allocated, but I allotted more than the question asked and still the problem continues

My code

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
double resultado(char *frase);

int main(int argc, char** argv)
{
  int teste, tam, cont, cont2, indice, i;
  char frase[900], presenca[900];
  char *ptr_1, *ptr_2;
  double vetor[900];

 char **nomes = malloc(sizeof(char) * 300);
 char **presencas = malloc(sizeof(char) * 300);

 for(i = 0; i < 300; i++)
 {
     nomes[i] = malloc(sizeof(char) * 900);
 }

 for(i = 0; i < 300; i++)
 {
     presencas[i] = malloc(sizeof(char) * 900);
 }

 scanf("%d", &teste);
 while(teste--)
 {
     cont2 = cont = 0;
     getchar();
     scanf("%d", &tam);
     scanf(" %[^\n]", frase);
     scanf(" %[^\n]", presenca);
     ptr_1 = strtok(frase, " ");

     while(ptr_1 != NULL)
     {
         strcpy(nomes[cont], ptr_1);
         cont++;
         ptr_1 = strtok(NULL, " ");
     }

     ptr_2 = strtok(presenca, " ");
     while(ptr_2 != NULL)
     {
         strcpy(presencas[cont2], ptr_2);
         cont2++;
         ptr_2 = strtok(NULL, " ");
     }

     for(indice = 0; indice < tam ; indice++)
     {
         vetor[indice] = resultado(presencas[indice]);
     }

     for(i = 0; i < tam; i++)
     {
        if(vetor[i] <= 75.0)
        {
            printf("%s ", nomes[i]);
        }
     }
     memset(vetor, 0, sizeof(vetor));
     printf("\n");
}
 for(i = 0; i < 300; i++)
 {
     free(nomes[i]);
 }
 free(nomes);
 for(i = 0; i < 300; i++)
 {
     free(presencas);
 }
  free(presencas);
  return 0;
}

double resultado(char *frase)
{
 int i, tam = strlen(frase);
 double cont = 0;
  for(i = 0; i < tam; i++)
  {
     if(frase[i] == 'M' || frase[i] == 'P')
     {
         cont++;
     }
  }

  return (cont * 100) / tam;
}
  • 1

    Run time error? Maybe it has to do with variable allocation nomes and presencas. They’re pointers, but you’re allocating space only for char, not to char*.

  • It takes away a doubt, personal curiosity, what is the purpose of making these issues of competitive programming?

  • @Jefferson Quesado on Stackoverflow himself I asked a question how I would do that kind of allocation I just did what they passed me

  • Cool is a way I have to train

  • Friend I just saw !! that can have up to N names of students ... I’ve done this exercise in Uri, ie !! N names if N= 100 and each name is size 50, the allocation size is 5000 !! That is to say you are allocating little space for what the problem asks for.

  • Dude, why don’t you declare these vectors as char vetor[300][900];? Is suffering there :/

  • @rafaelmarques sorry to tell you that is not working, nor is training taking place. You need to review your strategy.

Show 2 more comments

1 answer

1


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

/*
  Abaixo, declaro um tipo struct aluno, que contém o nome de um aluno
  e sua frequência.
*/
struct aluno
{
    char nome[51];
    double frequencia;
};

void imprimirreprovados(struct aluno aluno[], int tamanho)
{
    /* count, abaixo, serve para saber se se deve imprimir o espaço
       em branco que intercala cada nome a ser imprimido */
    int count = 0;

    for (int i = 0; i < tamanho; ++i)
    {
        /* como foi dito no enunciado do problema, se a frequencia
           for menor do que 75%, o aluno deve ser enunciado pela
           saida padrao */
        if (aluno[i].frequencia < 0.75)
        {
            if (count > 0)
            {
                printf(" ");
            }
            printf("%s", aluno[i].nome);
            ++count;
        }
    }
    printf("\n");
}

// carrega o vetor de struct aluno's com os nomes. usado na primeira
// linha após a entrada do número de alunos na amostra.
void carregarnomealunos(struct aluno aluno[], int tamanho)
{
    for (int i = 0; i < tamanho; ++i)
    {
        scanf("%s", aluno[i].nome);
    }
}

// carrega a frequência no vetor de struct aluno's. chamada logo
// apos carregarnomealunos(struct aluno[], int).
void carregarfrequenciaalunos(struct aluno aluno[], int tamanho)
{
    /* 'codigo' é o código de letras explicado no enunciado do problema,
       que representa a presença P/ausência A/justificativa de falta M. 
       aproveito o tamanho do vetor para contabilizar o número total de
       aulas, e realizar a conta de porcentagem. */
    char* codigo;

    for (int i = 0; i < tamanho; ++i)
    {
        double totalaulas = 0.0;
        double presencas = 0.0;

        // entrada do codigo na variável 'codigo'.
        scanf("%s", codigo);

        // enquanto não for fim de string (*codigo tem valor 0 no fim da string)
        while (*codigo)
        {
            if (*codigo == 'P')
                presencas += 1.0;
            else if (*codigo == 'M')
                totalaulas -= 1.0;

            totalaulas += 1.0;
            ++codigo;
        }

        // calculo aqui a frequência do caboclo.
        aluno[i].frequencia = totalaulas == 0.0 ? 
            1.0 : presencas / totalaulas;
    }
}

int main(int argc, char* argv[])
{
    int T;

    // entrada do valor T, explicado no enunciado do problema.
    scanf("%d", &T);

    for (int t = 0; t < T; ++t)
    {
        int N;

        // entrada do valor N, explicado no enunciado do problema.
        scanf("%d", &N);

        /* else if (true) abaixo é para separar o joio do trigo;
           quem copiar cegamente o código, vai se ferrar pra
           explicar isto aqui */
        if (true)
        {
             struct aluno alunos[N];
             int tamanho = N;

             carregarnomealunos(alunos, tamanho);
             carregarfrequenciaalunos(alunos, tamanho);
             imprimirreprovados(alunos, tamanho);
        }
    }


    return 0;
}
  • I can’t vote for my post?

  • 4

    Marcelo, vote for your answer, you say? If it is, it is not possible, nor would it make sense, since it was posted, it is understood that you already think the answer useful. As for the 'no' vote, it is likely that it is because your answer contains only codes, with no explanation. What may be trivial to one may not be trivial to others, so however basic the problem may be, it is always interesting to explain in text.

  • Do there exist ghost Sopt users that serve only to impute/remove points from certain other Sopt users?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.