and Functions to Simplify Code

Slides:



Advertisements
Similar presentations
BBS514 Structured Programming (Yapısal Programlama)1 Functions and Structured Programming.
Advertisements

Overview Reference parameters Documenting functions A game of craps. Design, code, test and document.
Lesson 6 - Pointers Outline Introduction Pointer Variable Declarations and Initialization Pointer Operators Calling Functions by Reference Using the const.
 2000 Prentice Hall, Inc. All rights reserved. Chapter 7 - Pointers Outline 7.1Introduction 7.2Pointer Variable Declarations and Initialization 7.3Pointer.
CMSC 104, Version 8/061L22Arrays1.ppt Arrays, Part 1 of 2 Topics Definition of a Data Structure Definition of an Array Array Declaration, Initialization,
CMSC 104, Version 9/011 Incremental Programming Topics Review of Incremental Programming Example of Incremental Programming Reading None.
Lecture 4: Calculating by Iterating. The while Repetition Statement Repetition structure Programmer specifies an action to be repeated while some condition.
Dr. Soha S. Zaghloul2 Let arr be an array of 20 integers. Write a complete program that first fills the array with up to 20 input values. Then, the program.
CMSC 1041 Examples Using Top-Down Design and Functions to Simplify Code and Create Modules.
C Lecture Notes 1 Structures & Unions. C Lecture Notes Introduction Structures –Collections of related variables (aggregates) under one name Can.
L19 a 1 Example Using Arrays Using Top-Down Design and Functions to Simplify Code and Create Modules.
Sudeshna Sarkar, IIT Kharagpur 1 Programming and Data Structure Sudeshna Sarkar Lecture 3.
CMSC 104, Section 301, Fall Lecture 18, 11/11/02 Functions, Part 1 of 3 Topics Using Predefined Functions Programmer-Defined Functions Using Input.
CMSC 104, Version 8/061L16IncrementalProg.ppt Incremental Programming Topics Review of Incremental Programming Example of Incremental Programming Reading.
CS1010 Programming Methodology
Functions Course conducted by: Md.Raihan ul Masood
Computer Science 210 Computer Organization
IGCSE 4 Cambridge Data types and arrays Computer Science Section 2
Chapter 7 - Pointers Outline 7.1 Introduction
Chapter 4 C Program Control Part I
2008/11/19: Lecture 18 CMSC 104, Section 0101 John Y. Park
Lecture 7: Repeating a Known Number of Times
CS1010 Discussion Group 11 Week 4 – Overview of C programming.
File Processing (Cont.) and Structures
Arrays in C.
Chapter 5 - Functions Outline 5.1 Introduction
Computer Science 210 Computer Organization
Chapter 5 - Functions Outline 5.1 Introduction
Arrays, Part 1 of 2 Topics Definition of a Data Structure
2008/11/24: Lecture 19 CMSC 104, Section 0101 John Y. Park
2008/11/24: Lecture 19 CMSC 104, Section 0101 John Y. Park
Chapter 6 - Functions Outline 5.1 Introduction
Value returning Functions
Incremental Programming
Structured Program
1) C program development 2) Selection structure
Chapter 3 - Structured Program Development
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
The ‘while’ loop ‘round and ‘round we go.
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Assignment Operators Topics Increment and Decrement Operators
Chapter 3 - Structured Program Development
Assignment Operators Topics Increment and Decrement Operators
Example Using Functions
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Relational, Logical, and Equality Operators
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Examples Example Problems, their Algorithms, and their C Source Code.
Arrays I Handling lists of data.
EPSII 59:006 Spring 2004.
ECE 103 Engineering Programming Chapter 18 Iteration
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
2008/11/19: Lecture 18 CMSC 104, Section 0101 John Y. Park
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Incremental Programming
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
Assignment Operators Topics Increment and Decrement Operators
登金陵鳳凰臺 ~李白 鳳凰臺上鳳凰遊, 鳳去臺空江自流。 吳宮花草埋幽徑, 晉代衣冠成古丘。 三山半落青山外, 二水中分白鷺洲。
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
and Functions to Simplify Code
Arrays, Part 2 of 2 Topics Array Names Hold Address How Indexing Works
Functions in C Math Library Functions Functions Function Definitions
Presentation transcript:

and Functions to Simplify Code Examples Using Top-Down Design and Functions to Simplify Code and Create Modules

Problem: Interest Compute interest that is compounded annually. Write an interactive program that allows the user to calculate the interest accrued in a savings account that is compounded annually over a period of years. The user must supply the principal amount, interest rate and the number of years .

Algorithm: Interest Print explanation of the program Get principal from user. Get interest rate from user. Get number of years from user. For the number of years specified Calculate the amount in the account at the end of the year. (amount += amount * rate) interest accrued = amount - principal Print report.

Deciding on functions: Interest Write the Function Prototypes void PrintInstructions (void) ; float GetPrincipal (float max, float min) ; float GetInterestRate (float max, float min) ; int GetYears (int max, int min) ; float CalculateAmount (float principal, float rate, int years) ; void PrintReport (float principal, float rate, int years, float amount, float interest) ;

Interest : Design the Report Interest rate : 7.0000 % Period : 20 years Principal at start of period : 1000.00 Interest accrued : 2869.68 Total amount at end of period : 3869.68

Improved Interest with functions Programmed Incrementally, #1 Write and test PrintInstructions( ) /*****************************************************************************************\ * Filename: interest.c * * Author: * * Description: This program computes the interest accrued in an account * * that compounds interest annually. * \*****************************************************************************************/ #include <stdio.h> void PrintInstructions (void) ; int main ( ) { PrintInstructions ( ) ; return 0; } /************************************************** * PrintInstructions is a procedure that prints the program instructions for the user * It takes no arguments and returns no values \*************************************************/ void PrintInstructions (void) printf (“This program computes the interest accrued in an account\n ” ) ; printf (“that compounds interest annually. You will need to enter the\n ” ) ; printf (“amount of the principal, the interest rate and the number of years. \n\n ” ) ;

Interest : Output #1 This program computes the interest accrued in an account that compounds interest annually. You will need to enter the amount of the principal, the interest rate and the number of years.

Improved Interest with functions Programmed Incrementally, # 2 Add to main ( ), write & debug GetPrincipal ( ) /*****************************************************************************************\ * Filename: interest.c * * Author: * * Description: This program computes the interest accrued in an account * * that compounds interest annually. * \******************************************************************************************/ #include <stdio.h> #define MAXPRIN 100000.00 #define MINPRIN 0.00 void PrintInstructions (void) ; float GetPrincipal (float max, float min) ; int main ( ) { float principal ; PrintInstructions ( ) ; principal = GetPrincipal (MAXPRIN, MINPRIN) ; printf (“The principal is %.2f \n ” , principal) ; return 0; }

Improved Interest with functions Programmed Incrementally, # 2 Writing of GetPrincipal ( ) /************************************************** * GetPrincipal gets the principal amount from the user and returns it to the calling function. * It assures that the principal is between the minimum amount passed to this function and the * maximum amount passed to this function. \*************************************************/ float GetPrincipal (float max, float min) { float principal ; printf (“Enter the principal amount : “) ; scanf (“%f”, &principal) ; /* assure input is between min and max */ while ( principal < min || principal > max ) printf (“The principal amount must be a value between %.2f and %.2f\n”, min, max) ; printf (“Enter the principal amount : “); scanf (“ %f ”, &principal); } return principal ;

Interest : Output #2 Test GetPrincipal ( ) This program computes the interest accrued in an account that compounds interest annually. You will need to enter the amount of the principal, the interest rate and the number of years. Enter the principal amount : 200000.00 The principal amount must be a value between 0.00 and 100000.00 Enter the principal amount : -5.00 Enter the principal amount : 100000.01 Enter the principal amount : - .01 Enter the principal amount : 1000.00 The principal is 1000.00

