L-3 MCS 275 Fri 12 Jan 2001

Below are listings for programs we discussed in class.
/* illustration on now to work with three-dimensional arrays,
   lecture 3 of MCS 275, Fri 12 Jan 2001. */

#include <stdio.h>

int sum_a (int n1, int n2, int n3, int a[n1][n2][n3]);
 /* returns the sum of the elements in the n1-by-n2-by-n3 matrix */
int sum_p1 (int n1, int n2, int n3, int *a);
 /* pointer version 1 of sum_a x*/
int sum_p2 (int n1, int n2, int n3, int *a);
 /* pointer version 2 of sum_a x*/
void test_sums (int n1, int n2, int n3);
 /* defines a n1-by-n2-by-n3 matrix and calls the summation routines */

int main(void)
{
   int n1,n2,n3;
   printf("Give dimension n1 : "); scanf("%d",&n1);
   printf("Give dimension n2 : "); scanf("%d",&n2);
   printf("Give dimension n3 : "); scanf("%d",&n3);
   test_sums(n1,n2,n3);
   return 0;
}

void test_sums (int n1, int n2, int n3)
{
   int a[n1][n2][n3], i,j,k;
   for (i = 0; i < n1; ++i)        /* define the matrix */
      for (j = 0; j < n2; ++j)
         for (k = 0; k < n3; ++k)
            a[i][j][k] = i+j+k;
   printf("the %d-by-%d-by-%d matrix is :\n", n1, n2, n3);
   for (i = 0; i < n1; ++i)        /* print the matrix */
      for (j = 0; j < n2; ++j)
      {
         for (k = 0; k < n3; ++k)
            printf("  a[%d][%d][%d]=%2d",i,j,k,a[i][j][k]);
         printf("\n");
      }
   printf("Sum with array version     : %d\n", sum_a(n1,n2,n3,a));
   printf("Sum with pointer version 1 : %d\n", sum_p1(n1,n2,n3,&a[0][0][0]));
   printf("Sum with pointer version 2 : %d\n", sum_p2(n1,n2,n3,&a[0][0][0]));
}

int sum_a (int n1, int n2, int n3, int a[n1][n2][n3])
{
   int i,j,k,sum = 0;
   for (i = 0; i < n1; ++i)
      for (j = 0; j < n2; ++j)
         for (k = 0; k < n3; ++k)
            sum += a[i][j][k];
   return sum;
}

int sum_p1 (int n1, int n2, int n3, int *a)
{
   int *p,sum = 0;
   for (p = a; p < a+(n1*n2*n3); ++p)
      sum += *p;
   return sum;
}

int sum_p2 (int n1, int n2, int n3, int *a)
{
   int i,j,k,sum = 0;
   for (i = 0; i < n1; ++i)
      for (j = 0; j < n2; ++j)
         for (k = 0; k < n3; ++k)
            sum += *(a + i*(n2*n3) + j*n3 + k);
   return sum;
}

/* safe selection from array with assert,
   program used in L-3 MCS 275, Fri 12 Jan 2001. */

#include <stdio.h>
#include <assert.h>

int select (int a[], int n, int i);
 /* returns a[i] after asserting that 0 <= i < n */
void test_select (int n);
 /* testing the select on array of size n */

int main(void)
{
   int n;
   printf("Give size of array : "); scanf("%d",&n);
   test_select(n);
   return 0;
}

int select (int a[], int n, int i)
{
   assert(i >= 0 && i < n);  /* prevents illegal access to array */
   return a[i];
}

void test_select (int n)
{
   int a[n];
   int i;
   for (i = 0; i < n; ++i)
      a[i] = i;
   printf("Give index : "); 
   scanf("%d", &i);
   printf("  a[%d] = %d\n", i, select(a,n,i));
}