example 2 - wikimedia · 22/11/2017  · example 2 3 young won lim 11/22/17 using 2-d arrays...

30
Young Won Lim 11/22/17 Example 2

Upload: others

Post on 11-Oct-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Young Won Lim11/22/17

Example 2

Page 2: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Young Won Lim11/22/17

Copyright (c) 2010 - 2017 Young W. Lim.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

Please send corrections (or suggestions) to [email protected].

This document was produced by using OpenOffice.

Page 3: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 3 Young Won Lim11/22/17

Using 2-d Arrays

#include <stdio.h>#include <stdlib.h>#define SIZE 10

Page 4: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 4 Young Won Lim11/22/17

avg3() definition

//--------------------------------------------------// Calculating the average of three numbers//--------------------------------------------------double avg3(int x, int y, int z) { return (x+y+z) / 3.;}

Page 5: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 5 Young Won Lim11/22/17

init_arrays() definition

//--------------------------------------------------// Initialize X[4][SIZE] arrays // by assigning random number grade//--------------------------------------------------void init_arrays (int X[][SIZE], double A[]){ int i;

// srand(7) makes rand() generate // the same random sequence // --> easy to debug a program srand(7);

for (i=0; i<SIZE; ++i) { X[0][i] = i+1 + 201600; // I X[1][i] = rand() % 101; // K X[2][i] = rand() % 101; // E X[3][i] = rand() % 101; // M A[i] = avg3(X[1][i], X[2][i], X[3][i]); }}

Page 6: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 6 Young Won Lim11/22/17

pr_table() definition

//--------------------------------------------------// Print the original table //-------------------------------------------------void pr_table (int X[][SIZE], double A[]){ int i;

printf("%10s %10s %10s %10s %10s \n", "StID", "Korean", "Enlgish", "Math", "Average"); for (i=0; i<SIZE; ++i) { printf("%10d %10d %10d %10d %10.2f \n", X[0][i], X[1][i], X[2][i], X[3][i], A[i]);

}}

Page 7: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 7 Young Won Lim11/22/17

DbubbleSort() definition

//--------------------------------------------------// Bubble Sort Double Array //-------------------------------------------------void DbubbleSort(double a[], int size) { int p, j; double tmp;

for (p=1; p< size; ++p) { for (j=0; j< size-1; ++j) { if ( a[j] < a[j+1] ) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } }}

Page 8: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 8 Young Won Lim11/22/17

pr_sorted_table() definition

//--------------------------------------------------// Print the Sorted Table//-------------------------------------------------void pr_sorted_table (int X[][SIZE], double A[]){ int i, j; double B[SIZE]; // Backup Array for Sorting

for (i=0; i<SIZE; ++i) B[i] = A[i]; //.................... DbubbleSort(B, SIZE); //....................

printf("\n\nSorted on a student's average\n\n"); printf("%10s %10s %10s %10s %10s \n", "StID", "Korean", "Enlgish", "Math", "Average"); for (i=0; i<SIZE; ++i) { for (j=0; j<SIZE; ++j) if (B[i] == A[j]) break;

printf("%10d %10d %10d %10d %10.2f \n", X[0][j], X[1][j], X[2][j], X[3][j], A[j]); }}

Page 9: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 9 Young Won Lim11/22/17

Avg() definition

//--------------------------------------------------// Average over Integer Array//-------------------------------------------------double Avg(int M[], int n) { int i; double S=0.0; for (i=0; i<n; ++i) S+= M[i]; return S/n;}

Page 10: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 10 Young Won Lim11/22/17

DAvg() definition

//--------------------------------------------------// Average over Doubl Array//-------------------------------------------------double DAvg(double N[], int n) { int i; double S=0.0; for (i=0; i<n; ++i) S+= N[i]; return S/n; }

Page 11: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 11 Young Won Lim11/22/17

pr_average definition

//-------------------------------------------------- // Print the Averages //------------------------------------------------- void pr_averages(int X[][SIZE], double A[]) { double A1 = Avg(X[1], SIZE); double A2 = Avg(X[2], SIZE); double A3 = Avg(X[3], SIZE); double A4 = DAvg(A, SIZE);

printf("%10s %10.2f %10.2f %10.2f %10.2f \n", "Average", A1, A2, A3, A4); }

Page 12: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 12 Young Won Lim11/22/17

main() definition

//====================================================// main//====================================================int main(void) { // X[0][SIZE] --> I[SIZE]; // ID of a student // X[1][SIZE] --> K[SIZE]; // Grade of Korean // X[2][SIZE] --> E[SIZE]; // Grade of English // X[3][SIZE] --> M[SIZE]; // Grade of Math

int X[4][SIZE]; double A[SIZE]; // Average of a student

init_arrays(X, A);

pr_table(X, A);

pr_sorted_table(X, A);

pr_averages(X, A);}

Page 13: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 13 Young Won Lim11/22/17

2-d Array Definition

Student ID

Korean

English

Math

Average A[j]

X[i][j]

Page 14: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 14 Young Won Lim11/22/17

Row-by-Row : Row Major Ordering

Page 15: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 15 Young Won Lim11/22/17

Row and Column Index

j

i

i

j

X[i][j]

X[j][i]

Page 16: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 16 Young Won Lim11/22/17

init_arrays() - filling grades

76 8644 9897

Korean

English

Math

X[i][j]

Random Number

Page 17: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 17 Young Won Lim11/22/17

init_arrays() - computing averages

Student ID

Korean

English

Math

Average avg3() avg3() avg3() avg3() avg3() avg3() avg3() avg3() A[i]

X[j][i]

i+1 + 201600

i

Page 18: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 18 Young Won Lim11/22/17

pr_table()

I K E M A

Student ID Korean English Math Average

i

Page 19: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 19 Young Won Lim11/22/17

pr_sorted_table – copying A to B

Student ID

Korean

English

Math

Average A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[i]

X[j][i]

Average2 B[0] B[1] B[2] B[3] B[4] B[5] B[6] B[7] B[i]

First, copy A[i] into B[i]

Page 20: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 20 Young Won Lim11/22/17

pr_sorted_table – sorting B

Student ID

Korean

English

Math

Average A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7]

Average2 B[0] B[1] B[2] B[3] B[4] B[5] B[6] B[7]

after DbubbleSort()B[j] > B[j+1]

A, B: different order

A[i]

X[j][i]

B[i]

Decreasing

Page 21: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 21 Young Won Lim11/22/17

pr_sorted_table – printing by B

Student ID

Korean

English

Math

Average A[0] A[1]

Average2 B[0] B[1] B[2] B[3] B[4] B[5] B[6] B[7]

Search A[j] = B[i]

A[j]

B[i]

Assume that two averages have always different values

j

i

X[0][j]X[1][j]X[2][j]X[3][j]

Page 22: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 22 Young Won Lim11/22/17

pr_averages

Student ID

Korean

English

Math

Average

Avg()

DAvg()

Avg()Avg()

A[i]

X[j][i]

Page 23: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 23 Young Won Lim11/22/17

Function Prototypes and Function Calls

double avg3 (int x, int y, int z) ;void init_arrays (int X[][SIZE], double A[]);void pr_table (int X[][SIZE], double A[]);void DbubbleSort (double a[], int size);void pr_sorted_table (int X[][SIZE], double A[]);double Avg (int X[], int n);double Davg (double Y[], int n);void pr_averages (int X[][SIZE], double A[]);

init_arrays(X, A); …………………………… in main()A[i] = avg3(K[i], E[i], M[i]); ……………. in init_arrays()

pr_table(X, A); ………………………………. in main()

pr_sorted_table(X, A); …………………….. in main()DbubbleSort(B, SIZE); ………………. in pr_sorted_table()

pr_averages(X, A); …………………………. in main()double A1 = Avg(X[1], SIZE); ………… in pr_averages()

double A2 = Avg(X[2], SIZE); ………… in pr_averages() double A3 = Avg(X[3], SIZE); ………… in pr_averages() double A4 = DAvg(A, SIZE); ………..… in pr_averages()

Page 24: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 24 Young Won Lim11/22/17

2-d Array Definitions

int main(void) { // X[0][SIZE] --> I[SIZE]; // ID of a student // X[1][SIZE] --> K[SIZE]; // Grade of Korean // X[2][SIZE] --> E[SIZE]; // Grade of English // X[3][SIZE] --> M[SIZE]; // Grade of Math

int X[4][SIZE]; double A[SIZE]; // Average of a student

init_arrays(X, A);

pr_table(X, A);

pr_sorted_table(X, A);

pr_averages(X, A);}

Page 25: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 25 Young Won Lim11/22/17

2-d Array Definition

Student ID

Korean

English

Math

Average A[j]

X[i][j]

Page 26: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 26 Young Won Lim11/22/17

int X[ ][SIZE] : Formal Parameter

Student ID

Korean

English

Math

X[i][j]

SIZEX

X

int X[4][SIZE];

Init_arrays( int X[ ][SIZE], … ) pr_table( int X[ ][SIZE], … )pr_sorted_table( int X[ ][SIZE], … ) pr_averages( int X[ ][SIZE], … )

Page 27: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 27 Young Won Lim11/22/17

X[1], X[2], X[3] : 2nd, 3rd , 4th rows

Student ID

Korean

English

Math

X[i][j]

SIZEX

X[1]

X[2]x[1][0] x[1][1] x[1][2] x[1][3] x[1][4] x[1][5] x[1][6] x[1][7]

X[3]x[2][0] x[2][1] x[2][2] x[2][3] x[2][4] x[2][5] x[2][6] x[2][7]

x[3][0] x[3][1] x[3][2] x[3][3] x[3][4] x[3][5] x[3][6] x[3][7]

can be used as a 1-d array

Page 28: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 28 Young Won Lim11/22/17

int X[ ] : Formal Parameter

X[1]

X[2]

X[3]

X[1]X[2]X[3]

int X[4][SIZE];

Avg( int X[ ], … )

Page 29: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Example 2 29 Young Won Lim11/22/17

double Y[ ] : Formal Parameter

A

A

int A[SIZE];

DAvg( double Y[ ], … )

Page 30: Example 2 - Wikimedia · 22/11/2017  · Example 2 3 Young Won Lim 11/22/17 Using 2-d Arrays #include  #include  #define SIZE 10

Young Won Lim11/22/17

References

[1] Essential C, Nick Parlante[2] Efficient C Programming, Mark A. Weiss[3] C A Reference Manual, Samuel P. Harbison & Guy L. Steele Jr.[4] C Language Express, I. K. Chun[5] cprogramex.wordpress.com