Improved Interest with functions Programmed Incrementally, # 3 Add to main ( ), write and test GetRate ( ) /*****************************************************************************************\ * Filename: interest.c * * Author: * * Description: This program computes the interest accrued in an account * * that compounds interest annually. * \*****************************************************************************************/ #include <stdio.h> #define MAXPRIN 100000.00 #define MINPRIN 0.00 #define MAXRATE 1.00 #define MINRATE 0.00 void PrintInstructions (void) ; float GetPrincipal (float max, float min) ; float GetRate ( float max, float min); int main ( ) { float principal, rate ; PrintInstructions ( ) ; principal = GetPrincipal (MAXPRIN, MINPRIN) ; rate = GetRate (MAXRATE, MINRATE) ; printf (“The interest rate is %.4f \n ” , rate) ; return 0; }

Improved Interest with functions Programmed Incrementally, # 3 Write and test GetRate ( ) /************************************************** * GetRate gets the interest rate from the user and returns it to the calling function. * It assures that the rate is between the minimum amount passed to this function and the * maximum amount passed to this function. \*************************************************/ float GetRate (float max, float min) { float rate; printf (“Enter the interest rate as a decimal (for 7%% enter .07) : “) ; scanf (“%f”, &rate); /* assure input is between min and max */ while ( rate < min || rate > max ) printf (“The interest rate must be between %.4f and %.4f\n”, min, max ) ; printf (“Enter the interest rate as a decimal (for 7%% enter .07) : “) ; scanf ( “ %f ”, &rate); } return rate ;

Interest : Output #3 Test GetRate ( ) This program computes the interest accrued in an account that compounds interest annually. You will need to enter the amount of the principal, the interest rate and the number of years. Enter the principal amount : 1000.00 Enter the interest rate as a decimal (for 7% enter .07) : 5 The interest rate must be between 0.0000 and 1.0000 Enter the interest rate as a decimal (for 7% enter .07) : - .0001 Enter the interest rate as a decimal (for 7% enter .07) : .07 The interest rate is .0700

Improved Interest with functions Programmed Incrementally, # 4 Add to main ( ), write and test GetYears ( ) /***********************************************************\ * Filename: interest.c * * Author: * * Description: This program computes the interest * * accrued in an account that * * compounds interest annually. * \***********************************************************/ #include <stdio.h> #define MAXPRIN 100000.00 #define MINPRIN 0.00 #define MAXRATE 1.00 #define MINRATE 0.00 #define MINYEARS 1 #define MAXYEARS 100 void PrintInstructions (void) ; float GetPrincipal (float max, float min) ; float GetRate ( float max, float min) ; int GetYears (int max, int min) ; int main ( ) { float principal, rate ; int years ; PrintInstructions ( ) ; principal = GetPrincipal (MAXPRIN, MINPRIN) ; rate = GetRate (MAXRATE, MINRATE) ; years = GetYears (MAXYEARS, MINYEARS) ; printf (“years is %d\n”, years) ; return 0; }

Improved Interest with functions Programmed Incrementally, # 4 Write and test GetYears ( ) /************************************************** * GetYears gets the years of the investment from the user and returns it to the calling function. * It assures that the years are between the minimum amount passed to this function and the * maximum amount passed to this function. \*************************************************/ int GetYears (int max, int min) { int years ; printf (“Enter the number of years : “); scanf (“%d”, &years); /* assure input is between min and max */ while ( years < min || years > max ) printf (“The number of years must be between 1 and 100, inclusive \n ” ) ; } return years ;

Interest : Output #4 Test GetYears ( ) This program computes the interest accrued in an account that compounds interest annually. You will need to enter the amount of the principal, the interest rate and the number of years. Enter the principal amount : 1000.00 Enter the interest rate as a decimal (for 7% enter .07) : .07 Enter the number of years : 0 The number of years must be between 1 and 100, inclusive Enter the number of years : 101 Enter the number of years : 20 years is 20

