Ajuda em trabalho em C

Benfas17

Membro
Boas.


Sou um novato no mundo da programacao e tenho que fazer um trabalho.
Basicamente preciso de arranjar um método que me permita armazenar objectos que sao dados em ficheiros de texto da seguinte forma:

A1(nome do objecto) 4(número de vertices) 5(cor do objecto)
10 10 /* estas 4 linhas sao as coordenadas d cada um dos 4 vertices */
10 20
20 10
20 20


Ora eu para isso fiz:

#################################

typedef struct s_vertice{

int x;
int y;
}vertice;



typedef struct s_objecto{


int cor;
char nome[100];

int n_vertices;
vertice *vertices;
struct s_objecto *Prox;
}objecto;

###########################################

Agora eu preciso é de arranjar algo ( de memória dinâmica (listas, filas, pilhas) ) que me permita armazenar todos os objectos (e respectivos vertices) sendo que o primeiro objecto no ficheiro de texto será o primeiro objecto a ser retirado da memoria (logo as pilhas estao excluidas certo ?).

Esta memória terá também de me deixar percorrer a lista para procurar, por exemplo, o objecto "D1" e assim lhe poder retirar os valores dos vertices( que vao ser necessarios para outras operaçoes). Como posso fazer isto? Agradecia imenso qualquer ajuda. Obrigado.
 
Ninguem? Nao tem de ser especifico para o meu problema mas basicamente gostaria que me explicassem como fazer uma lista que albergasse os objectos e como fazer "search" de um objecto especifico nessa lista. Obrigado.
 
Array não serve? Usas uns nomes um bocado estranhos e não consegui perceber se queres mesmo em ficheiros se em memória. Porque são duas situações distintas. Mas parece que queres mais a segunda hipotese:


Declaras um array com um número que penses não chegar lá por pouco (a ideia é nem reservar imensa memória desnecessariamente mas deixar preparado para o que vier).
tipo_de_dados nome_da_variavel[tamanho];

Não te esqueças que um array de 10 elementos começa no 0 e acaba no 9.
Para pesquisares tens de pensar o que uma pesquisa faz. E o que faz? Não adivinha, não sabe onde estão as coisas.
Fazes um ciclo que percorra todo o teu array. Em cada ciclo vai ver se naquela posição está o que tu queres procurar.



Qualquer dúvida volta a apitar.
 
Obrigado pela ajuda.

O que eu tenho é um ficheiro de texto com por exemplo isto escrito:

A1 3 5
10 30
10 20
10 10

Bola1 2 4
10 10
20 30

....etc ( ou seja uma string com o nome, dois int com o nº d vertices e com a cor do objecto(cada numero e uma cor) e os vertices em si (coordena x, coordenada y) ).


O que eu preciso de fazer é fazer uma estrutura para os vertices, uma estrutura para os objectos e depois colocar numa lista os objectos ( com vista a poder percorrer a lista em busca, por exemplo, do objecto "b2", e poder sacarlhe os vertices).

A minha duvida é mesmo como fazer listas que alberguem estas estruturas e como percorrelas em busca de determinado objecto ( e ao encontralo arranjar alguma maneira de poder "trabalhar" os varios vertices desse mesmo objecto).

Muito obrigado :)


Nota: Nao é para fazer com arrays mas obrigado.É mesmo para utilizar as estrutura:

typedef struct s_vertice{
int x;
int y;
}vertice;

(para os vertices)

e :

typedef struct s_objecto{
int cor;
char nome[100];
int n_vertices;
vertice *vertices;
struct s_objecto *Prox;
}objecto;

(para os objectos)
 
O que tu queres são "listas ligadas".

O melhor se calhar é googlares, porque ainda é um bocado complexo para estar aqui a explicar. Ia ficar aqui um testamento gigantesco.
 
E se fosse com uma base de dados? Não faço grande ideia do que queres exactamente por isso não sei até que ponto isto pode ser normal sugerir lol
 
Fazes mais uma estrutura só que em vez dessa estrutura representar um objecto desses que tu queres, representa o seu conjunto ou seja vai ter os tipos de estrutura que queres armazenar e um apontador para uma próxima estrutura que será ela propria.

Depois crias os procedimentos necessários para acrescentar/tirar valores da estrutura.

Se acrescentas -vais ate a ultima estrutura (é a ultima se o apontador para a estrutura genérica apontar para null) e colocas esse apontador a apontar para uma estrutura que criaste obrigatoriamente com o malloc.

Para retirar fazes de igual forma, procuras a ultima estrutura mas vais guardando sempre a anterior a essa, quando encontrares a ultima colocas a penúltima a apontar para null (ou seja apagas a ultima da lista) e assim por diante, o raciocínio vai variando de acordo com a estrutura pretendida.

Basicamente percorrer uma lista é pegares na primeira, vez qual a sua próxima, pegas na próxima, vez a próxima e assim por diante.

Treina com uma caneta e uns bonecos numa folha lolol :)
 
Se fosse ajuda de trabalho em PHP com base de dados ias fazer a base de dados em PHP?

Aliás, a ideia disto tudo é programas trabalharem com base de dados em vez de à unha andares a ver a base de dados.
 
Se fosse ajuda de trabalho em PHP com base de dados ias fazer a base de dados em PHP?

Aliás, a ideia disto tudo é programas trabalharem com base de dados em vez de à unha andares a ver a base de dados.

Se ele ta a fazer um trabalho em C e a aprender a programar, que razão o professor ia mandar fazer uma ligacao a uma base dados com C ???

