Ir ao conteúdo
  • Cadastre-se

Estrutura não recebe char corretamente.


lusomoreira

Posts recomendados

Bom dia, pessoal.

 

 

Estou com um probleminha no meu código e não acho algo parecido em lugar nenhum. Eu criei um programa que contem uma estrutura chamada contabancaria, e um vetor do tipo contabancaria para armazenar 100 cadastros, no entanto os nomes (atributo da estrutura) estão se sobrepondo, ou seja, eu cadastro o primeiro nome na posição zero do vetor e depois outro nome na posição 1, e ambos os nomes ficarão iguais, e caso eu cadastre uma terceira pessoa todos os três nomes ficarão igual ao ultimo cadastrado.

 

veja o codigo:

#include<stdio.h>#include<stdlib.h>#include<windows.h>int numconta=0;typedef struct contabancaria{    char *titular;    int numero;    double saldo;}Conta;Conta *criaConta(char tit[100], double saldo){    Conta *c;    c=((Conta*)malloc(sizeof(Conta)));    c->titular=tit;    c->numero=++numconta;    c->saldo=saldo;    return c;}void realizaDeposito(Conta *c, double valor){        c->saldo+=valor;}void imprimeSaldo(Conta *c){    printf("\nNome.....: %s" ,c->titular);    printf("\nNumero...: %d", c->numero);    printf("\nSaldo....: %.2f", c->saldo);}void realizaSaque(Conta *c, double valor){        //CONDICIONAL PARA RESTRINGIR CASO O VALOR SEJA MENOR QUE O SALDO        if(c->saldo>valor){            c->saldo-=valor;        }else{            printf("\n...SALDO INSUFICIENTE PARA ESSA OPERACAO");            printf("\nTENTE NOVAMENTE");            printf("\n\n");            main();        }}void transferenciaBancaria(Conta *contaQueTransfere, Conta *contaQueRecebe, double valorPagar){	realizaSaque(contaQueTransfere, valorPagar);//APROVEITA A FUNÇAO REALIZASAQUE PARA TRANSFERIR VALOR	realizaDeposito(contaQueRecebe, valorPagar);//APROVEITA A FUNÇAO REALIZADEPOSITO PARA RECEBER VALOR}int menuPrincipal(){	int retorno;    printf("\n====================MENU=====================");    printf("\n");	printf("\n1-CRIA CONTA");	printf("\n2-SAQUE");	printf("\n3-DEPOSITO");	printf("\n4-TRANSFERENCIA");	printf("\n5-SALDO");	printf("\n6-SAIR");	printf("\n=============================================");	printf("\n");	printf("\nDIGITE A OPCAO.....:");	scanf("%d", &retorno);	return retorno;}void main(){    Conta *vet[100];	int opcao, contaRealizaTransferencia, contaRecebeTransferencia;	char nome[90];	double saldo, valorSaque, valorTransferencia, valorDeposito;	int numeroConta;	do{    	opcao=menuPrincipal();    	switch(opcao){    		case 1:    			fflush(stdin);				system("cls");				printf("\nDIGITE O NOME DO TITULAR....:");    			fgets(nome, 100, stdin);    			fflush(stdin);				printf("\nDIGITE O SALDO INICIAL.....: R$ ");    			scanf("%lf", &saldo);//PARA LER DOUBLE USA_SE %lf    			//PASSANDO VALORES PARA O OBJETO CONTA    			vet[numconta]=criaConta(nome, saldo);    			break;    		case 2:                    fflush(stdin);//LIMPAR BUFFER DO TECLADO                    system("cls");//LIMPAR TELA, COMANDO WINDOWS                    printf("\nDIGITE O NUMERO DA CONTA....:");                    scanf("%d", &numeroConta);                    printf("\nDIGITE O VALOR DO SAQUE.....: R$ ");                    scanf("%lf", &valorSaque);                    realizaSaque(vet[numeroConta], valorSaque);    			break;    		case 3:                    fflush(stdin);                    system("cls");                    printf("\nDIGITE O NUMERO DA CONTA PARA O DEPOSITO....:");                    scanf("%d", &numeroConta);                    printf("\nDIGITE O VALOR DO DEPOSITO....: RS ");                    scanf("%lf", &valorDeposito);                    realizaDeposito(vet[numeroConta], valorDeposito);    			break;    		case 4:                    fflush(stdin);                    system("cls");                    printf("\nDIGITE O NUMERO DA CONTA QUE REALIZARA A TRANSFERENCIA....:");                    scanf("%d", &contaRealizaTransferencia);                    printf("\nDIGITE O NUMERO DA CONTA PARA QUEM DESEJA TRANSFERIR......:");                    scanf("%d", &contaRecebeTransferencia);                    printf("\nDIGITE O VALOR....: R$ ");                    scanf("%lf", &valorTransferencia);                    transferenciaBancaria(vet[contaRealizaTransferencia], vet[contaRecebeTransferencia], valorTransferencia);				break;			case 5:				 system("cls");				 printf("\nDIGITE O NUMERO DA CONTA...:");				 scanf("%d", &numeroConta);				 imprimeSaldo(vet[numeroConta]);				break;		}    }while(opcao!=6);}
Link para o comentário
Compartilhar em outros sites

