Jump to content
Debbugger

*

Recommended Posts

Debbugger

Boas.Vou iniciar um programar para gestao de uma frota de motas e estou com algumas duvidas.

Em relação á definiçao de cada menu,por exemplo o menu inserir motas para implementar as funcionalidades dentro deste menu sao

    (I)nserir Mota

-->(A)lterar Mota

-->©onsulta Mota

-->(A)lterar mota

-->(E)liminar Mota

É melhor usar 5 funções certo(uma para cada funcionalidade)?Sendo que estas cinco fazem parte da funçao viaturas(que basicamente so serve para conter estas 5 e para poder ser chamada no menu principal ,certo?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Tens de ter um vector de estruturas com as características de cada mota.


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

E como é que eu declaro isso?Para declarara uma struct mota e do tipo:

struct Mota
{
        char  matricula[10];
         float autonomia ;
       char marca[20];
};

E depois como é que declaro o vector com estas estruturas?E se eu definir o tamanho maximo do vector como 20 , não e possivel inserir mais do que 2o motas certo?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Supondo que esses são os campos que tens na estrutura fica:

#define MAX 30

// Definir novo tipo de dado -> nova estrutura
typedef struct
{
    char matricula[10], marca[20];
    float autonomia;
} Bikes;

Bikes bikes[MAX]; // Declarar uma variável (um vector com MAX posições) do tipo Bikes


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

E em relação á definiçao de cada menu,por exemplo o menu inserir motas para implementar as funcionalidades dentro deste menu sao

    (I)nserir Mota

-->(A)lterar Mota

-->©onsulta Mota

-->(A)lterar mota

-->(E)liminar Mota

É melhor usar 5 funções certo(uma para cada funcionalidade)?Sendo que estas cinco fazem parte da funçao viaturas(que basicamente so serve para conter estas 5 e para poder ser chamada no menu principal ,certo?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Sim, convém não misturares tudo. É sempre boa prática criar funções para organizar o código. No entanto, também não deves cria-las em excesso, logo não precisas dessa tal função viaturas. Podes simplesmente ter uma função que vai mostrar o menu e que, dependendo do que o utilizador inserir, vai chamar determinada função.


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

Sim, convém não misturares tudo. É sempre boa prática criar funções para organizar o código. No entanto, também não deves cria-las em excesso, logo não precisas dessa tal função viaturas. Podes simplesmente ter uma função que vai mostrar o menu e que, dependendo do que o utilizador inserir, vai chamar determinada função.

Mas essa funçao para chamar as outras vai ser a viaturas();.E como é que eu posso fazer isso?Eu tenho o menu principal com uma esturura de switch depois tenho várias funçoes que podem ser chamadas e o que eu quero depois é definir dentro dessas funções mais subfunções.Tenho de criar outro menu que é apresentado quando é invocada uma função do menu principal?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Debbugger

Supondo que esses são os campos que tens na estrutura fica:

#define MAX 30

// Definir novo tipo de dado -> nova estrutura
typedef struct
{
    char matricula[10], marca[20];
    float autonomia;
} Bikes;



Bikes bikes[MAX]; // Declarar uma variável (um vector com MAX posições) do tipo Bikes

E se eu quiser fazer um scanf da matricula por exemplo como e que faço?

scanf("%c",&Bikes1);

Posso fazer isto?

E se quiser declarar uma funçao que recebe e devolve esta struct?Como e que eu fazia isso?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Repara que já estás a perguntar coisas que vão envolver a maioria do programa. Agora também convém leres algo sobre estruturas (provavelmente tens um livro mas se não tiveres, tens a internet) e sobre as outras coisas nas quais tens dúvidas.

Tu para definires uma função fazes:

tipo_de_retorno nome_da_função (parâmetros_da_função)

Tu já tens definido um novo tipo (tipo Bikes) definido e agora queres fazer o retorno de uma estrutura desse tipo, como é que achas que fazes isso..?


here since 2009

Share this post


Link to post
Share on other sites
Debbugger
Tu para definires uma função fazes:

tipo_de_retorno nome_da_função (parâmetros_da_função)

Tu já tens definido um novo tipo (tipo Bikes) definido e agora queres fazer o retorno de uma estrutura desse tipo, como é que achas que fazes isso..?

Epah eu só estou a ver se consigo clarificar um bocado o que tenho de fazer, para conseguir fazer  mais ou menos o algortimo do programa para depois codificar.

Em relação á struct se quisesse delcarar 20 bikes podia fazer a declaração nesta struct deste modo certo?

typedef struct Bike
{
    char matricula[10], marca[20];
    float autonomia;
} Bike_1,Bike_2,........,Bike_20

E para fazer o scanf de dados para  a struct é so fazer o habitual ("%s",&matricula); no caso de ser uma string correcto?

E já agora é possivel eliminar uma determinada struct?Por exmplo , se eu quissesse eliminar uma Bike_3 ,existe alguma instrução que apague essa struct da memoria?

Obrigado.Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Já te respondi a isso na segunda resposta que te dei neste tópico. Tens que declarar um vector. Se quiseres podes fazer dessa maneira mas como tens 3 campos na definição estrutura terias de fazer: 20*3=60 scanf's mais os printf's e mais a dificuldade que terias a fazer o programa, acho que seria mesmo impossível.

E para leres para um campo de uma determinada estrutura tens que fazer:

scanf ("%d", &estrutura.campo);

Daí ser difícil tu leres para essas estruturas (da maneira como queres declarar) porque terias que andar sempre com os nomes de cada estrutura, seria mesmo impossível. E depois ainda por cima para se ler strings tu não envias como argumento para a função o endereço da "string" visto que o nome da string é na verdade um ponteiro para o primeiro elemento da mesma. Por isso para leres uma string de uma determinada estrutura farias:

scanf ("%s", estrutura.campo);

E mais a mais não deverias utilizar a função scanf visto que depois vais correr o risco de te ocorrer um buffer overflow. No entanto, isto são questões mais avançadas e numa primeira fase devias de te preocupar em fazer as coisas básicas (coisas que tu estás a ter dificuldade em fazer...).

Mais uma vez te recomendo a comprar um livro ou a utilizar a internet para solidificares esse conceitos, que estão muito tremidos.


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

Já te respondi a isso na segunda resposta que te dei neste tópico. Tens que declarar um vector. Se quiseres podes fazer dessa maneira mas como tens 3 campos na definição estrutura terias de fazer: 20*3=60 scanf's mais os printf's e mais a dificuldade que terias a fazer o programa, acho que seria mesmo impossível.

E para leres para um campo de uma determinada estrutura tens que fazer:

scanf ("%d", &estrutura.campo);

O campo representa a declaração de uma determinada variável do tipo estrutura correcto?

Daí ser difícil tu leres para essas estruturas (da maneira como queres declarar) porque terias que andar sempre com os nomes de cada estrutura, seria mesmo impossível. E depois ainda por cima para se ler strings tu não envias como argumento para a função o endereço da "string" visto que o nome da string é na verdade um ponteiro para o primeiro elemento da mesma. Por isso para leres uma string de uma determinada estrutura farias:

scanf ("%s", estrutura.campo);

É basicamente o mesmo de sempre sem o &(o tal apontador para o endereço de memoria da variavel) ,quando colocamos o nome da esturura em que queremos guardar os dados inseridos.Entao imaginando que a estrutura declarada,tal como a do exemplo, tem duas strings e float,ao fazermos um scanf do genero do que colocaste aqui em que string é que ele fica armezenados os dados, se existem duas na struct?É pela ordem de declação que fizemos na estrutura?

E mais a mais não deverias utilizar a função scanf visto que depois vais correr o risco de te ocorrer um buffer overflow. No entanto, isto são questões mais avançadas e numa primeira fase devias de te preocupar em fazer as coisas básicas (coisas que tu estás a ter dificuldade em fazer...).

Entao utilizo o que?gets?

Mais uma vez te recomendo a comprar um livro ou a utilizar a internet para solidificares esse conceitos, que estão muito tremidos.

Share this post


Link to post
Share on other sites
Localhost

O campo representa uma variável declarada _dentro_ da definição da estrutura. Imagina uma estrutura como uma pessoa. Defines uma estrutura do tipo pessoa e depois tens a suas características dentro (nome, idade, etc.).

Cada campo tem o seu nome, logo utilizas o nome da variável do tipo estrutura seguido de um ponto e o nome da variável.

Lê este meu artigo sobre buffer overflow (recomendo que leias numa fase mais avançada).

Buffer overflow - Dive in

Já agora para finalizar, tomando aquele exemplo das estruturas como pessoas.

typedef struct
{
    // Características de uma pessoa
    char nome[1024];
    unsigned int idade, altura, peso;
} Pessoa;
/* Nome do tipo da estrutura é Pessoa - para declarar uma variável deste tipo fazer
Pessoa nome_da_variável. Mesma coisa que fazer int nome_da_variável (int é um tipo) */

// Declarar uma variável do tipo Pessoa
Pessoa joao; // joao agora tem características como nome, idade, etc.

joao.idade = 10; // Idade do joao é 10

Pessoa pessoas[10]; // Vector com 10 pessoas com todas com aquelas características

Acho que assim já percebes melhor.


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

typedef struct
{
    // Características de uma pessoa
    char nome[1024];
    unsigned int idade, altura, peso;
} Pessoa;
/* Nome do tipo da estrutura é Pessoa - para declarar uma variável deste tipo fazer
Pessoa nome_da_variável. Mesma coisa que fazer int nome_da_variável (int é um tipo) */

// Declarar uma variável do tipo Pessoa
Pessoa joao; // joao agora tem características como nome, idade, etc.

joao.idade = 10; // Idade do joao é 10

Pessoa pessoas[10]; // Vector com 10 pessoas com todas com aquelas características

Então supondo que em vez de seres tu a inicializar por exemplo,um campo nome  da estrutura pessoa, querias recolher essa informação do teclado.

Era do genero

printf("Introduza a idade:\n);
gets("%s",joao.nome)

.Deste modo eu ficava com o conjunto de caracteres que compõem a string armazenados no campo nome da struct, certo?

E supondo que eu queria guardar 10 nomes sequencialmente introduzidos.Acho que tinha de fazer isto

#Define MAX 20
typedef struct
{
    // Características de uma pessoa
    char nome[1024];
    unsigned int idade, altura, peso;
} Pessoa;

Pessoa Pessoas [MAX];

printf("Introduza o nome:");
gets("%s",pessoas)

;

Se eu fizesse isto podiam ser introduzidos 10 nomes que iriam ser guardados no campo nome do vector de structs?

Obrigado pela ajuda.Cumps

Share this post


Link to post
Share on other sites
Localhost

Vou sugerir pela última vez que compres um livro ou que arranjes uma boa referência online para solidificares os conhecimentos que, mais uma vez digo, estão *muito* tremidos.

Repara que especificadores como %s só se utilizam em funções como a scanf e afins, nunca na função gets. Portanto o código ficava assim:

printf ("Introduza o nome: ");
gets (joao.nome)

Também quero alertar-te que no futuro (quando já tiveres o teu programa num nível mais avançado) deves alterar as funções que utilizas para leituras de strings (como a gets, scanf...) para funções seguras, como a fgets. Nessa altura aconselho-te a ler o artigo que te deixei num post anterior.

No teu caso terias 20 motas logo, mais uma vez digo, terias de utilizar um vector para armazenar toda a informação.

Nota: Repara bem na quantidade de vezes que utilizei a expressão "mais uma vez digo". Não achas que está na altura de começares a seguir o que te digo e a prestar mais atenção às minhas respostas...?


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

Mas nao era semelhante ao que eu fiz no exemplo acima pah....Declarei o vector pessoas com 20 posições ,cada uma delas corresponde a uma struct do tipo pessoa e deste modo julgo ser possivel armazenar la 20 nomes no campo nome de cada uma delas correcto?O que acontece no caso de serem introduzidos mais de 20 nomes?É necessário prever essa situação?

Em relação a grande tremedeira que afecta os meus conhecimentos nao te preocupes é normal pois e a primeira vez que estou a olhar para estes assuntos e aprender estas questões das structs ,vectores etc...de que nunca tinha ouvi falar... :)

Share this post


Link to post
Share on other sites
Localhost

Não. O teu código está errado. Primeiro não tens nenhuma variável chamada "pessoas". Depois estás a ler exactamente para quê? Precisas de indexar posições visto que é um vector. Tal como fazes quando tens um vector de inteiros...

int vector[10];

scanf ("%d", &vector[0]);


here since 2009

Share this post


Link to post
Share on other sites
Debbugger

Estou a ler para recolher 20 nomes introduzidos ,e guarda-los no campo nome do vector de structs do tipo pessoa

Nao tenho nenhuma variavel pessoas, mas declarei um vector pessoas do tipo pessoa,ou seja, nao tenho nehuma variavel do tipo pessoa mas sim um vector de variaveis deste  tipo acho eu(tendo em conta que o tipo pessoa e uma struct entao...

.Vamos la ver se me consigo fazer entender

#Define MAX 20
typedef struct
{
    // Características de uma pessoa
    char nome[1024];
    unsigned int idade, altura, peso;
} Pessoa;

Struct Pessoa Pessoas [MAX];/*declaração do vector de structs pessoas de do tipo pessoa,certo?o que eu quero é armazenar 20 nomes introduzidos nas 20 posiçoes do vector declarado.Deste modo,por exemplo para armazenar um nome no campo nome do vector de structs do tipo pessoa sendo que eu o queria por na posiçao 1 ficaria talvez*/
gets("%s",pessoas[1]);

/*isto deve estar mal porque assim nao sei a string fica armezenada no campo que eu queria,ou seja,nome

Cumps

Share this post


Link to post
Share on other sites
Debbugger

Percebi agora que talvez a melhor maneira de te explicar isto é assim:

http://www.portugal-a-programar.pt/index.php?showtopic=23389.

[me=Localhost]is off.[/me]

LOL.Epah ninguem te obriga a responder ás minhas duvidas,se nao queres ou achas que nao o deves fazer, nao o faças,mas podias-te era abster e meter a viola no saco, e guardar a tua musica para quem quer ouvi-la.Se queres responder á duvida que coloquei respondes,se queres dar conselhos faz voluntariado na paroquia.

Cumps

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.