Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com parâmetros (vetor, ponteiro, struct)


Guest --Murilo --

Pergunta

Guest --Murilo --

Galera, to tentando fazendo um código que recebe o numero de refeições, e pra cada refeição ele adiciona os alimentos com nome, calorias, carboidratos, proteínas e lipídios por meio de um procedimento, mas to com problemas na leitura.

Eu defini um struct chamado 'alimento' que contém as características que escrevi acima, e quando o main roda o procedimento, o programa trava na primeira leitura, alguém pode me ajudar? Eu fiz da scruct 'alimento' um vetor pra poder ler vários valores, por exemplo:

alimento[0]

nome: ovo

cal: 78

carb: 0

ptn: 6

lip: 6

alimento[1]

nome:leite desnatado

cal: 64

carb: 10

ptn: 6

lip: 0

e assim vai.. quem tiver paciência tenta me dar uma luz :unsure:

--------------------------------------------------------------------------------------------------------------------------------------------------

Código:

typedef struct{
        char nome;
        float cal, 
              carb, 
              ptn, 
              lip;
} alimento;        

void adicionaAlimento(alimento *alimento, int contador){
    
     
     printf(" Entre com o nome do alimento: ");
     scanf("%s", alimento[contador].nome);
     printf(" Quantidade de calorias: ");
     scanf("%f", &alimento[contador].cal);
     printf(" Quantidade de carboidratos: ");
     scanf("%f", &alimento[contador].carb);
     printf(" Quantidade de proteína: ");
     scanf("%f", &alimento[contador].ptn);
     printf(" Quantidade de lipídios: ");
     scanf("%f", &alimento[contador].lip);
}


int main()
{
    int numeroRefeicoes, i, escolha, contador;
    alimento alimento[100];
    
    printf(" Defina o numero de refeicoes: ");
    scanf("%d", &numeroRefeicoes);
    
    escolha = 1;
    contador = 0;
    
    for (i = 0; i < numeroRefeicoes; i++){
        while(escolha != 0){            
            adicionaAlimento(alimento, contador);
            printf(" Digite '0' se deseja finalizar a adicao de alimentos. ");
            scanf("%d", &escolha);
        }
    }
         
  return 0;
}

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Falta um & no primeiro scanf na função adicionaAlimento.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Murilo --

Fiz uma mudança no código, pra ele ficar mais limpo e estou tendo novos problemas.

