Pessoal,
Eu preciso desenvolver um programa em c para um trabalho de faculdade, que é um orçamento familiar.
A ideia é trabalhar com 3 tabelas (obtidas das structs) para cadastros de:
1) Pessoas
2) Despesas
3) Lançamento de Despesas
Fiz 3 structs para receber as informações.
Fiz a parte de cadastro de Pessoas e o cadastro das Depesas.
Na parte de lancamentos, eu queria cadastrar a pessoa, o lancamento e o valor.
Mas eu preciso depois, para gerar os dados e relatorios, associar e obter outros campos de Pessoas e Despesas, (como de fosse relacionamentos em um banco de dados) para poder fazer os agrupamentos e responder o que se pede (como se fossem querys em um banco de dados).
O caso é que não consigo, ao lançar a pessoa e despesa, trazer as demais informações que eu vou precisar, conforme esta comentado no codigo.
Nao sei se é possivel fazer isso. Não sei se é com structs que vou conseguir.
Não posso usar banco de dados com o c.
Segue abaixo os comentarios e o codigo, para que se possivel, alguem possa me ajudar a sair dessa.
Obrigado.
Anderson
/*
Aplicação de Orçamento e Despesas Familiares
1. Cadastrar membro da família.
2. Definir se a despesa é pessoal ou da família.
3. Se a despesa é pessoal, então o usuário será direcionado a uma verificação de despesas básicas.
São despesas básicas pessoais: caso ele tenha mais de 18 anos – escola, transporte, lazer, saúde e previdência.
Caso seja menor de idade, as despesas básicas serão adicionadas ao cálculo das estimativas do usuário cadastrado como “pai” ou “mãe”.
4. Para usuário cadastrado como “pai” ou “mãe”, permitir a visualização das despesas comuns da residência, que incluem:
moradia, água, luz, gás, IPTU, prestação do carro (se houver).
Se sim, apresente as demais despesas:
IPVA, seguro, combustível, higienização e manutenção.
Ainda como despesas básicas:
plano de saúde (se houver), despesas de mercado, previsão de gastos extras com férias, lazer e outras relacionadas à gastronomia e previdência.
5. Além de permitir a inserção das despesas de acordo com o usuário, o sistema deverá permitir aos usuários em suas respectivas
planilhas as funcionalidades básicas (CRUD ? Create, Read, Update e Delete).
6. Ao final, deverá realizar o controle que considera:
valor recebido, total de despesas, saldo a poupar, saldo a recuperar, tanto em cálculos individuais quanto em despesas comuns.
A ideia é trabalhar com 3 tabelas (obtidas das structs) para cadastros de:
1) Pessoas
2) Despesas
3) Lançamento de Despesas
*/
#include <stdio.h>
#include <stdlib.h>
struct Pessoas{
int CodigoPessoa;
char nome[40];
char sexo[2]; //Deveria ser 1 mas da problema
char tipo[2]; //Deveria ser 1 mas da problema
int idade;
float renda;
};
struct Despesas{
int CodigoDespesa;
char NomeDespesa[40];
char TipoDespesa[2]; //Deveria ser 1 mas da problema
float ValorEstimado;
};
struct Lancamentos{
int LancamentoID;
int LnCodigoDespesa;
int LnCodigoPessoa;
int Mes;
int Ano;
float ValorLancado;
};
int main()
{
int op = 0;
// posicao, codaux, retorno;
while ( op != 5 )
{
system("cls");
printf("\n\n\t\t\t\t** Orcamento e Planejamento Familiar **\n\n\n");
printf("MENU\n\n1 - Cadastrar Pessoas\n2 - Cadastrar Despesas\n3 - Lancamentos\n4 - Relatorio\n5 - Sair\n\nOpcao: ");
scanf("%d",&op);
system("cls");
switch ( op )
{
case 1: // Cadastro Pessoas
{
int qtde;
struct Pessoas CadastroPessoas[10]; //Pessoas cadastro[10];
int i = 0;
//Inicio Cadastro Pessoas
printf("-----------------------------------\n");
printf("Quantos pessoas voce quer informar? ");
scanf("%d",&qtde);
while(qtde>10){
printf("Quantidade nao permitida, tente novamente...\n\n");
printf("Quantas pessoas: ");
scanf("%d",&qtde);
}
//capturando os dados
for(i=0;i<qtde;i++)
{
printf("-----------------------------------\n");
CadastroPessoas[i].CodigoPessoa = i+1;
printf("\nDigite o nome %d: ",i+1);
fflush(stdin);
fgets(CadastroPessoas[i].nome,40,stdin);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("Digite o sexo (M/F) %d: ",i+1);
scanf("%s", &CadastroPessoas[i].sexo);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("Digite o tipo (P - Pai / M - Mae / F - Filho / O - Outro)%d: ",i+1);
scanf("%s", &CadastroPessoas[i].tipo);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("Digite a idade %d: ",i+1);
scanf("%d", &CadastroPessoas[i].idade);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("Digite a Renda %d: ",i+1);
scanf("%f", &CadastroPessoas[i].renda);
setbuf(stdin, NULL); //limpar buffer de entrada
}
//Visualizar os dados
for(i=0;i<qtde;i++)
{
printf("\n-----------------------------------");
printf("\nCodigo %d ",CadastroPessoas[i].CodigoPessoa);
printf("\nNome: %s ",CadastroPessoas[i].nome);
printf("\nSexo: %s ",CadastroPessoas[i].sexo);
printf("\nTipo: %s ",CadastroPessoas[i].tipo);
printf("\nIdade: %d ",CadastroPessoas[i].idade);
printf("\nRenda: %f ",CadastroPessoas[i].renda);
puts(" ");
}
//TESTES ARQUIVOS
FILE *pont_arq_pessoas; // cria variável ponteiro para o arquivo
//abrindo o arquivo com tipo de abertura w
pont_arq_pessoas = fopen("dt_pessoas.txt", "w");
//Gravação do arquivo
for(i=0;i<qtde;i++)
{
fprintf(pont_arq_pessoas,"%d ",CadastroPessoas[i].CodigoPessoa,5);
fprintf(pont_arq_pessoas,"%s ",CadastroPessoas[i].nome,40);
fprintf(pont_arq_pessoas,"%s ",CadastroPessoas[i].sexo,1);
fprintf(pont_arq_pessoas,"%s ",CadastroPessoas[i].tipo,1);
fprintf(pont_arq_pessoas,"%d ",CadastroPessoas[i].idade,2);
fprintf(pont_arq_pessoas,"%f ",CadastroPessoas[i].renda,15);
fprintf(pont_arq_pessoas,"\n");
}
//fclose para fechar o arquivo
fclose(pont_arq_pessoas);
system("pause");
break;
}
//CADASTRO DE DESPESAS
case 2: // Cadastro Despesas
{
struct Despesas CadastroDespesas[30];
char Retorno;
int i = 0;
int j = 0;
do
{
printf("-----------------------------------\n");
CadastroDespesas[i].CodigoDespesa = i+1;
printf("\nDigite o nome da Despesa %d: ",i+1);
fflush(stdin);
fgets(CadastroDespesas[i].NomeDespesa,40,stdin);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("Digite o Tipo (P/R - Pessoal / Residencial) %d: ",i+1);
scanf("%s", &CadastroDespesas[i].TipoDespesa);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("Digite o Valor Estimado %d: ",i+1);
scanf("%f", &CadastroDespesas[i].ValorEstimado);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("\n-----------------------------------\n");
printf("\nDeseja cadastrar outra despesa? (S/N)\n");
scanf("%s", &Retorno);
i = i + 1;
j = j + 1;
} while (Retorno == 'S' || Retorno == 's');
//imprimindo os dados
for(i=0;i<j;i++)
{
printf("\n-----------------------------------");
printf("\nCodigo Despesa %d ",CadastroDespesas[i].CodigoDespesa);
printf("\nNome Despesa: %s ",CadastroDespesas[i].NomeDespesa);
printf("\nTipo Despesa: %s ",CadastroDespesas[i].TipoDespesa);
printf("\nValor Estimado: %f ",CadastroDespesas[i].ValorEstimado);
puts(" ");
}
//ARQUIVOS DESPESAS
FILE *pont_arq_despesas; // cria variável ponteiro para o arquivo
//abrindo o arquivo com tipo de abertura w
pont_arq_despesas = fopen("dt_despesas.txt", "w");
//Gravação do arquivo
for(i=0;i<j;i++)
{
fprintf(pont_arq_despesas,"\nCodigo Despesa %d ",CadastroDespesas[i].CodigoDespesa);
fprintf(pont_arq_despesas,"\nNome Despesa: %s ",CadastroDespesas[i].NomeDespesa);
fprintf(pont_arq_despesas,"\nTipo Despesa: %s ",CadastroDespesas[i].TipoDespesa);
fprintf(pont_arq_despesas,"\nValor Estimado: %f ",CadastroDespesas[i].ValorEstimado);
fprintf(pont_arq_despesas,"\n");
}
//fclose para fechar o arquivo
fclose(pont_arq_despesas);
system("pause");
break;
}
//CADASTRO DE LANCAMENTOS
//A ideia é fazer o lancamento por pessoa e despesa.
//Depois, precisa buscar os dados das pessoas (Tipo, Idade e Renda) e associar com os dados das despesas (TipoDespesa e ValorEstimado) para fazer os calculos
//de despesas por familia, despesas pessoais, orçamento, etc.
case 3: // Cadastro de Lançamentos
{
struct Lancamentos CadastroLancamentos[30];
char Retorno;
int i = 0;
int j = 0;
do
{
printf("-----------------------------------\n");
CadastroLancamentos[i].LancamentoID = i+1;
printf("\nInforme o Codigo da Despesa %d: ",i+1);
scanf("%d", &CadastroLancamentos[i].LnCodigoDespesa);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("\nInforme o Codigo da Pessoa %d: ",i+1);
scanf("%d", &CadastroLancamentos[i].LnCodigoPessoa);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("\nInforme o Mes %d: ",i+1);
scanf("%d", &CadastroLancamentos[i].Mes);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("\nInforme o Ano %d: ",i+1);
scanf("%d", &CadastroLancamentos[i].Ano);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("Digite o Valor Estimado %d: ",i+1);
scanf("%f", &CadastroLancamentos[i].ValorLancado);
setbuf(stdin, NULL); //limpar buffer de entrada
printf("\n-----------------------------------\n");
printf("\nDeseja cadastrar outra despesa? (S/N)\n");
scanf("%s", &Retorno);
i = i + 1;
j = j + 1;
} while (Retorno == 'S' || Retorno == 's');
//Visualizando os dados
for(i=0;i<j;i++)
{
printf("\n-----------------------------------");
printf("\nCodigo da Despesa %d ",CadastroLancamentos[i].LnCodigoDespesa);
printf("\nCodigo da Pessoa: %d ",CadastroLancamentos[i].LnCodigoPessoa);
printf("\nMes: %d ",CadastroLancamentos[i].Mes);
printf("\nAno: %d ",CadastroLancamentos[i].Ano);
printf("\nValor: %f ",CadastroLancamentos[i].ValorLancado);
puts(" ");
}
//TESTES ARQUIVOS DESPESAS
FILE *pont_arq_lancamento; // cria variável ponteiro para o arquivo
//abrindo o arquivo com tipo de abertura w
pont_arq_lancamento = fopen("dt_lancamentos.txt", "w");
//Gravação do arquivo
for(i=0;i<j;i++)
{
fprintf(pont_arq_lancamento,"\nCodigo da Despesa %d ",CadastroLancamentos[i].LnCodigoDespesa);
fprintf(pont_arq_lancamento,"\nCodigo da Pessoa: %d ",CadastroLancamentos[i].LnCodigoPessoa);
fprintf(pont_arq_lancamento,"\nMes: %d ",CadastroLancamentos[i].Mes);
fprintf(pont_arq_lancamento,"\nAno: %d ",CadastroLancamentos[i].Ano);
fprintf(pont_arq_lancamento,"\nValor: %f ",CadastroLancamentos[i].ValorLancado);
}
//fclose para fechar o arquivo
fclose(pont_arq_lancamento);
system("pause");
break;
}
}
}
return 0;
}