Jump to content
Psycop

Duvida com Struct e Alocação Dinâmica

Recommended Posts

Psycop

Boas

Estou a tentar implementar uma solução de um problema usando alocação dinâmica de memória e estruturas, mas confesso que me sinto bastante perdido em como alocar memória dinâmica para uma estrutura.

O código que tenho escrito até agora é o seguinte:

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

//Definição do Máximo de Unidades Curriculares que Podem ser alocadas dinamicamente
#define MAX_UC 32

typedef struct _UC
{
int ano;
int semestre;
char nome_uc[30];
int ects;
float nota;
}UC;

typedef UC* Uc;

//Função para Criar Aluno e Inserir Informação
void criar_aluno()
{
//Definição da Variável para abertura do ficheiro
FILE *entrada;
Uc = (UC)malloc(MAX_UC*sizeof(UC));
}


void main()
{
//Declaração da Variavel de escolha do MENU
int escolha = 0;

   //Permite uma correcta acentuação das palavras embora não funcione para a definição dos nomes dos ficheiros
setlocale(LC_ALL, "Portuguese");

printf("\t\t\t Project Lab\n\n\n");

//Menu Principal de Escolha das Opções
do
{
	printf("1 - Criar Aluno: ");
	printf("\n2 - Editar Informação do Aluno: ");
	printf("\n3 - Consultar Informação do Aluno: ");
	printf("\n4 - SAIR");
	printf("\n\nOpçao: ");
	fflush(stdin);
	scanf("%d", &escolha);
	switch(escolha)
	{
		case 1:
		{
			break;
		}
		case 2:
		{
			break;
		}
		case 3:
		{
			break;
		}
		case 4:
		{
			exit(0);
			break;
		}
		default:
		{
			break;
		}
	}
}while (escolha != 4);
system("pause");
}

Alguém me pode ajudar a perceber qual é a forma correcta de implementar dinamicamente a alocação de memória em estruturas que irão imprimir os dados num ficheiro txt.

PS: Actualmente estou a usar o Codeblocks como IDE, mas tentei usar o Visual Studio 2012 e o mesmo código ao correr aparece repetidamente o MENU, como se o ciclo while não tivesse condição para validar. Alguém sabe o porquê de isto acontecer?

Edited by Psycop

Share this post


Link to post
Share on other sites
HappyHippyHippo

Alguém me pode ajudar a perceber qual é a forma correcta de implementar dinamicamente a alocação de memória em estruturas que irão imprimir os dados num ficheiro txt.

um estrutura assim como todas as outras variáveis é somente uma forma de ler dados de um bloco de dados.

é por essa razão que o malloc serve para tudo !!

struct Estrutura * var1 = malloc(sizeof(struct Estrutura)); // estas a pedir um bloco de memória com o tamanho exacto da estrutura
struct Estrutura * var2 = malloc(sizeof(struct Estrutura) * 2); // estas a pedir um bloco de memória com o tamanho exacto de duas estruturas

PS: Actualmente estou a usar o Codeblocks como IDE, mas tentei usar o Visual Studio 2012 e o mesmo código ao correr aparece repetidamente o MENU, como se o ciclo while não tivesse condição para validar. Alguém sabe o porquê de isto acontecer?

eis um exemplo claro do fflush(stdin) ser (à falta de melhores palavras) : estúpido e quem ensina a fazer isso nunca deveria estar a fazer o que está a fazer.

solução :

https://www.portugal-a-programar.pt/topic/60506-limpar-buffer-do-stdin/


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Psycop

Olá Novamente

Estou mais uma vez de volta de um trabalho que engloba estruturas e alocação dinâmica de estuturas, e estou a deparar-me com alguns problemas os quais não estou a conseguir superar.

Aqui vai o código que tenho até ao momento:

/*************************************************************
Nome: Nuno Santos
Numero: 50959
Projecto: Lab_INF_I
Data: 16 - 04 - 2013
Observações: Definição dos MENU's e Recolha e Leitura de Dados
		 Usando Funções, Alocação Dinâmica e Estruturas
*************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <locale.h>

//Definição do Máximo de Unidades Curriculares que Podem ser alocadas dinamicamente
#define MAX_UC 32


typedef struct _UC
{
int ano;
int semestre;
char nome_uc[30];
int ects;
float nota;
}UC;

UC *Uc;


//Função para Criar Aluno e Inserir Informação
void criar_aluno()
{
//Definição da Variável para abertura do ficheiro
FILE *entrada;

//Definição da variável de escolha Continuar a Inserir Unidades Curriculares
int escolha_continuar_inserir = 0;

   int i = 0;
int num_uc;

//Alocação Dinâmica de Memória
Uc = (UC*)malloc(MAX_UC*sizeof(UC));

  if(Uc == NULL)
{
	printf("Memória Insuficiente!!");
}
else
{
	printf("Memória Alocada com Sucesso!!\n\n\n");
}

//Introdução e recolha da informação do Aluno
char nome_aluno[100];
int num_mec_aluno;
char nome_ficheiro_aluno[105];

printf("Insira o Número Mecanográfico do Aluno: ");
scanf("%d", &num_mec_aluno);
printf("Insira o Nome do Aluno(Sem Acentuação): ");
fflush(stdin);
scanf("%[^\n]", nome_aluno);
//Inserir Unidades Curriculares

do
{
	printf("Insira O Nome da Unidade Curricular: ");
	scanf("%s", Uc[i].nome_uc);
	printf("\nInsira o Ano da Unidade Curricular: ");
	scanf("%d", &Uc[i].ano);
	printf("\nInsira o Semestre da Unidade Curricular: ");
	scanf("%d", &Uc[i].semestre);
	printf("\nInsira a Nota da Unidade Curricular: ");
	scanf("%f", &Uc[i].nota);
	printf("\nInsira os ECTS da Unidade Curricular: ");
	scanf("%d", &Uc[i].ects);

	//Abertura e verificação do ficheiro de saida
	entrada = fopen("ficheiro_entrada.txt","a+");

	if(entrada == NULL)
	{
		perror("Erro na Abertura do Ficheiro!!\n\n");
		exit(0);
	}
	else
	{
		//Gravação dos Dados no ficheiros de Saida
		fprintf(entrada, "Numero Mecanográfico: %d \n", num_mec_aluno);
		fprintf(entrada, "Nome do Aluno: %s \n", nome_aluno);
		fprintf(entrada, "Nome da UC: %s \n", Uc[i].nome_uc);
		fprintf(entrada, "Ano da UC: %d \n", Uc[i].ano);
		fprintf(entrada, "Semestre da UC: %d \n", Uc[i].semestre);
		fprintf(entrada, "Nota da UC: %f \n", Uc[i].nota);
		fprintf(entrada, "ECTS da UC: %d \n", Uc[i].ects);
		fprintf(entrada, "\n\n");
	}

	//Incremento do i para adição de novas estruturas
	i++;

	num_uc = i;

	printf("Numero de Unidades Curriculares Inseridas = %d", num_uc);
	//Escolha para continuar a inserir mais Unidades Curriculares
	//Opção de Continuar a Inserir Dados
	printf("\n Pretende Inserir Mais Dados? (1- Sim | 2 - Nao): ");
	printf("\n\nOpçao: ");
	scanf("%d", &escolha_continuar_inserir);

}while(escolha_continuar_inserir == 1);

if(escolha_continuar_inserir == 2)
{
	main();
}
printf("\n\n");
}

//Função para consulta dos dados do Aluno
void consultar_info_aluno()
{
//Definição de Variáveis dos ficheiros
FILE *entrada;

int i=0;

//Alocação Dinâmica de Memória
Uc = (UC*)malloc(MAX_UC*sizeof(UC));

if(Uc == NULL)
{
	printf("Memória Insuficiente!!");
}
else
{
	printf("Memória Alocada com Sucesso!!\n\n\n");
}

//Introdução e recolha da informação do Aluno
char nome_aluno[100];
int num_mec_aluno;
char nome_ficheiro_aluno[105];

entrada = fopen("ficheiro_entrada.txt", "r");
if (entrada == NULL)
{
	perror("Erro na Abertura do Ficheiro de Entrada");
}
else
{
	while(!feof(entrada))
		{
			//Leitura dos dados do Ficheiro
			fscanf(entrada, "Numero Mecanográfico: %d \n", &num_mec_aluno);
			fscanf(entrada, "Nome do Aluno: %s \n", nome_aluno);
			fscanf(entrada, "Nome da UC: %s \n", Uc[i].nome_uc);
			fscanf(entrada, "Ano da UC: %d \n", &Uc[i].ano);
			fscanf(entrada, "Semestre da UC: %d \n", &Uc[i].semestre);
			fscanf(entrada, "Nota da UC: %f \n", &Uc[i].nota);
			fscanf(entrada, "ECTS da UC: %d \n", &Uc[i].ects);
			fscanf(entrada, "\n\n");

			//Apresentação dos dados no Ecrã
			printf(entrada, "Numero Mecanográfico: %d \n", num_mec_aluno);
			printf(entrada, "Nome do Aluno: %s \n", nome_aluno);
			printf(entrada, "Nome da UC: %s \n", Uc[i].nome_uc);
			printf(entrada, "Ano da UC: %d \n", Uc[i].ano);
			printf(entrada, "Semestre da UC: %d \n", Uc[i].semestre);
			printf(entrada, "Nota da UC: %f \n", Uc[i].nota);
			printf(entrada, "ECTS da UC: %d \n", Uc[i].ects);
			printf("\n\n");
			i++;
		}
}
}


//Função para o tratamento de dados do Aluno
void tratamento_info_aluno()
{
}


void main()
{
//Declaração da Variavel de escolha do MENU
int escolha = 0;

//Permite uma correcta acentuação das palavras embora não funcione para a definição dos nomes dos ficheiros
setlocale(LC_ALL, "Portuguese");

printf("\t\t\t Project Lab\n\n\n");

//Menu Principal de Escolha das Opções
do
{
	printf("1 - Criar Aluno: ");
	printf("\n2 - Editar Informação do Aluno: ");
	printf("\n3 - Consultar Informação do Aluno: ");
	printf("\n4 - SAIR");
	printf("\n\nOpçao: ");
	fflush(stdin);
	scanf("%d", &escolha);

	switch(escolha)
	{
		case 1:
		{
			criar_aluno();
			break;
		}
		case 2:
		{
			break;
		}
		case 3:
		{
			consultar_info_aluno();
			break;
		}
		case 4:
		{
			exit(0);
			break;
		}
		default:
		{
			break;
		}
	}
}while (escolha != 4);

system("pause");
}

O meu problema neste momento está na leitura dos dados na função consultar_info_aluno() na qual não estou a conseguir ler os dados e imprimi-los correctamente no ecrã e não sei muito bem onde possa estar o erro.

Gostaria ainda de uma opinião acerca de se a minha implementação está a seguir um caminho correcto ou se deveria optar por uma outra abordagem.

No geral a aplicação tem de consegui recolher os dados das unidades curriculares do aluno, verificar quantas faltam para a totalidade das UC do curso, respectiva média ponderada e ECTS que faltam e já conseguidos, infomação esta que será posteriormente escrita no inicio do ficheiro juntamente com o nome e num mecanográfico do aluno e logo a baixo virão as UC's e respectivas informações.

Cumprimentos

Edited by Psycop

Share this post


Link to post
Share on other sites
Rui Carlos

Qual é o conteúdo do ficheiro?

(Em todo o caso, e assumindo que o conteúdo é texto, recomendava a utilização do fgets para ler directamente uma linha do ficheiro, e depois fazias o parsing da linha.)

Share this post


Link to post
Share on other sites
Psycop

O conteúdo do ficheiro é a informação inserida pelo utilizador! Ou seja o utilizador regista o aluno (para já apenas 1 aluno) e as unidades curriculares e suas informações consequentemente! depois disso a informação será processada, de modo a calcular a média das notas, ects e unidades curriculares em falta, sendo tudo isso posteriormente escrito no ficheiro.

Mas depois de escrito o ficheiro poderá ser lido e apresentado no ecrã assim como modificado o seu conteudo ou mesmo adicionadas novas unidades curriculares!

Cumprimentos

Share this post


Link to post
Share on other sites
Rui Carlos

Há alguma razão para guardares os ficheiros em modo de texto?

Há alguma razão para colocares o texto "Numero Mecanográfico:" antes dos dados?

Diria que se pudesses evitar algum dos pontos anteriores simplificavas a tua tarefa.

Adicionalmente, isto

fscanf(entrada, "Nome do Aluno: %s \n", nome_aluno);

quase de certeza que vai falhar devido ao facto do nome ter espaços.

Podes ver aqui como resolver o problema.

Mas volto a repetir que devia ser melhor utilizar o fgets para ler directamente uma linha do ficheiro, e depois fazer o parsing da linha.

Share this post


Link to post
Share on other sites
Psycop

No Enunciado do problema propõem a seguinte estrutura para o output dos dados num ficheiro .txt!

Descrição do Ficheiro Dados.txt

Cabeçalho (1ª linha):

No Mecanográfico do aluno (99999 <=> desconhecido);

Nome do aluno (Sem Nome <=> desconhecido);

No de UC que constam no Ficheiro (exemplo: 36);

Média com das notas do ficheiro que são diferentes de 99.99 (99.99 <=> não calculado);

ECTS em falta(exemplo: 180);

As UCs (restantes linhas):

Ano;

Semestre;

Nome da UC;

ECTS;

Nota ( 99.99 <=> nota desconhecida/não inserida);

É por esse motivo que eu estava a recolher a informação do aluno anteriormente, de modo a poder escreve-la no ficheiro!

No entanto é possivel colocar previamente todas as unidades curriculares e suas informações como ano, semestre, ects excepto a nota num ficheiro e ler para a aplicação a partir desse ficheiro, inserindo apenas a nota na respectiva unidade curricular!

Edited by Psycop

Share this post


Link to post
Share on other sites
Psycop

Olá novamente

Já consegui alguns avanços, nomeadamente a leitura de todos os dados excepto as notas das UC's para o vector de estruturas com o seguinte código:

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


//Definição do Máximo de Unidades Curriculares que Podem ser alocadas dinamicamente
#define MAX_UC 36

typedef struct _UC
{
char nome_uc[100];
int ano;
int semestre;
int ects;
float nota;
}UC;


UC *Uc;

//Função para Criar o Aluno
void criar_aluno()
{
int num_mecanografico = 0;
char nome_aluno[100];
//Input da Informação do Aluno
printf("Insira o Numero Mecanográfico do Aluno: ");
scanf("%d", &num_mecanografico);
printf("\n\n");
printf("Insira o Seu Nome: ");
scanf("%s", nome_aluno);
printf("\n\n");
}

//Função para ler os Dados do ficheiro de Entrada
void ler_ficheiro_dados_entrada()
{
//Definição da Variável para abertura do Fichero de Entrada
FILE *entrada;
//Definição da Variável i para incremento do Vector
int i = 0;
int x = 0;
//Alocação Dinâmica de Memória para o Vector de Estruturas
Uc = (UC*)malloc(MAX_UC*sizeof(UC));
//Verificação da correcta Alocação de Memória
if(Uc == NULL)
{
 perror("Erro na Locação de Memória");
 exit(0);
}
//Abertura e verificação do Ficheiro de Entrada
entrada = fopen("Dados.txt", "r");
if (entrada == NULL)
{
 perror("Erro na Abertura do Ficheiro de Dados!!");
 exit(0);
}
else
{
 for(i = 0; i < MAX_UC; i++)
 {
	 //Leitura dos dados do Ficheiro de Entrada De acordo com a Sua Estutura de Dados
	 fscanf(entrada, "Nome da UC: %[^\n] \n", Uc[i].nome_uc);
	 fscanf(entrada, "Ano: %d \n", &Uc[i].ano);
	 fscanf(entrada, "Semestre: %d \n", &Uc[i].semestre);
	 fscanf(entrada, "ECTS: %d \n", &Uc[i].ects);
	 fscanf(entrada, "Nota: %f \n", &Uc[i].nota);
 }
 for (x = 0; x < MAX_UC; x++)
 {
	 printf("Nome da UC: %s \n", Uc[x].nome_uc);
	 printf("Ano: %d \n", Uc[x].ano);
	 printf("Semestre: %d \n", Uc[x].semestre);
	 printf("ECTS: %d \n", Uc[x].ects);
	 //Caso Não Haja Nota Inserida coloca-se o valor 99
	 if(Uc[x].nota == 0)
	 {
		 Uc[x].nota = 99;
	 }
	 printf("Nota: %f \n", Uc[x].nota);
	 printf("\n");
 }
}
}


//Função Para Inserir As Notas do Aluno nas Respectivas Unidades Curriculares
void inserir_notas_uc()
{

}


int main()
{
//Declaração da Variavel de escolha do MENU
int escolha = 0;
//Permite uma correcta acentuação das palavras embora não funcione para a definição dos nomes dos ficheiros
setlocale(LC_ALL, "Portuguese");
printf("\t\t\t Project Lab\n\n\n");
//Menu Principal de Escolha das Opções
do
{
 printf("***MENU Principal***\n\n");
 printf("1 - Criar Aluno: ");
 printf("\n2 - Editar Informação do Aluno: ");
 printf("\n3 - Consultar Informação do Aluno: ");
 printf("\n4 - SAIR");
 printf("\n\nOpçao: ");
 fflush(stdin);
 scanf("%d", &escolha);
 switch(escolha)
 {
	 case 1:
	 {
		 criar_aluno();
		 break;
	 }
	 case 2:
	 {
		 inserir_notas_uc();
		 break;
	 }
	 case 3:
	 {
		 ler_ficheiro_dados_entrada();
		 break;
	 }
	 case 4:
	 {
		 exit(0);
		 break;
	 }
	 default:
	 {
		 break;
	 }
 }
}while (escolha != 4);
system("pause");
}

O que acontece é que eu agora preciso de inserir as notas das correspondentes Unidades curriculares, podendo ou não inserir a nota consoante o aluno já tenha concluído a unidade curricular.

A minha grande dúvida agora é como é que eu poderei fazer a leitura da nota e coloca-la na correspondente unidade curricular??

Edited by Psycop

Share this post


Link to post
Share on other sites
Psycop

Entretanto já evoluí um pouco mais mas continuo com alguns problemas, tais como o calculo errado da média final, assim como a impressão do valor nota que foi inserida pelo utilizador no ficheiro final.

Aqui está o código:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <locale.h>
//Definição do Máximo de Unidades Curriculares que Podem ser alocadas dinamicamente
#define MAX_UC 36
typedef struct _UC
{
   char nome_uc[100];
   int ano;
   int semestre;
   int ects;
   float nota;
}UC;
UC *Uc;
//Função para Criar o Aluno
void criar_aluno()
{
   int num_mecanografico = 0;
   char nome_aluno[100];
   FILE *saida;
   //Input da Informação do Aluno
   printf("Insira o Numero Mecanográfico do Aluno: ");
   scanf("%d", &num_mecanografico);
   printf("\n\n");
   printf("Insira o Seu Nome: ");
   scanf("%s", nome_aluno);
   printf("\n\n");
   //Output do Cabeçalho do Aluno para Um novo ficheiro
   //Abertura e verificação do Ficheiro de Entrada
   saida = fopen("Dados_Aluno.txt", "w");
   if (saida == NULL)
   {
    perror("Erro na Abertura do Ficheiro de Dados!!");
    exit(0);
   }
   else
   {
    //Output do Cabeçalho
    fprintf(saida,"Numero Mecanográfico do Aluno: %d", num_mecanografico );
    fprintf(saida, "\nNome do Aluno: %s \n\n\n", nome_aluno);
   }
}

//Função para ler os Dados do ficheiro de Entrada
void ler_ficheiro_dados_entrada()
{
   //Definição da Variável para abertura do Fichero de Entrada
   FILE *entrada;
   //Definição da Variável i para incremento do Vector
   int i = 0;
   int x = 0;
   //Alocação Dinâmica de Memória para o Vector de Estruturas
   Uc = (UC*)malloc(MAX_UC*sizeof(UC));
   //Verificação da correcta Alocação de Memória
   if(Uc == NULL)
   {
    perror("Erro na Locação de Memória");
    exit(0);
   }
   //Abertura e verificação do Ficheiro de Entrada
   entrada = fopen("Dados.txt", "r");
   if (entrada == NULL)
   {
    perror("Erro na Abertura do Ficheiro de Dados!!");
    exit(0);
   }
   else
   {
    for(i = 0; i < MAX_UC; i++)
    {
	    //Leitura dos dados do Ficheiro de Entrada De acordo com a Sua Estutura de Dados
	    fscanf(entrada, "Nome da UC: %[^\n] \n", Uc[i].nome_uc);
	    fscanf(entrada, "Ano: %d \n", &Uc[i].ano);
	    fscanf(entrada, "Semestre: %d \n", &Uc[i].semestre);
	    fscanf(entrada, "ECTS: %d \n", &Uc[i].ects);
	    fscanf(entrada, "Nota: %f \n", &Uc[i].nota);
    }
    for (x = 0; x < MAX_UC; x++)
    {
	    printf("Nome da UC: %s \n", Uc[x].nome_uc);
	    printf("Ano: %d \n", Uc[x].ano);
	    printf("Semestre: %d \n", Uc[x].semestre);
	    printf("ECTS: %d \n", Uc[x].ects);
	    //Caso Não Haja Nota Inserida coloca-se o valor 99
	    if(Uc[x].nota == 0)
	    {
		    Uc[x].nota = 99;
	    }
	    printf("Nota: %f \n", Uc[x].nota);
	    printf("\n");
    }
   }
   //Leitura dos Dados do Ficheiro de entrada
}
//Função Para Inserir As Notas do Aluno nas Respectivas Unidades Curriculares
void inserir_notas_uc()
{
   //Definição da Variável para abertura do Fichero de Entrada
   FILE *entrada;
   FILE *saida;
   //Definição da variável de escolha Continuar a Inserir Unidades Curriculares
   int escolha_continuar_inserir = 0;
   //Definição das Variáveis de Contagem das Unidades Curriculares e ECTS
   int num_uc_concluidas = 0;
   int total_ects = 0;
   float somatorio_notas = 0;
   float media = 0;
   //Definição da Variável i para incremento do Vector
   int i = 0;
   int x = 0;
   //Alocação Dinâmica de Memória para o Vector de Estruturas
   Uc = (UC*)malloc(MAX_UC*sizeof(UC));
   //Verificação da correcta Alocação de Memória
   if(Uc == NULL)
   {
    perror("Erro na Locação de Memória");
    exit(0);
   }
   //Abertura e verificação do Ficheiro de Entrada
   entrada = fopen("Dados.txt", "r");
   if (entrada == NULL)
   {//Leitura dos dados do Ficheiro de Entrada De acordo com a Sua Estutura de Dados
		    fscanf(entrada, "Nome da UC: %[^\n] \n", Uc[i].nome_uc);
		    fscanf(entrada, "Ano: %d \n", &Uc[i].ano);
		    fscanf(entrada, "Semestre: %d \n", &Uc[i].semestre);
		    fscanf(entrada, "ECTS: %d \n", &Uc[i].ects);
		    fscanf(entrada, "Nota: %f \n", &Uc[i].nota);
    perror("Erro na Abertura do Ficheiro de Dados!!");
    exit(0);
   }
   else
   {
    for(i = 0; i < MAX_UC; i++)
    {
		    //Leitura dos dados do Ficheiro de Entrada De acordo com a Sua Estutura de Dados
		    fscanf(entrada, "Nome da UC: %[^\n] \n", Uc[i].nome_uc);
		    fscanf(entrada, "Ano: %d \n", &Uc[i].ano);
		    fscanf(entrada, "Semestre: %d \n", &Uc[i].semestre);
		    fscanf(entrada, "ECTS: %d \n", &Uc[i].ects);
		    fscanf(entrada, "Nota: %f \n", &Uc[i].nota);
		    if (Uc[i].nota == 0)
		    {
			    printf("\n\n");
			    printf("Nome da UC: %s  \n", Uc[i].nome_uc);
			    printf("Ano: %d \n", Uc[x].ano);
			    printf("Semestre: %d \n", Uc[x].semestre);
			    printf("ECTS: %d \n", Uc[x].ects);

			    printf("\n\nPretende Inserir a Nota Desta Unidade Curricular? (1- Sim | 2 - Nao): ");
			    printf("\n\nOpçao: ");
			    scanf("%d", &escolha_continuar_inserir);
			    if (escolha_continuar_inserir == 1)
			    {
				    printf("Insira a nota: ", Uc[i].nota);
				    scanf("%d", &Uc[i].nota);
				    //Incrementa o numero de unidades curriculares terminadas
				    num_uc_concluidas++;
				    //Incrementa o numeros de ects totais
				    total_ects += Uc[i].ects;
				    //Incrementa o Somatório das Notas
				    somatorio_notas += Uc[i].nota;
				    //Output de Toda a Informação do Aluno para Um novo ficheiro
				    //Abertura e verificação do Ficheiro de Entrada
				    saida = fopen("Dados_Aluno.txt", "a");
				    if (saida == NULL)
				    {
					    perror("Erro na Abertura do Ficheiro de Dados!!");
					    exit(0);
				    }
				    else
				    {
						    //Escrita dos dados do Ficheiro de Saida dos Dados do Aluno
						    fprintf(saida, "\n\n\nNome da UC: %s \n", Uc[i].nome_uc);
						    fprintf(saida, "Ano: %d \n", Uc[i].ano);
						    fprintf(saida, "Semestre: %d \n", Uc[i].semestre);
						    fprintf(saida, "ECTS: %d \n", Uc[i].ects);
						    fprintf(saida, "Nota: %f \n", Uc[i].nota);
				    }
			    }
		    }
    }
    //Calculo da Média Ponderada do Aluno
    media = (somatorio_notas / num_uc_concluidas);
    //Output no Ecrã dos Resultados Finais
    printf("Somatorio Notas: %f", somatorio_notas);
    printf("\n\nNumero Uc's Terminadas: %d", num_uc_concluidas);
    printf("\nTotal de ECTS: %d", total_ects);
    printf("\nMedia Ponderada: %f", media);
    printf("\n\n\n");
   }
}
int main()
{
   //Declaração da Variavel de escolha do MENU
   int escolha = 0;
//Permite uma correcta acentuação das palavras embora não funcione para a definição dos nomes dos ficheiros
   setlocale(LC_ALL, "Portuguese");
   printf("\t\t\t Project Lab\n\n\n");
   //Menu Principal de Escolha das Opções
   do
   {
    printf("***MENU Principal***\n\n");
    printf("1 - Criar Aluno: ");
    printf("\n2 - Editar Informação do Aluno: ");
    printf("\n3 - Consultar Informação do Aluno: ");
    printf("\n4 - SAIR");
    printf("\n\nOpçao: ");
    fflush(stdin);
    scanf("%d", &escolha);
    switch(escolha)
    {
	    case 1:
	    {
		    criar_aluno();
		    break;
	    }
	    case 2:
	    {
		    inserir_notas_uc();
		    break;
	    }
	    case 3:
	    {
		    ler_ficheiro_dados_entrada();
		    break;
	    }
	    case 4:
	    {
		    exit(0);
		    break;
	    }
	    default:
	    {
		    break;
	    }
    }
   }while (escolha != 4);
system("pause");
}

Alguém sabe o que poderei estar a fazer mal?

Cumprimentos

Share this post


Link to post
Share on other sites
Rui Carlos

Estás a misturar I/O com computação, o que é uma má prática... Separa a leitura dos dados e os printfs da computação.

Suspeito que no calculo da média esteja em dividires o total pelo número de UC concluídas, em vez de dividires pelo total de ECTS.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.