Ir ao conteúdo
  • Cadastre-se
TheNick

C Função não retorna valor correto

Recommended Posts

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);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Leonardo0308 Eu tentei mudar aqui, mas dá no mesmo, ela só retorna o valor do ultimo saldo, olha como ficou.

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

    int i;

    float soma = 0;

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

     a[i].soma = a[i].soma + a[i].saldo;

}
    return somando;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
float somando(struct lista a[], int *p){

    int i;

    float soma = 0;

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

     soma = soma + a[i].saldo;

}
    return soma;
}

 

Tenta assim

  • Curtir 2

Compartilhar este post


Link para o post
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);
}

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite @Asrety , eu compilei o código de acordo com as alterações que você recomendou, mas mesmo assim ele não calcula a soma das contas, eu dou enter, o programa da uma pausa de uns 2 segundos e após isso finaliza.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TheNick, a função somando retorna um float, mas você não está aproveitando o retorno da função.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite @allanxd , sempre que eu tento algum return o compilador da erro, a unica maneira que ele aceita é essa:

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

    int i;

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

    }
    return *soma;
}

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TheNick, tente assim:

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

    int i;

    float soma = 0;

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

Você a chama fazendo somando(a, p);

 

Não foi necessário o membro soma dentro da estrutura,  você pode tirá-la.

  • Curtir 2

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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));
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Enfim, testei aqui e está funcionando perfeitamente (com a função que te mostrei). Estou achando que você chamou de maneira errada a função. 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro estava naquele "&p" da função somando  @allanxd , eu o retirei e deu certo aqui, muito obrigado pela força.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora sim @Asrety , o programa ficou perfeito, está lendo e imprimindo nome e sobrenome, muito obrigado pela ajuda.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fico feliz @TheNick, mas não agradeça somente a mim, os nossos amigos @allanxd e @Leonardo0308 também contribuíram bastante, eu tentei ajudar da maneira que pude, com certeza há muitas formas, explore elas, tente sempre inovar, e bons estudos a ti !

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×