Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite, estou tentando fazer uma funcao que le o nome e a nota de individuos e descobre qual é a maior nota entre eles. Como podem ver eu chamo a funcao fgets, guardo nas variaveis o nome em nome1 e a nota em n1 e só depois entro no while. Mas acontece algo bem bizarro, quando eu chamo fgets dentro do while, a variavel nome1 é substituida pela linha inteira que o fgets lê.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80
int comparar_notas ()
{
int n1,n2;
char *nome2,*nome1;
char buf[MAX];
FILE *arq;
arq = fopen("arquivo.txt", "r");
if(arq == NULL)
{
printf("Erro ao abrir o arquivo\n");
return;
}
fgets(buf, MAX, arq);
nome1 = strtok(buf,",");
n1 = atoi(strtok(NULL,","));
while(!feof(arq))
{
fgets(buf, MAX, arq);
nome2 = strtok(buf,",");
n2 = atoi(strtok(NULL,","));
if (n1<n2)
{
n1=n2;
nome1=nome2;
}
}
printf("%s,%d",nome1,n1);
}
int main ()
{
comparar_notas();
return 0;
}
segue ai o q esta escrito no arquivo
Adamastor,66
Alaor,28
Aldebaran,88
Arlinda,19
Austeclynio,22
Claudinei,60
Domitila,62
Enderson,44
Guilhermina,33
Milena,72
Reginaldo,50
Tula,99
Zoraide,77
Não entedi porque você criou uma função inteira que não retorna nem um valor, então coloquei ela para o tipo void mesmo.
O problema esta resolvido ~^-^~;
Script:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80
void comparar_notas ()
{
int notaCORRENTE, notaMAXIMA;
char *nomeCORRENTE;
static char buffer[MAX] = "", alunonMAXIMA[MAX] = "";
notaCORRENTE = notaMAXIMA = 0;
nomeCORRENTE = NULL;
FILE *arq = fopen("arquivo.txt", "r");
if(arq == NULL)
{
printf("Erro ao abrir o arquivo\n");
return ;
}
while(!feof(arq))
{
//Capturando linhas:
fgets(buffer, MAX, arq);
//Trocando ',' por zero:
nomeCORRENTE = strtok(buffer,","); //Nesse momento a função strtok() coloca um caracter nulo no lugar da vírgula, e pega o que tem antes dele, token;
buffer[strlen(buffer)] = '0'; //colocamos 0 no lugar deste caracter nulo para que possamos trabalhar normalmente com a função strstr() e que possamos trabahar com a conversão de tipos;
//Capturando nota; coversão de tipos:
notaCORRENTE = atoi(strstr(buffer,"0")); //Ira pegar o conteudo desde do zero ate '\0';
//Capturando nome:
nomeCORRENTE = strtok(buffer,"0"); //Como foi trocado ',' por 0 fazemos dessa forma para pegar somente o nome; -_-# ponteiros kkkk
if (notaCORRENTE > notaMAXIMA)
{
notaMAXIMA = notaCORRENTE;
memset(alunonMAXIMA,0,MAX);
strcpy(alunonMAXIMA,nomeCORRENTE);
}
}
fclose(arq);
printf("Aluno(a) nota maxima: %s\nNota: %i\n",alunonMAXIMA, notaMAXIMA);
} comparar_notas();
return 0;
}
Eu testei aqui e só to conseguindo mostrar as duas maiores notas, só coloquei o printf dentro do if do while... Mas n to entendendo o pq dele colocar o nome errado do jeito q você fez
EDIT
Fazendo uma gambiarra bem feia, consegui o resultado... Mas vou ficar tentando aqui pra poder te ajudar
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80
int comparar_notas ()
{
}int main ()
{