• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ptrci

[C] Ajuda: Pesquisa em estruturas

22 mensagens neste tópico

Ola a todos estou a tentar fazer uma função que faz uma pesquisa numa estrutura em que a informação é guardada num vector, já ando as volta com isto e não consigo.

tenho esta estretura:

/* ---------------------------  Inicio  Estretura motas ---------------------------------------------*/

typedef struct { /* O typedef server para não estar a repetir a palavra stuct no código */	
	int agrupamento;				 /*Tipo de agrupamento: motos, carros, camiões*/
	int numero;						 /*Numero de indentificação */
	int tempo;                       /*Tempo ( temp acumualdao das etapas hh-mm-ss );*/
	int hh;						     /* Tempo horas */
	int mm;							 /* Tempo minutos */
	int ss;                          /* Tempo segundos */
	int classificacao;               /* Número de classificativas concluidas */ 
	char equipa [limequipa];         /*Equipa*/
	char marca [limmarca];			 /*Marca*/
	char modelo [limmodelo];		 /*Modelo*/
	char piloto [limpiloto];         /*Nome Piloto */
}motas;
/* ---------------------------  Fim  Estretura motas    ---------------------------------------------*/

os dados são guardados neste vector:

motas dakar1[250];  /* vector 250 ( motos)  */

alguém pode ajudar.

Isto é um trabalho sobe o Dakar que tenho de entregar, parece uma estupidez já ando a mais de três dias as voltas com isto e não sou capaz de fazer isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois esqueci me :wallbash:.

Digamos que inseri uma equipa com o n.º de identificação : "4"  ( [motas.numero] )  .

E quero fazer uma pesquisa em que encontre o n.º de identificação " 4" , e que diga o nome da equipa; piloto; marca ; ou seja os dados da estrutura que pertencem ao n.º de identificação 4.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que percebi queres uma função deste tipo.

int pesquisa(int n_id)
{
    int i;
    
    for(i=0;i<250;i++)
        if(dakar[i].numero==n_id)
        {
            printf(".........Os dados que queres");
            return 1;
        }
        
    return 0;
}

Podia igualmente ser feito com um while, mas a lógica é a mesma, percorrer dakar1 até ao fim. Se encontrarmos um numero de identificação compativel imprimes os seus dados. Retornei 0 só para ter algo que me diga no código se encontrou ou não, se não quiseres podes simplesmente dizer que quando encontrar o número i=250 isso terminaria o for;

se o vector dakar não for global. Tens que enviá-lo também para a função.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pa faz algo do tipo....

//n é o numero que tás a procura.
int i = 0;
while(dakar1[i]->numero != n && i < 250){
i++;
}
printf("%d\n",dakar1[i]->agrupamento);
printf("%d\n",dakar1[i]->tempo);
printf("%d\n",dakar1[i]->classificacao);
//..... e por ai fora

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que percebi queres uma função deste tipo.

int pesquisa(int n_id)
{
    int i;
    
    for(i=0;i<250;i++)
        if(dakar[i].numero==n_id)
        {
            printf(".........Os dados que queres");
            return 1;
        }
    return 0;
}

se o vector dakar não for global. Tens que enviá-lo também para a função.

Essa tá mais formal :thumbsup: e talvez mais simples..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol tava agora a modificar o post para por a hipótese do while  :-[ pessoalmente até gosto mais de usar whiles mas quando percorro vectores por alguma razão acho mais legivel o for :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado afinal era simples. era só fazer

 dakar[i].numero

. E eu nunca punha o

[i]. 

exprimentei tudo menos com o

[i]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@magician: cuidado com os apontadores ("->") no teu exemplo, é que ele não usa isso. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A"->" e o "." tem a mesma funcionalidade como programo muito em Java normalmente uso o "." mas não sei porque em C uso sempre a "->" tal como em php.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A"->" e o "." tem a mesma funcionalidade como programo muito em Java normalmente uso o "." mas não sei porque em C uso sempre a "->" tal como em php.

Não sabia. que tinham a mesma funcionalidade a mim explicaram que eram diferentes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A"->" e o "." tem a mesma funcionalidade como programo muito em Java normalmente uso o "." mas não sei porque em C uso sempre a "->" tal como em php.

Não sabia. que tinham a mesma funcionalidade a mim explicaram que eram diferentes.

E são diferentes. Quando usas apontadores usas o -> quando usar arrays usas o .

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu uso sempre a "->" tecnicamente está a apontar para uma variável da estrutura.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ambos dependem do uso que lhe quiseres dar é apenas um auxílio visual. Por exemplo:

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

typedef struct {
   int v1;
   int v2;
} estrutura;

int main()
{
estrutura a, *b;
   b=&a;
a.v1=1;
a.v2=2;

printf("%d - %d",a.v1, b->v2);

return 0;
}

o -> serve para que em vez de *b.v2 escrevas b->v2. Ou seja é a tradução visual para código da expressão "o elemento apontado por", se tentares usar nese caso em vez de a.v1, a->v1 vai dar erro porque a não é um apontador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Precisamente por isso é que uso a "->" é muito mais simples, para alem disso quando consultamos uma struct estamos a apontar para argumentos da mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas nem sempre serve usar o ->. Não sabia que já tinhas respondido e alterei a minha resposta anterior. Vê na última linha o exemplo que eu dou.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim mas como eu normalmente quando trabalho com structs uso alocação dinâmica de memoria as "->" tão sempre a bombar :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lol usando apontadores nem se discute. o "->" torna tudo muito mais legível, pelo menos na minha opinião.

Para ser sincero até nunca as tinha usado em C só em C++ mas quando fizes-te o teu exemplo fui testar a ver se se realmente dava. Pensava que era mais uma coisa exclusiva do c++  :-[

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não domino muito C sou mais Java :thumbsup: mas como tive 3 trabalho para fazer em C tive que aprender há força sozinho e fiz sempre com as "->" e foi sempre o que usei por isso é que não uso os "." no C ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção com a ordem das prioridades.

Em C, o "." tem mais prioridade do que o "*", logo, *b.v1 estaria incorrecto. Estarias a aceder ao elemento apontado por b.v1, e não ao elemento v1 apontado pela estrutura b.

O que tu querias usar era (*:thumbsup:.v1. Daí ter nascido o b->v1, porque repara, entre *b.v1, e b->v1 o número de caracteres é igual, agora com os parênteses a coisa complicava..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Upx.. Esqueci-me de por ai os  () :-[ bem visto. Mas o -> não apareceu só por serem menos caractéres, mas também porque facilita em muito a leitura do código principalmente em expressões complexas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora