Ir ao conteúdo
  • Cadastre-se

C Construir um programa que calcule a media e salve em um arquivo txt externo.


juh.monteiroo
Ir à solução Resolvido por arfneto,

Posts recomendados

Sou iniciante em C e não consigo encontrar onde estou errando.

Professor pediu para Construir um programa que solicite o nome do aluno, as notas, calcule a media e salve em um arquivo txt externo.

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

int main(void)
{
	FILE*fp;
	fp = fopen("media.txt", "W");
	if (fp == NULL)
	
{
  	// Nome do aluno
	char string [50];
	printf ("Nome do aluno: ");
	fgets(string, 50, stdin);
	
}
  //Declaração das variáveis
  float nota1, nota2, media;
  
  //Entrada de dados
  printf("Nota da Av1: ");
  scanf("%f",&nota1);
  
  printf("Nota da Av2: ");
  scanf("%f",&nota2);
  
  //Processamento
  media = (nota1 + nota2) / 2;
  
  //Saída
  printf("Media do aluno = %.1f\n",media);
  
  // comparar a nota para dizer se aprovado ou não
  {
  if(media>=6){
  	printf("Aprovado\n\n");
  }else{
  	printf("Reprovado\n\n");
  }
}
  
  system("pause");//pausa da tela somente para Windows
  fclose(fp);
  return 0;//retorno da função main  
}


O pragrama que fiz, cria o txt, porém o mesmo fica vazio.

 

 

Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues tentei o fprintf, mas estava dando erro. Então modifiquei o codigo. Mas agora não sei como faço para calcular a media

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

int main (void)
{
    FILE *fp;
    char aluno[50];
    char nota1[10];
    char nota2[10];
    char media[10];
    int i, j, k, l;
    int tamanho;
    
    fp = fopen ("Nota.txt", "w");
    if ( fp == NULL)
    {
        printf ("Erro ao tentar abrir o arquivo.");
        exit(1);
    }
    
    fprintf (fp, "Nome do aluno: ");
    printf ("Nome do Aluno: ");
    gets(aluno);
    
    //verificando a quantidade de caracteres da string frase
    tamanho = strlen(aluno);
    
    //gravando caractere por caractere
    for(i=0; i < tamanho; i++)
    {
        fputc (aluno[i], fp);
    }
        fprintf (fp, "\nNota Av1: ");
        printf ("Nota AV1: ");
        gets(nota1);
        
        
    //verificando a quantidade de caracteres da string frase
    tamanho = strlen(nota1);
    
    //gravando caractere por caractere
    for(j=0; j < tamanho; j++)
    {
        fputc (nota1[j], fp);
    }
    
        fprintf (fp, "\nNota Av2: ");
        printf ("Nota AV2: ");
        gets(nota2);
        
    
    //verificando a quantidade de caracteres da string frase
    tamanho = strlen(nota2);
    
    //gravando caractere por caractere
    for(k=0; k < tamanho; k++)
    {
        fputc (nota2[k], fp);
    }
    
        
    //verificando a quantidade de caracteres da string frase
    tamanho = strlen(media);

    for(l = 0; l< tamanho; l ++);

    {
        fputc (media[l], fp);
    }
        fprintf (fp, "\nMedia do aluno: ");
        printf ("Media do aluno: ");
        gets(media);
        
        
        
    
    fclose(fp);
    system("pause");
    return 0;
}
 

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

int main (void)
{
	FILE *fp;
	char aluno[50];
	char nota1[10];
	char nota2[10];
	char media[10];
	int i, j, k, l;
	int tamanho;
	
	fp = fopen ("Nota.txt", "w");
	if ( fp == NULL)
	{
		printf ("Erro ao tentar abrir o arquivo.");
		exit(1);
	}
	
	fprintf (fp, "Nome do aluno: ");
	printf ("Nome do Aluno: ");
	gets(aluno);
	
	//verificando a quantidade de caracteres da string frase
	tamanho = strlen(aluno);
	
	//gravando caractere por caractere
	for(i=0; i < tamanho; i++)
	{
		fputc (aluno[i], fp);
	}
		fprintf (fp, "\nNota Av1: ");
		printf ("Nota AV1: ");
		gets(nota1);
		
		
	//verificando a quantidade de caracteres da string frase
	tamanho = strlen(nota1);
	
	//gravando caractere por caractere
	for(j=0; j < tamanho; j++)
	{
		fputc (nota1[j], fp);
	}
	
		fprintf (fp, "\nNota Av2: ");
		printf ("Nota AV2: ");
		gets(nota2);
		
	
	//verificando a quantidade de caracteres da string frase
	tamanho = strlen(nota2);
	
	//gravando caractere por caractere
	for(k=0; k < tamanho; k++)
	{
		fputc (nota2[k], fp);
	}
	
		
	//verificando a quantidade de caracteres da string frase
	tamanho = strlen(media);

	for(l = 0; l< tamanho; l ++);

	{
		fputc (media[l], fp);
	}
		fprintf (fp, "\nMedia do aluno: ");
		printf ("Media do aluno: ");
		gets(media);
		
		
		
	
	fclose(fp);
	system("pause");
	return 0;
}

Meu txt agora mostra o nome do aluno e as notas, mas a media fica em branco.

jpg media.jpg

Link para o comentário
Compartilhar em outros sites

@juh.monteiroo Seu programa não está bom ainda. Vai ter trabalho para concluir desse modo.

 

6 minutos atrás, juh.monteiroo disse:
		
	//verificando a quantidade de caracteres da string frase
	tamanho = strlen(media);

	for(l = 0; l< tamanho; l ++);

	{
		fputc (media[l], fp);
	}
		fprintf (fp, "\nMedia do aluno: ");
		printf ("Media do aluno: ");
		gets(media);
		

 

Qual a razão desse ';' perdido depois do for e antes das chaves? 

 

Ele vai encerrar o comando.

 

Não use gets(). Não existe mais há décadas. Seu compilador não reclamou?

 

Não use system() nunca. Para nada.

 

Declare as variáveis de controle do loop DENTRO do loop ou no comando

    FILE* fp;
    char  aluno[50];
    char  nota1[10];
    char  nota2[10];
    char  media[10];
    int   i, j, k, l;
    int   tamanho;

    fp = fopen("Nota.txt", "w");
 

    FILE* fp;
    char  aluno[50];
    char  nota1[10];
    char  nota2[10];
    char  media[10];
    int   i, j, k, l;
    int   tamanho;

    fp = fopen("Nota.txt", "w");

 

Evite escrever assim. Entre a primeira e a última linha muita coisa pode acontecer e pode estar criando um hábito ruim. 
 

Prefira o simples
 

    FILE* fp = fopen("Nota.txt", "w");

 

    char  media[10];

 

10 letrinhas não deve ser o que pretende para guardar uma média. 

 

Prefira 

 

	double media = 0.;

 

int main(void)
{
    FILE* fp;
    char  aluno[50];
    char  nota1[10];
    char  nota2[10];
    char  media[10];
    int   i, j, k, l;
    int   tamanho;

 

Essas variáveis com esses nomes ingênuos i j k l são então globais a main(). Péssima ideia. Não use isso.

Não declare mais de uma variável por linha: é grátis. Não ajuda em nada ter que ficar procurando por elas.

Inicialize TODAS as variáveis. Use nomes mais significativos.

    FILE* fp = fopen("Nota.txt", "w");
    if (fp == NULL)
    {
        printf("Erro ao tentar abrir o arquivo.");
        exit(1);
    }

 

exit() em main pouco acrescenta: um return vai encerrar seu programa igualzinho. main() é, bem, main. 

     char nota1[10];
     char nota2[10];
     char media[10];

 

Não pode operar com essas variáveis, que são conjuntos de 10 letrinhas. Para somar precisa de um número. Para uma média precisa de algo que tenha decimais --- fração. Em geral se espera que a média entre 8 e 7 seja 7.5.

Link para o comentário
Compartilhar em outros sites

22 minutos atrás, arfneto disse:

@juh.monteiroo Seu programa não está bom ainda. Vai ter trabalho para concluir desse modo.

 

 

Qual a razão desse ';' perdido depois do for e antes das chaves? 

 

Ele vai encerrar o comando.

 

Não use gets(). Não existe mais há décadas. Seu compilador não reclamou?

 

Não use system() nunca. Para nada.

 

Declare as variáveis de controle do loop DENTRO do loop ou no comando

    FILE* fp;
    char  aluno[50];
    char  nota1[10];
    char  nota2[10];
    char  media[10];
    int   i, j, k, l;
    int   tamanho;

    fp = fopen("Nota.txt", "w");
 

    FILE* fp;
    char  aluno[50];
    char  nota1[10];
    char  nota2[10];
    char  media[10];
    int   i, j, k, l;
    int   tamanho;

    fp = fopen("Nota.txt", "w");

 

Evite escrever assim. Entre a primeira e a última linha muita coisa pode acontecer e pode estar criando um hábito ruim. 
 

Prefira o simples
 

    FILE* fp = fopen("Nota.txt", "w");

 

    char  media[10];

 

10 letrinhas não deve ser o que pretende para guardar uma média. 

 

Prefira 

 

	double media = 0.;

 

int main(void)
{
    FILE* fp;
    char  aluno[50];
    char  nota1[10];
    char  nota2[10];
    char  media[10];
    int   i, j, k, l;
    int   tamanho;

 

Essas variáveis com esses nomes ingênuos i j k l são então globais a main(). Péssima ideia. Não use isso.

Não declare mais de uma variável por linha: é grátis. Não ajuda em nada ter que ficar procurando por elas.

Inicialize TODAS as variáveis. Use nomes mais significativos.

    FILE* fp = fopen("Nota.txt", "w");
    if (fp == NULL)
    {
        printf("Erro ao tentar abrir o arquivo.");
        exit(1);
    }

 

exit() em main pouco acrescenta: um return vai encerrar seu programa igualzinho. main() é, bem, main. 

Muitos erros, rsrsrs.
Vou tentar fazer as modificações que falou.
Até aqui estou seguindo o que foi passado na faculdade, não estou tendo muitas opções pelo material que o professor passou. 
Vou refazer o codigo. Obrigada

Link para o comentário
Compartilhar em outros sites

  • Solução
51 minutos atrás, juh.monteiroo disse:

Vou tentar fazer as modificações que falou.
Até aqui estou seguindo o que foi passado na faculdade, não estou tendo muitas opções pelo material que o professor passou. 

 

J. , seu curso adota um livro? Tem alguma apostila? Aprendeu algo sobre tipos de dados por exemplo?

 

Exemplo

 

Esse programa calcula uma média de 5 notas e grava 4 vezes no arquivo. Serve pra ver como construir. Rode em sua maquina.

 

#include <stdio.h>

int main(void)
{
    const char* aluno = "Clube do Hardware";
    const double nota[] = { 6., 4., 8., 9.5, 10. };

    double soma = 0.;
    int    qtd  = sizeof(nota) / sizeof(nota[0]);
    for (int i = 0; i < qtd; i += 1) soma = soma + nota[i];

    printf("Aluno: %s\n\tNotas: ", aluno);
    for (int i = 0; i < qtd; i += 1)
        printf("%4.2f ", nota[i]);
    printf("\n\tMedia: %4.2f", soma / qtd);

    // grava isso 4x no arquivo
    const char* arquivo = "Nota.txt";

    FILE* fp = fopen(arquivo, "w");
    if (fp == NULL)
    {
        printf("Erro ao tentar abrir o arquivo.");
        return -1;
    }


    for (int i = 0; i < 4; i += 1)
    {
        fprintf( fp, "Aluno: %s\n\tNotas: ", aluno);
        for (int i = 0; i < qtd; i += 1)
            fprintf( fp, "%4.2f ", nota[i]);
        fprintf(fp, "\n\tMedia: %4.2f\n\n", soma / qtd);
    }

    fclose(fp);
    return 0;
}

 

Eis o arquivo gerado

 

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

 

É uma maneira comum de fazer essas coisas.

 

 

 

 

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

 

J. , seu curso adota um livro? Tem alguma apostila? Aprendeu algo sobre tipos de dados por exemplo?

 

Exemplo

 

Esse programa calcula uma média de 5 notas e grava 4 vezes no arquivo. Serve pra ver como construir. Rode em sua maquina.

 

#include <stdio.h>

int main(void)
{
    const char* aluno = "Clube do Hardware";
    const double nota[] = { 6., 4., 8., 9.5, 10. };

    double soma = 0.;
    int    qtd  = sizeof(nota) / sizeof(nota[0]);
    for (int i = 0; i < qtd; i += 1) soma = soma + nota[i];

    printf("Aluno: %s\n\tNotas: ", aluno);
    for (int i = 0; i < qtd; i += 1)
        printf("%4.2f ", nota[i]);
    printf("\n\tMedia: %4.2f", soma / qtd);

    // grava isso 4x no arquivo
    const char* arquivo = "Nota.txt";

    FILE* fp = fopen(arquivo, "w");
    if (fp == NULL)
    {
        printf("Erro ao tentar abrir o arquivo.");
        return -1;
    }


    for (int i = 0; i < 4; i += 1)
    {
        fprintf( fp, "Aluno: %s\n\tNotas: ", aluno);
        for (int i = 0; i < qtd; i += 1)
            fprintf( fp, "%4.2f ", nota[i]);
        fprintf(fp, "\n\tMedia: %4.2f\n\n", soma / qtd);
    }

    fclose(fp);
    return 0;
}

 

Eis o arquivo gerado

 

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

Aluno: Clube do Hardware
	Notas: 6.00 4.00 8.00 9.50 10.00 
	Media: 7.50

 

É uma maneira comum de fazer essas coisas.

 

 

 

 

 

 

 

 

O professor ministra as aulas baseando-se em slides. ele ainda não passou tipos de dados, pelo menos não com essa nomenclatura.. rsrs.
Fazia Engenharia civil, e mudei de curso para Ciencia da computação. E me encontro bem perdida nas materias.
E pelo pouco que já vi por aqui, muita coisa que estou prendendo nem se usa mais.
Vou precisar buscar livros para me aprofundar mais .

 

Tentei rodar seu programa, mas esta dando erro

erros .jpg

Link para o comentário
Compartilhar em outros sites

Pois é. Deve imaginar que não tem nada errado no que eu escrevi, já que eu postei também a saída do programa.

 

Leu as mensagens de erro? 

 

Seu ambiente está mal configurado e está usando uma versão da linguagem de décadas atrás. Que usa para compilar? Use ao menos a opção c17. Está usando a versão de C de '89 e naquela época já não se usava assim.

 

Usa um IDE?

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

21 minutos atrás, arfneto disse:

Pois é. Deve imaginar que não tem nada errado no que eu escrevi, já que eu postei também a saída do programa.

 

Leu as mensagens de erro? 

 

Seu ambiente está mal configurado e está usando uma versão da linguagem de décadas atrás. Que usa para compilar? Use ao menos a opção c17. Está usando a versão de C de '89 e naquela época já não se usava assim.

 

Usa um IDE?

 

 

 

 

 

Compilo pelo DEV C++, que foi o que o professor indicou para estudar.

Realmente deve ter algo de errado, porque tudo o que rodo nele da algum tipo de erro.

Mesmo os códigos que já foram rodados em sala de aula com o professor, tento rodar nele e sempre da algum erro.

Vou ver se desinstalo, e instalo novamente pra ver se resolve isso.

Link para o comentário
Compartilhar em outros sites

@juh.monteiroo Como já foi dito pelo arfneto, a configuração do devc++ que vem por padrão não vai te permitir declarar uma variável pra ser usada apenas no loop for.

Esse ambiente é um saco, mas o pessoal continua usando. Aposto que seu professor também não mudou pra C99 ou C11 como foi mencionado no erro, então se você mudar o modo, não vai rodar na máquina dele.

Pra evitar esse tipo de problema, você pode declarar o índice i antes do loop, mas pode continuar inicializando ele no loop mesmo.

Link para o comentário
Compartilhar em outros sites

@juh.monteiroo Não faça isso. reinstalar não vai mudar nada. E não vai aprender nada. Apenas aprenda a configurar. 

 

Esse é um ambiente muito ruim, esse IDE. Um dos piores. Uma pena que seu curso adote isso. De todo modo a opção de que precisa é trivial. Apenas use -std=c17 nas opções do compilador. 

 

E aproveite e marque a opção -Wall para mostrar mais mensagens de erro

 

image.png.3996f405dd82e061e2d033d2b312d247.png

 

Não parece complicado. Está no menu. Instalei pra ver.

 

 

 

image.png.5c6c08bbe6a8999e135fb50f564492d0.png

 

Pois é....

 

-Wall -std=c11 ou c17 se seu compilador não for tambem muito antigo

Instalei uma versão disso --- DevC++ --- aqui e diz que é a versão 5.11 atualizada em 16 dez 2021. E fui ver o compilador que acompanha. O compilador gcc. A versão? 4.9.2.

 

Fiquei curioso porque uso a versão 12.02 e fui consultar as datas em https://gcc.gnu.org/releases.html. Essa versão saiu em 30 de outubro. de 2014. 

 

Não é surpresa que o tal IDE tenha recusado minha opção de compilação c17 já que o compilador é de 2014.

 

Fuja disso. É só prejuízo. A linguagem evoluiu muito em 7 anos. E em trinta anos, considerando a versão que está usando, de 89.. Use algo mais recente.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

59 minutos atrás, arfneto disse:

@juh.monteiroo Não faça isso. reinstalar não vai mudar nada. E não vai aprender nada. Apenas aprenda a configurar. 

 

Esse é um ambiente muito ruim, esse IDE. Um dos piores. Uma pena que seu curso adote isso. De todo modo a opção de que precisa é trivial. Apenas use -std=c17 nas opções do compilador. 

 

E aproveite e marque a opção -Wall para mostrar mais mensagens de erro

 

image.png.3996f405dd82e061e2d033d2b312d247.png

 

Não parece complicado. Está no menu. Instalei pra ver.

 

 

 

image.png.5c6c08bbe6a8999e135fb50f564492d0.png

 

Pois é....

 

-Wall -std=c11 ou c17 se seu compilador não for tambem muito antigo

Realmente esse Dev c++ é muito ruim. Consegui fazer essa configuração que passou e o programa que o arfineto mandou, rodou certinho. Muito obrigada
Vou tentar fazer as modificações para o que o professor pediu.

Preciso fazer com que o programa receba o nome e as notas externas, calcule a media e grave em txt.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!