Improved Interest with functions Programmed Incrementally, # 5 Add to main ( ), write & test CalculateAmount ( ) /***********************************************************\ * Filename: interest.c * * Author: * * Description: This program computes the interest * * accrued in an account that * * compounds interest annually. * \***********************************************************/ #include <stdio.h> #define MAXPRIN 100000.00 #define MINPRIN 0.00 #define MAXRATE 1.00 #define MINRATE 0.00 #define MINYEARS 1 #define MAXYEARS 100 void PrintInstructions (void) ; float GetPrincipal (float max, float min) ; float GetRate ( float max, float min) ; int GetYears (int max, int min) ; float CalculateAmount (float principal, float rate, int years ) ; int main ( ) { float principal, rate, amount ; int years ; PrintInstructions ( ) ; principal = GetPrincipal (MAXPRIN, MINPRIN) ; rate = GetRate (MAXRATE, MINRATE) ; years = GetYears (MAXYEARS, MINYEARS) ; amount = CalculateAmount (principal, rate, years) ; printf (“amount is %.2f\n”, amount) ; return 0; }

Improved Interest with functions Programmed Incrementally, # 5 Write and test CalculateAmount( ) /************************************************** * CalculateAmount calculates and returns the amount in the account when the account * is opened with the principal amount passed in, at the annual percentage rate passed in, * compounded annually, for the number of years passed in. \*************************************************/ float CalculateAmount (float principal, float rate, int years) { int i ; /* Calculate total amount in the account after the specified number of years */ for ( i = 0 ; i < years ; i++ ) principal += principal * rate ; } return principal;

Interest : Output #5 Test CalculateAmount ( ) This program computes the interest accrued in an account that compounds interest annually. You will need to enter the amount of the principal, the interest rate and the number of years. Enter the principal amount : 1000.00 Enter the interest rate as a decimal (for 7% enter .07) : .07 Enter the number of years : 20 amount is 3869.68

Improved Interest with functions Programmed Incrementally, # 6 Add to main ( ), write & test PrintReport ( ) /***********************************************************\ * Filename: interest.c * * Author: * * Description: This program computes the interest * * accrued in an account that * * compounds interest annually. * \***********************************************************/ #include <stdio.h> #define MAXPRIN 100000.00 #define MINPRIN 0.00 #define MAXRATE 1.00 #define MINRATE 0.00 #define MINYEARS 1 #define MAXYEARS 100 void PrintInstructions (void) ; float GetPrincipal (float max, float min) ; float GetRate ( float max, float min) ; int GetYears (int max, int min) ; float CalculateAmount (float principal, float rate, int years ) ; void PrintReport (float principal, float rate, int years, float amount, float interest) ; int main ( ) { float principal, rate, amount, interest ; int years ; PrintInstructions ( ) ; /Get valid input from user */ principal = GetPrincipal (MAXPRIN, MINPRIN) ; rate = GetRate (MAXRATE, MINRATE) ; years = GetYears (MAXYEARS, MINYEARS) ; /* Do Calculations */ amount = CalculateAmount (principal, rate, years) ; interest = amount - principal ; PrintReport (principal, rate, years, amount, interest ) ; return 0; }

Improved Interest with functions Programmed Incrementally, # 6 Write and test PrintReport( ) /************************************************** * PrintReport takes the original principal amount, the interest rate, amount of years of the * investment, amount in the account at the end of the term and the accrued interest as * arguments. It prints these values in a report format. \*************************************************/ void PrintReport (float principal, float rate, int years, float amount, float interest) { printf (“\n\n”) ; printf (“Interest rate : %.4f %% \n ” , 100 * rate ) ; printf (“ Period : %d years \n \n ” , years ) ; printf (“ Principal at start of period : %9.2f ” , principal ) ; printf (“ Interest accrued : %9.2f ” , interest ) ; printf (“Total amount at end of period : %9.2f ” , amount) ; }

Interest : Output #6 Final output: Test PrintReport ( ) This program computes the interest accrued in an account that compounds interest annually. You will need to enter the amount of the principal, the interest rate and the number of years. Enter the principal amount : 1000.00 Enter the interest rate as a decimal (for 7% enter .07) : .07 Enter the number of years : 20 Interest rate : 7.0000 % Period : 20 years Principal at start of period : 1000.00 Interest accrued : 2869.68 Total amount at end of period : 3869.68

