O programa que eu estou querendo fazer serve para distribuir o valor da conta de telefone entre os moradores da minha republica. O esquema é o seguinte:
1- Existe um cadastro de morador, com um codigo de cada morador para facilitar a entrada de dados
2- Existe um valor fixo (assinatura ou multa) que deve ser dividido por todos os moradores
3- Divide-se o resto do valor da conta pelos segundos totais falados, gerando uma quantia q deve ser paga por segundo falado
4- O usuario vai digitar a duração das ligaçoes de cada morador e oi programa vai calcular o valor q deve ser pago pelo morador...
mas o programa esta dando alguns loops... alguém me ajude a consertar.. se alguém tiver alguma sugestão de melhora do programa seja bem vindo para falar...
aki vai o codigo
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define TAM_MAX_NOME 40
#define TAM_MAX_CODIGO 15
struct moradores
{
char nome[TAM_MAX_NOME];
char codigo[TAM_MAX_CODIGO];
int segundos;
double divida;
};
char *fgetline(FILE *f, char *s, int tamanho)
{
char *str = fgets(s, tamanho, f);
if (str != NULL)
{
int n = strlen(s);
if (s[n-1] == '\n')
s[n-1] = '';
else
while (! feof(f) && fgetc(f) != '\n');
}
return str;
}
void distribuicao(struct moradores v[], int*pn)
{
char pesquisa_codigo[TAM_MAX_CODIGO];
int i, h, m, s, r, x;
double d, d2, conta, vps, horas, minutos, segundos;
printf("Valor a ser dividido por todos: R$");
scanf("%lf", &d);
d2 = d / *pn;
for(i = 0; i < *pn; i++){ v[i].divida += d2;}
printf("Deseja voltar ao menu?\n1-Sim\n2-não\nOpcao: ");
scanf("%d", &r);
if(r == 1){printf("\n\n"); return;}
printf("\nValor da conta para dividir pelos minutos: R$");
scanf("%lf", &conta);
printf("\nMinutos total da conta (hh:mm:ss): ");
scanf("%lf:%lf:%lf", &horas, &minutos, &segundos);
vps = conta / (3600*horas + 60*minutos + segundos);
printf("\nValor a ser pago por segundo falado: R$%.5lf\n\n", vps);
do
{
printf("\nAcrescentar tempo a morador?\n1-Sim\n2-não\nOpcao: ");
scanf("%d", &x);
if(x == 1)
{
printf("Codigo do morador: ");
fgetline(stdin, pesquisa_codigo, TAM_MAX_CODIGO);
for (i = 0; i < *pn; i++)
{
if (strcmp(v[i].codigo, pesquisa_codigo) == 0)
{
printf("Tempo da ligação (hh:mm:ss): ");
scanf("%d:%d:%d", &h, &m, &s);
v[i].segundos += (3600*h + 60*m + s);
break;
}
}
}
}while(x == 's');
for (i = 0; i < *pn; i++)
v[i].divida += (v[i].segundos * vps);
}
void adicionar_morador(struct moradores v[], int *pn)
{
printf("\nAdicionando novo usuario\n");
printf("Nome do usuario: "); fgetline(stdin, v[*pn].nome, TAM_MAX_NOME);
printf("Codigo: "); fgetline(stdin, v[*pn].codigo, TAM_MAX_CODIGO);
printf("\n\n");
(*pn)++;
}
void consultar(struct moradores v[], int n)
{
char pesquisa_codigo[TAM_MAX_CODIGO];
printf("\nConsulta de divida\n");
printf("Codigo: ");
fgetline(stdin, pesquisa_codigo, TAM_MAX_CODIGO);
int i;
for (i = 0; i < n; i++)
{
if (strcmp(v[i].codigo, pesquisa_codigo) == 0)
{
printf("Nome: %s\n", v[i].nome);
printf("Divida: R$%.2lf\n\n", v[i].divida);
break;
}
else
{
if (strcmp(v[i].codigo, pesquisa_codigo) != 0)
printf("\nUsuario não encontrado.\n\n");
break;
}
}
}
void abater(struct moradores v[], int *pn)
{
char pesquisa_codigo[TAM_MAX_CODIGO];
double pagamento;
printf("\nPagamento de divida\n");
printf("Codigo: ");
fgetline(stdin, pesquisa_codigo, TAM_MAX_CODIGO);
int i;
for (i = 0; i < *pn; i++)
{
if (strcmp(v[i].codigo, pesquisa_codigo) == 0)
{
printf("Valor do pagamento: R$");
scanf("%lf", &pagamento);
if (pagamento < 0.0 || pagamento == 0.0)
printf("Voce deve colocar um valor positivo");
else
{
if (pagamento > v[i].divida)
printf("Valor do pagamento maior que a divida.\n\n");
else
{
v[i].divida -= pagamento;
printf("Pagamento realizado com sucesso\n");
printf("Divida atual: R$%.2lf\n\n", v[i].divida);
}
}
}
else
{
if (strcmp(v[i].codigo, pesquisa_codigo) != 0)
printf("\nUsuario não encontrado.\n\n");
}
}
}
void acrescentar(struct moradores v[], int *pn)
{
char pesquisa_codigo[TAM_MAX_CODIGO];
double acrescimo;
printf("\nAcrescimo de divida\n");
printf("Codigo: ");
fgetline(stdin, pesquisa_codigo, TAM_MAX_CODIGO);
int i;
for (i = 0; i < *pn; i++)
{
if (strcmp(v[i].codigo, pesquisa_codigo) == 0)
{
printf("Valor do acrescimo: R$");
scanf("%lf", &acrescimo);
if (acrescimo < 0.0 || acrescimo == 0.0)
printf("Voce deve colocar um valor positivo");
else
{
v[i].divida += acrescimo;
printf("Acrescimo de divida realizado com sucesso\n");
printf("Divida atual: R$%.2lf\n\n", v[i].divida);
}
}
else
{
if (strcmp(v[i].codigo, pesquisa_codigo) != 0)
printf("\nUsuario não encontrado.\n\n");
}
}
}
void listar(struct moradores v[], int n)
{
printf("Listagem de todos os usuarios e suas respectivas dividas\n");
int i;
for (i = 0; i < n; i++)
{
printf("--–-–-–-–-–-–-–-–-–-–-–-–-–-–-–-–-–-–\n");
printf("Nome : %s\n", v[i].nome);
printf("Divida : R$%.2f\n", v[i].divida);
}
}
void ler_arquivo(struct moradores v[], int *pn)
{
printf("\nLeitura de arquivo do Sistema\n");
char nome_arquivo[TAM_MAX_NOME];
printf("Nome do arquivo: ");
fgetline(stdin, nome_arquivo, TAM_MAX_NOME);
FILE *f = fopen(nome_arquivo, "r");
if (f == NULL)
printf("O arquivo não foi encontrado.\n");
else
{
*pn = 0;
while (! feof(f))
{
fgetline(f, v[*pn].nome, TAM_MAX_NOME);
fscanf(f, "%lf", &(v[*pn].divida));
fgetline(f, v[*pn].codigo, TAM_MAX_CODIGO);
if (v[*pn].nome[0] != '')
(*pn)++;
}
fclose(f);
}
printf("Numeros de usuario cadastrados = %d\n\n", (*pn - 2));
}
void gravar_arquivo(struct moradores v[], int n)
{
printf("\nGravação dos dados do Sistema\n");
char nome_arquivo[TAM_MAX_NOME];
printf("Nome do arquivo: ");
fgetline(stdin, nome_arquivo, TAM_MAX_NOME);
FILE *f = fopen(nome_arquivo, "w");
if (f == NULL)
printf("Não foi possivel salvar o arquivo.\n");
else
{
int i;
for (i = 0; i < n; i++)
{
fprintf(f, "%s\n", v[i].nome);
fprintf(f, "%s\n", v[i].codigo);
fprintf(f, "%lf\n", v[i].divida);
}
fclose(f);
}
printf("\n");
}
int main(void)
{
struct moradores dados[500];
int n = 0;
int opcao;
do
{
printf("===============================================================================\n");
printf("============================ REPUBLICA COSA NOSTRA ============================\n");
printf("===============================================================================\n\n");
printf("=========== SISTEMA DE DISTRIBUICAO DE VALORES DA CONTA DE TELEFONE ===========\n\n");
printf("1. Adicionar morador\n");
printf("2. Consultar divida de morador\n");
printf("3. Abater divida de morador\n");
printf("4. Fazer distribuicao de valores da conta de telefone\n");
printf("5. Acrescentar divida a morador\n");
printf("6. Listar todos usuarios\n");
printf("7. Ler dados de arquivo\n");
printf("8. Gravar dados em arquivo\n");
printf("0. Terminar\n");
printf("\n");
do
{
printf("Escolha uma opcao: ");
scanf("%d", &opcao);
if (opcao < 0 || opcao > 8)
printf("Opção Inválida.\n");
}
while (opcao < 0 || opcao > 8);
getchar();
switch (opcao)
{
case 1:
adicionar_morador(dados, &n);
break;
case 2:
consultar(dados, n);
break;
case 3:
abater(dados, &n);
break;
case 4:
distribuicao(dados, &n);
break;
case 5:
acrescentar(dados, &n);
break;
case 6:
listar(dados, n);
break;
case 7:
ler_arquivo(dados, &n);
break;
case 8:
gravar_arquivo(dados, n);
break;
case 0:
break;
}
if (opcao == 0)
printf("\nO programa sera fechado.\n");
}
while (opcao != 0);
getchar();
return 0;
}
Pergunta
RenanPoswar
O programa que eu estou querendo fazer serve para distribuir o valor da conta de telefone entre os moradores da minha republica. O esquema é o seguinte:
1- Existe um cadastro de morador, com um codigo de cada morador para facilitar a entrada de dados
2- Existe um valor fixo (assinatura ou multa) que deve ser dividido por todos os moradores
3- Divide-se o resto do valor da conta pelos segundos totais falados, gerando uma quantia q deve ser paga por segundo falado
4- O usuario vai digitar a duração das ligaçoes de cada morador e oi programa vai calcular o valor q deve ser pago pelo morador...
mas o programa esta dando alguns loops... alguém me ajude a consertar.. se alguém tiver alguma sugestão de melhora do programa seja bem vindo para falar...
aki vai o codigo
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.