• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

gotak

Problema no Código

4 mensagens neste tópico

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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para facilitar a que alguém te ajude, sê um pouco mais específico acerca do problema, sff.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é o seguinte o programa devia ler quem enviou as mensagens, e quando carrego para ler ele diz 'opção incorrecta', mas nao sei qual é o problema  :hmm:

0

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