/*************************************************************************
Series-parallel circuit random problem generator
By Tony R. Kuphaldt
Last update 17 May 2026

This software is released under the CC0 1.0 Universal license,
which is equivalent to Public Domain.

*************************************************************************/

#include <stdio.h>
#include <math.h>	// Necessary for powers and roots to work
#include <stdlib.h>	// Necessary for the "random" function to work
#include <time.h>		// Necessary for the "time" library functions to work

#define SIZE 10 
double Vsrc, Isrc, Psrc;
double R[SIZE], V[SIZE], I[SIZE], P[SIZE];

int initialize(void);
int random_whole (int);
int metric (double);
int clear_screen (void);
int print_parameters (int);

int circuit_series_v(void);
int circuit_series_i(void);
int circuit_parallel_v(void);
int circuit_parallel_i(void);
int circuit_00(void);
int circuit_01(void);
int circuit_02(void);
int circuit_03(void);
int circuit_04(void);
int circuit_05(void);
int circuit_06(void);
int circuit_07(void);
int circuit_08(void);
int circuit_09(void);
int circuit_10(void);
int circuit_11(void);
int circuit_12(void);
int circuit_13(void);
int circuit_14(void);
int circuit_15(void);

/*************MAIN*****************/
int main (void)
{
  // "Seed" the random number generator with the system time
  srandom ((int) (time (NULL)));
 
  clear_screen();  initialize();  circuit_series_v();
  clear_screen();  initialize();  circuit_series_i();
  clear_screen();  initialize();  circuit_parallel_v();
  clear_screen();  initialize();  circuit_parallel_i();
  clear_screen();  initialize();  circuit_00();
  clear_screen();  initialize();  circuit_01();
  clear_screen();  initialize();  circuit_02();
  clear_screen();  initialize();  circuit_03();
  clear_screen();  initialize();  circuit_04();
  clear_screen();  initialize();  circuit_05();
  clear_screen();  initialize();  circuit_06();
  clear_screen();  initialize();  circuit_07();
  clear_screen();  initialize();  circuit_08();
  clear_screen();  initialize();  circuit_09();
  clear_screen();  initialize();  circuit_10();
  clear_screen();  initialize();  circuit_11();
  clear_screen();  initialize();  circuit_12();
  clear_screen();  initialize();  circuit_13();
  clear_screen();  initialize();  circuit_14();
  clear_screen();  initialize();  circuit_15();
 
  return 0;
}
/*************MAIN*****************/


