Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

MatheusSilva

struct com vetores

Recommended Posts

bom, estou com problema para fazer um programa.

Vou receber varias linhas de texto, atraves do fgets, onde terá:

nome

salario

salario2

 

ex:

Fulano de tal

33000.00

300.00

 

eu gostaria de saber como ler isso e separar em vetores individuais, pensei em fazer com struct.

 

 

struct pagamento{
        char nome[50]; //nome da pessoa
        float salario; //salario da pessoa
        float salario2; //comissao da pessoa
 
}pessoa[100][100];

 

onde as linhas seriao os nomes, e nas colunas os valores, mas estou um pouco ainda confuso como usar o struct com vetores, poderiam me dar uma ajuda de como fazer isso e consequentemente ja entender o struct com vetores?

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 
struct pagamento {
   char nome[50];
   float salario, salario2;
};
 
int main(void) {
   struct pagamento registros[100];
   .....
}

 

O '\n' funciona como delimitador no fgets. O nome vai ser lido normalmente (com espaços, inclusive), mas você precisa se preocupar com o seguinte:

 

1- Tamanho do array de char p/ armazenar o nome

2- Funcionamento do fgets

 

O segundo item explica-se pela manpage da função: http://linux.die.net/man/3/fgets

 

If a newline is read, it is stored into the buffer. A terminating null byte (aq\0aq) is stored after the last character in the buffer.

 

Então, como o '\n' acaba fazendo parte do dado, vc precisa colocar o '\0' delimitador nessa posição. E provavelmente não vai ter problemas com o '\n' perdido na entrada padrão quando for ler outras strings. No caso dos salários, vc pode usar fgets em conjunto com o sscanf (http://stackoverflow.com/questions/8551723/fgets-combined-with-sscanf).

 

http://linux.die.net/man/3/sscanf

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa utilizar um array multidimensional para isso. Basta um vetor simples (pessoa[100]).

 

Cada posição do vetor pessoa vai ter uma estrutura do tipo pagamento.

Para acessar os valores, utilize:

 

pessoa.nome;

pessoa.salario1;

pessoa.salario2;

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

uhm, obrigado pela

 

 

 
struct pagamento {
   char nome[50];
   float salario, salario2;
};
 
int main(void) {
   struct pagamento registros[100];
   .....
}

 

O '\n' funciona como delimitador no fgets. O nome vai ser lido normalmente (com espaços, inclusive), mas você precisa se preocupar com o seguinte:

 

1- Tamanho do array de char p/ armazenar o nome

2- Funcionamento do fgets

 

O segundo item explica-se pela manpage da função: http://linux.die.net/man/3/fgets

 

 

 

Então, como o '\n' acaba fazendo parte do dado, vc precisa colocar o '\0' delimitador nessa posição. E provavelmente não vai ter problemas com o '\n' perdido na entrada padrão quando for ler outras strings. No caso dos salários, vc pode usar fgets em conjunto com o sscanf (http://stackoverflow.com/questions/8551723/fgets-combined-with-sscanf).

 

http://linux.die.net/man/3/sscanf

 

Obrigado pela resposta, mas me apareceu um problema.

tenho este codigo:

 

 

struct pagamentos{
    char nome[1000];
    float salario;
    float comissao;

};
     int i,j,l,c,k,tamanho = 0;
    float salarioBase = 0;
    char vetor[1001];

    struct pagamentos pg[100];
 
 
while(1){
    k=0;
 
    printf("Nome: ");
    fgets(pg[k].nome, 1000, stdin);
    printf("\n");
    printf("Salario: ");
    scanf("%f", &pg[k].salario);
    printf("\n");
    printf("comissao: ");
    scanf("%f", &pg[k].comissao);
    printf("\n");
 
 
 
k++;
}
 

Nesse codigo ele nao aparece tudo certinho, parece que na 2 pra frente execução ele pula a parte de nome, e vai direto pra salario ficando assim:

 

 

Nome: Salario:

 

 

 

estou fezendo com o while, pq dentro dele preciso ter uma condiçao de que se no NOME estiver escrito FIM ele de break, que tbm nao estou conseguindo arrumar, com vetor era assim:

 

tamanho = strlen(vetor);
        if((tamanho >=3) && (vetor[0] == 70) && (vetor[1] == 73) && (vetor[2] == 77)){
           //printf("Caractere achado FIM \n");
        break;
        }

 

como posso arrumar isso pra utilização com struct, infelizmente ja tentei de tudo e nao deu certo ?

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso acontece porque o \n fica na entrada após a leitura (o scanf não "limpa" o stdin após a leitura, a grosso modo).

 

Existe um tópico de "boas práticas" ou dicas em C no qual se discute isso. Se eu não me engano está em destaque. Dê uma olhada lá.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu acabei nao achando, desculpe-me.

aparentemente ele ta reconhecendo o enter depois do scanf da comissao, e ele acaba entrando no fgets, o que eu poderia fazer para arrumar este problema?

 

######EDIT#####

 

Acabei achando, como vc falou o scanf deixa um lixo no fgets mesmo, entao eu coloquei um getchar depois do ultimo scanf

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como nao conseguir editar o topico acima, tive que responder novamente, estou com o problema para fazer a ordenação em relação ao salario no caso, quero listar todos os nomes que possuam tal salario, mas nao faço a minima ideia de como fazer. Tbm preciso ordenar alfabeticamente, mas ja sei como fazer, vou comparar o valor delas por strcmp

 

 

if(strcmp(p[k].nome, p[k].nome) > 0){
    p[m].nome = p[k].nome
}

 

ta certo isso?

 

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.