Answer 2D17

This answer includes a function printImage() that creates an image file grayWedge.pgm from the array. If you uncomment the statement in print2DArray() you can create a gray wedge image file that is viewable through IrfanView and some other image viewers:

Gray Wedge

As usual, some compilers may balk at compiling this program. You may have to do some patching.


#include <stdio.h>
#include <stdlib.h>

void grayWedge( int nrows, int ncols, int x[nrows][ncols], int low, int high )
{
  int r, c, rowVal;
   
  for ( r=0; r<nrows; r++ )
  {
    rowVal = ((high-low)*r)/(nrows-1) + low;
    for ( c=0; c<ncols; c++ )
       x[r][c] = rowVal;
  }
}

void print2DArray ( int nrows, int ncols, int x[nrows][ncols] )
{
  int r, c;
  
  for ( r=0; r<nrows; r++ )
  {
    for ( c=0; c<ncols; c++ )
      printf( "%3d ", x[r][c] );
    printf("\n");
  }
}

void printImage( int nrows, int ncols, int x[nrows][ncols] )
{
  FILE *image;
  int r, c;
  
  if ( (image=fopen("grayWedge.pgm", "wb")) == NULL )
  {
    printf("grayWedge.pgm failed to open\n");
    exit(1);
  }
  
  fprintf( image, "P5 %d %d 255", nrows, ncols);
  for ( r=0; r<nrows; r++ )
  {
    for ( c=0; c<ncols; c++ )
      fputc( x[r][c], image );
  }
}
  
int main(int argc, char *argv[])
{
  int nrows, ncols, min, max, wantImg=0;
  char userInput[32];
  
  printf( "Number of rows: ");
  scanf("%d", &nrows);
  printf( "Number of cols: ");
  scanf("%d", &ncols);
  printf( "Value for row 0: ");
  scanf("%d", &min);
  printf( "Value for row %d: ", nrows-1);
  scanf("%d", &max);
  printf( "Image File (y/n): " );
  scanf("%s", userInput );
  if ( userInput[0] == 'y' || userInput[0] == 'Y') wantImg=1;
    
  int x[nrows][ncols];
  grayWedge( nrows, ncols, x, min, max );
 
  if ( wantImg )
    printImage( nrows, ncols, x );
  else
    print2DArray( nrows, ncols, x ); 
 }


Back to Puzzle Home