Problem: Dealing Cards Deal a hand of cards to a player Write a program that deals a hand of cards to a player assuring that no cards are repeated. The user must supply the number of cards per hand.

Algorithm: Dealing Cards Print Explanation to user Get number of cards per hand from user for each card in the hand Randomly generate a card Assure that card hasn’t already been dealt. Put the new card in the player’s hand Record this card as a dealt card Print the suit and value of the cards in the player’s hand

Dealing Cards Thinking it through Draw a card by randomly getting a suit, a number between 0 and 3, inclusive & randomly getting a card value (1 - 13). Store the cards in a hand by having 4 arrays, one for each suit, that has a 1 as the element at the appropriate index to indicate the card’s presence, 0 its absence. Keep track of already used cards in 4 arrays (same storage method as hand)

Dealing Cards Design & write function prototypes void PrintExplanation (void) ; int GetNumPerHand (int min, int max) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]); void InitArray (int array[ ], int numElems) ; int GetRandomSuit (void) ; int GetRandomValue (void) ; int AlreadyUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; void Deal (int suit, int value, int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ]); void RecordAsUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], void PrintHand (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ] );

Dealing Cards Write and test PrintExplanation( ) /*****************************************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a player. The number of * * cards is specified by the user. * \*****************************************************************************************/ #include <stdio.h> void PrintExplanation (void) ; int main ( ) { PrintExplanation ( ) ; return 0; } /************************************************** * PrintExplanation is a procedure that prints the program explanation for the user * It takes no arguments and returns no values \*************************************************/ void PrintExplanation (void) printf (“This program deals a hand of cards to you. You will be asked\n”); printf (“to enter the number of cards you’d like in the hand.\n\n\n”);

Dealing Cards Write and test InitializeArrays( ) /************************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a player. * * The number of cards is specified by the user. * \************************************************************************/ #include <stdio.h> #include <stdlib.h> #define HEARTS 0 #define CLUBS 1 #define DIAMONDS 2 #define SPADES 3 #define SIZE 14 void PrintExplanation (void) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]); void InitArray (int array[ ], int numElems) ; int main ( ) { int handHearts[SIZE], handClubs[SIZE], handDiamonds[SIZE], handSpades[SIZE] ; int dealtHearts[SIZE], dealtClubs[SIZE], dealtDiamonds[SIZE], dealtSpades[SIZE] ; PrintExplanation ( ) ; InitializeArrays (handHearts, handClubs, handDiamonds, handSpades, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); return 0; }

Dealing Cards Write and test InitializeArrays( ) /*********************************************\ * InitializeArrays initializes all of the arrays passed to it * to hold all zeros by passing each to the InitArray function. \*********************************************/ void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) { InitArray (handHearts, SIZE) ; InitArray (handClubs, SIZE) ; InitArray (handDiamonds, SIZE) ; InitArray (handSpades, SIZE) ; InitArray (dealtHearts, SIZE) ; InitArray (dealtClubs, SIZE) ; InitArray (dealtDiamonds, SIZE) ; InitArray (dealtSpades, SIZE) ; }

Dealing Cards Write and test InitArray( ) /*********************************************\ * InitArray initializes the array of ints passed to it * to hold all zeros. The number of elements in the * array is passed in as numElems \*********************************************/ void InitArray (int array[ ], int numElems) { int i ; for (i = 0; i < numElems; i++) array [ i ] = 0 ; }

Dealing Cards Write and test GetNumPerHand( ) /*****************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a * * player. The number of cards is specified * * by the user. * \*****************************************************************/ #include <stdio.h> #include <stdlib.h> #define HEARTS 0 #define CLUBS 1 #define DIAMONDS 2 #define SPADES 3 #define SIZE 14 #define MIN 1 #define MAX 52 void PrintExplanation (void) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]); void InitArray (int array[ ], int numElems) ; int GetNumPerHand (int min, int max) ; int main ( ) { int num, handHearts[SIZE], handClubs[SIZE]; int handDiamonds[SIZE], handSpades[SIZE] ; int dealtHearts[SIZE], dealtClubs[SIZE]; int dealtDiamonds[SIZE], dealtSpades[SIZE] ; PrintExplanation ( ) ; InitializeArrays (handHearts, handClubs, handDiamonds, handSpades, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); num = GetNumPerHand (MIN, MAX) ; printf (“num = %d\n”, num) ; return 0; }

Dealing Cards Write and test GetNumPerHand ( ) /************************************************** * GetNumPerHand gets the number of cards per hand from the user and returns it to the * calling function. It assures that the number of cards is between the minimum amount passed to * this function and the maximum amount passed to this function. \*************************************************/ int GetNumPerHand (int min, int max) { int num ; printf (“Enter the number of cards per hand : “) ; scanf (“%d”, &num) ; /* assure input is between min and max */ while ( num < min || num > max ) printf (“The number of cards per hand must be between %d and %d, inclusive\n”, min, max) ; } return num ;

Dealing Cards Write and test GetRandomSuit( ) & GetRandomValue( ) /*****************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a * * player. The number of cards is specified * * by the user. * \*****************************************************************/ #include <stdio.h> #include <stdlib.h> #define HEARTS 0 #define CLUBS 1 #define DIAMONDS 2 #define SPADES 3 #define SIZE 14 #define MIN 1 #define MAX 52 void PrintExplanation (void) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]); void InitArray (int array[ ], int numElems) ; int GetNumPerHand (int min, int max) ; int main ( ) { int i, num, handHearts[SIZE], handClubs[SIZE]; int handDiamonds[SIZE], handSpades[SIZE] ; int dealtHearts[SIZE], dealtClubs[SIZE]; int dealtDiamonds[SIZE], dealtSpades[SIZE] ; int suit, value ; PrintExplanation ( ) ; InitializeArrays (handHearts, handClubs, handDiamonds, handSpades, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); num = GetNumPerHand (MIN, MAX) ; for ( i = 0 ; i < num ; i++ ) suit = GetRandomSuit ( ) ; value = GetRandomValue ( ) ; printf (“%d: %d of %d\n”, i, value, suit) ; } return 0;

Dealing Cards Write and test GetRandomSuit( ) & GetRandomValue( ) /************************************************** * GetRandomSuit gets a random number between 0 and 3 to indicate the suit of the drawn card. \*************************************************/ int GetRandomSuit (void) { int suit ; suit = rand ( ) % 4 ; return suit ; } * GetRandomValue gets a random number between 1 and 13, the value of the drawn card. int GetRandomValue (void) int value ; value = rand ( ) % 13 + 1 ; return value ;

Dealing Cards Write and test AlreadyUsed( ) /*****************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a * * player. The number of cards is specified * * by the user. * \*****************************************************************/ #include <stdio.h> #include <stdlib.h> #define HEARTS 0 #define CLUBS 1 #define DIAMONDS 2 #define SPADES 3 #define SIZE 14 #define MIN 1 #define MAX 52 void PrintExplanation (void) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]); void InitArray (int array[ ], int numElems) ; int GetNumPerHand (int min, int max) ; int AlreadyUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; int main ( ) { int i, num, handHearts[SIZE], handClubs[SIZE]; int handDiamonds[SIZE], handSpades[SIZE] ; int dealtHearts[SIZE], dealtClubs[SIZE]; int dealtDiamonds[SIZE], dealtSpades[SIZE] ; int suit, value ; PrintExplanation ( ) ; InitializeArrays (handHearts, handClubs, handDiamonds, handSpades, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); num = GetNumPerHand (MIN, MAX) ; for ( i = 0 ; i < num ; i++ ) suit = GetRandomSuit ( ) ; value = GetRandomValue ( ) ; while (AlreadyUsed (suit, value, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades) ) } return 0;

