Jump to content

Problema no Código


gotak

Recommended Posts

boas,

é o seguinte tenho o meu código a dar todo sem problemas, mas quando quero ler as mensagens, nao consigo ler.

ps: o username é: sa / password: sa

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

#define MAX_MENS 500
#define MAX_USER 50

struct tagUser{
   char idUser[20];
   char password[20];
   char nome[20];
   int numMsg;
};
struct tagData{
   int dia;
   int mes;
   int ano;
   int hora;
   int minuto;
   int segundo;
};
struct tagMensagem{
char userSentMsg[20];
char userReceiveMsg[20];
struct tagData HoraeData;
char subject[50];
char msg[250];
};

void menu_principal();
void menu_admin();
void menu_geral();

int ProcUsername(struct tagUser c[], int nUser, char nome[]);
int LerNovaMensagem (struct tagMensagem Mensagem[], char username[], int readMensagem[], int numMensagem);
int CriarConta (struct tagUser username[], int numUser);
int ApagarConta (struct tagUser username[], int numUser, struct tagMensagem Mensagem[], int numMensagem, int readMensagem[]);
int ApagarMensagem (struct tagMensagem Mensagem[], int numMensagem, char username[], int readMensagem[]);
int ApagarUserSemLerMensagem (struct tagMensagem Mensagem[], int numMensagem, char username[], int readMensagem[]);
void LerMensagemUser (struct tagMensagem Mensagem[], int numMensagem, char username[], int readMensagem[]);
int CheckMensagem (struct tagMensagem Mensagem[], int numMensagem, char username[], int LerMensagem[]);
int EnviarMensagem (struct tagUser username[], struct tagMensagem Mensagem[], int numMensagem, int numAccounts, char userSentMsg[], int readMensagem[]);

//Main

