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!

AragTey
27-01-2008, 11:46
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!

AragTey
28-01-2008, 09:41
%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!

AragTey
28-01-2008, 10:05
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

AragTey
28-01-2008, 16:46
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.

AragTey
28-01-2008, 17:29
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!

AragTey
30-01-2008, 13:03
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!

AragTey
30-01-2008, 13:13
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!