Lista Técnica de Clulares - Função editar dados de um celular

1. Lista Técnica de Clulares - Função editar dados de um celular

Karen Freitas
karenfreitas

(usa Outra)

Enviado em 13/12/2015 - 14:08h

Pessoal faz um tempinho eu estava com duas funções em meu programa, a exclusão e a alteração. Bom a exclusão consegui fazer, porem a alteração ainda não consegui terminar. Meu professor me deu algumas dicas de colocar um "sub-menu" e perguntar o usuário o que ele gostaria de alterar (modelo, marca, tela e etc...) esse menu tá em cometário no programa por enquanto e outra coisa que ele sugeriu foi usar a strcpy, mas não estou conseguindo me virar direito. Por favor se vocês puderem me ajudar, agradeço. :)
#define MAX 100
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct celular
{
char marca[15];
char modelo[25];
char processador[10];
char memoria [8];
char tela [4];
char inter [4];
char sisopera [15];
char valor [10];
};
typedef struct celular TCelular;

struct listaDeCelulares
{
unsigned ncel; // Número de celulares na lista
TCelular celulares[MAX];
};
typedef struct listaDeCelulares TListaCelulares;

void mostreCelular(TCelular cel)
{
printf("%-12s",cel.marca);
printf("%-15s",cel.modelo);
printf("%-8s",cel.processador);
printf("%-7s",cel.memoria);
printf("%-4s",cel.tela);
printf("%-4s",cel.inter);
printf("%-15s",cel.sisopera);
printf("%-9s",cel.valor);
printf("\n");

}

void mostreListaDeCelulares(TListaCelulares *lis)
{
int i;
printf("\n\n ----------- Lista de Celulares ------------\n");
printf(" MARCA-------MODELO---------PROCES.-MEM.--TELA-NET-S.O.-----------VALOR\n");
for(i=0; i<lis->ncel; i++) {
printf(" ");
mostreCelular(lis->celulares[i]);
printf("\n");
}
printf("\n\n");
}

int buscaCelular(TListaCelulares *lis, TCelular cel)
{
int i;
for(i=0; i<lis->ncel; i++)
if(strcmp(cel.modelo,lis->celulares[i].modelo) == 0)
printf("\n");
return i;
return -1;
}
int buscaCelularmodelo(TListaCelulares *lis, TCelular cel)
{
int i;
for(i=0; i<lis->ncel; i++)
if(strcmp(cel.modelo,lis->celulares[i].modelo) == 0)
mostreCelular(lis->celulares[i]);
printf("\n");
return i;
return -1;
}

int buscaCelularmarca(TListaCelulares *lis, TCelular cel)
{
int i;
for(i=0; i<lis->ncel; i++)
if(strcmp(cel.marca,lis->celulares[i].marca) == 0)
mostreCelular(lis->celulares[i]);
printf("\n\n");
return i;
return -1;
}

int buscaCelularinternet(TListaCelulares *lis, TCelular cel)
{
int i;
for(i=0; i<lis->ncel; i++)
if(strcmp(cel.inter,lis->celulares[i].inter) == 0)
mostreCelular(lis->celulares[i]);
printf("\n\n");
return i;
return -1;
}


void insereCelular(TListaCelulares *lis, TCelular cel)
{
lis->celulares[lis->ncel] = cel;
lis->ncel++;
}

int ordenaMarca(const void *a, const void *b)
{
TCelular *ca = (TCelular *) a;
TCelular *cb = (TCelular *) b;
return strcmp(ca->marca,cb->marca);
}

int ordenaValor(const void *a, const void *b)
{
TCelular *ca = (TCelular *) a;
TCelular *cb = (TCelular *) b;
return strcmp(ca->valor,cb->valor);
}

int ordenaProcessador(const void *a, const void *b)
{
TCelular *ca = (TCelular *) a;
TCelular *cb = (TCelular *) b;
return strcmp(ca->processador,cb->processador);
}

TCelular removeCelular(TListaCelulares *lis, int ind)
{
int i;
TCelular res = lis->celulares[ind];
for(i=ind; i<lis->ncel-1; i++)
lis->celulares[i] = lis->celulares[i+1];
lis->ncel--;
return res;
}


