Ir para conteúdo
Fórum Script Brasil
  • 0

Programa em c


RenanPoswar

Pergunta

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

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...