Menu com defeito

1. Menu com defeito

Hudson Orsine Assumpção
brevleq

(usa Slackware)

Enviado em 29/09/2006 - 15:47h

Olha eu aqui de novo!!

Criei um rpograminha com menu, pore o menu ainda naum funciona corretamente será q vcs podem me ajudar?? O código é este:

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>

#define ENTER 10
#define ESCAPE 27

void cadastra(void);
void abre(void);
int pesquisa(char valor[14]);
void altera(void);
void exclui(void);
void lista(void);
void criabarrasuperior(WINDOW *barrasup);
WINDOW **menuf1(WINDOW **opcoes);
void deleta_menu(WINDOW **opcoes);
void ativa_ncurses(void);
int navegacao(WINDOW **opcoes,int quant,int inicio_coluna);

struct nascimento{
short int dia,mes;
short int ano;
};
struct dados{
char nome[30],endereco[30],identidade[11],cpf[14];
struct nascimento datanasc;
float altura,peso;
short int status;
};
FILE *arquivo;

void abre(void){ /* Abre o arquivo desejado para leitura ou escrita */
if((arquivo=fopen("cadastro.bvq","rb+"))==0)
arquivo=fopen("cadastro.bvq","wb+");
}

void cadastra(void){ /* Função simples que simplesmente lê o teclado, grava as informações no registro e depois*/
struct dados aux; /* salva em disco */
printw("\nNome: ");
getstr(aux.nome);
printw("\nEndereço: ");
getstr(aux.endereco);
printw("\nIdentidade: ");
getstr(aux.identidade);
printw("\nCPF: ");
getstr(aux.cpf);
printw("\nNascimento: ");
printw("\nDia: ");
scanw("%d",&aux.datanasc.dia);
printw("\nMês: ");
scanw("%d",&aux.datanasc.mes);
printw("\nAno ");
scanw("%d",&aux.datanasc.ano);
printw("\nAltura: ");
scanw("%f",&aux.altura);
printw("\nPeso");
scanw("%f",&aux.peso);
aux.status=1;
if (pesquisa(aux.cpf)){
printw("O cadastro já existe!! Não se pode cadastrar novamente!!");
}
else{
fwrite(&aux,sizeof(aux),1,arquivo);
}
}

int pesquisa(char valor[14]){
struct dados aux;
rewind(arquivo);
do{
fread(&aux,sizeof(aux),1,arquivo);
if (strcmp(aux.cpf,valor) == 0){
fseek(arquivo,-1*sizeof(aux),SEEK_CUR);
return(1);
}
}while (!feof(arquivo));
return(0);
}

void altera(void){
struct dados aux,aux2;
char pesq[14];
short int pos;
printw("\nCPF do cadastro desejado: ");
getstr(pesq);
if (!(pos=pesquisa(pesq))){
printw("Cadastro não encontrado!");
return(0);
}
fread(&aux2,sizeof(aux2),1,arquivo);
printw("\nNome: ");
getstr(aux.nome);
if (aux.nome[0]=='{TTEXTO}')
strcpy(aux.nome,aux2.nome);
printw("\nEndereço: ");
getstr(aux.endereco);
if (aux.endereco[0]=='{TTEXTO}')
strcpy(aux.endereco,aux2.endereco);
printw("\nIdentidade: ");
getstr(aux.identidade);
if (aux.identidade[0]=='{TTEXTO}')
strcpy(aux.identidade,aux2.identidade);
printw("\nCPF: ");
getstr(aux.cpf);
if (aux.cpf[0]=='{TTEXTO}')
strcpy(aux.cpf,aux2.cpf);
printw("\nNascimento: ");
scanw("%d",&aux.datanasc.dia);
scanw("/%d/",&aux.datanasc.mes);
scanw("%d",&aux.datanasc.ano);
printw("\nAltura: ");
scanw("%f",&aux.altura);
printw("\nPeso: ");
scanw("%f",&aux.peso);
aux.status=1;
fseek(arquivo,-1*sizeof(aux),SEEK_CUR);
fwrite(&aux,sizeof(aux),1,arquivo);
}

void exclui(void){
char pesq[14];
struct dados aux;
printw("\nDigite o CPF desejado: ");
getstr(pesq);
if (pesquisa(pesq)){
fread(&aux,sizeof(aux),1,arquivo);
aux.status=0;
fseek(arquivo,-1*sizeof(aux),SEEK_CUR);
fwrite(&aux,sizeof(aux),1,arquivo);
printw("\nValor excluido com sucesso!");
}
else{
printw("\nCadastro não encontrado!");
return(0);
}
}

void lista(void){ /*Função que lista todos os registros de um arquivo*/
struct dados aux;
rewind(arquivo);
do{
fread(&aux,sizeof(aux),1,arquivo);
if (aux.status){
printw("%s\n",aux.nome);
printw("%s\n",aux.endereco);
printw("%s ",aux.identidade);
printw("%s\n",aux.cpf);
printw("%d/",aux.datanasc.dia);
printw("%d/",aux.datanasc.mes);
printw("%d ",aux.datanasc.ano);
printw("%f ",aux.altura);
printw("%f\n\n",aux.peso);
fread(&aux,sizeof(aux),1,arquivo);
}
}while (!feof(arquivo));
}


void deleta_menu(WINDOW **opcoes){
register short int i;
for (i=0;i<=4;i++)
delwin(opcoes[i]);
free(opcoes);
}

WINDOW **menuf1(WINDOW **opcoes){
register short int i;
opcoes=(WINDOW **)malloc(5*sizeof(WINDOW *));
opcoes[0]=newwin(6,13,1,0);
wbkgd(opcoes[0],COLOR_PAIR(2));
box(opcoes[0],ACS_VLINE,ACS_HLINE);
for (i=1;i<=4;i++){
opcoes[i]=subwin(opcoes[0],1,11,i+1,2);
wbkgd(opcoes[i],COLOR_PAIR(2));
}
waddstr(opcoes[1],"CADASTRAR");
waddstr(opcoes[2],"ALTERAR");
waddstr(opcoes[3],"EXCLUIR");
waddstr(opcoes[4],"LISTAR");
wrefresh(opcoes[0]);
return(opcoes);
}

void criabarrasuperior(WINDOW *barrasup){
wbkgd(barrasup,COLOR_PAIR(2));
waddstr(barrasup," OPCOES "); /*Escreve mensagem na janela indicada*/
wattron(barrasup,COLOR_PAIR(4));
waddstr(barrasup,"(F1) ");
wattroff(barrasup,COLOR_PAIR(4));
waddstr(barrasup," SAIR");
wattron(barrasup,COLOR_PAIR(4));
waddstr(barrasup," (F2)");
wattroff(barrasup,COLOR_PAIR(4));
}

void ativa_ncurses(void){
initscr();
start_color();
init_pair(1,COLOR_WHITE,COLOR_BLUE);
init_pair(2,COLOR_BLUE,COLOR_WHITE);
init_pair(3,COLOR_YELLOW,COLOR_RED);
init_pair(4,COLOR_RED,COLOR_WHITE);
curs_set(0); /*torna o cursor invisível*/
noecho(); /*torna invisível o que o usuário digita*/
keypad(stdscr,TRUE); /*habilita o uso de teclas especiais*/
}

int navegacao(WINDOW **opcoes,int quant,int inicio_coluna){
int valor,pos=0;
for (;;){
valor=getch();
if (valor==KEY_DOWN || valor==KEY_UP){
wbkgd(opcoes[pos+1],COLOR_PAIR(2));
wnoutrefresh(opcoes[pos+1]);
if (valor==KEY_DOWN)
pos=(pos+1)%quant;
else
pos=(pos+quant-1)%quant;
wbkgd(opcoes[pos+1],COLOR_PAIR(1));
wnoutrefresh(opcoes[pos+1]);
doupdate();
}
else {
if (valor==ESCAPE){
return(-1);
}
else
if (valor==ENTER)
return(pos);
}
}
}



void main(void){
int escolha;
WINDOW *menu,*info;
ativa_ncurses();
bkgd(COLOR_PAIR(1));
menu=subwin(stdscr,1,80,0,0);
info=subwin(stdscr,1,80,24,0);
criabarrasuperior(menu);
wbkgd(info,COLOR_PAIR(2));
refresh();
do{
int selec=0;
WINDOW **menu_opcoes;
escolha=getch();
werase(info);
wrefresh(info);
if (escolha==KEY_F(1)){
menuf1(menu_opcoes);
printw("%d",selec);
selec=navegacao(menu_opcoes,9,0);
printw("\n%d",selec);
deleta_menu(menu_opcoes);
switch(selec){
case 0 : waddstr(info,"Escolha uma das opcoes disponiveis.");
break;
case 1 : waddstr(info,"Efetua um novo cadastro.");
break;
case 2 : waddstr(info,"Altera um cadastro existente.");
break;
case 3 : waddstr(info,"Exclui um cadastro existente.");
break;
case 4 : waddstr(info,"Lista cadastros existentes.");
break;
}
touchwin(stdscr);
refresh();
}
}while (escolha!=KEY_F(2));
delwin(menu);
delwin(info);
endwin();
return(0);
}

Eu naum sei usar direito a ncurses, portanto se vcs descobrirem os erros me informem detalhadamente como eu posso corrigir e porque está acontecendo isso!!

vlw


  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts