Jump to content
orocha

Aceder a um canpo de uma struct

Recommended Posts

orocha

Boas.Se eu tiver uma struct do genero

// uma estrutura Pessoa
struct Pessoa
{
  char nome;
  int idade;
}pessoa, cliente, chefe;

Se eu quiser aceder a um campo nome do chefe  e guarda-lo numa variavel como faço isso?

Cumps

Share this post


Link to post
Share on other sites
Localhost

Acrescento que provavelmente não queres ter apenas um char mas sim um conjunto deles (uma string) para a variável nome da estrutura.


here since 2009

Share this post


Link to post
Share on other sites
orocha

char c = chefe.nome;

Mesmo usando a variavel c como uma string , o compilador diz que faltam ai um parentesis algures.É necessário alguns parentesis ao fazer essa atribuicao?

Se eu quiser uma funcao pessoas que recebe a struct pessoas, como é que deve ser declarada?

void pessoas(struct pessoa);

funciona?

Share this post


Link to post
Share on other sites
Localhost

Se declarares como string tens que utilizar a função strcpy, por exemplo, para atribuir a string a outra variável.

Para receberes numa função experimenta:

void pessoas (struct Pessoa person)


here since 2009

Share this post


Link to post
Share on other sites
orocha

Se eu declarar um vector de structs do tipo pessoa  que defini anteriormente ,que leva dados de 5 pessoas, e se eu quiser por o nome e a idade do chefe na primeira posiçao do vector ,tenho usar as funçoes das strings tambem (strcpy) ou posso utilizar o gets(nome) ?Ou talvez o strcpy e para armazenar no campo nome da struct e para ler uso o gets...

Para fazer atribuiçao para o campo da estruta poderia ficar algo como (nao sei se esta certo)

strcpy(nome=chefe.nome[0])

Share this post


Link to post
Share on other sites
bubulindo

Se eu declarar um vector de structs do tipo pessoa  que defini anteriormente ,que leva dados de 5 pessoas, e se eu quiser por o nome e a idade do chefe na primeira posiçao do vector

Importas-te de explicar melhor o que pretendes? Eu não percebi.

,tenho usar as funçoes das strings tambem (strcpy) ou posso utilizar o gets(nome) ?Ou talvez o strcpy e para armazenar no campo nome da struct e para ler uso o gets...

Para fazer atribuiçao para o campo da estruta poderia ficar algo como (nao sei se esta certo)

strcpy(nome=chefe.nome[0])

Esse código está errado.

Porque é que queres o gets()??? O gets serve para ir buscar strings ao buffer de entrada. Podes deslocar o buffer de entrada para outro lado, mas não to aconselho.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
orocha

O que eu quero basicamente e declarar um vector de estruturas do tipo pessoa que leva os dados de 5 pessoas.

Depois quero recolher informaçao do teclado relativa á idade e nome do chefe e coloca-la na 1 posiçao desse vector de structs que defini anteriomente.

Imaginando por exemplo que eu quero recolher o nome e a idade do chefe e coloca-los na 1 posicao do vector definido anteriomente.Depois quero fazer o mesmo para mais 4 pessoas.O meu problema esta em alterar os campos das structs do vector.Mas talvez o melhor mesmo seja fazer um ciclo do tipo for ou while que va lendo os dados e os ponha nos varios campos das structs definidas(nao sei se possivel fazer isso neste caso)

Share this post


Link to post
Share on other sites
falk0n

Praticamente deste a resposta ao teu problema ;)

Escreve o código que estas a pensar e depois irás receber ajuda.

Boas programações

Share this post


Link to post
Share on other sites
orocha

Praticamente deste a resposta ao teu problema ;)

Escreve o código que estas a pensar e depois irás receber ajuda.

Boas programações

Boas.O codigo que estava a pensar para ler os dados(idade e nome) inseridos era mais ou menos isto

#define MAX 5
struct pessoas Pessoa[MAX];

