1 CSE1301 Computer Programming: Lecture 20 Case Study.

24
1 CSE1301 Computer Programming: Lecture 20 Case Study
  • date post

    21-Dec-2015
  • Category

    Documents

  • view

    218
  • download

    0

Transcript of 1 CSE1301 Computer Programming: Lecture 20 Case Study.

Page 1: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

1

CSE1301 Computer Programming:

Lecture 20Case Study

Page 2: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

2

Task

• Design an algorithm and write a program that draws balls from a jar without replacement

Page 3: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

3

drawv1.c

#include <stdio.h>

//draws numbers from a jar without replacement

int main ()

{

// until the jar is empty or someone wins

// pick a number and update the jar

// call out the number

return 0;

}

Page 4: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

4

drawv2.c#include <stdio.h>#define MAXNUM 75 int IsJarEmpty (int injar[]);int PickNum (int injar[]);void CallOut (int num);int main (){ int newnum; int jar[MAXNUM];

while (!IsJarEmpty(jar)) { newnum = PickNum(jar); CallOut(newnum); } return 0;}

int IsJarEmpty (int injar[]){ return 1;}

int PickNum (int injar[]){ return 0;}

void CallOut (int num){ return;}

Page 5: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

5

drawv3.c#include <stdio.h>#define MAXNUM 75 int IsJarEmpty (int injar[]);int PickNum (int injar[]);void CallOut (int num);int main (){ int newnum; int jar[MAXNUM]; while (!IsJarEmpty(jar)) { newnum = PickNum(jar); CallOut(newnum); } return 0;}

int IsJarEmpty (int injar[]){ return 0; //infinite loop}

int PickNum (int injar[]){ return 0;}

void CallOut (int num){ printf("Next number: %d\n",num); return;}

Page 6: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

6

Algorithm for removing balls from a jar without replacement (PickNum)

1. Pick a number between 1 and 75 at random2. Remove the ball with this number from the jar

array:a. Push up in the array the remaining “balls”b. Update the number of remaining balls

Need another variable: numballs

Need to initialize the jar array!!

How does this affect IsJarEmpty?

Page 7: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

7

drawv4.c#include <stdio.h>#define MAXNUM 75int InitializeJar(int injar[]);int IsJarEmpty (int injar[]);int PickNum (int injar[]);void CallOut (int num);int main (){ int newnum, numballs; int jar[MAXNUM]; numballs=InitializeJar(jar); while (!IsJarEmpty(jar)) { newnum = PickNum(jar); CallOut(newnum); } return 0;}

int InitializeJar(int injar[]){ . . . return MAXNUM;}

int IsJarEmpty (int injar[]){ return 1;}

int PickNum (int injar[]){ return 0;}

void CallOut (int num){ printf("Next number: %d\n", num); return;}

Page 8: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

8

drawv4.c -- InitializeJar

int InitializeJar(int injar[]){ int i; for(i=0; i<MAXNUM; i++) { // bingo numbers run from 1 to 75 injar[i]=i+1; } return MAXNUM;}

How do we test this function?

Page 9: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

9

Implement printJar !

Page 10: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

10

drawv5.c#include <stdio.h>#define MAXNUM 75int InitializeJar(int injar[]);void PrintJar(int [], int);int IsJarEmpty (int injar[]);int PickNum (int injar[]);void CallOut (int num);int main (){ int newnum, numballs; int jar[MAXNUM]; numballs=InitializeJar(jar); printJar(jar,numballs); while (!IsJarEmpty(jar)) { newnum = PickNum(jar); CallOut(newnum); } return 0;}

int InitializeJar(int injar[]){ … return MAXNUM;}

void PrintJar(int injar[], int totalb){ . . . return;}

int IsJarEmpty (int injar[]){ return 1;}

int PickNum (int injar[]){ return 0;}void CallOut (int num){ printf("Next number: %d\n", num); return;}

Page 11: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

11

drawv5.c -- PrintJar

void PrintJar(int injar[], int totalb){ int i; for(i=0; i<totalb; i++) { printf("%d: %d\n", i, injar[i]); } return;}

Page 12: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

12

How can we determine if the jar is empty?

int IsJarEmpty (int totalb){ return totalb == 0;}

Do we still need jar as input?

Page 13: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

13

drawv6.c#include <stdio.h>#define MAXNUM 75int InitializeJar(int injar[]);void PrintJar(int [], int);int IsJarEmpty (int totalb);int PickNum (int injar[]);void CallOut (int num);int main (){ int newnum, numballs; int jar[MAXNUM]; numballs=InitializeJar(jar); while(!IsJarEmpty(numballs)) { newnum = PickNum(jar); CallOut(newnum); } return 0;}

int InitializeJar(int injar[]){ … return MAXNUM;}

void PrintJar(int injar[], int totalb){ return;}

int IsJarEmpty (int totalb){ return totalb==0;}

int PickNum (int injar[]){ return 0;}void CallOut (int num){ return;}

What will happen when we run this

program?

Page 14: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

14

Decrement numballs every

iteration!So how can we

test IsJarEmpty?

Page 15: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

15

drawv6.c – Testing IsJarEmpty#include <stdio.h>#define MAXNUM 75int InitializeJar(int injar[]);void PrintJar(int [], int);int IsJarEmpty (int totalb);int PickNum (int injar[]);void CallOut (int num);int main (){ int newnum, numballs; int jar[MAXNUM]; numballs=InitializeJar(jar); while(!IsJarEmpty(numballs)) { newnum = PickNum(jar); CallOut(newnum); numballs--; //only for testing } return 0;}

int InitializeJar(int injar[]){ … return MAXNUM;}

void PrintJar(int injar[], int totalb){ return;}

int IsJarEmpty (int totalb){ return totalb==0;}

int PickNum (int injar[]){ return 0;}void CallOut (int num){ return;}

Can we test the program now?

Page 16: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

16

drawv7.c – Better Test for IsJarEmpty#include <stdio.h> . . .int IsJarEmpty (int totalb);int PickNum (int injar[]);void CallOut (int num, int calln);int main (){ int newnum, numballs; int jar[MAXNUM]; int callnum = 1; numballs=InitializeJar(jar); while(!IsJarEmpty(numballs)) { newnum = PickNum(jar); CallOut(newnum,callnum); numballs--; //only for testing callnum++; } return 0;}

int InitializeJar(int injar[]){ … return MAXNUM;}void PrintJar(int injar[], int totalb){ return;}int IsJarEmpty (int totalb){ return totalb==0;}int PickNum (int injar[]){ return 0;}void CallOut (int num, int calln){ printf("Call %d: %d\n", calln, num); return;}

Page 17: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

17

int PickNum (int injar[], int *totalb){ int index, newnum; int i; // pick the index of the next number index = (*totalb) * rand()/(RAND_MAX+1); newnum = injar[index]; // push up the remaining elements of the jar for(i=index; i<*totalb; i++) { injar[i] = injar[i+1]; } (*totalb)--; return newnum;}

How do we pick a number and update the jar?

Will this work?

Page 18: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

18

No, because of integer division

Page 19: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

19

int PickNum (int injar[], int *totalb){ int index, newnum; int i; double random; // pick the index of the next number random = rand(); index = (*totalb) * random/(RAND_MAX+1.0); newnum = injar[index]; // push up the remaining elements of the jar for(i=index; i<*totalb; i++) { injar[i] = injar[i+1]; } (*totalb)--; return newnum;}

drawv8.c -- PickNum

Page 20: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

20

drawv8.c#include <stdio.h>#include <stdlib.h> . . .int PickNum (int [], int *);void CallOut (int num, int calln);int main (){ int newnum, numballs; int jar[MAXNUM]; int callnum = 1; srand(1237); numballs=InitializeJar(jar); while(!IsJarEmpty(numballs)) { newnum = PickNum(jar,&numballs); CallOut(newnum,callnum); numballs--; //only for testing callnum++; } return 0;}

int InitializeJar(int injar[]){ … return MAXNUM;}void PrintJar(int injar[], int totalb){ return;}int IsJarEmpty (int totalb){ return totalb==0;}

int PickNum (int injar[], int *totalb){ return newnum;}void CallOut (int num, int calln){ return;}

Careful!! We left the numballs-- instruction

we used for testing

Page 21: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

21

drawv8.c – Final Version#include <stdio.h>#include <stdlib.h> . . .int PickNum (int [], int *);void CallOut (int num, int calln);int main (){ int newnum, numballs; int jar[MAXNUM]; int callnum = 1; srand(1237); numballs=InitializeJar(jar); while(!IsJarEmpty(numballs)) { newnum = PickNum(jar,&numballs); CallOut(newnum,callnum); callnum++; } return 0;}

int InitializeJar(int injar[]){ … return MAXNUM;}void PrintJar(int injar[], int totalb){ return;}int IsJarEmpty (int totalb){ return totalb==0;}

int PickNum (int injar[], int *totalb){ return newnum;}void CallOut (int num, int calln){ return;}

Page 22: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

22

A Different Approach

• Pre-assign the numbers randomly to the jar array

• Call out the numbers sequentially

Page 23: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

23

drawv9.c – Alternative Version#include <stdio.h>#include <stdlib.h>#define MAXNUM 75void InitializeJar (int injar[]);int IsJarEmpty (int current);int PickNum (int [], int);void CallOut (int num, int calln);int main (){ int newnum, callnum=0; int jar[MAXNUM]; srand(1237); InitializeJar(jar); while(!IsJarEmpty(callnum)) { newnum = PickNum(jar,callnum); CallOut(newnum,callnum); callnum++; } return 0;}

void InitializeJar(int injar[]){ … return;}

int IsJarEmpty (int current){ return current==MAXNUM;}

int PickNum (int injar[],int current){ return injar[current];}

void CallOut (int num, int calln){ printf("Call number %d: %d\n", calln+1, num); return;}

Page 24: 1 CSE1301 Computer Programming: Lecture 20 Case Study.

24

void InitializeJar (int injar[]){ int i, index, temp; double random;

for(i=0;i<MAXNUM;i++) { injar[i]=i+1; }

for(i=0;i<MAXNUM;i++) { random = rand(); // pick the index of the number to be swapped index = MAXNUM * random/(RAND_MAX+1.0); // swap injar[index] with injar[i] temp = injar[index]; injar[index] = injar[i]; injar[i] = temp; } return;}

drawv9.c -- InitializeJar