Ir ao conteúdo
  • Cadastre-se
Alannnn

código com notas

Recommended Posts

Preciso de um help...


Estou enrolado pra escrever esse código...


Como escrever um código que leia um arquivo texto com a 1ª informação, a quantidade de notas e em seguida as notas. O programa tem que ler as notas, calcular a média e determinar o menor e a  maior nota da lista... No final gerando um arquivo de saída com a média, a menor e a maior encontradas.


Compartilhar este post


Link para o post
Compartilhar em outros sites

para ler de um arquivo de texto você pode usar fscanf. É exatamente igual que scanf, porém em vez de ler do teclado lê desde um arquivo.

 

/* fscanf example */#include <stdio.h>int main (){  char str [80];  float f;  FILE * pFile; //criamos o ponteiro  pFile = fopen ("myfile.txt","w+"); //abrimos em modo escritura estendido, escritura + leitura.   fprintf (pFile, "%f %s", 3.1416, "PI"); //Se imprime isso no arquivo  rewind (pFile); //cada vez que lemos ou escrevemos o ponteiro avança, si queremos ler o que escrevemos temos que fechar o arquivo e voltar a abrir ou usamos rewind que devolve o ponteiro ao inicio do arquivo para ler o que escrevemos antes  fscanf (pFile, "%f", &f); // fazemos a leitura de f  fscanf (pFile, "%s", str); // fazemos a leitura do string, podemos fazer ambos em um só fscanf ou por separado como nesse caso  fclose (pFile); //sempre temos que fechar o arquivo antes de sair  printf ("I have read: %f and %s \n",f,str); //imprimimos o que estava no arquivo  return 0;}

Para mais informação olhe aqui: http://www.cplusplus.com/reference/cstdio/fscanf/

 

 

Comentei todas as linhas, é só modificar para fazer uso com seu programa. Pratique com fscanf e fread.

sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a ok... 

veja se estou no caminho certo ??

 

