Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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

    normal... você tem que criar o arquivo e por 5 3.2 7.8 7.0 3.0 9.9 dentro, logo chamar ele de texto.txt

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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






    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

    ×