Estou usando procedimentos dentro de procedimentos, passando todos os valores por referencia, mas o programa não está armazenando os valores lidos pelo procedimento 'adicionaAlimento', eu fiz um teste de mesa (#2) para imprimir os valores lidos no código, e a saída é sempre nula para todos os campos. Mas pelo teste de mesa #1, eu atribuo valores aos campos e o teste #2 imprime tudo certinho.

A leitura do campo 'nome' tá estranha também, eu declarei 'nome' como um vetor de 50 posições, mas sempre que eu coloco uma string com espaços, o programa dá erros.

Ajuda :unsure:

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

typedef struct{
     /* armazena dados de um alimento */
     char nome[50];
     float cal, 
            carb, 
            ptn, 
            lip;
} tAlimento;     

typedef struct{
     /* armazena 0 ou mais vetores 'alimento' na variavel */
     tAlimento alimento[100];
} tRefeicao;   

void adicionaAlimento(tRefeicao *refeicao, tAlimento *alimento, int i, int j){  
     /* injeta valores por referencia nos campos do struct */    
     printf("   Alimento: ");
     scanf("%s", &refeicao[i].alimento[j].nome);
     printf("   Calorias (kcal): ");
     scanf("%f", &refeicao[i].alimento[j].cal);
     printf("   Carboidratos (g): ");
     scanf("%f", &refeicao[i].alimento[j].carb);
     printf("   Proteina (g): ");
     scanf("%f", &refeicao[i].alimento[j].ptn);
     printf("   Lipidios (g): ");
     scanf("%f", &refeicao[i].alimento[j].lip);
}

void adicionaRefeicao(tRefeicao *refeicao, int i){
     /* a partir do numero de refeicoes, passado por referencia da funcao 'criaDieta'
        roda um loop para adicionar alimentos em cada uma delas */
     int escolha = 1, contador = 0;
     tAlimento alimento[100];     
     
     while(escolha){
         printf("\n - Refeicao %d: \n", i+1);
         adicionaAlimento(refeicao, alimento, i, contador); 
         contador++;
         printf("\n Digite '0' para finalizar refeicao ou '1' para adicionar mais alimentos: ");
         scanf("%d", &escolha); 
     }  
}

void criaDieta(tRefeicao refeicao){
     /* para o numero determinado de refeicoes, roda o procedimento 'adicionaRefeicao' */             
     int numeroRefeicoes, i;
     
     printf(" - Defina o numero de refeicoes: ");
     scanf("%d", &numeroRefeicoes);
     
     for(i = 0; i < numeroRefeicoes; i++){
           adicionaRefeicao(&refeicao, i);      
     }       
}


int main(){
   
    int numeroRefeicoes, escolha, contador;   
    tRefeicao refeicao[100];

    
    puts(" ---------------------------------------------------------------------------- ");
    puts(" ----------------------------- CADASTRO DE DIETA ---------------------------- ");
    puts(" ---------------------------------------------------------------------------- ");
    printf("\n Selecione a opcao desejada: \n");
    printf(" 1 - Adicionar nova dieta \n");
    printf(" 2 - Consultar dieta \n");
    printf(" 3 - Modificar dieta \n");
    printf(" 4 - Excluir Dieta \n\n Opcao: ");
    scanf("%d", &escolha);
    
    switch(escolha){
        case 1: 
             printf("\n -------------------------------- NOVA DIETA -------------------------------- \n\n"); 
             criaDieta(refeicao[100]);

             //TESTE DE MESA #1
/*
             strcpy(refeicao[0].alimento[0].nome, "ovo codorna");
             refeicao[0].alimento[0].cal = 100;
             refeicao[0].alimento[0].carb = 1;
             refeicao[0].alimento[0].ptn = 2;
             refeicao[0].alimento[0].lip = 3;
             strcpy(refeicao[0].alimento[1].nome,"leite");
             refeicao[0].alimento[1].cal = 200;
             refeicao[0].alimento[1].carb = 2;
             refeicao[0].alimento[1].ptn = 3;
             refeicao[0].alimento[1].lip = 4;
             strcpy(refeicao[1].alimento[0].nome,"aveia");
             refeicao[1].alimento[0].cal = 300;
             refeicao[1].alimento[0].carb = 3;
             refeicao[1].alimento[0].ptn = 4;
             refeicao[1].alimento[0].lip = 5;
             strcpy(refeicao[1].alimento[1].nome,"carne");
             refeicao[1].alimento[1].cal = 400;
             refeicao[1].alimento[1].carb = 4;
             refeicao[1].alimento[1].ptn = 5;
             refeicao[1].alimento[1].lip = 6;
*/              
             // TESTE DE MESA #2 
             printf("%s %f %f %f\n", refeicao[0].alimento[0].nome, refeicao[0].alimento[0].carb, refeicao[0].alimento[0].ptn, refeicao[0].alimento[0].lip);  
             printf("%s %f %f %f\n", refeicao[0].alimento[1].nome, refeicao[0].alimento[1].carb, refeicao[0].alimento[1].ptn, refeicao[0].alimento[1].lip);
             printf("%s %f %f %f\n", refeicao[1].alimento[1].nome, refeicao[1].alimento[1].carb, refeicao[1].alimento[1].ptn, refeicao[1].alimento[1].lip);
             printf("%s %f %f %f\n", refeicao[1].alimento[0].nome, refeicao[1].alimento[0].carb, refeicao[1].alimento[0].ptn, refeicao[1].alimento[0].lip);
            
             
        break;
        
        case 2:
             
        break;
        
        case 3:
             
        break;
        
        case 4:
             
        break;
        
        default:
                
        break;
    }     
        
      
        
    return 0;
}

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Murilo --

Consegui arrumar o problema do armazenamento nos campos, se alguém me ajudar com o problema do armazenamento de array no campo refeicao.alimento.nome eu ficaria muito grato, o problema continua.

Para arrumar o problema eu tirei a especificação de vetor do argumento da chamada de procedimento criaDieta, adicionei um * no argumento no procedimento e só.

Link para o comentário
Compartilhar em outros sites

  • 0

Fala galera, então, me registrei aqui, sou o visitante, to aos poucos arrumando os erros e encontrando novos hehe.

Preciso de ajuda com uma função. Quero que essa função receba de parâmetros um vetor de struct e um inteiro, que é uma posição desse vetor, e imprima uma struct que tem essa possição de vetor:

/* 
a struct 'tDieta' tem como campo um vetor da struct 'tRegistro', 
que por sua vez tem como campo um vetor da struct 'tAlimento';
que possue um vetor, e 4 floats de campo.
*/

typedef struct{
     /* armazena dados de um alimento */
     char nome[50];
     float cal, 
           carb, 
           ptn, 
           lip;
} tAlimento;     

typedef struct{
     /* armazena 0 ou mais vetores 'alimento' na estrutura */
     tAlimento alimento[10];
} tRefeicao;  

typedef struct{
     /* armazena 0 ou mais vetores 'refeicao' na estrutura */ 
     tRefeicao refeicao[10];
} tDieta;

/* funcao */
tDieta imprimeDieta(tDieta *dieta, int i){
   
     return(dieta[i]);    
     
}

Link para o comentário
Compartilhar em outros sites

  • 0

einsen, em imprimeDieta você declarou o parâmetro dieta como sendo do tipo da estrutura tDieta, e ao que parece esta estrutura refere-se a uma matriz, já que é um array de 10 posições de outra estrutura (tRefeicao) que, por sua vez, é um array de 10 posições da estrutura tAlimento.

assim, você não tem como indexar diretamente dieta, como em return(dieta);

logo, utilizando o "campo" refeicao da estrutura dieta: dieta.refeicao[<índice>], voce terá acesso a uma estrutura do tipo tRefeicao na posição indicada por <índice>.

esta estrutura por sua vez, possui um "campo" alimento, que é um array, que em uma determinada posição lhe dará acesso a uma estrutura do tipo tAlimento. O acesso a esta estrutura fica, então, mais comprido um pouco:

dieta.refeicao[<índice_refeição>].alimento[<índice_alimento>]

A partir daí, é só acessar os "campos" da estrutura tAlimento, conforme necessário:

dieta.refeicao[<índice_refeição>].alimento[<índice_alimento>].nome = 'nome do sujeito';

dieta.refeicao[<índice_refeição>].alimento[<índice_alimento>].cal = 15.5;

Logo, parece que você precisará de mais que um parâmetro de indexação para poder localizar corretamente a pessoa que terá seus dados listados.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
einsen, em imprimeDieta você declarou o parâmetro dieta como sendo do tipo da estrutura tDieta, e ao que parece esta estrutura refere-se a uma matriz, já que é um array de 10 posições de outra estrutura (tRefeicao) que, por sua vez, é um array de 10 posições da estrutura tAlimento.

assim, você não tem como indexar diretamente dieta, como em return(dieta);

logo, utilizando o "campo" refeicao da estrutura dieta: dieta.refeicao[<índice>], voce terá acesso a uma estrutura do tipo tRefeicao na posição indicada por <índice>.

esta estrutura por sua vez, possui um "campo" alimento, que é um array, que em uma determinada posição lhe dará acesso a uma estrutura do tipo tAlimento. O acesso a esta estrutura fica, então, mais comprido um pouco:

dieta.refeicao[<índice_refeição>].alimento[<índice_alimento>]

A partir daí, é só acessar os "campos" da estrutura tAlimento, conforme necessário:

dieta.refeicao[<índice_refeição>].alimento[<índice_alimento>].nome = 'nome do sujeito';

dieta.refeicao[<índice_refeição>].alimento[<índice_alimento>].cal = 15.5;

Logo, parece que você precisará de mais que um parâmetro de indexação para poder localizar corretamente a pessoa que terá seus dados listados.

Abraços

Muito obrigado cara.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...