int main ()
{
struct tagUser username[MAX_USER];
struct tagMensagem Mensagem[MAX_MENS];
int numUser = 1; // numUser é igual a 1 devido a já existir no sisteam o sa que está na posição 0
int opcao, opcao2, newMensagem, aux; 
int LerMensagem[MAX_MENS], numMensagem = 0; // para sabermos quantas mensagens existem no sistema e quais já foram lidas e não lidas. O LerMensagem é verificado quando for enviado logo, há mensagem nova não lida e quando forem lidas  que volta a colocar a 0 essa posição
char user[20], pass[20], log_out,pos;


strcpy(username[0].idUser,"sa");
strcpy(username[0].nome,"System Administrator");
strcpy(username[0].password,"sa");

do {
	menu_principal(); //menu principal
	scanf("%d",&opcao);

	switch(opcao) {
	case 0: //terminar o programa
		printf("Para Terminar o Programa e' necessario o Username e Password do Admin:\n");
		fflush(stdin);
		gets(user);
		fflush(stdin);
		gets(pass);
		if(strcmp(username[0].idUser, user)==0 && strcmp(username[0].password,pass)==0)
			printf("Dados Correctos!\n");
		else {
			printf("Username ou Password Incorrectos!\n");
			opcao=-1;
		}
		break;
	case 1: //fazer login, verfica o mesmo e passa para outros menus
		printf("Introduza um Username e Password:\n");
		fflush(stdin);
		gets(user);
		fflush(stdin);
		gets(pass);
		pos = ProcUsername(username, numUser, user); //Valida se o username introduzido existe ou não no array 'username'
		if(pos!=-1) { // Significa que existe a conta introduzida
			if(strcmp(username[pos].password,pass)==0) {
				if(strcmp(username[0].idUser,username[pos].idUser)==0 && strcmp(username[0].password,username[pos].password)==0) {  
					newMensagem = LerNovaMensagem(Mensagem, username[pos].idUser, LerMensagem, numMensagem);
					if(newMensagem>0)
						printf("Tem %d novas Mensagens\n",newMensagem);
					else
						printf("Nao tem Mensagens\n");
					do {
						menu_admin(); //menu do admin, uma vez que o utilizador fez login com o seu user e pass
						scanf("%d",&opcao2);

						switch(opcao2) {
						case 0: //Logout
							printf("Queres mesmo sair? (s/n)\n");
							fflush(stdin);
							scanf("%c",&log_out);
							if(log_out=='s')
								printf("Adeus!\n");
							else
								opcao2=-1;
							break;
						case 1: //criar conta 
							numUser = CriarConta(username, numUser); 
							break;
						case 2: //apagar conta
							aux = ApagarConta(username, numUser, Mensagem, numMensagem, LerMensagem);
							if(aux!=-1) {
								numUser--;
								numMensagem-=aux;
							}
							break;				
						case 3: //ler mensagens
							LerMensagemUser(Mensagem, numMensagem, username[pos].idUser, LerMensagem);
							break;
						case 4: //apagar mensagens não lidas do utilizador logado.
							numMensagem-=ApagarUserSemLerMensagem(Mensagem, numMensagem, username[pos].idUser, LerMensagem);
							break;
						case 5: //enviar mensagem
							numMensagem+=EnviarMensagem(username, Mensagem, numMensagem, numUser, username[pos].idUser, LerMensagem);
							break;
						default:
							printf("Opcao Incorrecta.\n");
							break;		
						}
					}while(opcao2!=0);
				}
				else { // Como o user e pass não são de administrador, então mostra as opções de user normal
					newMensagem = CheckMensagem(Mensagem, numMensagem, username[pos].idUser, LerMensagem);
					if(newMensagem>0)
						printf("Tem %d novas Mensagens\n",newMensagem);
					else
						printf("Nao tem Mensagens\n");
					do {
						menu_geral(); //menu geral, uma vez que o utilizador fez login com user e pass de users normais
						scanf("%d",&opcao2);

						switch(opcao2) {
						case 0:
							printf("Queres mesmo sair? (s/n)\n");
							fflush(stdin);
							scanf("%c",&log_out);
							if(log_out=='s')
								printf("Adeus!\n");
							else
								opcao2=-1;
							break;
						case 1: //ler mensagens
							LerMensagemUser(Mensagem, numMensagem, username[pos].idUser, LerMensagem);
							break;
						case 2: //apagar mensagens não lidas do utilizador logado.
							numMensagem-=ApagarUserSemLerMensagem(Mensagem, numMensagem, username[pos].idUser, LerMensagem);
							break;
						case 3: //enviar mensagem
							numMensagem+=EnviarMensagem(username, Mensagem, numMensagem, numUser, username[pos].idUser, LerMensagem);
							break;
						default:
							printf("Opcao Incorrecta.\n");
							break;		
						}
					}while(opcao2!=0); 
				}
			} else printf("Password incorrecta\n");
		} else printf("A conta nao existe");
		break;
	default:
		printf("Option incorrecta\n");
		break;
	}
}while(opcao!=0);

return 0;
}

