arrays grades for students in a large course we need a lot of variables double[] grade; grade=new...

33
Arrays rades for students in a large course we need a lot of variables uble[] grade; ade=new double[numberOfStudents tes “variables” e[0],grade[1],...,grade[numberOfStudent

Post on 20-Dec-2015

214 views

Category:

Documents


1 download

TRANSCRIPT

Arraysgrades for students in a large course

we need a lot of variables

double[] grade;grade=new double[numberOfStudents];

creates “variables” grade[0],grade[1],...,grade[numberOfStudents-1]

Arraysdouble[] grade;grade=new double[numberOfStudents];

creates “variables” grade[0],grade[1],...,grade[numberOfStudents-1]

the variables have nice namesdouble sum=0,average;for (int i=0;i<numberOfStudents;i++) sum+=grade[i];average=sum/numberOfStudentes;

Arrays – another exampleString[] name;int[] phoneNumber;name=new double[numberOfPeople];phoneNumber=new int[numberOfPeople];int findPhoneNumber(String searchedName) { int i=0; while ((i<numberOfPeople)&& (!searchedName.equals(name[i]))) i++; if (i==numberOfPeople) return –1; else return phoneNumber[i];}

EXERCISE #1:String[] name;int[] phoneNumber;name=new double[numberOfPeople];phoneNumber=new int[numberOfPeople];

Do we need to search the phone book sequentially?

String[] name;int[] phoneNumber;name=new double[numberOfPeople];phoneNumber=new int[numberOfPeople];

not OOP!EXERCISE #2 - OOP:

What class(es) should we use?Define the class(es).

Arrays as parameterspublic class Test { public static double average(double[] a) { if (a.length>0) { double sum=0; for (int i=0;i<a.length;i++) sum+=a[i]; return sum/a.length; } } else return 0;} We can figure out

the size of the array!

Returning arrayspublic class Test { public static int[] firstNumbers(int x) { int[] a=new int[x]; for (int i=0;i<x;i++) a[i]=i; return a; }}

EXERCISE #3a:

Define a method void mirror(int[] a) {

}

a = | 6 | 10 | 3 | 2 | 1 | a = | 1 | 2 | 3 | 10 | 6 |

EXERCISE #3b:

Define a method int[] mirror(int[] a) {

}

a = | 6 | 10 | 3 | 2 | 1 | a = | 1 | 2 | 3 | 10 | 6 |

The method should not modify the input array, but return a mirrored copy

EXERCISE #4:

Define a method int maximum(int[] a) {

}

a = | 6 | 10 | 3 | 2 | 1 | 10

EXERCISE #5:

Define a method int indexOfMaximum(int[] a) {

}

a = | 6 | 10 | 3 | 2 | 1 | 1

a = | 6 | 4 | 3 | 2 | 1 | 0

a = | 6 | 1 | 3 | 2 | 10 | 4

EXERCISE #6a:

Define a method void sort(int[] a) {

}

a = | 6 | 10 | 3 | 2 | 1 | a = | 1 | 2 | 3 | 6 | 10 |

int indexOfMaximum(int[] a,int length) { int index=0; for (int i=1;i<length;i++) if (a[i]>a[index]) index=i; return index;}void sort(int [] a) { for (int length=a.length;length>0;length--) { int index=indexOfMaximum(a,length); int c=a[length-1]; a[length-1]=a[index]; a[index]=c; }}

EXERCISE #7a:

Define a method int split(int[] a,int x) {

}

1,9,8,4,5,2,3,8,9,2,3,9,5,3,2,4 and 4

1,4,2,3,2,3,3,2,4,9,8,8,9,9,5

smaller or equal larger

returned index

int split(int[] a,int x) { int b=0,e=a.length-1; while (b<=e) { while ((b<=e)&&(a[b]<=x)) b++; while ((b<=e)&&(a[e]>x)) e--; if (b<e) { int c=a[b]; a[b]=a[e]; a[e]=c; } } return b-1;}INVARIANT = (i<b => a[i]<=x) && (i>e => a[i]>x)

(in place – solution)

EXERCISE #7b:

Define a method int split(int[] a,int x,int start,int end) {

}

9,3,5,1,9,8,4,5,2,3,8,9,2,3,9,5,3,2,4,2,3 and 4

9,3,5,1,4,2,3,2,3,3,2,4,9,8,8,9,9,5,2,3

smaller or equal larger

returned index

int split(int[] a,int x,int start,int end) { int b=start,e=end; while (b<=e) { while ((b<=e)&&(a[b]<=x)) b++; while ((b<=e)&&(a[e]>x)) e--; if (b<e) { int c=a[b]; a[b]=a[e]; a[e]=c; } } return b-1;}INVARIANT = (i<b => a[i]<=x) && (i>e => a[i]>x)

Can we use split for sorting?

void sort(int[] a,int start,int end) { int middle=split(a,a[start],start,end); sort(a,start,middle); sort(a,middle+1,stop);}

This never finishes.

Can we use split for sorting?

void sort(int[] a,int start,int end) { if (start<end) { int middle=split(a,a[start],start,end); sort(a,start,middle); sort(a,middle+1,end); }}

This never finishes, too.

it can be thatmiddle=end ormiddle+1=start

Can we use split for sorting?

This never finishes, too.

it can be thatmiddle=end ormiddle+1=start

Solution – modify split so that start<=middle<end.We need to modify the specification too...

EXERCISE #7c:

Define a method int split2(int[] a,int x) {

}

1,9,8,4,5,2,3,8,9,2,3,9,5,3,2,4 and 4

1,4,2,3,2,3,3,2,4,9,8,8,9,9,5

smaller or equal larger or equal

returned index

we are promised that x occurs in a

+ each part has at least one element!!!

int split2(int[] a,int x) { int b=0,e=a.length-1; while (true) { while (a[b]>x) b++; while (a[e]<x) e--; if (b<e) { int c=a[b]; a[b]=a[e]; a[e]=c; b++; e--; } else return e; }}

INVARIANT: (i<b => a[i]<=x) && (i>e => a[i]>=x)

CLAIM: (e>=0)&&(e<a.length-1)

Can we use split for sorting?

void sort(int[] a,int start,int end) { if (start<end) { int middle=split2(a,a[start],start,end); sort(a,start,middle); sort(a,middle+1,end); }}

Now it always finishes.

it cannot be thatmiddle=end ormiddle+1=start

Can we use split for sorting?

void sort(int[] a,int start,int end) { if (start<end) { int middle=split(a,a[start],start,end); sort(start,middle); sort(middle+1,stop); }}

QUICKSORT – one of the fastest sorting algorithms!

a[(int)(Math.random()*(end-start)+start)]

Array index out of bounds

int a=new int[10],b=0;for (int i=0;i<=10;i++) { a[i]=i; b+=a[i];}System.out.println(“”+b);

Initializing arraysint[] smallPrimes={2,3,5,7,11,13,17,23,29};

int[] smallPrimes;smallPrimes =new int[10];smallPrimes[0]=2;smallPrimes[1]=3;....smallPrimes[9]=29;

int[] a = {1,2,3}; int[] b = {4,5};int[] c;

c=a;a=b;b=c;

System.out.println("a[0] = "+a[0]); System.out.println("a.length = "+a.length);

EXERCISE #8:

void swap(int[] d,int []e) { int[] f=d; d=e; e=f;}

int[] a = {1,2,3}; int[] b = {4,5};int[] c;

swap(a,b);

System.out.println("a[0] = "+a[0]);

EXERCISE #9:

void swap(int[] d,int []e) { int f=d[0]; d[0]=e[0]; e[0]=f;}

int[] a = {1,2,3}; int[] b = {4,5};int[] c;

swap(a,b);

System.out.println("a[0] = "+a[0]); System.out.println("a[1] = "+a[1]);

EXERCISE #10:

void swap(int d,int e) { int f=d; d=e; e=d;}

int[] a = {1,2,3}; int[] b = {4,5};int[] c;

swap(a[0],b[0]);

System.out.println("a[0] = "+a[0]); System.out.println("a[1] = "+a[1]);

EXERCISE #11:

class Test { private int data; public Test(int data) { this.data=data; } public int GetValue() { return data; }}

Test[] a;a=new Test[10];a[0]=new Test(3);System.println(a[0].GetValue());System.println(a[1].GetValue());

error!

Difference from C++

Multidimensional Arraysgrades for students in a large course, want tokeep grade for each assignment separately

double[][] grade;grade=new double[numberOfStudents][numberOfHomeworks];

Compute the average from i-th homework?Compute the sum for each student?

Multidimensional Arraysdouble[][] grade;grade=new double[numberOfStudents][numberOfHomeworks];

double[][] grade;grade=new double[numberOfStudents][];for (int i=0;i<numberOfStudents;i++) grade[i]=new double[numberOfHomeworks];