#include<stdio.h>
void main(void)
{
float notas[5][1], numero ; //Criando um vetor e uma variável temporária
int linha = 0; // Contador para o índice do vetor
char texto[ ] = " /home/alan/Documentos/texto.txt" ,texto2[] = "/home/alan/Documentos/texto2.txt";
FILE *arq;
FILE *arq2;
arq = fopen (texto, "r"); //abrindo o arquivo de texto
if((arq = fopen(texto,"r"))==NULL) //verificando se abriu com sucesso
  {
   printf("\nNão foi possível ler este arquivo.");
}else
 {
  while( (fscanf(arq,"%f",&numero))!EOF ) //Chegou ao fim? então, numero recebe valor daquela linha
  {
                      printf("%,if\n",numero);//imprimir na tela pra ver se está funcionando
                      notas[linha][0] = numero; //vetor recebe valor da variável a cada quebra de linha
                      linha++;//indice é incrementado
         }
}
arq = fopen(texto2,"w");//cria um novo arquivo
if((arq2 = fopen(texto2,"m"))==NULL) //verificando se abriu com sucesso
{
 prinft("\nNão foi possível ler este arquivo.");
}else
  {
  fprintf(arq2,"%, if\n%,if\n",notas[0][0],notas[1][0].notas[2][0]);//colando o que foi copiado no arquivo i
  }
fclose(arq);
fclose(arq2);
 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

vamos nos centrar no seu problema:

 

1ª informação, a quantidade de notas e em seguida as notas

 

a informação é um inteiro que diz quantas notas vai ser lido desde o arquivo então esse numero seria a o tamanho do vetor. Ou seja, teríamos uma linha assim num arquivo chamado texto.txt:

5 3.2 7.8 7.0 3.0 9.9

 

Note que o primeiro numero é um int, e os seguintes são floats, e todos os numeros incluindo o primeiro inteiro estão separados por um espaço. Si sabemos que nunca vamos a passar de x notas, esse valor x bem pode ter um numero, que com muito cuidado não deve ser superado, pois ao ter mais números no arquivo que o máximo permitido pela quantidade de memoria que reservamos, vai dar zica >_<, e nesse caso acho uma disparate utilizar um valor no inicio de cada linha si todas as linhas vão ter um tamanho predefinido, nesse caso melhor usar memoria dinâmica que faria más sentido, assim si o primeiro fosse um 5, reservamos memoria para um vetor de 5 casinhas com malloc, então nunca seria sobrepassado.

#include<stdio.h>#include <stdlib.h>int main ( void ) {    float *notas;    int i = 0, numeroNotas;    FILE *arq;    arq = fopen ( "texto.txt", "r" );        if ( arq == 0 ) {        perror("Erro: ");        return 1;            } else {        fscanf ( arq, "%d", &numeroNotas );                if ( numeroNotas == 0 ){            printf("numeroNotas zero");            return 2;                    }else{            printf("Reservando memoria para %d notas\n\n", numeroNotas);            notas = (float*)malloc( sizeof(float) * numeroNotas );        }                i=0;        while ( i < numeroNotas ) {             fscanf ( arq, "%f", &notas[i] );            i++;        }    }        i=0;    while ( i<numeroNotas ){        printf("nota[%d]=%.2f\n", i, notas[i]);        i++;    }        fclose ( arq );    free(notas);    return 0;}

Essa seria para mim a forma mais correta. Para guardar é modificar para que guarde no arquivo de saída, porém não acho necessário  a criação de outro "FILE Pointer" é só você fechar o "arq" e abrir outro arquivo reutilizando esse mesmo ponteiro. É muito boa pratica reutilizar ao máximo todas as variáveis evitando assim reservar memoria desnecessariamente.

 

Esse código lê uma só linha num arquivo de texto que contenha:
texto.txt

5 3.2 7.8 7.0 3.0 9.9

O que me parece é que você quer ler varias notas como essa, ou isso da a entender, sendo assim você precisa de uma matriz dinâmica e não um vetor. Mas a ideia é a mesma, tente fazê-lo si tiver dificuldade avise. você precisa praticar mais com arquivos, memoria dinâmica.

Editado por vangodp

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é,

comecei a cursar TI tem 2 meses, a professora passou um trabalho bastante complexo, estou apanhando aqui pra conseguir fazer.O prazo pra entregar é hoje.

Você esta me dando dicas mt boas.

Esse código que postou dá erro 

error: no such file or directory

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja isso ...

 

#include <stdio.h>

#include <stdlib.h>

#include<float.h>

 

//Limite no tamanho das linhas do arquivo de entrada

#define INPUT_LINE_SIZE_LIMIT 10

 

//Nome dos arquivo de entrada e saida

//TODO: Ler a partir dos argumentos do programa

char *inputFilename = "D:/Trabalho/tchola/entrada.txt";

char *outputFilename = "D:/Trabalho/tchola/saida.txt";

 

int main()

{

        printf("Programa para calcular os valores medio,maximo e minimo\n");

 

        //----------------------------------------------------------------------------------------

        // Abre o arquivo de entrada

        FILE *inputFileHandle = fopen(inputFilename, "r");

 

        if (inputFileHandle == NULL) {

                printf("O arquivo de entrada '%s' nao foi encontrado\n", inputFilename);

                return 0;

        }

        else {

                printf("Processando o arquivo de entrada '%s'\n", inputFilename);

        }

 

        //----------------------------------------------------------------------------------------

        // Processa a primeira linha (quantidade de linhas de dados no arquivo)

 

        // Buffer para leitura do arquivo de entrada

        char buffer[iNPUT_LINE_SIZE_LIMIT];

       

        fgets(buffer, INPUT_LINE_SIZE_LIMIT, inputFileHandle);

        if (buffer == NULL) {

                printf("O arquivo de entrada '%s' nao contem nenhuma linha\n", inputFilename);

                return 0;

        }

       

        long dataCount = strtol(buffer,NULL,10);

        printf("O arquivo de entrada contem %u linhas de dados\n", dataCount);

 

        //----------------------------------------------------------------------------------------

        // Processa os registros de dados

 

        // Aloca um array de doubles para os registros

        double *dataArray = (double *)malloc(sizeof(double) * dataCount);

       

        for (int i=0; i < dataCount; i++){

                fgets(buffer, INPUT_LINE_SIZE_LIMIT, inputFileHandle);

                dataArray = strtod(buffer, NULL);

               

                printf("%.2f \n", dataArray);

        }

 

        fclose(inputFileHandle);

 

        //----------------------------------------------------------------------------------------

        // Calcula os valores medio, maximo e minimo

 

        double averageValue=0,maxValue=DBL_MIN,minValue=DBL_MAX;

       

        for (int i = 0; i < dataCount; i++) {

 

                double value = dataArray;

 

                averageValue += value;

 

                if (value > maxValue) {

                        maxValue = value;

                }

 

                if (value < minValue) {

                        minValue = value;

                }

 

        }

 

        averageValue = averageValue / dataCount;

 

        printf("Valor medio %.2f \n", averageValue);

        printf("Valor minimo %.2f \n", minValue);

        printf("Valor maximo %.2f \n", maxValue);

       

 

        //----------------------------------------------------------------------------------------

        // Escreve o arquivo de saida

        FILE *outputFileHandle = fopen(outputFilename, "w");

 

        if (outputFileHandle == NULL) {

                printf("O arquivo de saida '%s' nao pode ser criado\n", outputFilename);

                return 0;

        }

       

        fprintf(outputFileHandle, "%.2f\n", averageValue);

        fprintf(outputFileHandle, "%.2f\n", minValue);

        fprintf(outputFileHandle, "%.2f\n", maxValue);

 

        fclose(outputFileHandle);

 

       

    return 0;

}


será que tem uma forma resumida para fazer??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Impossível! fazer isso:

char buffer[iNPUT_LINE_SIZE_LIMIT];
fgets ( buffer, INPUT_LINE_SIZE_LIMIT, inputFileHandle );

 

...Esta totalmente equivocado. Depois de declarar um array na pilha não podemos modificar seu tamanho, e como vejo que você esta buscando uma "via fácil", te vou dizer que....

 

fgets ( buffer, INPUT_LINE_SIZE_LIMIT, inputFileHandle );

char buffer[iNPUT_LINE_SIZE_LIMIT];
 

...também é errado, pois não é a forma correta de fazer a coisa, ou seja, o C padrão não aconselha você fazer isso, pode funcionar porém também pode falhar, e vamos pensar em algo... você acha que seu professor é burro e não te vai dar zero por isso?>_< A única saída para declarar um array de tamanho variável totalmente correto é de usar malloc e free, si não use arrays de tamanho fixo.

 

Como vejo que você esta com a corda no pescoço lhe convido a si quiser, que me adicione em skype. Talvez, e si te interessa, possa explicar melhor certos conceitos que lhe possam ajudar a entender certas coisas sobre o arquivos e memória dinâmica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com a corda no pescoço mesmo, tenho até as 19:30 pra mandar vou ter que mandar isso mesmo, não tenho outra alternativa... esse PC não tem skype, seria uma boa. Já que tenho que me aprofundar mais nessa matéria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×