Dealing Cards - Write and test AlreadyUsed( ) /************************************************** * AlreadyUsed returns true if a card has already been dealt and false if it hasn’t been dealt yet. * The function takes the suit and value of the card to be checked and the four arrays of dealt * cards, dealtHearts, dealtClubs, dealtDiamonds, and dealtSpades as arguments. \*************************************************/ int AlreadyUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) { int used; switch (suit) case HEARTS : used = dealtHearts [value] ; break; case CLUBS : used = dealtClubs [value] ; case DIAMONDS : used = dealtDiamonds [value] ; case SPADES : used = dealtSpades [value] ; default : printf (“Error in suit in AlreadyUsed\n”) ; used = -1 ; } return used;

Dealing Cards Write and test Deal( ) & RecordAsUsed( ) /**********************************************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a player. The number of * * cards is specified by the user. * \**********************************************************************************************/ #include <stdio.h> #include <stdlib.h> #define HEARTS 0 #define CLUBS 1 #define DIAMONDS 2 #define SPADES 3 #define SIZE 14 #define MIN 1 #define MAX 52 void PrintExplanation (void) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; void InitArray (int array[ ], int numElems) ; int GetNumPerHand (int min, int max) ; int AlreadyUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; void Deal (int suit, int value, int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ]) ;

Dealing Cards Write and test Deal( ) & RecordAsUsed( ) int main ( ) { int i, num, suit, value ; int handHearts[SIZE], handClubs[SIZE], handDiamonds[SIZE], handSpades[SIZE] ; int dealtHearts[SIZE], dealtClubs[SIZE], dealtDiamonds[SIZE], dealtSpades[SIZE] ; PrintExplanation ( ) ; InitializeArrays (handHearts, handClubs, handDiamonds, handSpades, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); num = GetNumPerHand (MIN, MAX) ; for ( i = 0 ; i < num ; i++ ) suit = GetRandomSuit ( ) ; value = GetRandomValue ( ) ; while (AlreadyUsed (suit, value, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades ) ) } Deal (handHearts, handClubs, handDiamonds, handSpades) ; RecordAsUsed (dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); return 0;

Dealing Cards Write and test Deal( ) /************************************************** * Deal takes the suit and value of a card and the four arrays of cards representing the player’s * hand, handHearts, handClubs, handDiamonds, and handSpades as arguments. The element of * the appropriate array is changed to 1 to indicate that the card is in the hand. \*************************************************/ void Deal (int suit, int value, int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ]) { switch (suit) case HEARTS : handHearts [value] = 1 ; break ; case CLUBS : handClubs [value] = 1 break ;; case DIAMONDS : handDiamonds [value] = 1 ; case SPADES : handSpades [value] = 1 ; default : printf (“Error in suit in Deal\n”) ; }

Dealing Cards Write and test RecordAsUsed( ) /************************************************** * RecordAsUsed takes the suit and value of a card and the four arrays of dealt cards, dealtHearts, * dealtClubs, dealtDiamonds, and dealtSpades as arguments. The element of the appropriate * array is changed to 1 to indicate that the card has been dealt. \*************************************************/ void RecordAsUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) { switch (suit) case HEARTS : dealtHearts [value] = 1 ; break ; case CLUBS : dealtClubs [value] = 1 case DIAMONDS : dealtDiamonds [value] = 1 ; case SPADES : dealtSpades [value] = 1 ; default : printf (“Error in suit in RecordAsUsed\n”) ; }

Dealing Cards - Write and test PrintHand( ) /**********************************************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a player. The number of * * cards is specified by the user. * \**********************************************************************************************/ #include <stdio.h> #include <stdlib.h> #define HEARTS 0 #define CLUBS 1 #define DIAMONDS 2 #define SPADES 3 #define SIZE 14 #define MIN 1 #define MAX 52 void PrintExplanation (void) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; void InitArray (int array[ ], int numElems) ; int GetNumPerHand (int min, int max) ; int AlreadyUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; void Deal (int suit, int value, int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ]) ; void PrintHand (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ] ) ;

