Jump to content

Recommended Posts

Posted

E ai Pessoal Beleza!!! Tenho que fazer um programa para a faculdade, mais nao estou conseguindo finalizar...

segue o codigo completo.

As duas funçoes que ta pegando e as:

CriaSubListaContaOrdenada e CriaSubListaFaturaOrdenada

Sera que alguem pode me ajudar.

/********************************************************************************
***********
* Descrição: sistema em linguagem C para a geraçao de extratos de um banco
* Curso: Tecnologia em Análise e Desenvolvimento de Sistemas
* Local: Fundação Universidade do Tocantins (UNITINS)
********************************************************************************
***********/

/******************************************Bibliotecas***************************
**********/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>
//#include <alloc.h>

/*****************************************Definições*****************************
**********/
#define TAM_STRING 100

/*****************************************Estruturas*****************************
**********/
//Estrutura utilizada para armazenar uma data
typedef struct Data
{
    int iDia;
    int iMes;
    int iAno;        
} stData;

//Estrutura utilizada para armazenar uma hora
typedef struct Horario
{
    int iHora;
    int iMinuto;    
}stHorario;

//Estrutura utilizada para armazenar os dados de uma conta
typedef struct Conta
{
    char cTitular[TAM_STRING];
    char cAgencia[TAM_STRING];
    char cNumConta[TAM_STRING];
    float fSaldoAnterior;
    float fSaldoAtual;
    int  iNumCartao;
    float fTotalComprasCartao;
    float fTotalPagtosCartao;
    float fTotalCartao;
}stConta;

//Estrutura utilizada para representar uma transação efetuada na conta ou cartão de crédito
typedef struct Transacao
{  
    float fValor; 
    stData sData;
    int iOperacao;
    stHorario sHorario; 
    struct Transacao *prProximo;    
}stTransacao;

//Estrutura utilizada para representar uma lista de transações
typedef struct Lista
{
    stTransacao *prInicio;
    stTransacao *prFim;
}stLista;

/*****************************************Variáveis Globais********************************/
//Armazena o nome das operações bancárias para conta corrente (Compra_debito, Saque, Deposito, Transferencia) e 
//cartao de crédito (Compra_credito, Pgto_fatura)
char* OPERACOES[] = {"Compra_debito","Saque","Deposito","Transferencia","Compra_credito","Pgto_fatura"};

/*************************Implementação das funções****************************************/
/*------------------------------------------------------------------------------------------
* Nome da função: LerCabecalho
* Descrição: Realiza a quebra das informações contidas no cabeçalho do arquivo (1ª linha do arquivo)
* Retorno: Nenhum
* Parâmetros: Ponteiro para uma estrutura stConta e string contendo cabeçalho
------------------------------------------------------------------------------------------*/
void LerCabecalho(stConta *pConta, char psCabecalho[])
{
    //Quebra os tokens do cabeçalho
    strcpy(pConta->cTitular,strtok(psCabecalho,";"));
    strcpy(pConta->cAgencia,strtok(NULL,";"));
    strcpy(pConta->cNumConta,strtok(NULL,";"));
    sscanf(strtok(NULL,";"),"%f",&pConta->fSaldoAnterior);
    sscanf(strtok(NULL,";"),"%d",&pConta->iNumCartao);
}

/*------------------------------------------------------------------------------------------
* Nome da função: RetornaOperacao
* Descrição: Recebe uma string contendo uma operação e retorna o código da mesma
* Retorno: Um valor inteiro indicando o código da transação
* Parâmetros: String contendo a operaçao
------------------------------------------------------------------------------------------*/
int RetornaOperacao(char psOperacao[])
{
    int iIndex=0;

    for (iIndex=0; iIndex<6; iIndex++)
    {
        if(!strcmp(psOperacao,OPERACOES[iIndex]))
        {
            return iIndex;
        }
    }
    return -1;
}

/*------------------------------------------------------------------------------------------
* Nome da função: PreencheTransacao
* Descrição: Quebra os campos de uma String contendo a transação e preenche a estrutura
* Retorno: Nenhum
* Parâmetros: Ponteiro para uma estrutura stTransacao e uma String
------------------------------------------------------------------------------------------*/
void PreencheTransacao(stTransacao *pTransacao, char psTransacao[])
{
    //Inicializa a transacao
    pTransacao->prProximo = NULL;
    pTransacao->fValor = 0.0f;

    //Quebra os tokens da transacao
    sscanf(strtok(psTransacao,";"),"%d/%d/%d/",&pTransacao->sData.iDia,&pTransacao->sData.iMes, &pTransacao->sData.iAno);
    sscanf(strtok(NULL,";"),"%d:%d",&pTransacao->sHorario.iHora,&pTransacao->sHorario.iMinuto);

    //Invoca a função que devolve o código da operação com base em uma string
    pTransacao->iOperacao = RetornaOperacao(strtok(NULL,";"));

    sscanf(strtok(NULL,";"),"%f",&pTransacao->fValor);
    
    //Faz a leitura do valor da transacao e de acordo com o tipo de operação coloca o sinal
    if(pTransacao->iOperacao == 0 || pTransacao->iOperacao == 1 || pTransacao->iOperacao == 4)
    {
        pTransacao->fValor *= -1;                     
    }
}

/*------------------------------------------------------------------------------------------
* Nome da função: InsereTransacao
* Descrição: Insere uma transação na lista passada como parâmetro
* Retorno: Nenhum
* Parâmetros: Um ponteiro para uma lista e um ponteiro para uma transação
-------------------------------------------------------------------------------------------*/
void InsereTransacao(stLista *pLista, stTransacao *pTransacao)
{
    //Variáveis temporárias
    int iIndex=0;
    int iPosicao = 0;
    stTransacao *temp = NULL;

    //Verifica se a lista existe
    if (!pLista)
    {
        return;
    }

    //Lista vazia, inserção do primeiro elemento na lista
    if (!pLista->prInicio)
    {
        pLista->prInicio = pTransacao;
        pLista->prFim = pTransacao;
        return;
    }

    //Inserção no final da lista 
    pLista->prFim->prProximo = pTransacao;
    pLista->prFim = pTransacao;
}

/*------------------------------------------------------------------------------------------
* Nome da função: LerArquivo
* Descrição: Realiza a leitura das informações do arquivo de entrada para as listas da conta
*            corrente e do cartão de crédito
* Retorno: Nenhum
* Parâmetros: Um ponteiro para a lista conta, um ponteiro para a lista cartao, um ponteiro para 
* uma estrutura stConta e uma String com o nome do arquivo a ser lido
------------------------------------------------------------------------------------------*/
void LerArquivo(stLista *pListaConta, stLista *pListaCartao, stConta *pConta, char psNomeArquivo[])
{
    //Declara um ponteiro para a estrutura de um arquivo
    FILE *prArquivoEntrada = NULL;

    //Declara uma string para a leitura da linha
    char sLinha[TAM_STRING];

    //Declara um ponteiro para transaçao
    stTransacao *prTransacao = NULL;

    //Faz as inicializaçoes das estruturas lista
    pListaConta->prInicio = NULL;
    pListaConta->prFim = NULL;
    pListaCartao->prInicio = NULL;
    pListaCartao->prFim = NULL;

    //Faz as inicializações da estrutura conta
    pConta->fSaldoAnterior = 0.0f;
    pConta->fSaldoAtual = 0.0f;
    pConta->iNumCartao = 0;
    pConta->fTotalComprasCartao = 0.0f;
    pConta->fTotalPagtosCartao = 0.0f;
    pConta->fTotalCartao = 0.0f;

    //Faz a abertura do arquivo
    prArquivoEntrada = fopen(psNomeArquivo,"r");

    //Testa se o arquivo foi aberto com sucesso
    if (!prArquivoEntrada)
    {
        printf("Nao foi possivel abrir o arquivo de entrada");
        return;
    }

    //Le a primeira linha do arquivo (cabecalho)
    fgets(sLinha,TAM_STRING,prArquivoEntrada);

    //Invoca a função que separa as informaçoes do cabeçalho
    LerCabecalho(pConta,sLinha);

    //Enquanto existirem transasões a serem lidas
    while (!feof(prArquivoEntrada))
    {
            //Faz a leitura de uma linha no arquivo contendo os dados da transação
        fgets(sLinha,TAM_STRING,prArquivoEntrada);
        
        //Testa se não é linha em branco
        if (sLinha[0]=='\n')
        {
                continue;
            }
        
        //Aloca memória para uma nova transação
        prTransacao = (stTransacao*)malloc(sizeof(stTransacao));

            //Quebra os dados da transação e preenche as estruturas
        PreencheTransacao(prTransacao,sLinha);

            //Verifica o tipo da operação e insere na lista do cartão ou da conta corrente:
            //código 1 a 4: operações de conta corrente
            //código 5 e 6: operações do cartão de crédito
        if (prTransacao->iOperacao < 4)
        {
            InsereTransacao(pListaConta,prTransacao);
        }
        else
        {
            InsereTransacao(pListaCartao,prTransacao);
        }
    }
    //Fecha o arquivo
    fclose(prArquivoEntrada);
}

/*------------------------------------------------------------------------------------------
* Nome da função: CriaSubListaContaOrdenada
* Descrição: Cria uma sublista ordenada contendo as transações da conta com base em uma data inicial e final
* Retorno: Ponteiro para uma lista
* Parâmetros: Ponteiro para uma lista ordenada, ponteiro para estrutura do tipo conta e duas 
* estruturas do tipo data
------------------------------------------------------------------------------------------*/
stLista* CriaSubListaContaOrdenada(stLista* pListaConta, stConta *pConta, stData pDataInicial, stData pDataFinal, char psNomeArquivo[])
{
     //Declara um ponteiro para a estrutura de um arquivo
    FILE *prArquivoEntrada = NULL;

    //Declara uma string para a leitura da linha
    char sLinha[TAM_STRING];

    //Declara um ponteiro para transaçao
    stTransacao *prTransacao = NULL;

    //Faz as inicializaçoes das estruturas lista
    pListaConta->prInicio = NULL;
    pListaConta->prFim = NULL;


    //Faz as inicializações da estrutura conta
    pConta->fSaldoAnterior = 0.0f;
    pConta->fSaldoAtual = 0.0f;
    pConta->iNumCartao = 0;
    pConta->fTotalComprasCartao = 0.0f;
    pConta->fTotalPagtosCartao = 0.0f;
    pConta->fTotalCartao = 0.0f;

    //Faz a abertura do arquivo
    prArquivoEntrada = fopen(psNomeArquivo,"r");

    //Testa se o arquivo foi aberto com sucesso
    if (!prArquivoEntrada)
    {
        printf("Nao foi possivel abrir o arquivo de entrada");
        return(0);
    }

    //Le a primeira linha do arquivo (cabecalho)
    fgets(sLinha,TAM_STRING,prArquivoEntrada);

    //Invoca a função que separa as informaçoes do cabeçalho
    LerCabecalho(pConta,sLinha);

    //Enquanto existirem transasões a serem lidas
    while (!feof(prArquivoEntrada))
    {
            //Faz a leitura de uma linha no arquivo contendo os dados da transação
        fgets(sLinha,TAM_STRING,prArquivoEntrada);
        
        //Testa se não é linha em branco
        if (sLinha[0]=='\n')
        {
                continue;
            }
             //Aloca memória para uma nova transação
        prTransacao = (stTransacao*)malloc(sizeof(stTransacao));

            //Quebra os dados da transação e preenche as estruturas
        PreencheTransacao(prTransacao,sLinha);

            //Verifica o tipo da operação e insere na lista do cartão ou da conta corrente:
            //código 1 a 4: operações de conta corrente
            //código 5 e 6: operações do cartão de crédito
        if (prTransacao->iOperacao < 4)
        {
            InsereTransacao(pListaConta,prTransacao);
        }

    }
    
      if(stTransacao.stData.iDia == sDataInicial.iDia); 
      if(stTransacao.stData.iMes == sDataInicial.iMes); 
      if(stTransacao.stData.iAno == sDataInicial.iAno);      
            
         if(stTransacao.stData.iDia == sDataFinal.iDia); 
      if(stTransacao.stData.iMes == sDataFinal.iMes); 
      if(stTransacao.stData.iAno == sDataFinal.iAno); 
            
     //Cria um ponteiro para o nó inicial de uma lista
      
      stLista* prSubLista  = NULL;
      stLista* prSubLista = (stLista*)malloc(sizeof(stLista));
      
     if (sListaConta==NULL)
   {
     printf("Erro de alocacao\n");
     return 0;
   }

   //sListaConta->sDataInicial = sConta;
   //sListaConta->sDataFinal = NULL;

   if (prSubLista==NULL)
      prSubLista = sListaConta;
   else {
      //sListaConta->sDataFinal = prSubLista;
      //prSubLista  = sListaConta;
    }

       //Implemente aqui
    
      //Retorna a lista ordenada
      return prSubLista;
    

}

/*------------------------------------------------------------------------------------------
* Nome da função: CriaSubListaFaturaOrdenada
* Descrição: Cria uma sublista das transações da fatura com base em uma data inicial e final
* Retorno: Ponteiro para uma lista
* Parâmetros: Ponteiro para uma lista ordenada, ponteiro para estrutura do tipo conta e duas 
* estruturas do tipo data
------------------------------------------------------------------------------------------*/
stLista* CriaSubListaFaturaOrdenada(stLista* pListaCartao, stConta *pConta, stData pDataInicial, stData pDataFinal, char psNomeArquivo[])
{
         
      //Declara um ponteiro para a estrutura de um arquivo
    FILE *prArquivoEntrada = NULL;

    //Declara uma string para a leitura da linha
    char sLinha[TAM_STRING];

    //Declara um ponteiro para transaçao
    stTransacao *prTransacao = NULL;

    //Faz as inicializaçoes das estruturas lista
    pListaConta->prInicio = NULL;
    pListaConta->prFim = NULL;


    //Faz as inicializações da estrutura conta
    pConta->fSaldoAnterior = 0.0f;
    pConta->fSaldoAtual = 0.0f;
    pConta->iNumCartao = 0;
    pConta->fTotalComprasCartao = 0.0f;
    pConta->fTotalPagtosCartao = 0.0f;
    pConta->fTotalCartao = 0.0f;

    //Faz a abertura do arquivo
    prArquivoEntrada = fopen(psNomeArquivo,"r");

    //Testa se o arquivo foi aberto com sucesso
    if (!prArquivoEntrada)
    {
        printf("Nao foi possivel abrir o arquivo de entrada");
        return(0);
    }

    //Le a primeira linha do arquivo (cabecalho)
    fgets(sLinha,TAM_STRING,prArquivoEntrada);

    //Invoca a função que separa as informaçoes do cabeçalho
    LerCabecalho(pConta,sLinha);

    //Enquanto existirem transasões a serem lidas
    while (!feof(prArquivoEntrada))
    {
            //Faz a leitura de uma linha no arquivo contendo os dados da transação
        fgets(sLinha,TAM_STRING,prArquivoEntrada);
        
        //Testa se não é linha em branco
        if (sLinha[0]=='\n')
        {
                continue;
            }
        
         
      //Cria um ponteiro para o nó inicial de uma lista
      stLista *sListaCartao = (stLista*)malloc(sizeof(stLista));
      stLista* prSubLista  = NULL;
      stData* sDataInicial;
      stData* sDataFinal;
      

           
      //Implemente aqui
    
      //Retorna a lista ordenada
      return prSubLista;
}

/*------------------------------------------------------------------------------------------
* Nome da função: LiberaTransacoes
* Descrição: Libera a memória de todas as transações contidas em uma lista
* Retorno: Nenhum
* Parâmetros: Um ponteiro para uma lista
------------------------------------------------------------------------------------------*/
void LiberaMemoriaTransacoes(stLista *pLista)
{
    stTransacao *temp = NULL;

    //Verifica se a lista não está vazia
    if (!pLista || !pLista->prInicio)
    {
        return;
    }
    
    //Enquanto houverem transações na lista, libera memória
    while (pLista->prInicio != NULL)
    {
        temp = pLista->prInicio->prProximo;
        free(pLista->prInicio);
        pLista->prInicio = temp;
    }

    //Aponta os ponteiros de inicio e fim de lista para NULL
    pLista->prInicio = NULL;
    pLista->prFim = NULL;
}

/*------------------------------------------------------------------------------------------
* Nome da função: FormataValorMonetario
* Descrição: Formata um valor monetário para o formato +00.00 ou -00.00
* Retorno: Nenhum
* Parâmetros: Um ponteiro para uma string e um valor do tipo float
------------------------------------------------------------------------------------------*/
void FormataValorMonetario(char *psValor, float pValor)
{
       // Verifica o valor pra ver se é necessário inserir o sinal
       if(pValor >= 0)
       {
           sprintf(psValor, "+%0.2f", pValor);
       }
       else
           sprintf(psValor, "%0.2f", pValor);
}

/*------------------------------------------------------------------------------------------
* Nome da função: FormataData
* Descrição: Formata uma data para o formato dd/mm/aaaa
* Retorno: Nenhum
* Parâmetros: Um ponteiro para uma string e uma estrutura do tipo Data
------------------------------------------------------------------------------------------*/
void FormataData(char *psData, stData pData)
{
       char cTmpDia[3];
       char cTmpMes[3];
       
       if(pData.iDia < 10)
       {
           sprintf(cTmpDia, "0%d", pData.iDia);
       }
       else
       {
           sprintf(cTmpDia, "%d", pData.iDia);
       }

       if(pData.iMes < 10)
       {
           sprintf(cTmpMes, "0%d", pData.iMes);
       }
       else
       {
           sprintf(cTmpMes, "%d", pData.iMes);
       }
       
       sprintf(psData, "%s/%s/%d", cTmpDia, cTmpMes, pData.iAno);       
}

/*------------------------------------------------------------------------------------------
* Nome da função: FormataHorario
* Descrição: Formata um horario para o formato hh:mm
* Retorno: Nenhum
* Parâmetros: Um ponteiro para uma string e uma estrutura do tipo Horario
------------------------------------------------------------------------------------------*/
void FormataHorario(char *psHorario, stHorario pHorario)
{
       char cTmpHora[3];
       char cTmpMin[3];
       
       if(pHorario.iHora < 10)
       {
           sprintf(cTmpHora, "0%d", pHorario.iHora);
       }
       else
       {
           sprintf(cTmpHora, "%d", pHorario.iHora);
       }

       if(pHorario.iMinuto < 10)
       {
           sprintf(cTmpMin, "0%d", pHorario.iMinuto);
       }
       else
       {
           sprintf(cTmpMin, "%d", pHorario.iMinuto);
       }
       
       sprintf(psHorario, "%s:%s", cTmpHora, cTmpMin); 
}

/*------------------------------------------------------------------------------------------
* Nome da função: ImprimeExtrato
* Descrição: Faz a impressão do extrato da conta corrente
* Retorno: Nenhum
* Parâmetros: Uma estrutura do tipo stConta e um ponteiro para uma lista ordenada
------------------------------------------------------------------------------------------*/
void ImprimeExtrato(stConta pConta, stLista *pLista)
{
    // Armazena valores que são convertidos para string
    char strValor[TAM_STRING];
    char strData[TAM_STRING];
    char strHorario[TAM_STRING];
    
    //Declara um ponteiro para a estrutura de um arquivo
    FILE *prArquivoSaida = NULL;
    
    //Faz a abertura do arquivo
    prArquivoSaida = fopen("extratoConta.txt","w");

    //Testa se o arquivo foi aberto com sucesso
    if (!prArquivoSaida)
    {
        printf("Nao foi possivel abrir o arquivo de saída");
        return;
    }
    
    fputs("\n  ================================================\n", prArquivoSaida);
    fputs("\n                       Banco TAD$\n", prArquivoSaida);
    fputs("\n              Extrato de Conta Corrente\n\n", prArquivoSaida);
    fputs("   Agencia: ", prArquivoSaida);
    fputs(pConta.cAgencia, prArquivoSaida);
    fputs("\n",prArquivoSaida);
    fputs("   Conta Corrente: ", prArquivoSaida);
    fputs(pConta.cNumConta, prArquivoSaida);
    fputs("\n",prArquivoSaida);
    fputs("   Titular: ", prArquivoSaida);
    fputs(pConta.cTitular, prArquivoSaida);
    fputs("\n  ------------------------------------------------\n\n", prArquivoSaida);
    fputs("\n\t\t\tSaldo Anterior: ", prArquivoSaida);
    FormataValorMonetario(strValor, pConta.fSaldoAnterior);
    fputs(strValor, prArquivoSaida);
    fputs("\n\n   Data\t Horario\t Operacao\t Valor\n\n", prArquivoSaida);
     
    //Cria um nó temporário
    stTransacao *temp = NULL;

    //Testa se a lista existe
    if(!pLista || !pLista->prInicio)
    {
        return;
    }

    //Aponta para o primeiro elemento da lista
    temp = pLista->prInicio;

    //Enquanto lista não chegou ao final, imprime
    while(temp!=pLista->prFim)
    {
            FormataValorMonetario(strValor, temp->fValor);
            FormataData(strData, temp->sData);
            FormataHorario(strHorario, temp->sHorario);
            if(temp->iOperacao == 1) // Saque: adiciona mais uma tabulação antes do valor
            {
                    fprintf(prArquivoSaida, "   %s \t %s \t %s \t\t %s\n", strData, strHorario, OPERACOES[temp->iOperacao], strValor);                       
            }
            else
            {
                    fprintf(prArquivoSaida, "   %s \t %s \t %s \t %s\n", strData, strHorario, OPERACOES[temp->iOperacao], strValor);                       
            }
                          
        temp = temp->prProximo;
    }

    FormataValorMonetario(strValor, temp->fValor);
    FormataData(strData, temp->sData);
    FormataHorario(strHorario, temp->sHorario);
    fprintf(prArquivoSaida, "   %s \t %s \t %s \t %s\n", strData, strHorario, OPERACOES[temp->iOperacao], strValor);                       
     
         FormataValorMonetario(strValor, pConta.fSaldoAtual);
         fputs("\n\t\t\tSaldo Atual: ", prArquivoSaida);
    fputs(strValor, prArquivoSaida);
     
    //Fecha o arquivo
    fclose(prArquivoSaida);    
}

/*------------------------------------------------------------------------------------------
* Nome da função: ImprimeFatura
* Descrição: Faz a impressão da fatura do cartão de crédito
* Retorno: Nenhum
* Parâmetros: Estrutura do tipo Conta e um ponteiro para uma lista ordenada
------------------------------------------------------------------------------------------*/
void ImprimeFatura(stConta pConta, stLista *pLista)
{
    // Armazena valores que são convertidos para string
    char strValor[TAM_STRING];
    char strData[TAM_STRING];
    char strHorario[TAM_STRING];
    
    //Declara um ponteiro para a estrutura de um arquivo
    FILE *prArquivoSaida = NULL;
    
    //Faz a abertura do arquivo
    prArquivoSaida = fopen("faturaCartao.txt","w");

    //Testa se o arquivo foi aberto com sucesso
    if (!prArquivoSaida)
    {
        printf("Nao foi possivel abrir o arquivo de saída");
        return;
    }
    
    fputs("\n  ================================================\n", prArquivoSaida);
    fputs("\n                       Banco TAD$\n", prArquivoSaida);
    fputs("\n              Fatura do Cartao de Credito\n\n", prArquivoSaida);
    fputs("   Nro. do Cartao: ", prArquivoSaida);
    fprintf(prArquivoSaida, "%i\n", pConta.iNumCartao);
    fputs("   Titular: ", prArquivoSaida);
    fputs(pConta.cTitular, prArquivoSaida);
    fputs("\n  ------------------------------------------------\n\n", prArquivoSaida);
    fputs("\n   Data\t Horario\t Operacao\t Valor\n\n", prArquivoSaida);
     
    //Cria um nó temporário
    stTransacao *temp = NULL;

    //Testa se a lista existe
    if(!pLista || !pLista->prInicio)
    {
        return;
    }

    //Aponta para o primeiro elemento da lista
    temp = pLista->prInicio;

    //Enquanto lista não chegou ao final, imprime
    while(temp!=pLista->prFim)
    {
            FormataValorMonetario(strValor, temp->fValor);
            FormataData(strData, temp->sData);
            FormataHorario(strHorario, temp->sHorario);
            if(temp->iOperacao == 5)  // Pagto_Fatura: adiciona mais uma tabulação antes do valor
            {
                    fprintf(prArquivoSaida, "   %s \t %s \t %s \t\t %s\n", strData, strHorario, OPERACOES[temp->iOperacao], strValor);                       
            }
            else
            {
                    fprintf(prArquivoSaida, "   %s \t %s \t %s \t %s\n", strData, strHorario, OPERACOES[temp->iOperacao], strValor);                               
            }
        
            temp = temp->prProximo;
    }

    FormataValorMonetario(strValor, temp->fValor);
    FormataData(strData, temp->sData);
    FormataHorario(strHorario, temp->sHorario);
    if(temp->iOperacao == 5)  // Pagto_Fatura: adiciona mais uma tabulação antes do valor
    {
            fprintf(prArquivoSaida, "   %s \t %s \t %s \t\t %s\n", strData, strHorario, OPERACOES[temp->iOperacao], strValor);                       
    }
    else
    {
            fprintf(prArquivoSaida, "   %s \t %s \t %s \t %s\n", strData, strHorario, OPERACOES[temp->iOperacao], strValor);                               
         }
     
         fputs("\n\t\t\tTotal de Compras: ", prArquivoSaida);
    FormataValorMonetario(strValor, pConta.fTotalComprasCartao);
    fputs(strValor, prArquivoSaida);
    fputs("\n\t\t\tTotal de Pagamentos: ", prArquivoSaida);
    FormataValorMonetario(strValor, pConta.fTotalPagtosCartao);
    fputs(strValor, prArquivoSaida);
    fputs("\n\t\t\tTotal da Fatura: ", prArquivoSaida);
    FormataValorMonetario(strValor, pConta.fTotalCartao);
    fputs(strValor, prArquivoSaida);
     
         //Fecha o arquivo
    fclose(prArquivoSaida);   
}

/*------------------------------------------------------------------------------------------
* Nome da função: MenuPrincipal
* Descrição: Mostra na tela o menu principal
* Retorno: Nenhum
* Parâmetros: Nenhum
------------------------------------------------------------------------------------------*/
void MenuPrincipal()
{
    system("cls");
    printf("\n  |------------------------------------------------|\n");
    printf("  |                                                |\n");    
    printf("  |            UNIVERSIDADE DO TOCANTINS           |\n");
    printf("  |                    Banco TAD$                  |\n");
    printf("  |                                                |\n");
    printf("  |------------------------------------------------|\n");
    printf("  |                                                |\n");
    printf("  |    <1> Extrato da Conta Corrente               |\n");    
    printf("  |    <2> Fatura do Cartao de Credito             |\n");
    printf("  |    <3> Sair                                    |\n");    
    printf("  |                                                |\n");    
    printf("  |------------------------------------------------|\n\n");    
    printf("\t\tOpcao: "); 
}

/*------------------------------------------------------------------------------------------
* Nome da função: TelaPeriodo
* Descrição: Mostra na tela o cabeçalho para solicitação do período do extrato da conta ou do cartao
* Retorno: Nenhum
* Parâmetros: Nenhum
------------------------------------------------------------------------------------------*/
void TelaPeriodo(char* psTipoRelatorio, stData *pDataInicio, stData *pDataFinal)
{
    system("cls");
    printf("\n  |------------------------------------------------|\n");
    printf("  |                                                |\n");    
    printf("  |            UNIVERSIDADE DO TOCANTINS           |\n");
    printf("  |                    Banco TAD$                  |\n");
    printf("  |                                                |\n");
    printf("  |------------------------------------------------|\n"); 
    printf("  |                                                |\n");
    printf("  |     %s - Periodo      |\n",psTipoRelatorio);
    printf("  |                                                |\n");    
    printf("  |------------------------------------------------|\n\n"); 
    
    //Obtem a data inicial e final para o extrato desejado
    printf("         Entre com a data inicial: ");
    scanf("%d/%d/%d", &pDataInicio->iDia, &pDataInicio->iMes, &pDataInicio->iAno); 
    printf("         Entre com a data final: ");
    scanf("%d/%d/%d", &pDataFinal->iDia, &pDataFinal->iMes, &pDataFinal->iAno);
}

/*------------------------------------------------------------------------------------------
* Nome da função: main
* Descrição: Função principal de um programa em C
* Retorno: Um valor inteiro
* Parâmetros: Nenhum
------------------------------------------------------------------------------------------*/
int main(void)
{
    //Variáveis criadas para armazenar a data inicial e final do extrato desejado
    stData sDataInicio;
    stData sDataFinal;

    //Variável criada para armazenar as informações da conta do cliente
    stConta sConta;

    //Declaração e alocação de memória para as listas
    stLista *sListaConta = (stLista*)malloc(sizeof(stLista));
    stLista *sListaCartao = (stLista*)malloc(sizeof(stLista));
    stLista *sSubLista = NULL;
    
    // Variável que armazena a opção do menu selecionada pelo usuário
    char opcao;
    
    //Invoca a função para realizar a leitura dos dados do arquivo
    LerArquivo(sListaConta, sListaCartao, &sConta, "Entrada.txt");

    // Mostra o menu principal na tela
    MenuPrincipal();
       fflush(stdin);
    opcao=getchar();
                
    switch(opcao)
    {
                 case '1': // Emitir extrato da conta corrente
                          system("cls");
                          TelaPeriodo("Extrato da Conta Corrente  ",&sDataInicio, &sDataFinal);                          
                          //Cria a sublista de transações com base nas datas fornecidas
                          sSubLista = CriaSubListaContaOrdenada(sListaConta, &sConta, sDataInicio, sDataFinal);
                      //Imprime extrato no arquivo de saída
                          ImprimeExtrato(sConta, sSubLista);
                          system("cls");
                          //Imprime mensagem
                          printf("\n\n\t\tExtrato da conta corrente gerado com sucesso");
                          getch();
                          break;
                 case '2': // Emitir fatura do cartão de crédito
                          system("cls");
                          TelaPeriodo("Fatura do Cartao de Credito",&sDataInicio, &sDataFinal);
                             //Cria a sublista de transações com base nas datas fornecidas
                          sSubLista = CriaSubListaFaturaOrdenada(sListaCartao, &sConta, sDataInicio, sDataFinal);
                      //Imprime a fatura no arquivo de saída
                          ImprimeFatura(sConta, sSubLista);
                          system("cls");
                          //Imprime mensagem
                          printf("\n\n\t\tFatura do cartao de credito gerado com sucesso");
                          getch();
                          break;
        }

    //Libera a memória alocada dinamicamente
    LiberaMemoriaTransacoes(sListaConta);
    LiberaMemoriaTransacoes(sListaCartao);

    free(sListaConta);
    free(sListaCartao);
    free(sSubLista);

    return 0;
}
Posted

Perdi-me a meio do codigo. Como eu acho que a maior parte das pessoas vai desistir a meio de ver.

1º - Podes so colcoar o codigo onde tents duvidas.

2º - Que duvida realmente tens ? Senão vai ser dificil ajudar-te

"There are two kinds of programmers. Those who write something to get the work done and those who want to write good code."João BrandãoWebsite e blog: http://jamab.blogspot.com/

Posted

E nessa função que eu estou com problemas:

/*------------------------------------------------------------------------------------------
* Nome da função: CriaSubListaContaOrdenada
* Descrição: Cria uma sublista ordenada contendo as transações da conta com base em uma data inicial e final
* Retorno: Ponteiro para uma lista
* Parâmetros: Ponteiro para uma lista ordenada, ponteiro para estrutura do tipo conta e duas 
* estruturas do tipo data
------------------------------------------------------------------------------------------*/
stLista* CriaSubListaContaOrdenada(stLista* pListaConta, stConta *pConta, stData pDataInicial, stData pDataFinal, char psNomeArquivo[])
{
     //Declara um ponteiro para a estrutura de um arquivo
    FILE *prArquivoEntrada = NULL;

    //Declara uma string para a leitura da linha
    char sLinha[TAM_STRING];

    //Declara um ponteiro para transaçao
    stTransacao *prTransacao = NULL;

    //Faz as inicializaçoes das estruturas lista
    pListaConta->prInicio = NULL;
    pListaConta->prFim = NULL;


    //Faz as inicializações da estrutura conta
    pConta->fSaldoAnterior = 0.0f;
    pConta->fSaldoAtual = 0.0f;
    pConta->iNumCartao = 0;
    pConta->fTotalComprasCartao = 0.0f;
    pConta->fTotalPagtosCartao = 0.0f;
    pConta->fTotalCartao = 0.0f;

    //Faz a abertura do arquivo
    prArquivoEntrada = fopen(psNomeArquivo,"r");

    //Testa se o arquivo foi aberto com sucesso
    if (!prArquivoEntrada)
    {
        printf("Nao foi possivel abrir o arquivo de entrada");
        return(0);
    }

    //Le a primeira linha do arquivo (cabecalho)
    fgets(sLinha,TAM_STRING,prArquivoEntrada);

    //Invoca a função que separa as informaçoes do cabeçalho
    LerCabecalho(pConta,sLinha);

    //Enquanto existirem transasões a serem lidas
    while (!feof(prArquivoEntrada))
    {
            //Faz a leitura de uma linha no arquivo contendo os dados da transação
        fgets(sLinha,TAM_STRING,prArquivoEntrada);
        
        //Testa se não é linha em branco
        if (sLinha[0]=='\n')
        {
                continue;
            }
             //Aloca memória para uma nova transação
        prTransacao = (stTransacao*)malloc(sizeof(stTransacao));

            //Quebra os dados da transação e preenche as estruturas
        PreencheTransacao(prTransacao,sLinha);

            //Verifica o tipo da operação e insere na lista do cartão ou da conta corrente:
            //código 1 a 4: operações de conta corrente
            //código 5 e 6: operações do cartão de crédito
        if (prTransacao->iOperacao < 4)
        {
            InsereTransacao(pListaConta,prTransacao);
        }

    }
    
      if(stTransacao.stData.iDia == sDataInicial.iDia); 
      if(stTransacao.stData.iMes == sDataInicial.iMes); 
      if(stTransacao.stData.iAno == sDataInicial.iAno);      
            
         if(stTransacao.stData.iDia == sDataFinal.iDia); 
      if(stTransacao.stData.iMes == sDataFinal.iMes); 
      if(stTransacao.stData.iAno == sDataFinal.iAno); 
            
     //Cria um ponteiro para o nó inicial de uma lista
      
      stLista* prSubLista  = NULL;
      stLista* prSubLista = (stLista*)malloc(sizeof(stLista));
      
     if (sListaConta==NULL)
   {
     printf("Erro de alocacao\n");
     return 0;
   }

   //sListaConta->sDataInicial = sConta;
   //sListaConta->sDataFinal = NULL;

   if (prSubLista==NULL)
      prSubLista = sListaConta;
   else {
      //sListaConta->sDataFinal = prSubLista;
      //prSubLista  = sListaConta;
    }

       //Implemente aqui
    
      //Retorna a lista ordenada
      return prSubLista;
    

}
Posted

Primeiramente, vc tem aí alguns problema de sintaxe, certo? Coloque pra rodar, e ele apontou para essa linha:

if(stTransacao.stData.iDia == sDataInicial.iDia);

Erro: 329 expected primary-expression before '.' token 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.