Acho que entendeste bem o que eu disse, não queres é dizer........ :P


"Agora eu preciso é de arranjar algo ( de memória dinâmica (listas, filas, pilhas) ) que me permita armazenar todos os objectos (e respectivos vertices)..."
 
Última edição:
Hm... O meu professor também me mandou em tempo fazer uma ligação a uma base de dados e estava em programação, não em qualquer coisa relacionado com BD :)

Uma coisa é um exercicio, outra é um trabalho. Um trabalho costuma ser um pouco - não venhas dizer se é muito ou não pois não é isso que interessa - mais flexivel. Se dá ou não acho que é ele quem tem de decidir. Como podes ler no post tão complicado que fiz para ele (embora estejas muito preocupado com isso) disse que ainda não tinha percebido bem o que quer ele. Ele mesmo não sabe como fazer o que quer. Quer propostas, ideias. Ele depois lá decidirá como quer.

Mas se queres continuar a ver quem faz o melhor programa só em C, estás à vontade :)
 
Hm... O meu professor também me mandou em tempo fazer uma ligação a uma base de dados e estava em programação, não em qualquer coisa relacionado com BD :)

Uma coisa é um exercicio, outra é um trabalho. Um trabalho costuma ser um pouco - não venhas dizer se é muito ou não pois não é isso que interessa - mais flexivel. Se dá ou não acho que é ele quem tem de decidir. Como podes ler no post tão complicado que fiz para ele (embora estejas muito preocupado com isso) disse que ainda não tinha percebido bem o que quer ele. Ele mesmo não sabe como fazer o que quer. Quer propostas, ideias. Ele depois lá decidirá como quer.

Mas se queres continuar a ver quem faz o melhor programa só em C, estás à vontade :)

Ok, ok, as minhas desculpas.
 
O que ele quer é utilizar malloc e callocs para ter os objectos todos em memória.
E depois atravez de várias funções, alterar o conteudo de cada estrutura.

(btw se estás tão avançado no projecto como pareces estar... ou fazes muitas noitadas ou tas fdd...)
 
basicamente vais ao ficheiro ler as várias cenas e guardas para structs do tipo 'objecto'..depois, visto qe em cada uma delas tens um ponteiro a apontar para a proxima, basta interliga-las a partir daí e voilá..basicamente vais fazer uma lista disso...
 
Última edição:
segunda feira ja tenho meu pc, onde tenho la a minha vida academica toda. se ajudar em algo tenho la listas criadas prontas a utilizar. lololol

fica por exemplo uma que criei de gaz uma vez para guardar uns link´s, codigo nao compilado, retirei so o necessário do projecto que pode servir como exemplo. este tipo de codigo é feito em cima das pernas, assim nisntante.

Código:
typedef struct no_lista{
    char *valor;
    struct no_lista *prox;
}NO;

void InitLista(NO *no_aux){
    no_aux->valor=NULL;
    no_aux->prox=NULL;
}

void Insere(NO *no_aux, char* s){

    if (no_aux->valor==NULL){
        no_aux->valor = (char*)malloc ( strlen(s)+1 );
        
        strcpy(no_aux->valor,s);
        no_aux->prox=NULL;
        return;
    }
    NO *no_anterior=no_aux;

    while ( no_aux->prox != NULL ){
        no_anterior=no_aux;
        no_aux= no_aux->prox;
    }
    NO *pno = (NO*)malloc (sizeof (NO));
    pno->valor=(char*)malloc(strlen(s)+1);
    strcpy(pno->valor,s);

    pno->prox=NULL;
    no_aux->prox=pno;
}

char *Tira(NO *no_aux){
    char *s;
    int i=0;
    NO *no_anterior=no_aux;
    NO *no_ant_anterior=NULL;

    while (no_aux != NULL){
        i++;
        no_ant_anterior=no_anterior;
        no_anterior=no_aux;
        s=no_aux->valor;
        no_aux= no_aux->prox;
    }
    
    no_ant_anterior->prox=NULL;
    
    if (i==1){
        no_ant_anterior->valor=NULL;
    }else{
        free(no_anterior);
    }
    return (s);
}

int Contem(NO *lista, char *s)
{
int i;
int flag = 0;
    while(lista->valor != NULL){
    
i= strcmp(lista->valor,s);
        if (i==0 ){         
        flag = 1;
        }
        if (lista->prox != NULL)
{
    lista=lista->prox;
}else
{
return flag;
}
    }
    return flag;
}


void apaga(NO* lista){
    NO* aux;
    while(lista->valor!=NULL){
        free(lista->valor);
        aux=lista->prox;
        free(lista);
        lista=aux;
    }
}

Encontras aí uma estrutura e metodos basicos de inserção e eliminacao bem como se contêm e inicializacao da lista.

Nao e grande ajuda mas se estiveres muito mal ajuda a compreender o funcionamento de uma lista, e so criar um main iniciar uma lista e utilizar essa como sendo sempre o inicio.

Cumps
 
Se fosse ajuda de trabalho em PHP com base de dados ias fazer a base de dados em PHP?

Aliás, a ideia disto tudo é programas trabalharem com base de dados em vez de à unha andares a ver a base de dados.

Lá está o trabalho dele é em C e não C com base de dados. De qualquer maneira se ele quisesse usar uma base de dados para fazer uma coisa tão simples ia perder mais tempo a fazer a ligação e criação da base de dados do que fazer uma porra de umas listas simples ligadas.
 
Back
Topo