Dealing Cards Write and test PrintHand( ) int main ( ) { int i, num, suit, value ; int handHearts[SIZE], handClubs[SIZE], handDiamonds[SIZE], handSpades[SIZE] ; int dealtHearts[SIZE], dealtClubs[SIZE], dealtDiamonds[SIZE], dealtSpades[SIZE] ; PrintExplanation ( ) ; InitializeArrays (handHearts, handClubs, handDiamonds, handSpades, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); num = GetNumPerHand (MIN, MAX) ; for ( i = 0 ; i < num ; i++ ) suit = GetRandomSuit ( ) ; value = GetRandomValue ( ) ; while (AlreadyUsed (suit, value, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades ) ) } Deal (handHearts, handClubs, handDiamonds, handSpades) ; RecordAsUsed (dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); PrintHand (handHearts, handClubs, handDiamonds, handSpades ) ; return 0;

Dealing Cards - Write and test PrintHand( ) /************************************************** * PrintHand takes the number of cards in the hand and the four arrays of cards representing the * player’s hand, handHearts, handClubs, handDiamonds, and handSpades as arguments. The * values and suits of each card held in the hand is printed. \*************************************************/ void PrintHand (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ] ) { int i ; for ( i = 1 ; i < SIZE ; i++ ) if (handHearts [ i ] == 1) printf (“%d of Hearts\n”, i ) ; } if (handClubs [ i ] == 1) printf (“%d of Clubs\n”, i ) ;

Dealing Cards Write and test PrintHand( ) (continued) for ( i = 1 ; i < SIZE ; i++ ) { if (handDiamonds [ i ] == 1) printf (“%d of Diamonds\n”, i ) ; } if (handSpades [ i ] == 1) printf (“%d of Spades\n”, i ) ; /* end of PrintHand Function */

Dealing Cards - Final Version /**********************************************************************************************\ * Filename: cards.c * * Author: * * Description: This program deals a hand of cards to a player. The number of * * cards is specified by the user. * \**********************************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> #define HEARTS 0 #define CLUBS 1 #define DIAMONDS 2 #define SPADES 3 #define SIZE 14 #define MIN 1 #define MAX 52 void PrintExplanation (void) ; void InitializeArrays (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ], int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; void InitArray (int array[ ], int numElems) ; int GetNumPerHand (int min, int max) ; int AlreadyUsed (int suit, int value, int dealtHearts[ ], int dealtClubs[ ], int dealtDiamonds[ ], int dealtSpades[ ]) ; void Deal (int suit, int value, int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ]) ; void PrintHand (int handHearts[ ], int handClubs[ ], int handDiamonds[ ], int handSpades[ ] ) ;

Dealing Cards - Final Version int main ( ) { int i, num, suit, value ; int handHearts[SIZE], handClubs[SIZE], handDiamonds[SIZE], handSpades[SIZE] ; int dealtHearts[SIZE], dealtClubs[SIZE], dealtDiamonds[SIZE], dealtSpades[SIZE] ; PrintExplanation ( ) ; InitializeArrays (handHearts, handClubs, handDiamonds, handSpades, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); srand ( time (0) ) ; num = GetNumPerHand (MIN, MAX) ; /* Deal a hand of cards making sure that each card hasn’t already been dealt */ for ( i = 0 ; i < num ; i++ ) suit = GetRandomSuit ( ) ; value = GetRandomValue ( ) ; while (AlreadyUsed (suit, value, dealtHearts, dealtClubs, dealtDiamonds, dealtSpades ) ) } Deal (handHearts, handClubs, handDiamonds, handSpades) ; RecordAsUsed (dealtHearts, dealtClubs, dealtDiamonds, dealtSpades); PrintHand (handHearts, handClubs, handDiamonds, handSpades ) ; return 0;

Further Improvements ? We have a design error ! We should have realized that Deal and RecordAsUsed would have same exact code. We could have had one function called AddCard that would have the same code as Deal or RecordAsUsed and passed in the arrays for the hand when dealing and the arrays for dealt when recording a used card. Wouldn’t this have been easier to handle if we had spotted it sooner ? We should rewrite PrintHand( ) so that it prints Jack, Queen and King instead of 11, 12, & 13. Anything else ?