char menu()
{
printf("******************************\n");
printf("* Ficha T%ccnica de Celulares *\n",130);
printf("******************************\n\n");
printf(" 1 - FILTRAR celular pela Marca\n");
printf(" 2 - FILTRAR pela Tecnologia de Internet (3G ou 4G)\n");
printf(" 3 - INSERIR celular\n");
printf(" 4 - APAGAR celular\n");
printf(" 5 - MOSTRAR celulares ordenados pela Marca\n");
printf(" 6 - MOSTRAR celulares ordenados pelo Valor\n");
printf(" 7 - MOSTRAR celulares ordenados pelo Processador\n");
printf(" 8 - EDITAR dados de um celular\n");
printf("\n 0 - SAIR do aplicativo\n");
printf("\n Escolha uma op%c%co: ",135,198);
fflush(stdin);
return getchar();
}

char menu2()
{
printf("\n");
printf(" 1 - ALTERAR Marca\n");
printf(" 2 - ALTERAR Modelo\n");
printf(" 3 - ALTERAR Processador\n");
printf(" 4 - ALTERAR Memoria\n");
printf(" 5 - ALTERAR Tela\n");
printf(" 6 - ALTERAR Internet\n");
printf(" 7 - ALTERAR Sistema Operacional\n");
printf(" 8 - ALTERAR Valor\n");
printf(" 9 - Voltar ao MENU PRINCIPAL\n");
printf("\n Escolha uma op%c%co: ",135,198);
fflush(stdin);
return getchar();
{
int op1;
while(op1 != '0')
{
op1 = menu2();
switch(op1)
{
fflush(stdin);
case '1':
printf("editar marca\n");
break;
case '2':
printf("editar modelo\n");
break;
case '3':
printf("editar processador\n");
break;
case '4':
printf("editar memoria\n");
break;
case '5':
printf("editar tela\n");
break;
case '6':
printf("editar internet\n");
break;
case '7':
printf("editar sistema operacional\n");
break;
case '8':
printf("editar valor\n");
break;
case '9':
menu();
break;
default:
printf("\n\n **** Entrada invalida ****\n\n");
}
}
}
}