@lusomoreira

 

O seu programa tem alguns "errinhos", procure sobre estrutura de dados: lista encadeada simples

 

Analisando o que você estava fazendo... Dê uma olhada nesse exemplo e compara com o seu código.

#include<stdio.h>#include<stdlib.h>typedef struct contabancaria{    char nome[20];    int nconta;    float saldo;}contabancaria;//variveis globaiscontabancaria c[100];int i = 0;contabancaria novaconta(){    contabancaria conta;    system("cls");    printf("Digite o nome: ");    fflush(stdin);    fgets(conta.nome,20,stdin);    printf("Digite numero da conta: ");    scanf("%d", &conta.nconta);    printf("Digite saldo: ");    scanf("%f", &conta.saldo);    return conta;}void conta(){    if (i == 99)    {        printf("Não é possivel criar mais conta !\n");        exit(1);    }    else    {        //chama funcao novaconta() e armazena o valor no vetor c[]        c[i] = novaconta();        i++;    }}//funcao imprime todas as contasvoid showconta(){    int j;    system("cls");    for (j=0; j<i; j++)    {        printf("%s  %d  %f\n", c[j].nome,c[j].nconta,c[j].saldo);    }}//funcao menuint menu(){	int retorno;	system("cls");    printf("\n====================MENU=====================");    printf("\n");	printf("\n1-CRIA CONTA");	printf("\n2-MOSTRAR CONTAS");	printf("\n6-SAIR");	printf("\n=============================================");	printf("\n");	printf("\nDIGITE A OPCAO.....: ");	scanf("%d", &retorno);	return retorno;}//funcao mainint main(){    int op;    do    {        op = menu();        switch(op)        {            case 1:                conta();                break;                            //exemplo !!!            case 2:                showconta();                break;        }        system("pause");    } while(op != 6);    return 0;}

obs: Esse exemplo não é a melhor das opções, mas vai te ajudar.

Link para o comentário
Compartilhar em outros sites

@slackforgo

 

Obrigado pela resposta, ajudou em muito, mas no caso do meu prof. pedir esse programa sem lista encadeada, visto que ainda não chegamos nesta parte, como eu poderia resolver este problema, veja, criei um código que trata exatamente deste problema onde ele sempre repete o ultimo char digitado.

#include<stdio.h>#include<stdlib.h>int numconta=0;struct contabancaria{    char *titular;    double saldo;    int numero;};typedef struct contabancaria Conta;Conta *criaConta(char *tit, double saldo){    Conta *c;    c=((Conta*)malloc(sizeof(Conta)));    c->numero=++numconta;    getchar();    c->titular=tit;    c->saldo=saldo;    return c;}void main(){    Conta *vet[3];    double s;    char nome[100];    int i;    printf("\n\tNome....:");    fgets(nome,100, stdin);    printf("\n\tSaldo....:");    scanf("%lf", &s);    vet[numconta]=criaConta(nome, s);    system("clear");    fflush(stdin);    printf("\n\tNome....:");    fgets(nome,100, stdin);    printf("\n\tSaldo....:");    scanf("%lf", &s);    vet[numconta]=criaConta(nome, s);    system("clear");    fflush(stdin);    printf("\n\tNome....:");    fgets(nome,100, stdin);    printf("\n\tSaldo....:");    scanf("%lf", &s);    vet[numconta]=criaConta(nome, s);        system("clear");    for(i=0; i<3; i++){        printf("\n\tNome....: %s", vet[i]->titular);        printf("\n\tSaldo....: %.2f", vet[i]->saldo);        printf("\n\tNum......: %d", vet[i]->numero);        printf("\n");    }}
Link para o comentário
Compartilhar em outros sites

Arquivado

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

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