gotak Posted November 21, 2009 at 11:32 PM Report Share #297145 Posted November 21, 2009 at 11:32 PM 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 More sharing options...
gotak Posted November 23, 2009 at 06:16 PM Author Report Share #297305 Posted November 23, 2009 at 06:16 PM ninguem que me possa ajudar ? Link to comment Share on other sites More sharing options...
TheDark Posted November 23, 2009 at 10:43 PM Report Share #297353 Posted November 23, 2009 at 10:43 PM Para facilitar a que alguém te ajude, sê um pouco mais específico acerca do problema, sff. Desaparecido. Link to comment Share on other sites More sharing options...
gotak Posted November 23, 2009 at 11:44 PM Author Report Share #297360 Posted November 23, 2009 at 11:44 PM é 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 ? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now