# Computer Systems Organization

Start Lecture #2

Lecture given by Prof. Hull

## 1.6: Arrays

We are hindered in our examples because we don't know how to input anything other than characters and don't want to write the program to convert a string of characters into an integer or (worse) a floating point number.

#### Mean and Standard Deviation

```#include <stdio.h>
#define N  10   /* imagine you read in N */
#define MAXN  1000
main() {
int i;
float x, sum=0, mu;
for (i=0; i<N; i++) {
x = i;  /* imagine you read in X[i] */
sum += x;
}
mu = sum / N;
printf("The mean is %f\n", mu);
}
#include <stdio.h>
#define N  10   /* imagine you read in N */
#define MAXN  1000
main() {
int i;
float x[MAXN], sum=0, mu;
for (i=0; i<N; i++) {
x[i] = i;  /* imagine you read in X[i] */
}
for (i=0; i<N; i++) {
sum += x[i];
}
mu = sum / N;
printf("The mean is %f\n", mu);
}
#include <stdio.h>
#include <math.h>
#define N  5   /* imagine you read in N */
#define MAXN  1000
main() {
int i;
double x[MAXN], sum=0, mu, sigma;
for (i=0; i<N; i++) {
x[i] = i;  /* imagine you read in x[i] */
sum += x[i];
}
mu = sum / N;
printf("The mean is %f\n", mu);
sum = 0;
for (i=0; i<N; i++) {
sum += pow(x[i]-mu,2);
}
sigma = sqrt(sum/N);
printf("The standard deviation is %f\n", sigma);
}
```

I am sure you know the formula for the mean (average) of N numbers: Add the number and divide by N. Call the mean μ

The standard deviation is the RMS of the deviations-from-the-mean, it is called σ. That is, σ = sqrt(Σ((Xi-&mu)2)/N). (For technical reasons, sometimes we divide by N-1 not N.)

The first program on the right is the natural program to read in N then read N number and compute the mean of the latter, with one problem. We don't know how to read numbers.

So I faked it by having N a symbolic constant and making x[i]=i.

<soapbox>
You would presumably not write the second version, with a gratuitous array. It takes more space, is (a little) longer, is slower, and is more complicated. However, in 202 students want to write it when doing my linker lab. There is an instinct to use a three step procedure for all assignments:

1. Read everything in.
2. Do the computation.
3. Print the answers.

But that is silly if you only need the value once as in this example.
</soapbox>.

The last example is a good use of arrays for computing the standard deviation using the RMS formula above. We do need to keep the values around after computing the mean so that we can compute the deviations and from them the standard deviation.

Note that, unlike Java, no use of new (or the C analogue malloc()) appears. Arrays declared as in this program have a lifetime of the routine in which they are declared. Specifically sum and x are both allocated when main is called and are both freed when main is finished.

Note the declaration int x[N]. In C, to declare something complicated, you say what has to be done to get one of the primitive types.

• int *(x[]) says that x x is something that if you take an element of it and dereference that element than you will get an integer. So x is an array of pointers to integers.
• int (*x)[] says that if you dereference x and take an element of the result, you get an integer. So x is a pointer to an array of integers.
• Thus int *(x[]) is not the same as (*x)[].
• This declaration style is a controversial feature of C. Some like it, some don't (I don't). But that is the way it is.

In C if we have int X[10]; then writing X in you program is the same as writing &A[0]. & is the address of operator. More on this later when we discuss pointers.

## 1.7: Functions

```#include <stdio.h>
// Determine letter grade from score
// Demonstration of functions
char letter_grade (int score) {
if      (score >= 90) return 'A';
else if (score >= 80) return 'B';
else if (score >= 70) return 'C';
else if (score >= 60) return 'D';
else                  return 'F';
}  // end function letter_grade
char letter_grade2 ( int score ) {
switch ( score ) {  // yes, this is an awful case statement!
case 90 : case 91 : case 92 : case 93 : case 94 :
case 95 : case 96 : case 97 : case 98 : case 99 :
case 100 : return 'A'; break;

default : return 'F'; break;
} // end switch score
} // end function letter_grade2
main() {
int  quiz;
quiz = 95;
printf(" \n for a score of %3d the grade is %c\n ", quiz, grade);
quiz = 75;
printf(" \n for a score of %3d the grade is %c\n ", quiz, grade);
} // end main
#include <stdio.h>
// Demo of Arrays
// Create random numbers, average and sort them
#define maxelements 50
void sort ( int stuff [], int max ) {
int temp;
int x,
for (x=0; x<(max-1); x++)   {
for (y=0; y<(max-(x+1)); y++) {
if (stuff[y] < stuff[y+1]) {
temp       = stuff[y];
stuff[y]   = stuff[y+1];
stuff[y+1] = temp;
} // end if stuff
} // end for y
} // end for x
} // end function sort
float avg ( int stuff [], int max ) {
int sum;
int x;
sum = 0;
for (x = 0; x < max; x++)
sum = sum + stuff[x];
return (sum / max);
}
main() {
int table[maxelements];
int  x;
float average;
for (x = 0; x < maxelements; x++)
table[x] = rand();
for (x = 0; x < maxelements; x++)
printf(" the element in position %3d is %3d \n", x, table[x]);
average = avg( table, maxelements );
printf(" the average value is %5.1f ", average);
sort( table, maxelements );
for (x = 0; x < maxelements; x++)
printf(" the element in position %3d is %3d \n", x, table[x]);
} // end function main
```