CSC 101 Lecture Notes Week 3
Overall C Program Structure
The char Data Type
More on Conditional Statements
More on Functions
Relevant Reading: Chapters 4 and 6
/* #includes for stdio.h and other libraries /* Function prototypes. */ /* The main function, which calls other functions */ /* Function definitions */
/**** * * This program computes simple statistics for three real numbers read from * standard input. The statistics computed are the sum of the numbers, the * arithmetic mean, and the standard deviation. The results are output to * standard output, in the following form: * * Sum = * Mean = * Standard Deviation = * * The precise formulae for mean and standard deviation are as defined here: * * http://www.gcseguide.co.uk/statistics_and_probability.htm * * Input numbers must be non-negative. If a negative number is input, it is * treated as an error, and the program terminates without computing stats. * * * Author: Gene Fisher (gfisher@calpoly.edu) * Created: 31mar11 * Last Modified: 3apr11 * */ #include <stdio.h> #include <math.h> #define NUM_DATA_POINTS 3 /* Fixed number of data points */ /* * Declare the prototypes for functions used in the program. */ double compute_sum(double x1, double x2, double x3); double compute_mean(double x1, double x2, double x3); double compute_std_dev(double x1, double x2, double x3); int main () { /* * Declare the variables used in main. */ double x1, x2, x3; /* Input variables */ /* * Prompt the user for the input. */ printf("Enter three real numbers, separated by spaces: "); /* * Input the numbers. */ scanf("%lf%lf%lf", &x1, &x2, &x3); /* * Consider any negative input to be an error, and do not perform the * calculation if one or more negative inputs is received. */ if ((x1 < 0) || (x2 < 0) || (x3 < 0)) { printf("\nAll inputs must be non-negative: exiting.\n"); } else { /* * Compute and output the results. */ printf("Sum = %f\n", compute_sum(x1, x2, x3)); printf("Mean = %f\n", compute_mean(x1, x2, x3)); printf("Standard Deviation = %f\n\n", compute_std_dev(x1, x2, x3)); } return 0; } /* * Return the sum of the given three numbers. */ double compute_sum(double x1, double x2, double x3) { return x1 + x2 + x3; } /* * Return the arithmetic mean of the given three numbers. */ double compute_mean(double x1, double x2, double x3) { return compute_sum(x1, x2, x3) / NUM_DATA_POINTS; } /* * Return the standard deviation of the given three numbers. */ double compute_std_dev(double x1, double x2, double x3) { double mean = compute_mean(x1, x2, x3); return sqrt((pow(x1 - mean, 2) + pow(x2 - mean, 2) + pow(x3 - mean, 2)) / (NUM_DATA_POINTS - 1 )); }
versusa + b * c
(a + b) * c
/**** * * This program has exactly the same behavior as ./stats-neg-errors.c, q.v. * The only difference between this program and stats-neg-errors.c is in the * use of an elseless if statement followed by a return, instead of an if-else * statement. * * Author: Gene Fisher (gfisher@calpoly.edu) * Created: 13apr11 * Last Modified: 13apr11 * */ #include <stdio.h> #include <math.h> #define NUM_DATA_POINTS 3 /* Fixed number of data points */ /* * Declare the prototypes for functions used in the program. */ double compute_sum(double x1, double x2, double x3); double compute_mean(double x1, double x2, double x3); double compute_std_dev(double x1, double x2, double x3); int main () { /* * Declare the variables used in main. */ double x1, x2, x3; /* Input variables */ /* * Prompt the user for the input. */ printf("Enter three real numbers, separated by spaces: "); /* * Input the numbers. */ scanf("%lf%lf%lf", &x1, &x2, &x3); /* * Consider any negative input to be an error, and do not perform the * calculation if one or more negative inputs is received. */ if ((x1 < 0) || (x2 < 0) || (x3 < 0)) { printf("\nAll inputs must be non-negative: exiting.\n"); return 0; } /* * The else is now gone, with the rest of the program just following. The * preceding return makes the else unnecessary, since the program will not * reach this point if the return is executed. */ /* * Compute and output the results. */ printf("Sum = %f\n", compute_sum(x1, x2, x3)); printf("Mean = %f\n", compute_mean(x1, x2, x3)); printf("Standard Deviation = %f\n\n", compute_std_dev(x1, x2, x3)); return 0; } /* * Return the sum of the given three numbers. */ double compute_sum(double x1, double x2, double x3) { return x1 + x2 + x3; } /* * Return the arithmetic mean of the given three numbers. */ double compute_mean(double x1, double x2, double x3) { return compute_sum(x1, x2, x3) / NUM_DATA_POINTS; } /* * Return the standard deviation of the given three numbers. */ double compute_std_dev(double x1, double x2, double x3) { double mean = compute_mean(x1, x2, x3); return sqrt((pow(x1 - mean, 2) + pow(x2 - mean, 2) + pow(x3 - mean, 2)) / (NUM_DATA_POINTS - 1 )); }
/**** * * This program illustrates equivalent uses of if, if_else and switch * statements. The program has four functions, the names of which indicate the * kind of logic the functions use: use_if_else(), use_if_return(), * use_switch_break(), and use_switch_return(). * * All four of the functions produce exactly the same results. Viz., they read * in an integer between 1 and 3, and perform different processing based on the * input. If the input is not between 1 and 3, the functions output an error * message. * * The actual processing the functions perform is trivial, it's simply a place * holder for processing that could be more involved. The point is that * different processing happens based on user input. Taken together, the * functions illustrate alternate approaches to using conditional logic, where * each approach produces precisely the same results. * * Author: Gene Fisher (gfisher@calpoley.edu * Created: 12apr11 * Modified: 14apr11 * */ #include <stdio.h> /** * Function prototypes. */ void use_if_else(); void use_if_return(); void use_switch_break(); void use_switch_return(); /** * Call each of the function to produce its result. */ int main() { printf("\nRun the use_if_else function:\n"); use_if_else(); printf("\nRun the use_if_return function:\n"); use_if_return(); printf("\nRun the use_switch_break function:\n"); use_switch_break(); printf("\nRun the use_switch_return function:\n"); use_switch_return(); printf("\n"); return 0; } /** * Input a number between 1 and 3 from the terminal. Do some different * calculation based on the value of the number. If the number is not in the * range 1 through 3, output an error message and do no calculation. * * This function uses an if-else statement. */ void use_if_else() { int number; /* * Get the number. */ printf("Please input a number between 1 and 3: "); scanf("%d", &number); /* * Do selection-specific processing based on the input, or no processing if * the input is out of range. */ if (number == 1) { printf("Thank you for inputting the value 1.\n"); printf("I'll now perform the calculation based this value ...\n"); } else if (number == 2) { printf("Thank you for inputting the value 2.\n"); printf("I'll now perform the calculation based this value ...\n"); } else if (number == 3) { printf("Thank you for inputting the value 3.\n"); printf("I'll now perform the calculation based this value ...\n"); } else { printf("The value %d is not between 1 and 3.\n", number); printf("I'd say you have some issues when it comes to following instructions.\n"); } } /** * Input a number between 1 and 3 from the terminal. Do some different * calculation based on the value of the number. If the number is not in the * range 1 through 3, output an error message and do no calculation. * * This function uses if statements, with multiple returns. */ void use_if_return() { int number; /* * Get the number. */ printf("Please input a number between 1 and 3: "); scanf("%d", &number); /* * Do selection-specific processing based on the input, or no processing if * the input is out of range. */ if (number == 1) { printf("Thank you for inputting the value 1.\n"); printf("I'll now perform the calculation based this value ...\n"); return; } if (number == 2) { printf("Thank you for inputting the value 2.\n"); printf("I'll now perform the calculation based this value ...\n"); return; } if (number == 3) { printf("Thank you for inputting the value 3.\n"); printf("I'll now perform the calculation based this value ...\n"); return; } printf("The value %d is not between 1 and 3.\n", number); printf("I'd say you have some issues when it comes to following instructions.\n"); } /** * Input a number between 1 and 3 from the terminal. Do some different * calculation based on the value of the number. If the number is not in the * range 1 through 3, output an error message and do no calculation. * * This function uses a switch statement with breaks in each case. */ void use_switch_break() { int number; /* * Get the number. */ printf("Please input a number between 1 and 3: "); scanf("%d", &number); /* * Do selection-specific processing based on the input, or no processing if * the input is out of range. */ switch (number) { case 1: printf("Thank you for inputting the value 1.\n"); printf("I'll now perform the calculation based this value ...\n"); break; case 2: printf("Thank you for inputting the value 2.\n"); printf("I'll now perform the calculation based this value ...\n"); break; case 3: printf("Thank you for inputting the value 3.\n"); printf("I'll now perform the calculation based this value ...\n"); break; default: printf("The value %d is not between 1 and 3.\n", number); printf("I'd say you have some issues when it comes to following instructions.\n"); } } /** * Input a number between 1 and 3 from the terminal. Do some different * calculation based on the value of the number. If the number is not in the * range 1 through 3, output an error message and do no calculation. * * This function uses a switch statement with returns instead of breaks. */ void use_switch_return() { int number; /* * Get the number. */ printf("Please input a number between 1 and 3: "); scanf("%d", &number); /* * Do selection-specific processing based on the input, or no processing if * the input is out of range. */ switch (number) { case 1: printf("Thank you for inputting the value 1.\n"); printf("I'll now perform the calculation based this value ...\n"); return; case 2: printf("Thank you for inputting the value 2.\n"); printf("I'll now perform the calculation based this value ...\n"); return; case 3: printf("Thank you for inputting the value 3.\n"); printf("I'll now perform the calculation based this value ...\n"); return; default: printf("The value %d is not between 1 and 3.\n", number); printf("I'd say you have some issues when it comes to following instructions.\n"); } }