for(i=0;i<MAX;i++){
for(i=0;j<MAX;j++)
printf("%s %d",matriz_pessoas[i][j]);/*escreve os elementos para a matriz*/

Nao sei se esta certo nem como declarar a matriz ,mas era maois ou menos isto

Share this post


Link to post
Share on other sites
falk0n

#define MAX 5
struct pessoas Pessoa[MAX];

for(i=0;i<MAX;i++){

// para obteres dados do input podes utilizar o scanf o printf é apenas para visualizar no ecrã.
// para poderes aceder a um campo da estruturas utilizas 
// Pessoas[i].idade o que neste caso estas a aceder ao campo idade da pessoa i (de relembrar que os indices em C começam em zero.

// com estes comentarios tenta novamente escrever codigo para ver se consegues perceber

Procura informações sobre o scanf pois pareceu-me que nao estavas a perceber para que servia o printf ....

Boas programações

Share this post


Link to post
Share on other sites
orocha

Boas.O indice i que define no codigo para ler da struct e um contador para ir incrementando a contagem dos elementos.

Em relação a questao do inicio do array acho que ja corrigi isso agora.É que se eu nao definir um contador para percorrer os elementos inseridos como é que os percorro?

Obrigado.Cumprimentos

Código ©: [seleccione]

for (i=0;i<MAX;i++){

scanf("%d",pessoas[MAX-1].idades);

Share this post


Link to post
Share on other sites
falk0n

for (i=0;i<MAX;i++){
scanf("%d",pessoas[MAX-1].idades);

O i serve para iterares, por isso deves utilizar esse identificador/counter para acederes às posições do array e não estares sempre a aceder à mesma posição através de (MAX-1) .

Este é o teu erro .

Para além disso a utilização do scanf é a seguinte.


scanf("%d", &(pessoas[i].idades)); // pois é necessário ao scanf modificar o valor  da variável idades e por isso é necessário passar o parâmetro por referência, ou seja o seu endereço.

Boas programações

Share this post


Link to post
Share on other sites
orocha

Entao o codigo correcto seria mais ou menos assim

for (i=0;i<MAX;i++){
scanf("%d",pessoas[i].idades);

Em relação ao scanf pensei que estivesse a trabalhar com strings,nem reparei que tava a ir buscar um inteiro,pois caso eu quisesse ir buscar o nome da pessoa(string)ja nao colocava o enderço certo?

Share this post


Link to post
Share on other sites
falk0n

Em relação ao scanf pensei que estivesse a trabalhar com strings,nem reparei que tava a ir buscar um inteiro,pois caso eu quisesse ir buscar o nome da pessoa(string)ja nao colocava o enderço certo?

Certo. No código que mostraste, como é um inteiro e não colocaste lá o & , ficou errado ...

Boas programações

Share this post


Link to post
Share on other sites
KTachyon

Não é por ser um inteiro, é por não ser um ponteiro. Quando se está a enviar uma variável para uma função que a quer modificar, essa função tem que receber a referência (ponteiro, apontador, wtv), não o valor.

Daí o nome, passar argumento por referência (by ref vs. by value).


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
falk0n

Não é por ser um inteiro, é por não ser um ponteiro. Quando se está a enviar uma variável para uma função que a quer modificar, essa função tem que receber a referência (ponteiro, apontador, wtv), não o valor.

Daí o nome, passar argumento por referência (by ref vs. by value).

Sim tens razão, anteriormente tb indiquei isso (que o scanf recebe o valor por referência) .

Boas programações

Share this post


Link to post
Share on other sites
orocha

Boas.Eu tenho uma struct com 3 campos (duas strings e um float), e preciso de ir buscar dados ao teclado e armazena-los em posiçoes sequenciais de um vector de estruturas.Qualquer coisa como:

#define MAX 20

tydedef struct pessoa{

char nome[30],char apelido[20];
float idade;/* e um float porque existe a possibildade de indicar por exemplo,20.3 anos(tendo em conta o meses que ja decorreram desde o aniversario, enfim nao e relevante , a idade e um float*/
}pessoas;
struct pessoa pessoas[MAX];

Agora para ir buscar os dados para por nos 3 campos ,posso ler e armazenar tudo de uma vez,ou e melhor fazer 3 printfs e ir lendo a armazenando campo a campo?E em relação a leitura esta pode ser feita com um codigo do genero

for (i=0;i<MAX;i++){
printf("Introduza a idade: );
scanf("%d",pessoas[i].idades);

Se isto funcionasse tenho duas duvidas.Primeiro isto nao obriga a que sejam introduzidos logo os 20 nomes?Eu nao pretendia isso ,prentendia que os nomes pudessem ser introduzidos conforme o user quissesse..Segundo neste ,caso se isto funcionar(o que e improvavel) teria que fazer 3 trechos iguais a este para ler e armazenar cada um dos campos,certo?

Obrigado

Share this post


Link to post
Share on other sites
falk0n

O exemplo que colocaste tem idade com um inteiro.

Não sei o que queres dizer com colocar logo os 20 nomes.

De qualquer das formas em principio irás criar uma pessoa de cada vez. Seja iterando no ciclo for, seja pedindo explicitamente a uma função para te ler do teclado o nome o apelido e a idade.

Não entendo para que queres a idade como sendo um float, é para saber se está perto do aniversario ? Alguem com 5.5 anos tem cinco anos e meio, mais meio ano e faz os seis anos.

int i;

for(i =0 ; i < MAX ; i++) {

    //le o nome do teclado
    //le o apelido do teclado
    //le a idade do teclado

   // utilizar uma função para afectar ou enquanto le do teclado afectar logo para as variaveis correctas
    //apenas depende do que queiras fazer 

}

Se eu estiver apenas a ler do teclado e puder colocar um ficheiro como input (para não estar a escrever sempre as mesmas coisas na consola)

prefiro fazer assim utilizando o for como mostrei no código

Se necessitar de criar uma pessoa de vez enquando coloco uma função apenas para me ler os tres parametros, sem necessida de do for.

Boas programações

Share this post


Link to post
Share on other sites
orocha

O exemplo que colocaste tem idade com um inteiro.

Não sei o que queres dizer com colocar logo os 20 nomes.

De qualquer das formas em principio irás criar uma pessoa de cada vez. Seja iterando no ciclo for, seja pedindo explicitamente a uma função para te ler do teclado o nome o apelido e a idade.

Não entendo para que queres a idade como sendo um float, é para saber se está perto do aniversario ? Alguem com 5.5 anos tem cinco anos e meio, mais meio ano e faz os seis anos.





   // utilizar uma função para afectar ou enquanto le do teclado afectar logo para as variaveis correctas
    //apenas depende do que queiras fazer 

}

Se eu estiver apenas a ler do teclado e puder colocar um ficheiro como input (para não estar a escrever sempre as mesmas coisas na consola)

prefiro fazer assim utilizando o for como mostrei no código

Se necessitar de criar uma pessoa de vez enquando coloco uma função apenas para me ler os tres parametros, sem necessida de do for.

Boas programações

Boas.Eu coloquei 20 nos nomes para definir uma string com 20 caracteres.E necessario definir quantos caracteres recebe no maximo a string ou posso nao especificar isso?

Em relaçao ao float dos anos , nao e relevante ,tem a haver com certas especificaçoes.

Em relação a isto ficava assim?

int i;

for(i =0 ; i < MAX ; i++) {

   printf("Introduza o nome :\n");
    scanf("%s",pessoas.nome);
    printf("Introduza o apelido :\n");
    scanf("%s",pessoas.apelido);
    scanf("%f",&pessoas.idade);

}

Porque o que eu quero e criar uma pessoa vez em quando,ou seja, o user pode por uma pessoa agora e depois outra daqui a x tempo.Sendo assim o codigo acima nao precisa do for para nada certo?Posso simplesmente fazer uma funcao com isto para ler os 3 paramentros?

   printf("Introduza o nome :\n");
    scanf("%s",pessoas[i].nome");
    printf("Introduza o apelido :\n");
    scanf("%s",pessoas[i].apelido);
   printf("Introduza a idade");
    scanf("%f",&ipessoas[i].idade);

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.