Ir ao conteúdo
  • Cadastre-se

C Função não retorna valor correto


TheNick

Posts recomendados

Boa tarde pessoal, estou tentando fazer a minha função "somando" calcular o saldo total de todos os clientes cadastrados nesse exercício de programação, mas ela só me retorna o ultimo saldo cadastrado, onde será que eu estou errando?

 

#include<stdio.h>


struct lista{

    char nome[50], rua[50], cpf[11];
    int num;
    float saldo, soma;
};

const int MAX = 50;

int menu(){
    int op;

    printf("\n\tMENU\n");
    printf("\n1. Incluir\n");
    printf("2. Imprimir\n");
    printf("0. Sair\n");
    printf("\nSelecione uma opcao -> ");
    scanf("%d", &op);

    return op;
}

void incluir(struct lista a[], int *p){

    if(*p < MAX){

        printf("\nInforme o nome: ");
            scanf("%s", &a[*p].nome);

        printf("Informe a rua: ");
            scanf("%s", &a[*p].rua);

        printf("Informe o numero da casa: ");
            scanf("%d", &a[*p].num);

        printf("Informe o CPF: ");
            scanf("%s", &a[*p].cpf);

        printf("Informe o saldo da conta: ");
            scanf("%f", &a[*p].saldo);

        (*p)++;

    }else printf("\n\t\tLista cheia\n");

}

float somando(struct lista a[], int *p){

    int i;

    float soma = 0;

    for (i = 0; i < *p; i++){

     a[*p].soma = a[*p].soma + a[*p].saldo;

}
    return soma;
}

void imprimir(struct lista a[], int *p){

    int i;

    printf("\nLISTA\n");

    for (i = 0; i < *p; i++){

        printf("\nNome:    %s", a[i].nome);
        printf("\nRua:     %s", a[i].rua);
        printf("\tNumero:  %d", a[i].num);
        printf("\tCPF:     %s", a[i].cpf);
        printf("\nSaldo:   %.2f\n", a[i].saldo);


    }
        printf("\nSoma:    %.2f\n", somando);
}

int main(void){
    struct lista lista[MAX];
    int opcao, i = 0;

    do{
        opcao = menu();

        switch(opcao){
            case 1: incluir(lista, &i);
                    break;

            case 2: imprimir(lista, &i);
                    break;

            case 0: printf("Fim\n");
                    break;

            default: printf("Opcao invalida\n");
        }

    }while (opcao != 0);
}

 

Link para o comentário
Compartilhar em outros sites

Está certo dessa maneira? porque agora nem calcula 😥

float somando(struct lista a[], int *p){
    float soma, saldo;
    int i;

    for (i = 0; i < *p; i++){
     soma = soma + a[i].saldo;

}
    return soma;
}

void imprimir(struct lista a[], int *p){

    int i;
    float soma, saldo;

    printf("\nLISTA\n");

    for (i = 0; i < *p; i++){

        printf("\nNome:    %s", a[i].nome);
        printf("\nRua:     %s", a[i].rua);
       // printf("\tNumero:  %d", a[i].num);
       // printf("\tCPF:     %s", a[i].cpf);
        printf("\nSaldo:   %.2f\n", a[i].saldo);


    }
        somando(&soma, &saldo);
        printf("\nSoma:    %.2f\n", soma);
}

 

Link para o comentário
Compartilhar em outros sites

void somando(float *soma, struct lista a[], int *p){
  
    int i;
  
    for (i = 0; i < *p; i++){
     *soma += a[i].saldo; //soma recebe ela mesmo mais o saldo da posição i
	}
  
}

void imprimir(struct lista a[], int *p){

    int i;
    float soma=0; //inicialização

    printf("\nLISTA\n");

    for (i = 0; i < *p; i++){

        printf("\nNome:    %s", a[i].nome);
        printf("\nRua:     %s", a[i].rua);
       // printf("\tNumero:  %d", a[i].num);
       // printf("\tCPF:     %s", a[i].cpf);
        printf("\nSaldo:   %.2f\n", a[i].saldo);
    }
  
  	somando(&soma, a, &p);
//1 - passando a variavel soma como ponteiro para realizar modificações dentro dessa função
// que no caso é para somar todos os saldos
//2 - como a variavel ( a ) do tipo lista é um vetor, então não precisa passar como ponteiro
// ela será util para ler os dados armazenados nela
//3 - passando o tamanho via ponteiro 
  
        printf("\nSoma:    %.2f\n", soma);
}

 

Acima está seu código com algumas alterações, não posso garantir funcionamento, mas espero ter ajudado, dê o feedback se conseguiu ou não, até mais !

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@TheNick como disse não poderia garantir funcionamento, mas peço perdão... Agora eu realizei os testes com o código completo, novamente deixo aqui embaixo com algumas mudanças, espero que agora funcione !

#include<stdio.h>

typedef struct{

    char nome[50];
  	char rua[50];
  	char cpf[11];
    int num;
    float saldo;
  
}Lista;

#define MAX 50

int p=0; //variavel global para contagem

int menu();
void incluir(Lista a[]);
void somando(float *soma, Lista a[]);
void imprimir(Lista a[]);


int main(void){

    Lista lista[MAX];
    int opcao;

    do{
        opcao = menu();

        switch(opcao){
            case 1: incluir(lista);
                    break;

            case 2: imprimir(lista);
                    break;

            case 0: printf("Fim\n");
                    break;

            default: printf("Opcao invalida\n");
        }

    }while (opcao != 0);
}

int menu(){

    int op;

    printf("\n\tMENU\n");
    printf("\n1. Incluir\n");
    printf("2. Imprimir\n");
    printf("0. Sair\n");
    printf("\nSelecione uma opcao -> ");
    scanf("%d", &op);

    return op;
}

void incluir(Lista a[]){

    if(p < MAX){

        printf("\nInforme o nome: ");
            scanf("%s", a[p].nome);

        printf("Informe a rua: ");
            scanf("%s", a[p].rua);

        printf("Informe o numero da casa: ");
            scanf("%d", &a[p].num);

        printf("Informe o CPF: ");
            scanf("%s", a[p].cpf);

        printf("Informe o saldo da conta: ");
            scanf("%f", &a[p].saldo);

        p++;

    }else printf("\n\t\tLista cheia\n");

}

void somando(float *soma, Lista a[]){

    int i;

    for (i = 0; i < p; i++){
     *soma += a[i].saldo; //soma recebe ela mesmo mais o saldo da posição i
	}

}

void imprimir(Lista a[]){

    int i;
    float soma=0;

    printf("\nLISTA\n");

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

        printf("\nNome:    %s", a[i].nome);
        printf("\nRua:     %s", a[i].rua);
        //printf("\tNumero:  %d", a[i].num);
        //printf("\tCPF:     %s", a[i].cpf);
        printf("\nSaldo:   %.2f\n", a[i].saldo);
    }

  	somando(&soma, a);

    printf("\nSoma:    %.2f\n", soma);
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Boa tarde @Asrety , te agradeço muito pela força, o código está funcionando perfeitamente, porém tem duas coisas que eu não consegui mudar, quando vou cadastrar um nome, assim que aperto a tecla espaço para inserir o sobrenome o programa da erro, a outra é esse caractere antes da opção "0. Sair", também não consegui encontrar onde esse erro se encontra. Meu compilador é o CodeBlocks

 

112301623_Anotao2018-12-06140808.jpg.a46c78e6cd344af2fabb6d22cc712692.jpg

adicionado 2 minutos depois

Boa tarde @allanxd, eu tentei o código original com essas modificações, mesmo assim ele não soma, na hora de somar o programa para uns 2 segundos e termina do nada.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Estou chamando ela dessa forma @allanxd

void imprimir(struct lista a[], int *p){

    int i;
    float soma = 0;

    printf("\nLISTA\n");

    for (i = 0; i < *p; i++){

        //printf("\nNome:    %s", a[i].nome);
        //printf("\nRua:     %s", a[i].rua);
        //printf("\tNumero:  %d", a[i].num);
        //printf("\tCPF:     %s", a[i].cpf);
        printf("\nSaldo:   %.2f\n", a[i].saldo);

    }
        somando(a, &p);
        printf("\nSoma:    %.2f\n", somando(a, p));
}

 

Link para o comentário
Compartilhar em outros sites

@TheNick  Sobre o nome, é devido ao scanf, abaixo é mostrado uma das maneiras para ler espaços, o scanf irá ler tudo até achar um '\n' que será o seu enter e acredito que terá problemas com buffer, então é necessário limpar antes de cada leitura de uma string, no exemplo utilizei o fflush, mas não é o mais recomendado, existem outros metodos para fazer isto, porém é só um exemplo...

char teste[50];

fflush(stdin);
scanf("%[^\n]", teste);

Agora sobre o caractere estranho no 0 - sair, eu realmente não sei porque está assim, experimente reescrever esse printf para ver se resolve.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...