// Fim da Main
void menu_principal()
{
   printf("\n******** Menu ********\n");
   printf("*   1 - Log On:      *\n");
   printf("*   2 - Terminar     *\n");
   printf("**********************\n");
   printf("Indique a opcao pretendida:");
}
void menu_admin()
{
   printf("\n********* System Menu *********\n");
   printf("*   1 - Criar Utilizadores      *\n");
   printf("*   2 - Apagar Utilizadores     *\n");
   printf("*   3 - Ler Mensagens           *\n");
   printf("*   4 - Apagar Mensagens        *\n");
   printf("*   5 - Enviar Mensagens        *\n");
   printf("*                               *\n");
   printf("*   0 - Sair                    *\n");
   printf("*********************************\n");
   printf("Indique a opcao pretendida:");
}
void menu_geral()
{
   printf("\n********* User Menu *********\n");
   printf("*   1 - Ler Mensagens        *\n");
   printf("*   2 - Apagar Mensagens     *\n");
   printf("*   3 - Enviar Mensagens     *\n");
   printf("*                            *\n");
   printf("*   0 - Sair                 *\n");
   printf("******************************\n");
   printf("Indique a opcao pretendida:");
}
//int procconta(struct tagConta b[],int num, int numCT)
int ProcUsername(struct tagUser c[], int numUser, char nome[])
{
int idx;
for(idx = 0; idx < numUser; idx++) {
   if(strcmp(c[idx].idUser, nome) == 0)
	return idx;
}
return -1;
}
int LerNovaMensagem (struct tagMensagem Mensagem[], char username[], int readMensagem[], int numMensagem) { // Função que verifica se existem mensagens novas ou não
int NovaMensagem = 0, i;

for(i=0;i<numMensagem;i++) {
	if(readMensagem[i]==1 && strcmp(Mensagem[i].userReceiveMsg,username)==0)
		++NovaMensagem;
	}
	if(NovaMensagem>0)
		return NovaMensagem;
	else
		return 0;
}
int CriarConta (struct tagUser username[], int numUser) { // Função que permite criar um novo utilizador
char aux[20];

if(numUser<50) { // Verifica se já excedeu o número de users possíveis no username
	printf("Introduza o username:\n");
	fflush(stdin);
	gets(aux);
	if(ProcUsername(username, numUser, aux)==-1) { // Verifica se o username introduzido já existe ou não.
		strcpy(username[numUser].idUser, aux);
		printf("Introduza o nome e a password:\n");
		fflush(stdin);
		gets(username[numUser].nome);
		fflush(stdin);
		gets(username[numUser].password);
		printf("A Conta foi criada com sucesso\n");
		return numUser+1;
	} else printf("Esse username ja' existe\n");
} else printf("O numero de Users foi atingido\n");
return numUser;
}
int ApagarConta (struct tagUser username[], int numUser, struct tagMensagem Mensagem[], int numMensagem, int readMensagem[]) { // Função que permite apagar contas, excepto a de adminitrador. Apaga também todas as mensagens desse utilizador.
int pos, numMensagemToDecrease;
char aux[20];

if(numUser>1) {
	printf("Introduza o Username a Eliminar:\n");
	fflush(stdin);
	gets(aux);
	pos = ProcUsername(username, numUser, aux);
	if(pos!=-1 && pos!=0) { // Verifica se o username introduzido existe ou não e tem de ser diferente de 0 pois o sa não se pode apagar.
		numMensagemToDecrease = ApagarMensagem(Mensagem, numMensagem, username[pos].idUser, readMensagem); 
		for(;pos<numUser;pos++) { // Realocar as posições do vector de modo a não ficar uma posição por utilizar.
			if(pos!=numUser-1) 
				strcpy(username[pos].idUser, username[pos+1].idUser);
				strcpy(username[pos].nome, username[pos+1].nome);
				strcpy(username[pos].password, username[pos+1].password);
		}
		printf("O User foi apagado\n");
		return numMensagemToDecrease; // Assim retorna o valor de numMensagem que tem de ser subtraido na main e uma vez que se returnar >=0 o numUser também reduzirá um valor uma vez que foi apagada uma conta do array username.
	} else printf("O username nao e valido.\n");
} else printf("Nao ha User a apagar");
return -1;
}
int ApagarMensagem (struct tagMensagem Mensagem[], int numMensagem, char username[], int readMensagem[]) { // Função que permite apagar todas as mensagens de um utilizador lidas ou não lidas, ou somente as não lidas.
int i, pos, numMensagemToDecrease = 0;

if(numMensagem>0) { // Caso seja verdade é porque existem mensagens no sistema.
	for(i=0;i<numMensagem;i++) { // Este for serve realocar as posições do array caso existe uma mensagem do utilizador que tem de ser apagada
		if(strcmp(Mensagem[i].userReceiveMsg, username)==0) { // Assim se a mensagem for para o username seja lida ou não irá apagá-la
			++numMensagemToDecrease; // Caso o if anterior seja verdade, sabemos que temos mais uma posição vaga no sistema de mensagens.
			pos = i;
			for(;pos<numMensagem;pos++) {
				if(pos!=numMensagem-1) { // Para o caso de ser verdade, então puxamos uma posição atrás até chegarmos à última em que esta não sofre alterações, uma vez que se for usada irão ser colocados lá os valores pretendidos
					if(readMensagem[pos+1]==1)
						readMensagem[pos] = 1;
					else readMensagem[pos] = 0;
					strcpy(Mensagem[pos].userSentMsg, Mensagem[pos+1].userSentMsg);
					strcpy(Mensagem[pos].userReceiveMsg, Mensagem[pos+1].userReceiveMsg);
					Mensagem[pos].HoraeData.ano = Mensagem[pos+1].HoraeData.ano;
					Mensagem[pos].HoraeData.mes = Mensagem[pos+1].HoraeData.mes;
					Mensagem[pos].HoraeData.dia = Mensagem[pos+1].HoraeData.dia;
					Mensagem[pos].HoraeData.hora = Mensagem[pos+1].HoraeData.hora;
					Mensagem[pos].HoraeData.minuto = Mensagem[pos+1].HoraeData.minuto;
					Mensagem[pos].HoraeData.segundo = Mensagem[pos+1].HoraeData.segundo;
					strcpy(Mensagem[pos].subject, Mensagem[pos+1].subject);
					strcpy(Mensagem[pos].msg, Mensagem[pos+1].msg);
				}
			}
		}
	}
	printf("%d As Mensagens Lidas e Não Lidas deste User foram apagadas\n", numMensagemToDecrease);
	return numMensagemToDecrease; // faz return do número de mensagens que se têm de descontar no numMessages
} else printf("Não ha mensagens a apagar\n");
return 0; // vai ter de returnar o número de numMessagesToDecrease, neste caso, não apagou mensagens, returnou 0 (só retorna mais que 0 se fizer o if.
}
int ApagarUserSemLerMensagem (struct tagMensagem Mensagem[], int numMensagem, char username[], int readMensagem[]) {
int i, pos, numMensagemToDecrease = 0;

if(numMensagem>0) { // Caso seja verdade é porque existem mensagens no sistema.
	for(i=0;i<numMensagem;i++) { // Este for é fundamental, pois serve realocar as posições do array caso existe uma mensagem do utilizador que tem de ser apagada
		if(strcmp(Mensagem[i].userReceiveMsg, username)==0 && readMensagem[i]==1) { // Só apaga a mensagem caso pertença ao utilizador que está login e se essa mensagem não tiver sido lida por esse.
			++numMensagemToDecrease; // Caso o if anterior seja verdade, já sabemos que temos mais uma posição vaga no sisteam de mensagens.
			pos = i;
			for(;pos<numMensagem;pos++) {
				if(pos!=numMensagem-1) { // Para o caso de ser verdade, então puxamos uma posição atrás até chegarmos à última em que esta não sofre alterações, uma vez que se for usada irão ser colocados lá os valores pretendidos
					if(readMensagem[pos+1]==1)
						readMensagem[pos] = 1;
					else readMensagem[pos] = 0;
					strcpy(Mensagem[pos].userSentMsg, Mensagem[pos+1].userSentMsg);
					strcpy(Mensagem[pos].userReceiveMsg, Mensagem[pos+1].userReceiveMsg);
					Mensagem[pos].HoraeData.ano = Mensagem[pos+1].HoraeData.ano;
					Mensagem[pos].HoraeData.mes = Mensagem[pos+1].HoraeData.mes;
					Mensagem[pos].HoraeData.dia = Mensagem[pos+1].HoraeData.dia;
					Mensagem[pos].HoraeData.hora = Mensagem[pos+1].HoraeData.hora;
					Mensagem[pos].HoraeData.minuto = Mensagem[pos+1].HoraeData.minuto;
					Mensagem[pos].HoraeData.segundo = Mensagem[pos+1].HoraeData.segundo;
					strcpy(Mensagem[pos].subject, Mensagem[pos+1].subject);
					strcpy(Mensagem[pos].msg, Mensagem[pos+1].msg);
				}
			}
		}
	}
	printf("%d As Mensagens Lidas e Não Lidas deste User foram apagadas\n", numMensagemToDecrease);
	return numMensagemToDecrease; // faz return do número de mensagens que se têm de descontar no numMessages
} else printf("Não ha mensagens a apagar");
return 0; // vai ter de returnar o número de numMessagesToDecrease, neste caso, não apagou mensagens, returnou 0 (só retorna mais que 0 se fizer o if.
}

