Ir ao conteúdo

Posts recomendados

Postado

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

 

Postado

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

 

Postado

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

 

Postado
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
Postado

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.

Postado

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

 

Postado

@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
Postado

@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
Postado

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
Postado

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

 

Postado

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
Postado

@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

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!