Question
Language: C The partially completed plotting project (PlotFunctions.c): /*------------------------------------------------------------------ File: plotFunctions.c Author: Gilbert Arbez, Fall 2016 Description: Allows the user to plot a number of
Language: C
The partially completed plotting project ("PlotFunctions.c"):
/*------------------------------------------------------------------ File: plotFunctions.c Author: Gilbert Arbez, Fall 2016 Description: Allows the user to plot a number of functions for different ranges. ---------------------------------------------------------------------*/ #include
// Some definitions #define NUM_POINTS 500 // Number of points used for plotting #define X_IX 0 // Row index for storing x values #define FX_IX 1 // Row index for storing f(x) values #define TRUE 1 #define FALSE 0
// Structure for user input typedef struct { int fNumber; // function number double x0; // first value of x to plot double xf; // final value of x to plot } F_SELECT;
// function prototypes void selectFunction(F_SELECT *); void computeDataPoints(F_SELECT *fsPtr, int n, double [][n]); double calcFx(double, int); void plot(int n, double [][n]); double getMinDouble(double [], int); double getMaxDouble(double [], int); /*--------------------------------------------------------------------- Function: main Description: This function computes a set of points for plotting. The function calcFx is called to computes the value of f(x) . Modify calcFx to compute the values of f(x) desired. In this template, the sin function is used. ------------------------------------------------------------------------*/ void main(void) { // Variable declarations F_SELECT fselect; double points[2][NUM_POINTS]; // row 0 contains values of x // Get user input selectFunction(&fselect); // Compute the data points and save in array computeDataPoints(&fselect, NUM_POINTS, points); // Call plot function to plot plot(NUM_POINTS, points); }
/*----------------------------------------------------------------------- Function: selectFunction Parameters: sfPtr - Pointer to F_SELECT structure variable to store input data. Description: Prompts the user to get x0 and xf (range of x for plotting) and to select a function to plot. ------------------------------------------------------------------------*/ void selectFunction(F_SELECT *sfPtr) { // Variable Declarations int flag; // Display function menu printf("1) f(x) = sqrt(|x-1|) + 1 "); printf("2) f(x) = exp(-x) "); printf("3) f(x) = sqrt(x^2+1) - x "); printf("4) f(x) = [exp(-x) - 1)]/x "); printf("5) f(x) = sin(x)+0.1*cos(10.0*x) "); // Select a function // Select a range of x for plotting }
/*----------------------------------------------------------------------- Function: computeDataPoints Parameters: fsPtr - Pointer to F_SELECT structure variable with input data. n - number of points in the 2D array (i.e. number of columns) points - 2D array that contains the data points - row X_IX with x values and row FX_IX with the f(x) values. Description: Calculates NUM_POINTS points of the function f(x) (selected by the the user and computed with calcFx), and stored in the 2D array points. points[X_IX] is the 1D array (row X_IX) that contains the x values while points[FX_IX] is the 1D array (row FX_IX) that contains the f(x) values. ------------------------------------------------------------------------*/ void computeDataPoints(F_SELECT *fsPtr, int n, double points[][n]) { int ix; // for indexing points, i.e. columns of 2D array double x; // for incrementing the value of x double inc; // incrementation value of x // Setup loop that computes the points and stores in 2D array // A determinant loop is used to increment x, calculate f(x) // and store the values in the 2D array.
}
/*----------------------------------------------------------------------- Function: calcFx Parameters: x - the value of x funtionNum - function number to select function for calculation Return: The value of f(x) Description: Calculates the value of f(x). In this case f(x) is selected using functionNum. ------------------------------------------------------------------------*/ double calcFx(double x) { // Variable declations double fx; // Instructions fx = sin(x); return(fx); }
/*------------------------------------------------- Function: plot() Parameters: numPoints: number of points in the array, i.e. number of columns points: reference to 2D array Return value: none. Description: Initializes the plot. The following values in the referenced structure are used to setup the plot: points[X_IX][0], points[X_IX][nbrPoints-1] range of horizontal axis minFx, maxFx - vertical axis range Note the that the values of minFx and maxFx are determined with the functions getMinDouble and getMaxDouble. The values in the row X_IX are assumed to be sorted in increasing order. Then plots the curve accessed using the contents of each row, that is, points[X_IX] and points[FX_IX] which are both references to 1D arrays. -------------------------------------------------*/ void plot(int numPoints, double points[][numPoints]) { // Variable declaration double minFx, maxFx; // Minimum and maximum values of f(x) // Setup plot configuration plsdev("wingcc"); // Sets device to wingcc - CodeBlocks compiler // Initialize the plot plinit(); // Configure the axis and labels plwidth(3); // select the width of the pen minFx = getMinDouble(points[FX_IX], numPoints); maxFx = getMaxDouble(points[FX_IX], numPoints); plenv(points[X_IX][0],points[X_IX][numPoints-1], minFx, maxFx, 0, 0); plcol0(GREEN); // Select color for labels pllab("x", "f(x)", "Plot of f(x) versus x"); // Plot the function. plcol0(BLUE); // Color for plotting curve plline(numPoints, points[X_IX], points[FX_IX]); plend(); }
/*------------------------------------------------- Function: getMinDouble Parameters: arr: reference to array of double values n: number of elements in the array Return value: the smallest value found in the array. Description: Finds the smallest value in the array. Uses a determinate loop to traverse the array to test each value in the array. -------------------------------------------------*/ double getMinDouble(double arr[], int n) { // Variable declarations double min; // for storing minimum value int ix; // indexing into an array // Instructions min = DBL_MAX; // most positive value for type double for(ix = 0; ix arr[ix]) min = arr[ix]; } return(min); }
/*------------------------------------------------- Function: getMaxDouble Parameters: arr: reference to array of double values n: number of elements in the array Return value: the largest value found in the array. Description: Finds the largest value in the array. Uses a determinate loop to traverse the array to test each value in the array. -------------------------------------------------*/ double getMaxDouble(double arr[], int n) { // Variable declarations double max; // for storing maximum value int ix; // indexing into an array // Instructions max = -DBL_MAX; // most negative value for type double for(ix = 0; ix C. Exercise: Plotting Functions Plotting is important in engineering and science for displaying results. In this exercise, you shall be creating software that allows a user to plot one of the five following functions, fr) for any desired range ofx fx)-+1 f(x)-e f(x)= x2 +1-x f(r)- f(x) r)+0.1cos(10r) To include and have access to the plotting library PLplot, you must create a CodeBlocks project with the PLplot configuration. When creating the CodeBlocks project, click on "C Console App/Pplo" c,, and click on the Go button to start the project Wizard. You will note that the template sofiware included in this project can be compiled and executed. It will plot a sine wave as follows A partially completed plotting project is provided in the zipped file PloiFunctions.zip. Download the file, unzip it, and open the project in CodeBlocks. The program will llow the user to select one of the ive functions presented above and give a range of values lor xor ploiling. A plot will be genera lcd according lo lhe user selections. The following are guidelines help with this completing the program 1. The structure type F_SELECT is defined to store input from the user, which consists of the range of values for x, xo and x, as well as a function number (fNumber) which identifies the number to plot. The following is an example of the interaction with the user to obtain these three valucs f(x)-text (xx)+ 1) 1) )f(x) sin(x)+0.1 lect a function to plot ase select between 1 and 5 ect a function to plot (1 to 52: 2 ect range of x for plotting x and xf5.1 10.4 (and xf): -5.1 10.4 2. Complete the function selectFunction to implement the above interaction. Ensure that the error message is display if the user enters a value outside the valid range ( to 5) and prompt the user for a correct value Complete the function computeDataPoints that will fill in the 2D array 3. a. Compute the increment value to increment the value of x (i.e. the value of inc) using xf, x0 (members of the F_SELECT structure), and n (number of points to compute). Note that there are only n-1 increments to obtain n points When creating the loop to fill in the array, use the ix to control the loop, not x. Using real values to control a loop is more difficult that using integer values b. c. Use the X IX and FX IX symbolic constants for the row index of the 2D array points 4. Modify calcFx to compute the value of for) given a function number (provided by the user). (The version given comes from the project template)
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started