View Full Version : Stock Laboratorio em C
So_SiMpLe_ 27-01-2008, 11:39 Boas pessoal! :confused:
Tou aqui com um problema.
Tenho um trabalho para fazer de gestao de stocks de laboratorio. So que tou aqui a empancar com uma estrutura.
O seguinte excerto:
typedef struct
{
char nome_utente[60];
long int numero_bi;
char morada_utente[60];
long int telefone_utente;
}utente;
contador_utentes = 0;
utente utente[10];
Tenho problemas aqui, porque ao compilar o programa primeiro dá erro com o contador_utentes (Defaulting to int) e nao percebo porque, o objectivo de tar sozinho é para abranger todas as funções.
Depois dá erro com o utente, alias 3 erros:
-illegal use of type name 'utente'
-operands of + have illegal types 'untente' and 'int'
-type error:pointer expected
Não tou msm a perceber como resolver isto e pela nOObidade :lol: da questao não consigo passar daqui.
Alguem me pode ajudar please?
Abraço!
int contador_utentes = 0; // falta declarares a variável do tipo int
utente list_utente[10]; // nao podes ter variáveis com o mesmo nome de estruturas.
So_SiMpLe_ 27-01-2008, 11:58 Boas!
Desde já obrigado!
O problema do contador já nao da erro, mas o utente ainda dá o mesmo.
tenho nas funções quando vai buscar o nome_utente tenho assim:
gets (utente[contador_utentes].nome_utente);
é aqui que ele me da aqueles erros que referi acima.
:mad:
Abraço!
Ace-_Ventura 27-01-2008, 13:54 utente utente[10] só pode dar problemas. É como criares 1 variável chamada int (se fosse possível). Altera para utente utentes[10].
So_SiMpLe_ 27-01-2008, 17:33 Ace mas isso ja foi explicado pelo Aragtey que disse para por utente list_utente[10].
Tou msm a atrofiar com isto :mad:. tks anyway
Abraço!
Baderous 27-01-2008, 17:34 E já mudaste aqui?
gets (utente[contador_utentes].nome_utente);
So_SiMpLe_ 27-01-2008, 17:35 Mudar para qual Baderous? o utente tem de passar para list_utente?
Abraço!
Baderous 27-01-2008, 17:38 Mudar para qual Baderous? o utente tem de passar para list_utente?
Abraço!
Claro!
So_SiMpLe_ 27-01-2008, 17:44 Isso msm! já ta a funcar! :x2: desceumpem la sou mta noob nisto é um trabalho de faculdade eng mecanica. Tks!
Abraços!
So_SiMpLe_ 28-01-2008, 09:36 Boas!
Bem pelo menos a parte dos utentes já funca!
Tenho é um problema agora: Quando consulto os dados, aparece numeros como 43000 e tal para o nome e morada que tao em %d e 0 (zero) para os long ints do numero de telefone e BI.
Isto em vez de aparecer o nome, morada, telefone e BI mesmo do utente.
Deixo aqui o codigo para verem:
////REGISTO DE UTENTES
int regist_utente (void)
{
system("cls");
printf("nome?");
fflush(stdin);
gets(list_utente[contador_utentes].nome_utente);
printf("morada?");
fflush(stdin);
gets(list_utente[contador_utentes].morada_utente);
printf("telef?");
scanf("%ld",list_utente[contador_utentes].telefone_utente);
printf("bi?");
fflush(stdin);
scanf("%ld",list_utente[contador_utentes].numero_bi);
contador_utentes++;
system("pause");
return gest_utente();
}
////INFO DE UTENTES
int info_utente (void)
{
int numero;
system("cls");
printf("introduza o numero de utente: ");
scanf ("%d", &numero);
printf("%d\n", list_utente[numero-1].nome_utente);
printf("%d\n", list_utente[numero-1].morada_utente);
printf("%ld\n", list_utente[numero-1].telefone_utente);
printf("%ld\n", list_utente[numero-1].numero_bi);
system("pause");
return gest_utente();
}
Obrigado pessoal!!
Abraço!
%d é para escreveres inteiros, para escreveres string usas %s
http://br.geocities.com/sdiasneto/c_int/printf.htm
Baderous 28-01-2008, 09:44 ////INFO DE UTENTES
int info_utente (void)
{
int numero;
system("cls");
printf("introduza o numero de utente: ");
scanf ("%d", &numero);
printf("%d\n", list_utente[numero-1].nome_utente);
printf("%d\n", list_utente[numero-1].morada_utente);
printf("%ld\n", list_utente[numero-1].telefone_utente);
printf("%ld\n", list_utente[numero-1].numero_bi);
system("pause");
return gest_utente();
}
Então queres imprimir uma string e metes %d? Acho melhor meteres %s.
So_SiMpLe_ 28-01-2008, 09:57 É isso msm! tks! :D
já agora o prog ta.me a dar um erro quando pede o BI do tipo:
exception segment violation
Adress 0x4054bd
isto aparece noutra janela.
Sabem do que se trata?
Abraço!
Que faz isto ... return gest_utente(); ??
So_SiMpLe_ 28-01-2008, 10:23 Isso volta ao menu de gestao de utentes, onde tem mais opcoes:
int gest_utente (void)
{
int utente;
do{
system("cls");
printf(" GESTAO DE UTENTES\n\n\n");
printf(" 1- Ver informacao de um utente\n\n");
printf(" 2- Registar novo utente\n\n");
printf(" 3- Alterar dados do utente\n\n");
printf(" 4- Listar informacao de utentes\n\n");
printf(" 5- Regressar ao menu anterior\n\n\n");
printf(" Escolha uma opcao: ");
scanf("%d" , &utente);
switch (utente)
{
case 1 : info_utente();
break;
case 2 : regist_utente();
break;
case 3 : printf("oi"); //alterar_utente();
break;
case 4 : printf("oi"); //listar_utente();
break;
case 5 : main();
break;
}
}while (utente<1 || utente>5);
return 0;
}onde tenho o printf("oi"); é onde ainda nao fiz as funcoes correspondentes á alteração e lista de utentes.
Abraço!
Já descobri o porquê mas nao percebo. o problema de aparecer os numero ja ficou resolvido, agora quando pede o numero de telefone, bi ou algum que possua long int, ao pedir no programa as informações, se ponho caracteres ele segue, se puser numeros ele dá esse erro. 8|. De resto ta tdo a funcar!
Alguem me pode so dar uma ajudinha?
Mto obrigado!
Cumps
printf("%ld\n", &list_utente[numero-1].telefone_utente);
Experimenta por o '&'. Não sei se irá funcionar, o melhor é teres uma variável para ler e depois igualas.
Baderous 28-01-2008, 17:27 Experimenta por o '&'. Não sei se irá funcionar, o melhor é teres uma variável para ler e depois igualas.
Isso assim vai mostrar o endereço de memória e não o que ele quer.
Isso assim vai mostrar o endereço de memória e não o que ele quer.
Ups tens razão...copiei mal...queria copiar o scanf que ele faz. Obrigado pelo aviso.
So_SiMpLe_ 28-01-2008, 20:44 Boas!
Já deu! já nao da erro e aceita os numeros e mostra sem problema!
mto obrigado pessoal!!
abraços!
JarimbaG1S 29-01-2008, 16:26 Estou com um trabalho muito parecido, para não dizer igual, e preciso de ajuda.
Como altero os dados do utente? (pergunta para o So_SIMple_)
Sou um autêntico noob nisto...
walterwolf 29-01-2008, 18:15 Estou com um trabalho muito parecido, para não dizer igual, e preciso de ajuda.
Como altero os dados do utente? (pergunta para o So_SIMple_)
Sou um autêntico noob nisto...
para o caso de ser string:
strcpy(list_utente[x].nome_utente,novo_nome);
para caso de ser inteiro:
list_utente[x].numero_bi=novo_numero;
"x" - é a posição a modificar (int)
"novo_nome" - é a string k keres substituir pelo nome_utente (char)
"novo_numero" - o numero a substituir pelo numero_bi (int)
JarimbaG1S 29-01-2008, 23:51 Danke! :)
So_SiMpLe_ 30-01-2008, 12:52 Boas! desculpa so vi hj!
De qqer foram toma o meu para te ajudar!
int alterar_utente (void)
{
int numero;
system("cls");
printf ("\n\n Por favor introduza o numero de utente:");
scanf("%d", &numero);
if (contador_utentes == 0)
{printf("\n\n _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ");
printf(" |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_ |_|_|_|_|_|_|_|_|_|_|_|_| ");
printf(" |_|_| |_|_| ");
printf(" |_|_| ERRO! |_|_| ");
printf(" |_|_| Nao existem utentes registados! |_|_| ");
printf(" |_|_| Por favor registe utentes. |_|_| ");
printf(" |_|_|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_|_| ");
printf(" |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_ |_|_|_|_|_|_|_|_|_|_|_|_| \n");
system("pause");
}
else if (numero > contador_utentes)
{ system("cls");
printf(" _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ");
printf(" |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_ |_|_|_|_|_|_|_|_|_|_|_|_| ");
printf(" |_|_| |_|_| ");
printf(" |_|_| ERRO! |_|_| ");
printf(" |_|_| Numero de utente nao registado! |_|_| ");
printf(" |_|_| Por favor registe utentes. |_|_| ");
printf(" |_|_|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_|_| ");
printf(" |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_ |_|_|_|_|_|_|_|_|_|_|_|_| \n");
system("pause");
}
else
{
printf("\n\n Dados actuais do utente:");
printf("\n\n\n Nome do utente: %s\n\n", list_utente[numero-1].nome_utente);
printf(" Morada do utente: %s\n\n", list_utente[numero-1].morada_utente);
printf(" Telefone do utente: %ld\n\n", list_utente[numero-1].telefone_utente);
printf(" Numero de BI do utente: %ld\n\n\n", list_utente[numero-1].numero_bi);
printf("\n\n\n Introduza os seguintes dados a alterar:\n\n");
printf(" Nome do utente:");
fflush(stdin);
gets(list_utente[numero-1].nome_utente);
printf("\n\n Morada do utente:");
fflush(stdin);
gets(list_utente[numero-1].morada_utente);
printf("\n\n Numero de telefone do utente:");
scanf("%ld", &list_utente[numero-1].telefone_utente);
printf("\n\n Numero de BI do utente:");
scanf("%ld", &list_utente[numero-1].numero_bi);
system("pause");
return gest_utente();
}
return gest_utente();
}
Tá aqui. Mas nao te esqueças que este usa a estrutura para armazenar os dados!
Abraço!
So_SiMpLe_ 30-01-2008, 12:55 Boas!
Já agora, Como posso apagar a informacao de um equipamento?
Tenho um contador de equipamentos int contador_equipamento == 0.
e na parte de apagar pus:
int abater_equip (void)
{
int numeroequip;
system ("cls");
printf("introduza o numero de equipamento a abater");
scanf("%d", &numeroequip);
system ("pause");
return gest_equip();
}
A minha ideia era usar o numeroequip para depois igualar ao valor do contador_equipamento que quero apagar. Mas como? :D
Obrigado!
Abraço!
Como tas a usar array não podes apagar, podes é limpar essa posição no array, substituindo-o valores por valores de defeito, tipo:
list_utente[numeroequip].nome_utente = "";
list_utente[numeroequip].morada_utente = "";
ist_utente[numeroequip].telefone_utente = 0;
list_utente[numeroequip].numero_bi = 0;
outra coisa no return não precisas de ter "return gest_equi()", basta faz fazeres "return".
EDIT : Enganei-me a mim e a ti...sorry...para limpar as strings é melhor o strcpy.
So_SiMpLe_ 30-01-2008, 13:07 Belo!
Obrigado meu!
Pois como esta funcao ta associada á do menu, ao fazer return ele volta ao menu associado ne?
Obrigado!
Abraço!
Pois como esta funcao ta associada á do menu, ao fazer return ele volta ao menu associado ne?
O return no final de um procedimento returna a execução para o ponto anterior á chamada dessa mesma função. Ai o que estavas a fazer era a chamar novamente a funcao gest_utente() e só depois de sair dessa é que fazia esse return.
Provavelmento quando escolhia para sair do programa aparecia-te novamente uma janela de gestao de utentes.
walterwolf 30-01-2008, 16:22 Boas!
Já agora, Como posso apagar a informacao de um equipamento?
Tenho um contador de equipamentos int contador_equipamento == 0.
e na parte de apagar pus:
int abater_equip (void)
{
int numeroequip;
system ("cls");
printf("introduza o numero de equipamento a abater");
scanf("%d", &numeroequip);
system ("pause");
return gest_equip();
}
A minha ideia era usar o numeroequip para depois igualar ao valor do contador_equipamento que quero apagar. Mas como? :D
Obrigado!
Abraço!
fazes uma pesquisa pelo numeroequip que te devolva a sua posiçao de memoria
ao saber a posição de memoria do equipamento a abater, tens de puxar os outros equipamentos seguintes e depois decrementar o contador de equipamento, por exemplo se o equipamento k keres remover estiver na posição 2, puxas o da posição 3 para a 2, o da 4 para a 3, e assim sucessivamente (ciclo) e no fim decrementas o contador. e se estiver na ultima posição ocupada do array, ou seja, posição = contador-1, so precisas de decrementar o array.
Assim é a melhor forma de eliminar um campo do array em vez de estar a por valores k significam "nada".
peace out
Assim facilita nas ordenaçoes e pesquisa
JarimbaG1S 30-01-2008, 22:25 Tenho-o já feito (pelo menos para ter 13 :freak3:), corre, mas muito mal. Dá-me vários erros 0xblabla.
Se quiserem ver o trabalho (um bocadinho fraco, mas pronto) está aí (http://uwclanet.home.sapo.pt/projecto2008.rar). Se puderem corrigir eu agradeço imenso (ai que noob que sou :P). Pelo menos até amanhã de manha (pois ainda tenho de gravar em cd, entregar manuais de utilização e o pseudocódigo).
walterwolf 30-01-2008, 23:53 boy, tava a ver o teu programa e tens aki muitos problemas:
-o contador de utentes e equipametos têm de ser declarados globalmente e incrementados kuando inseres ou decrementados quando removes;
-nao era preciso passar por parametro a estrutura nas funcoes k envolve utentes e equipamentos, era so declarar globalmente, ex: UTENTE ut[50]; <-- tens ai um array de 50 posiçoes ou seja no maximo podes ter 50 utentes;
-tas a emprimir os dados do utente mal, tas a ir a posiçoes k n estao acupadas (posiçoes com lixo).
faz o dwld aqui (http://up-file.com/download/3ce94f827897/projecto2008.rar.html) . fiz algumas alteraçoes mas nao o suficiente pra tudo funcionar(n tou com muito tempo) , mudei a declaraço da estrutura UTENTE, declarei algumas funçoes k n estavam declaradas e pus o adiçionar utente e ver informaçoes do utente a funcionar (nao estavam bem)
tenta fazer essas mudanças no equipameto tb
JarimbaG1S 31-01-2008, 00:00 Obrigado, mais uma vez :)
Não consigo "sakar" o ficheiro. Tens alternativa? (mail ou outra coisa do genero vê a pm sff)
EDIT:Resolvido!
|
|