Ir para o conteúdo
Psycop

Duvida com Struct e Alocação Dinâmica

Mensagens Recomendadas

Psycop    2
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?

Editado por Psycop

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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 :


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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Psycop    2
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

Editado por Psycop

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
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.)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Psycop    2
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Psycop    2
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!

Editado por Psycop

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Psycop    2
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??

Editado por Psycop

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Psycop    2
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.