/************CIRCUIT_SERIES_V************/
int circuit_series_v(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------R1----------+ \n");
  printf("  |                      | \n");
  printf(" Vsrc                    R2 \n");
  printf("  |                      | \n");
  printf("  +----------R3----------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = R[1] + R[2] + R[3];  // Using R[4] as total resistance
  Isrc = I[1] = I[2] = I[3] = Vsrc / R[4];
  Psrc = Isrc * Vsrc;
  V[1] = I[1] * R[1]; 
  V[2] = I[2] * R[2]; 
  V[3] = I[3] * R[3]; 
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_SERIES_V************/


/************CIRCUIT_SERIES_I************/
int circuit_series_i(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------R1----------+ \n");
  printf("  |                      | \n");
  printf(" Isrc                    R2 \n");
  printf("  |                      | \n");
  printf("  +----------R3----------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = R[1] + R[2] + R[3];  // Using R[4] as total resistance
  I[1] = I[2] = I[3] = Isrc;
  Vsrc = Isrc * R[4];
  Psrc = Isrc * Vsrc;
  V[1] = I[1] * R[1]; 
  V[2] = I[2] * R[2]; 
  V[3] = I[3] * R[3]; 
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_SERIES_I************/


/************CIRCUIT_PARALLEL_V************/
int circuit_parallel_v(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-------+-------+-------+ \n");
  printf("  |       |       |       | \n");
  printf(" Vsrc     R1      R2      R3 \n");
  printf("  |       |       |       | \n");
  printf("  +-------+-------+-------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = 1/(1/R[1] + 1/R[2] + 1/R[3]);  // Using R[4] as total resistance
  Isrc = Vsrc / R[4];
  V[1] = V[2] = V[3] = Vsrc;
  Psrc = Isrc * Vsrc;
  I[1] = V[1] / R[1]; 
  I[2] = V[2] / R[2]; 
  I[3] = V[3] / R[3]; 
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_PARALLEL_V************/


/************CIRCUIT_PARALLEL_I************/
int circuit_parallel_i(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-------+-------+-------+ \n");
  printf("  |       |       |       | \n");
  printf(" Isrc     R1      R2      R3 \n");
  printf("  |       |       |       | \n");
  printf("  +-------+-------+-------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = 1/(1/R[1] + 1/R[2] + 1/R[3]);  // Using R[4] as total resistance
  Vsrc = Isrc * R[4];
  V[1] = V[2] = V[3] = Vsrc;
  Psrc = Isrc * Vsrc;
  I[1] = V[1] / R[1]; 
  I[2] = V[2] / R[2]; 
  I[3] = V[3] / R[3]; 
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_PARALLEL_I************/


/************CIRCUIT_00************/
int circuit_00(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+ \n");
  printf("  |                      | \n");
  printf(" Vsrc                    R1 \n");
  printf("  |                      | \n");
  printf("  +----------R2----------+ \n");
  printf("  |                      | \n");
  printf("  |                      | \n");
  printf("  +----------R3----------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = 1/(1/R[2] + 1/R[3]);  // Using R[4] as R[2]//R[3] equivalent
  R[5] = R[4] + R[1];          // Using R[5] as total resistance
  Isrc = I[1] = Vsrc / R[5];
  Psrc = Isrc * Vsrc;
  V[1] = I[1] * R[1]; 
  V[2] = V[3] = Vsrc - V[1];
  I[2] = V[2] / R[2];
  I[3] = V[3] / R[3];
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_00************/


/************CIRCUIT_01************/
int circuit_01(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+ \n");
  printf("  |                      | \n");
  printf(" Isrc                    R1 \n");
  printf("  |                      | \n");
  printf("  +----------R2----------+ \n");
  printf("  |                      | \n");
  printf("  |                      | \n");
  printf("  +----------R3----------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = 1/(1/R[2] + 1/R[3]);  // Using R[4] as R[2]//R[3] equivalent
  R[5] = R[4] + R[1];          // Using R[5] as total resistance
  Vsrc = Isrc * R[5];
  Psrc = Isrc * Vsrc;
  I[1] = Isrc;
  V[1] = I[1] * R[1]; 
  V[2] = V[3] = Vsrc - V[1];
  I[2] = V[2] / R[2];
  I[3] = V[3] / R[3];
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_01************/


/************CIRCUIT_02************/
int circuit_02(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+-----+ \n");
  printf("  |                      |     | \n");
  printf(" Vsrc                    R1    | \n");
  printf("  |                      |     | \n");
  printf("  +----------R2----------+     | \n");
  printf("  |                            | \n");
  printf("  |                            | \n");
  printf("  +----------R3----------------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = R[1] + R[2];           // Using R[4] as R[1]--R[2] equivalent
  R[5] = 1/(1/R[4] + 1/R[3]);   // Using R[5] as total resistance
  Isrc = Vsrc / R[5];
  Psrc = Isrc * Vsrc;
  V[3] = Vsrc;
  I[3] = V[3] / R[3]; 
  I[1] = I[2] = Vsrc / R[4];
  V[1] = I[1] * R[1];
  V[2] = I[2] * R[2];
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_02************/


/************CIRCUIT_03************/
int circuit_03(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+-----+ \n");
  printf("  |                      |     | \n");
  printf(" Isrc                    R1    | \n");
  printf("  |                      |     | \n");
  printf("  +----------R2----------+     | \n");
  printf("  |                            | \n");
  printf("  |                            | \n");
  printf("  +----------R3----------------+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");

  R[4] = R[1] + R[2];           // Using R[4] as R[1]--R[2] equivalent
  R[5] = 1/(1/R[4] + 1/R[3]);   // Using R[5] as total resistance
  Vsrc = Isrc * R[5];
  Psrc = Isrc * Vsrc;
  V[3] = Vsrc;
  I[3] = V[3] / R[3]; 
  I[1] = I[2] = Vsrc / R[4];
  V[1] = I[1] * R[1];
  V[2] = I[2] * R[2];
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];

  print_parameters(3);
  
  return 0;
}
/************CIRCUIT_03************/


/************CIRCUIT_04************/
int circuit_04(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+-----+ \n");
  printf("  |                      |     | \n");
  printf(" Vsrc                    R1    | \n");
  printf("  |                      |     | \n");
  printf("  +----------R2----------+     | \n");
  printf("  |                            | \n");
  printf("  |                            | \n");
  printf("  +----------R4----------R3----+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");

  R[5] = R[1] + R[2];           // Using R[5] as R[1]--R[2] equivalent
  R[6] = R[3] + R[4];           // Using R[6] as R[3]--R[4] equivalent
  R[7] = 1/(1/R[5] + 1/R[6]);   // Using R[7] as total resistance
  Isrc = Vsrc / R[7];
  I[1] = I[2] = Vsrc / R[5];
  I[3] = I[4] = Vsrc / R[6];
  Psrc = Isrc * Vsrc;
  V[1] = I[1] * R[1];
  V[2] = I[2] * R[2];
  V[3] = I[3] * R[3];
  V[4] = I[4] * R[4];
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];

  print_parameters(4);
  
  return 0;
}
/************CIRCUIT_04************/


/************CIRCUIT_05************/
int circuit_05(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+-----+ \n");
  printf("  |                      |     | \n");
  printf(" Isrc                    R1    | \n");
  printf("  |                      |     | \n");
  printf("  +----------R2----------+     | \n");
  printf("  |                            | \n");
  printf("  |                            | \n");
  printf("  +----------R4----------R3----+ \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");

  R[5] = R[1] + R[2];           // Using R[5] as R[1]--R[2] equivalent
  R[6] = R[3] + R[4];           // Using R[6] as R[3]--R[4] equivalent
  R[7] = 1/(1/R[5] + 1/R[6]);   // Using R[7] as total resistance
  Vsrc = Isrc * R[7];
  I[1] = I[2] = Vsrc / R[5];
  I[3] = I[4] = Vsrc / R[6];
  Psrc = Isrc * Vsrc;
  V[1] = I[1] * R[1];
  V[2] = I[2] * R[2];
  V[3] = I[3] * R[3];
  V[4] = I[4] * R[4];
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];

  print_parameters(4);
  
  return 0;
}
/************CIRCUIT_05************/


/************CIRCUIT_06************/
int circuit_06(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+  \n");
  printf("  |                      |  \n");
  printf(" Vsrc                    R1 \n");
  printf("  |                      |  \n");
  printf("  +----------R2----------+  \n");
  printf("  |                      |  \n");
  printf("  |                      |  \n");
  printf("  +-----R4--------R3-----+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");

  R[5] = R[3] + R[4];           // Using R[5] as R[3]--R[4] equivalent
  R[6] = 1/(1/R[2] + 1/R[5]);   // Using R[6] as R[2]//R[5] equivalent
  R[7] = R[1] + R[6];           // Using R[7] as total resistance
  Isrc = I[1] = Vsrc / R[7];
  V[1] = I[1] * R[1];
  V[2] = Isrc * R[6];
  I[2] = V[2] / R[2];
  I[3] = I[4] = V[2] / R[5];
  V[3] = I[3] * R[3];  
  V[4] = I[4] * R[4];  
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];

  print_parameters(4);
  
  return 0;
}
/************CIRCUIT_06************/


/************CIRCUIT_07************/
int circuit_07(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----------------------+  \n");
  printf("  |                      |  \n");
  printf(" Isrc                    R1 \n");
  printf("  |                      |  \n");
  printf("  +----------R2----------+  \n");
  printf("  |                      |  \n");
  printf("  |                      |  \n");
  printf("  +-----R4--------R3-----+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");

  R[5] = R[3] + R[4];           // Using R[5] as R[3]--R[4] equivalent
  R[6] = 1/(1/R[2] + 1/R[5]);   // Using R[6] as R[2]//R[5] equivalent
  R[7] = R[1] + R[6];           // Using R[7] as total resistance
  Vsrc = Isrc * R[7];
  I[1] = Isrc;
  V[1] = I[1] * R[1];
  V[2] = Isrc * R[6];
  I[2] = V[2] / R[2];
  I[3] = I[4] = V[2] / R[5];
  V[3] = I[3] * R[3];  
  V[4] = I[4] * R[4];  
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];

  print_parameters(4);
  
  return 0;
}
/************CIRCUIT_07************/


/************CIRCUIT_08************/
int circuit_08(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-----------+----------+  \n");
  printf("  |           |          |  \n");
  printf("  |           R1         R2 \n");
  printf(" Vsrc         |          |  \n");
  printf("  |           +----------+  \n");
  printf("  |                      |  \n");
  printf("  |                      |  \n");
  printf("  +-----R4--------R3-----+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");

  R[5] = 1/(1/R[1] + 1/R[2]);   // Using R[5] as R[1]//R[2] equivalent
  R[6] = R[3] + R[4];           // Using R[6] as R[3]--R[4] equivalent
  R[7] = R[5] + R[6];           // Using R[7] as total resistance
  Isrc = Vsrc / R[7];
  I[3] = I[4] = Isrc;
  V[3] = I[3] * R[3];
  V[4] = I[4] * R[4];
  V[1] = V[2] = Isrc * R[5];
  I[1] = V[1] / R[1];
  I[2] = V[2] / R[2];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];

  print_parameters(4);
  
  return 0;
}
/************CIRCUIT_08************/


/************CIRCUIT_09************/
int circuit_09(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-----------+----------+  \n");
  printf("  |           |          |  \n");
  printf("  |           R1         R2 \n");
  printf(" Isrc         |          |  \n");
  printf("  |           +----------+  \n");
  printf("  |                      |  \n");
  printf("  |                      |  \n");
  printf("  +-----R4--------R3-----+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");

  R[5] = 1/(1/R[1] + 1/R[2]);   // Using R[5] as R[1]//R[2] equivalent
  R[6] = R[3] + R[4];           // Using R[6] as R[3]--R[4] equivalent
  R[7] = R[5] + R[6];           // Using R[7] as total resistance
  Vsrc = Isrc * R[7];
  I[3] = I[4] = Isrc;
  V[3] = I[3] * R[3];
  V[4] = I[4] * R[4];
  V[1] = V[2] = Isrc * R[5];
  I[1] = V[1] / R[1];
  I[2] = V[2] / R[2];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];

  print_parameters(4);
  
  return 0;
}
/************CIRCUIT_09************/


/************CIRCUIT_10************/
int circuit_10(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-----------+----------+  \n");
  printf("  |           |          |  \n");
  printf("  |           R1         R2 \n");
  printf(" Vsrc         |          |  \n");
  printf("  |           +----R3----+  \n");
  printf("  |                      |  \n");
  printf("  |                      |  \n");
  printf("  +-----R5--------R4-----+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");
  printf("R5 = ");  metric(R[5]);  printf("Ohms \n");

  R[6] = R[1] + R[3];           // Using R[6] as R[1]--R[3] equivalent
  R[7] = 1/(1/R[6] + 1/R[2]);   // Using R[7] as R[6]//R[2] equivalent
  R[8] = R[7] + R[4] + R[5];    // Using R[8] as total resistance
  Isrc = Vsrc / R[8];
  I[4] = I[5] = Isrc;
  V[4] = I[4] * R[4];
  V[5] = I[5] * R[5];
  V[2] = V[6] = V[7] = Isrc * R[7];
  I[2] = V[2] / R[2];
  I[1] = I[3] = V[6] / R[6];
  V[1] = I[1] * R[1];
  V[3] = I[3] * R[3];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];
  P[5] = I[5] * V[5];

  print_parameters(5);
  
  return 0;
}
/************CIRCUIT_10************/


/************CIRCUIT_11************/
int circuit_11(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-----------+----------+  \n");
  printf("  |           |          |  \n");
  printf("  |           R1         R3 \n");
  printf(" Vsrc         |          |  \n");
  printf("  |           |          |  \n");
  printf("  |           R2         R4 \n");
  printf("  |           |          |  \n");
  printf("  +-----R5----+----------+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");
  printf("R5 = ");  metric(R[5]);  printf("Ohms \n");

  R[6] = R[1] + R[2];           // Using R[6] as R[1]--R[2] equivalent
  R[7] = R[3] + R[4];           // Using R[7] as R[3]--R[4] equivalent
  R[8] = 1/(1/R[6] + 1/R[7]);   // Using R[8] as R[6]//R[7] equivalent
  R[9] = R[8] + R[5];           // Using R[9] as total resistance
  
  Isrc = Vsrc / R[9];
  I[5] = Isrc;
  V[5] = I[5] * R[5];
  V[6] = V[7] = V[8] = Isrc * R[8];
  I[1] = I[2] = V[6] / R[6];
  I[3] = I[4] = V[7] / R[7];
  V[1] = I[1] * R[1];
  V[2] = I[2] * R[2];
  V[3] = I[3] * R[3];
  V[4] = I[4] * R[4];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];
  P[5] = I[5] * V[5];

  print_parameters(5);
  
  return 0;
}
/************CIRCUIT_11************/


/************CIRCUIT_12************/
int circuit_12(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-----------+----------+  \n");
  printf("  |           |          |  \n");
  printf("  |           R1         R4 \n");
  printf("  |           |          |  \n");
  printf(" Isrc         R2         |  \n");
  printf("  |           |          |  \n");
  printf("  |           R3         R5 \n");
  printf("  |           |          |  \n");
  printf("  +-----------+----------+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");
  printf("R5 = ");  metric(R[5]);  printf("Ohms \n");

  R[6] = R[1] + R[2] + R[3];    // Using R[6] as R[1]--R[2]--R[3] equivalent
  R[7] = R[4] + R[5];           // Using R[7] as R[4]--R[5] equivalent
  R[8] = 1/(1/R[6] + 1/R[7]);   // Using R[8] as total resistance
  
  Vsrc = V[6] = V[7] = Isrc * R[8];
  I[6] = I[1] = I[2] = I[3] = V[6] / R[6];
  I[7] = I[4] = I[5] = V[7] / R[7];
  V[1] = I[1] * R[1];
  V[2] = I[2] * R[2];
  V[3] = I[3] * R[3];
  V[4] = I[4] * R[4];
  V[5] = I[5] * R[5];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];
  P[5] = I[5] * V[5];

  print_parameters(5);
  
  return 0;
}
/************CIRCUIT_12************/


/************CIRCUIT_13************/
int circuit_13(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +----R1-----+----------+  \n");
  printf("  |           |          |  \n");
  printf("  |           R2         |  \n");
  printf("  |           |          |  \n");
  printf(" Isrc         R3         R5 \n");
  printf("  |           |          |  \n");
  printf("  |           R4         |  \n");
  printf("  |           |          |  \n");
  printf("  +-----------+----------+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");
  printf("R5 = ");  metric(R[5]);  printf("Ohms \n");

  R[6] = R[2] + R[3] + R[4];    // Using R[6] as R[2]--R[3]--R[4] equivalent
  R[7] = 1/(1/R[6] + 1/R[5]);   // Using R[7] as R[6]//R[5] equivalent
  R[8] = R[7] + R[1];           // Using R[8] as total resistance
  
  Vsrc = Isrc * R[8];
  I[1] = Isrc;
  V[1] = I[1] * R[1];
  V[7] = V[5] = V[6] = Isrc * R[7];
  I[5] = V[5] / R[5];
  I[6] = I[2] = I[3] = I[4] = V[6] / R[6];
  V[2] = I[2] * R[2];
  V[3] = I[3] * R[3];
  V[4] = I[4] * R[4];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];
  P[5] = I[5] * V[5];

  print_parameters(5);
  
  return 0;
}
/************CIRCUIT_13************/


/************CIRCUIT_14************/
int circuit_14(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-----R1-----+  \n");
  printf("  |            |  \n");
  printf("  +-----R2-----+  \n");
  printf("  |            |  \n");
  printf(" Vsrc          R3 \n");
  printf("  |            |  \n");
  printf("  +-----R4-----+  \n");
  printf("  |            |  \n");
  printf("  +-----R5-----+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");
  printf("R5 = ");  metric(R[5]);  printf("Ohms \n");

  R[6] = 1/(1/R[1] + 1/R[2]);   // Using R[6] as R[1]//R[2] equivalent
  R[7] = 1/(1/R[4] + 1/R[5]);   // Using R[7] as R[4]//R[5] equivalent
  R[8] = R[6] + R[3] + R[7];    // Using R[8] as total resistance
  
  Isrc = Vsrc / R[8];
  I[3] = Isrc;
  V[3] = I[3] * R[3];
  V[6] = V[1] = V[2] = Isrc * R[6];
  V[7] = V[4] = V[5] = Isrc * R[7];
  I[1] = V[1] / R[1];
  I[2] = V[2] / R[2];
  I[4] = V[4] / R[4];
  I[5] = V[5] / R[5];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];
  P[5] = I[5] * V[5];

  print_parameters(5);
  
  return 0;
}
/************CIRCUIT_14************/


/************CIRCUIT_15************/
int circuit_15(void)
{
  printf("SCHEMATIC DIAGRAM: \n \n");
  printf("  +-----R1-----+  \n");
  printf("  |            |  \n");
  printf("  +---R2--R3---+  \n");
  printf("  |            |  \n");
  printf(" Vsrc          | \n");
  printf("  |            |  \n");
  printf("  +-----R4-----+  \n");
  printf("  |            |  \n");
  printf("  +-----R5-----+  \n");
  printf("\n");

  printf("R1 = ");  metric(R[1]);  printf("Ohms \n");
  printf("R2 = ");  metric(R[2]);  printf("Ohms \n");
  printf("R3 = ");  metric(R[3]);  printf("Ohms \n");
  printf("R4 = ");  metric(R[4]);  printf("Ohms \n");
  printf("R5 = ");  metric(R[5]);  printf("Ohms \n");

  R[6] = R[2] + R[3];          // Using R[6] as R[2]--R[3] equivalent
  R[7] = 1/(1/R[1] + 1/R[6]);  // Using R[7] as R[1]//R[6] equivalent
  R[8] = 1/(1/R[4] + 1/R[5]);  // Using R[8] as R[4]//R[5] equivalent
  R[9] = R[7] + R[8];          // Using R[9] as total resistance
  
  Isrc = Vsrc / R[9];
  V[7] = V[1] = V[6] = Isrc * R[7];
  V[8] = V[4] = V[5] = Isrc * R[8];
  I[1] = V[1] / R[1];
  I[2] = I[3] = V[6] / R[6];
  V[2] = I[2] * R[2];
  V[3] = I[3] * R[3];
  I[4] = V[4] / R[4];
  I[5] = V[5] / R[5];
  Psrc = Isrc * Vsrc;
  P[1] = I[1] * V[1];
  P[2] = I[2] * V[2];
  P[3] = I[3] * V[3];
  P[4] = I[4] * V[4];
  P[5] = I[5] * V[5];

  print_parameters(5);
  
  return 0;
}
/************CIRCUIT_15************/



/***********INITIALIZE*************/
int initialize(void)
{
  #define OPTIONS 14
  int count;
  double Rchoices[OPTIONS] = {1.0e3, 1.2e3, 1.5e3, 1.8e3, 2.2e3, 2.7e3, 3.3e3, 3.9e3, 4.7e3, 5.6e3, 6.8e3, 8.2e3, 10.0e3, 12.0e3};
  double Vchoices[OPTIONS] = {1.5, 1.8, 2.2, 3.3, 4.5, 5.0, 5.5, 6.0, 9.0, 12.0, 12.6, 15.0, 17.5, 24.0};
  double Ichoices[OPTIONS] = {1.0e-3, 2.0e-3, 3.0e-3, 4.5e-3, 5.0e-3, 5.1e-3, 6.3e-3, 10.0e-3, 11.0e-3, 12.0e-3, 14.2e-3, 15.9e-3, 19.1e-3, 21.0e-3};

  // Initializes the resistance, voltage, and current arrays with values randomly chosen from the above choices
  for (count = 0 ; count < SIZE ; ++count)
    R[count] = Rchoices[random_whole(OPTIONS - 1)];

  Vsrc = Vchoices[random_whole(OPTIONS - 1)];
  Isrc = Ichoices[random_whole(OPTIONS - 1)];

  return 0;
}
/***********INITIALIZE*************/


/***********RANDOM_WHOLE***********/
int random_whole (int max)
{
  double y;
  double x;

  y = (double) (random ());	// Casts the random long integer as a doubleing-point value
  x = (double) RAND_MAX;		// Casts the RAND_MAX (long integer) as a doubleing-point value

  // This function returns a whole-number value ranging from 0 to "max", inclusive
  return (int) ((max + 1) * y / x);

}
/***********RANDOM_WHOLE***********/


/**************METRIC**************/
int metric (double x)
{

  if (x >= 1e-6 && x < 1e-3)      // Micro prefix
  {
    printf("%6g u", x * 1e6);
  }

  else if (x >= 1e-3 && x < 0.5)  // Milli prefix
  {
    printf("%6g m", x * 1e3);
  }

  else if (x >= 0.5 && x < 1e3)  // No prefix
  {
    printf("%6g ", x);
  }

  else if (x >= 1e3 && x < 1e6)  // Kilo prefix
  {
    printf("%6g k", x / 1e3);
  }

  else
    printf("%e ", x);

  return 0;

}
/**************METRIC**************/


/***********CLEAR_SCREEN***********/
int clear_screen (void)
{
  int n;

  // Crude screen-clearing routine
  for (n = 0; n < 50; ++n)
      printf ("\n");

  return 0;
}
/***********CLEAR_SCREEN***********/


/*********PRINT_PARAMETERS*********/
int print_parameters (int max)
{
  printf("\nRandom component parameter: \n");
  int vip, n;

  vip = random_whole(2);

  // Print random (single) parameter to the console
  if (vip == 0)
  {
    n = random_whole(2) + 1;
    printf("V_R%i = ", n);  metric(V[n]);  printf("V \n");
  }

  else if (vip == 1)
  {
    n = random_whole(2) + 1;
    printf("I_R%i = ", n);  metric(I[n]);  printf("A \n");
  }
 
  else
  {
    n = random_whole(2) + 1;
    printf("P_R%i = ", n);  metric(P[n]);  printf("W \n");
  }

  printf("\nYour task is to solve for every component's voltage, current, and power.\n");
  printf("Press <Enter> when you are ready to see the solution!\n");
  getchar();
  
  // Print all circuit parameters to the console
  printf("All component parameters revealed: \n");
  printf("Vsrc = ");  metric(Vsrc);  printf("V       ");
  printf("Isrc = ");  metric(Isrc);  printf("A       ");
  printf("Psrc = ");  metric(Psrc);  printf("W     \n");
  
  for (n = 1 ; n <=max ; ++n)
  {
    printf("V_R%i = ", n);  metric(V[n]);  printf("V       ");
    printf("I_R%i = ", n);  metric(I[n]);  printf("A       ");
    printf("P_R%i = ", n);  metric(P[n]);  printf("W     \n");
  }

  printf("\nDo your answers match these?  If not, re-check your calculations until you get the same results.\n");
  printf("Press <Enter> when you are ready to proceed with the next circuit challenge.\n\n");
  getchar();

  // "Seed" the random number generator (again) with the system time
  srandom ((int) (time (NULL)));

  return 0;
}
/*********PRINT_PARAMETERS*********/