int EnviarMensagem (struct tagUser username[], struct tagMensagem Mensagem[], int numMensagem, int numUser, char userSentMsg[], int readMensagem[]) {
char aux[20];
struct tm *systemTime;
time_t time1; // Variável criada para irmos buscar a data e hora do envio da mensagem.

if(numMensagem<500) {
	printf("Introduza o username a quem quer enviar:\n");
	fflush(stdin);
	gets(aux);
	if(ProcUsername(username, numUser, aux)!=-1) {
		strcpy(Mensagem[numMensagem].userReceiveMsg, aux);
		strcpy(Mensagem[numMensagem].userSentMsg, userSentMsg);
		time(&time1); // Vamos buscar o time do sistema
		systemTime = localtime(&time1); // Aqui vamos igualar todas a estreutura tm criada ao tempo do sistema guardado na variável time1 do tipo time_t.
		Mensagem[numMensagem].HoraeData.ano = systemTime->tm_year;
		Mensagem[numMensagem].HoraeData.mes = systemTime->tm_mon;
		Mensagem[numMensagem].HoraeData.dia = systemTime->tm_mday;
		Mensagem[numMensagem].HoraeData.hora = systemTime->tm_hour;
		Mensagem[numMensagem].HoraeData.minuto = systemTime->tm_min;
		Mensagem[numMensagem].HoraeData.segundo = systemTime->tm_sec;
		printf("Introduza o Assunto:\n");
		fflush(stdin);
		gets(Mensagem[numMensagem].subject);
		printf("Escreva a Mensagem:\n");
		fflush(stdin);
		gets(Mensagem[numMensagem].msg);
		readMensagem[numMensagem] = 1;
		return 1;
	} else printf("Esse User não coincide com qualquer usuário do Sistema de Mensagens\n");
} else printf("Não há espaço para novas mensagens\n");
return 0;
}
void LerMensagemUser (struct tagMensagem Mensagem[], int numMensagem, char username[], int readMensagem[]) {
int i;
char next;

if(numMensagem>0) {
	if(CheckMensagem(Mensagem, numMensagem, username, readMensagem)!=0) {
		for(i=0;i<numMensagem;++i) {
			if(strcmp(Mensagem[i].userReceiveMsg, username)==0) {
				printf("Enviado por:\n%s\n",Mensagem[i].userSentMsg);
			    printf("Data: %d/%d/%d \n",Mensagem[i].HoraeData.dia, Mensagem[i].HoraeData.mes, Mensagem[i].HoraeData.ano);
				printf("Hora: %d:%d:%d\n",Mensagem[i].HoraeData.hora, Mensagem[i].HoraeData.minuto, Mensagem[i].HoraeData.segundo);
				printf("Assunto:\n%s\n",Mensagem[i].subject);
				printf("Mensagem:\n%s\n",Mensagem[i].msg);
				printf("Esta mensagem ja foi lida antes %d\n",readMensagem[i]);
				readMensagem[i] = 0;
			}
			printf("Carregue Enter para ler a proxima mensagem.\n");
			fflush(stdin);
			scanf("%c",&next);
		}
		printf("Não tem a mais para ler\n");
	} else printf("Não tem a mais para ler");
} else printf("Nao ha mensagens no sistema\n");
}	

int CheckMensagem(struct tagMensagem Mensagem[], int numMensagem, char username[], int LerMensagem[]) {
int i, mensagens = 0;

for(i=0;i<numMensagem;i++) {
	if(strcmp(Mensagem[i].userReceiveMsg, username)==0)
		Mensagem++;
}
return mensagens;
}
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.