
#include <stdlib.h>
#include <stdio.h>

#define TRUE (1)
#define FALSE (0)

double resistance, capacitance;
double charge, voltage, current;
double end_time, delta_time;

int strequal(char s0[], char s1[])
{
  return(strcmp(s0, s1) == 0);
}

void get_keyboard_parameters(void)
{
  printf("Please enter Resistance in ohm:");
  scanf("%lf", &resistance);
  printf("Please enter Capacitance in farad:");
  scanf("%lf", &capacitance);
  printf("Please enter initial charge in coulomb:");
  scanf("%lf", &charge);
  printf("Please enter time step in seconds:");
  scanf("%lf", &delta_time);
  printf("Please enter end time in seconds:");
  scanf("%lf", &end_time);
}

int get_file_parameters(void)
{
  char filename[100];
  FILE *stream;
  int result;

  result = TRUE;

  printf("Please enter parameter file name:");
  scanf("%s", filename);

  printf("filename: %s\n", filename);
  stream = fopen(filename, "r");

  if (stream == NULL)
  {
    printf("rc1: fopen() failed!\n");
    perror("rc1:");
    result = FALSE;
  }
  else
  {
    if (fscanf(stream, "%lf %lf %lf %lf %lf", 
          &resistance,
          &capacitance,
          &charge,
          &delta_time,
          &end_time) != 5)
      result = FALSE;
  }

  return(result);
}

void get_parameters(void)
{
  int getting;
  char answer[20];

  getting = TRUE;
  while(getting)
  {
    printf("Get parameters from file (y/n)?");
    scanf("%s", answer);

    if (strequal(answer,"y"))
      getting = !get_file_parameters();
    else
    {
      get_keyboard_parameters();
      getting = FALSE;
    }
  }

  printf("Check: %f %f %f %f %f\n",
    resistance, capacitance, charge, delta_time,
    end_time);
}

void do_calculations(void)
{
  double delta_charge;

  voltage = charge/capacitance;
  current = - voltage/resistance;
  delta_charge = current * delta_time;
  charge = charge + delta_charge;
}

void print_results(double time, double charge)
{
  printf("%f %f\n", time, charge);
}

void main(void)
{
  double elapsed_time;

  get_parameters();

  elapsed_time = 0.0;
  while (elapsed_time < end_time)
  {
    print_results(elapsed_time, charge);
    do_calculations();
    elapsed_time = elapsed_time + delta_time;
  }
}
