
#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;
  int status;

  result = TRUE;

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

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

  if (stream == NULL)
  {
    perror("rc2: perror()");
    printf("rc2: fopen() failed!\n");
    result = FALSE;
  }
  else
  {
    status = fscanf(stream, "%lf %lf %lf %lf %lf",
          &resistance,
          &capacitance,
          &charge,
          &delta_time,
          &end_time);
    if (status != 5)
    {
      perror("rc2: perror()");
      printf("rc2: fscanf() return value: %d\n", status);
      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(FILE *stream, double time, double charge)
{
  fprintf(stream, "%f %f\n", time, charge);
}

FILE *get_output_stream(void)
{
  FILE *stream;
  char filename[100];
  char answer[20];

  stream = stdout; /* Default is to send output to stdout... */

  printf("Output results to file (y/n)?");
  scanf("%s", answer);

  if (strequal(answer,"y"))
  {

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

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

    if (stream == NULL)
    {
      perror("rc2: perror()");
      printf("rc2: fopen() failed!\n");
      exit(EXIT_FAILURE);
    }
  }

  return(stream);
}

void main(void)
{
  double elapsed_time;
  FILE *output_stream;

  get_parameters();
  output_stream = get_output_stream();

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