int main()
{
TListaCelulares liscel;
liscel.ncel = 0;
TCelular cel;
int rb;
int alterado = 0;
int op1;
char op2 = 'A';
char op = 'A';

FILE *fp;
fp = fopen("Celulares.arq","rb");
if(fp != NULL) {
fread(&liscel.ncel,sizeof(unsigned),1,fp);
fread(liscel.celulares,sizeof(TCelular),liscel.ncel,fp);

}
fclose(fp);
while(op != '0')
{
op = menu();
switch(op)
{
fflush(stdin);
case '1':
printf("\n\n **** Filtrar celulares pela marca ****\n");
printf("\n Marca: ");
fflush(stdin);
gets(cel.marca);
printf("\n\n-------------Lista de Celulares Filtrados pela Marca--------------\n");
printf("MARCA-------MODELO---------PROCES.-MEM.--TELA-NET-S.O.-----------VALOR\n");
rb = buscaCelularmarca(&liscel,cel);
if(rb < 0)
printf("\n **** Celular com esta marca n%co existe ****\n",198);
printf("\n\n");
break;
case '2':
printf("\n\n **** Filtrar celulares pela Tecnologia de Iternet (3G ou 4G) ****\n");
printf("\n Tecnologia de Internet: ");
fflush(stdin);
gets(cel.inter);
printf("\n\n------------Lista de Celulares Filtrados pela Internet------------\n");
printf("MARCA-------MODELO---------PROCES.-MEM.--TELA-NET-S.O.-----------VALOR\n");
rb = buscaCelularinternet(&liscel,cel);
if(rb < 0)
printf("\n **** Celular com esta tecnologia de internet n%co existe ****\n",198);
printf("\n\n");
break;
case '3':
fflush(stdin);
printf("\n\n --- Cria novo celular ---\n");
printf(" Modelo: ");
gets(cel.modelo);
rb = buscaCelular(&liscel,cel);
if(rb >= 0)
printf("\n **** Celular existente ****\n\n");
else
{
printf("\n\n");
printf(" Marca : ");
gets(cel.marca);
printf(" Modelo : ");
gets(cel.modelo);
printf(" Processador : ");
fflush(stdin);
gets(cel.processador);
printf(" Memoria : ");
gets(cel.memoria);
printf(" Tela : ");
gets(cel.tela);
printf(" Tecnologia de Internet: ");
gets(cel.inter);
printf(" Sistema Operacional : ");
gets(cel.sisopera);
printf(" Valor : ");
gets(cel.valor);
while(op2!='s' && op2!='S' && op2!='n' && op2!='N')
{
printf("\n Salvar celular? (s/n): ");
fflush(stdin);
op2 = getchar();
if(op2=='S' || op2=='s')
{
alterado = 1;
insereCelular(&liscel,cel);
printf("\n\n **** Celular criado ****\n\n");
}
else
if(op2!='N' && op2!='n')
printf("\n\n **** Pressione S ou N ****\n\n");
}
}
op2 = 'A';
break;

case '4':
fflush(stdin);
printf("\n\n **** Apagar celular ****\n");
printf(" Modelo: ");
gets(cel.modelo);
rb = buscaCelular(&liscel,cel);
if(rb < 0)
printf("\n **** Celular n%co existe ****\n",198);
else
{
printf(" Excluir %s? (S/N): ",cel.modelo);
op2 = getchar();
if(op2=='s' || op2=='S') {
removeCelular(&liscel,rb);
alterado = 1;
}
}
printf("\n\n");
break;
case '5':
qsort(liscel.celulares,liscel.ncel,sizeof(TCelular),ordenaMarca);
mostreListaDeCelulares(&liscel);
break;
case '6':
qsort(liscel.celulares,liscel.ncel,sizeof(TCelular),ordenaValor);
mostreListaDeCelulares(&liscel);
break;
case '7':
qsort(liscel.celulares,liscel.ncel,sizeof(TCelular),ordenaProcessador);
mostreListaDeCelulares(&liscel);
break;
case '8':

printf("\n\n **** EDITAR CELULAR ****\n");
printf("\n MODELO: ");
fflush(stdin);
gets(cel.modelo);
printf("MARCA-------MODELO---------PROCES.-MEM.--TELA-NET-S.O.-----------VALOR\n");
rb = buscaCelularmodelo(&liscel,cel);
if(rb < 0)
printf("\n **** Celular com esta modelo n%co existe ****\n",198);
else
printf("Marca:");
gets(cel.marca);
strcpy(cel.marca,cel.marca);
printf(" Alterar %s? (S/N): ",cel.marca);
op2 = getchar();
if(op2=='s' || op2=='S') {

alterado = 1;
//menu2 ();
break;
case '0':
break;
default:
printf("\n\n **** Entrada invalida ****\n\n");
}
}
if(alterado)
{
printf("\n\n Arquivo alterado. Deseja salvar as altera%c%ces? (S/N): ",135,228);
fflush(stdin);
op2 = getchar();
if(op2=='S' || op2=='s')
{
fp = fopen("Celulares.arq","wb");
fwrite(&liscel.ncel,sizeof(unsigned),1,fp);
fwrite(liscel.celulares,sizeof(TCelular),liscel.ncel,fp);
fclose(fp);
printf("\n **** O arquivo foi salvo ****\n");
}
}
printf("\n");
return 0;
}
}



  


2. Re: Lista Técnica de Clulares - Função editar dados de um celular

Thiago Henrique Hüpner
Thihup

(usa Linux Mint)

Enviado em 13/12/2015 - 14:33h

Olá!

Bom amigo, achei vários erros no seu código.

Pode se dizer que o "pior deles", é no fim do código, onde você faz


int main(){
while(...){
printf("\n");
return 0;
} // While
} // Main


Ou seja, você sai do programa já na primeira vez no fim do loop, imagino que deva ter sido um erro de identação, e que deveria ficar no main, e não no loop.

Outra coisa: o que você faz se o arquivo não existir, por exemplo? [Eu, por exemplo, não possuo e está me gerando problemas...]

Uma coisa que pode se tornar erro [no futuro] é já mostrado pelo compilador:


aviso: the `gets' function is dangerous and should not be used.


Não é recomendável utilizar a função gets, pois pode ocasionar problemas no seu programa, como overflow. Troque pela função fgets. Exemplo que como usar:


char vetor[365];
fgets(vetor,365,stdin);


Assim você permite que seja armazenado só o possível dentro do vetor.

Não sei se foi só aqui, mas acontece um Seg Fault ao executar o programa. Deve ser alguma coisa que fizeste na hora de manipular o arquivo [abrir, fechar, escrever,...].

Qualquer dúvida só postar.

Espero ter ajudado

[]'s

T+

--

Att,

Thiago Henrique Hüpner

(Mensagem scaneada pelo antivírus........ops! não precisa, afinal eu uso Linux!)







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts