Difference between revisions of "Principles of Computer Programming"

From David Vernon's Wiki
Jump to: navigation, search
Line 587: Line 587:
 
  }
 
  }
  
/* Program to read a file of integer numbers, 5 per line        */
+
/* Program to read a file of integer numbers, 5 per line        */
/* the 5 numbers represent the x, y, r, g, b values of a point  */
+
/* the 5 numbers represent the x, y, r, g, b values of a point  */
/* Each point is stored in an array                            */
+
/* Each point is stored in an array                            */
/* Write out the r, g, b values of each point to an output file */
+
/* Write out the r, g, b values of each point to an output file */
/*                                                              */
+
/*                                                              */
/* Input file: points.txt                                      */
+
/* Input file: points.txt                                      */
/* Output file: colours.txt                                    */
+
/* Output file: colours.txt                                    */
/*                                                              */
+
/*                                                              */
/* NOTE: this program is intended to illustrate the use of      */
+
/* NOTE: this program is intended to illustrate the use of      */
/*      structures in C                                        */
+
/*      structures in C                                        */  
 +
 +
#include <stdio.h>
 +
 +
main() {
 +
 
 +
    /*** define structure types ***/
 +
 +
    struct colour {
 +
      int red;
 +
      int green;
 +
      int blue;
 +
    };
 +
 +
    struct point {
 +
      int x;
 +
      int y;
 +
      struct colour clr;
 +
    };
 +
 +
    FILE *fin, *fout;
 +
 +
    struct point ps[100];  /* assume a maximum of 100 points in the input file */
 +
 +
    int temp_r, temp_g, temp_b, temp_x, temp_y,  i, count;
 +
 +
    fin = fopen("points.txt", "r");
 +
    if (fin == 0) {
 +
      printf("Error ... can't open file points.txt\n");
 +
      exit(0);
 +
    }
 +
 +
    fout = fopen("colours.txt", "w");
 +
    if (fout == 0) {
 +
      printf("Error ... can't open file colours.txt\n");
 +
      exit(0);
 +
    }
 +
 +
    /*  files are open so now we read in the point information */
 +
 +
    i = 0;
 +
 +
    while (fscanf(fin, "%d %d %d %d %d", &temp_x, &temp_y,
 +
                                        &temp_r, &temp_g, &temp_b) != EOF)  {
 +
 +
        /* store the values read in my array of points */
 +
 +
        ps[i].x  = temp_x;
 +
        ps[i].y  = temp_y;
 +
        ps[i].clr.red  = temp_r;
 +
        ps[i].clr.green  = temp_g;
 +
        ps[i].clr.blue  = temp_b;
 +
 +
        i++;
 +
    }
 +
 +
    /* remember how many points we read */
 +
 +
    count = i;
 +
 +
    /* now write out just the rgb values to the output file */
 +
 +
    for (i=0; i<count; i++) {
 +
      fprintf(fout, "%d %d %d \n", ps[i].clr.red, ps[i].clr.green, ps[i].clr.blue);
 +
    }
 +
    fclose(fin);
 +
    fclose(fout);
 +
}
  
#include <stdio.h>
+
/* Program to read a file of integer numbers, 5 per line        */
 
+
/* the 5 numbers represent the x, y, r, g, b values of a point  */
main() {
+
/* Each point is stored in an array                            */
 +
/* Remove all duplicate points (i.e. points with the same x y  */
 +
/* value.                                                      */
 +
/* Write out the x, y, r, g, b values of each point to an      */
 +
/* file                                                        */
 +
/*                                                              */
 +
/* Input file: points.txt                                      */
 +
/* Output file: new_points.txt                                  */
 +
/*                                                              */
 +
/* NOTE: this program is intended to illustrate the use of      */
 +
/*      structures in C                                        */
 +
 +
#include <stdio.h>
 +
 +
main() {
 +
 
 +
    /*** define structure types ***/
 +
 +
    struct colour {
 +
      int red;
 +
      int green;
 +
      int blue;
 +
    };
 
    
 
    
  /*** define structure types ***/
+
    struct point {
 
+
      int x;
  struct colour {
+
      int y;
      int red;
+
      struct colour clr;
      int green;
+
    };  
      int blue;
+
   
  };
+
    FILE *fin, *fout;
 
+
    struct point ps[100];  /* assume a maximum of 100 points in the input file */
  struct point {
+
    int temp_r, temp_g, temp_b, temp_x, temp_y,  i, j, k, count;
      int x;
+
      int y;
+
    fin = fopen("points.txt", "r");
      struct colour clr;
+
    if (fin == 0) {
  };
+
      printf("Error ... can't open file points.txt\n");
 
+
      exit(0);
  FILE *fin, *fout;
+
    }  
 
+
  struct point ps[100]; /* assume a maximum of 100 points in the input file */
+
    fout = fopen("new_points.txt", "w");
 
+
    if (fout == 0) {
  int temp_r, temp_g, temp_b, temp_x, temp_y,  i, count;
+
      printf("Error ... can't open file colours.txt\n");
 
+
      exit(0);
  fin = fopen("points.txt", "r");
+
    }  
  if (fin == 0) {
+
      printf("Error ... can't open file points.txt\n");
+
    /*  files are open so now we read in the point information */
      exit(0);
+
  }
+
    i = 0;
 
+
    while (fscanf(fin, "%d %d %d %d %d", &temp_x, &temp_y,  
  fout = fopen("colours.txt", "w");
+
                                        &temp_r, &temp_g, &temp_b) != EOF)  {
  if (fout == 0) {
+
      printf("Error ... can't open file colours.txt\n");
+
        /* store the values read in my array of points */
      exit(0);
+
  }
+
        ps[i].x  = temp_x;
 
+
        ps[i].y  = temp_y;
  /*  files are open so now we read in the point information */
+
        ps[i].clr.red  = temp_r;
 
+
        ps[i].clr.green  = temp_g;
  i = 0;
+
        ps[i].clr.blue  = temp_b;
 
+
  while (fscanf(fin, "%d %d %d %d %d", &temp_x, &temp_y,
+
        i++;
                                        &temp_r, &temp_g, &temp_b) != EOF)  {
+
    }
 
+
      /* store the values read in my array of points */
+
    /* remember how many points we read */
 
+
      ps[i].x  = temp_x;
+
    count = i;
      ps[i].y  = temp_y;
+
      ps[i].clr.red  = temp_r;
+
    /*** this section eliminates the duplicate values ***/
      ps[i].clr.green  = temp_g;
+
      ps[i].clr.blue  = temp_b;
+
    /* look at each element in turn */
 
+
      i++;
+
    for (i=0; i<count; i++) {
  }
+
 
+
        /* check for duplicates in all the remaining elements */
  /* remember how many points we read */
+
 
+
        for (j=i+1; j<count; j++)  {
  count = i;
+
          if ((ps[j].x == ps[i].x)  &&  (ps[j].y == ps[i].y))  {
 
+
  /* now write out just the rgb values to the output file */
+
              /* we have found duplicate so shift all the rest */
 
+
  for (i=0; i<count; i++) {
+
              for (k=j; k<count-1; k++) {
      fprintf(fout, "%d %d %d \n", ps[i].clr.red, ps[i].clr.green, ps[i].clr.blue);
+
                ps[k] = ps[k+1];
  }
+
              }
  fclose(fin);
+
              count = count - 1;
  fclose(fout);
+
              j--;  /* decrement j so that when it is incremented in the    */
}
+
                    /* for loop it will still index the same element,        */
 
+
                    /* i.e. the element that was shifted into the j position */
/* Program to read a file of integer numbers, 5 per line        */
+
          }
/* the 5 numbers represent the x, y, r, g, b values of a point  */
+
        }  
/* Each point is stored in an array                            */
+
    }
/* Remove all duplicate points (i.e. points with the same x y  */
+
/* value.                                                      */
+
    /* now write out the x, y, r, g, b values to the output file */
/* Write out the x, y, r, g, b values of each point to an      */
+
/* file                                                        */
+
    for (i=0; i<count; i++) {
/*                                                              */
+
      fprintf(fout, "%5d %5d %5d %5d %5d \n",  
/* Input file: points.txt                                      */
+
                    ps[i].x, ps[i].y, ps[i].clr.red, ps[i].clr.green, ps[i].clr.blue);
/* Output file: new_points.txt                                  */
+
    }  
/*                                                              */
+
    fclose(fin);
/* NOTE: this program is intended to illustrate the use of      */
+
    fclose(fout);
/*      structures in C                                        */
+
}
 
+
#include <stdio.h>
+
 
+
main() {
+
 
+
  /*** define structure types ***/
+
 
+
  struct colour {
+
      int red;
+
      int green;
+
      int blue;
+
  };
+
 
+
  struct point {
+
      int x;
+
      int y;
+
      struct colour clr;
+
  };
+
 
+
  FILE *fin, *fout;
+
  struct point ps[100];  /* assume a maximum of 100 points in the input file */
+
  int temp_r, temp_g, temp_b, temp_x, temp_y,  i, j, k, count;
+
 
+
  fin = fopen("points.txt", "r");
+
  if (fin == 0) {
+
      printf("Error ... can't open file points.txt\n");
+
      exit(0);
+
  }
+
 
+
  fout = fopen("new_points.txt", "w");
+
  if (fout == 0) {
+
      printf("Error ... can't open file colours.txt\n");
+
      exit(0);
+
  }
+
 
+
  /*  files are open so now we read in the point information */
+
 
+
  i = 0;
+
  while (fscanf(fin, "%d %d %d %d %d", &temp_x, &temp_y,  
+
                                        &temp_r, &temp_g, &temp_b) != EOF)  {
+
 
+
      /* store the values read in my array of points */
+
 
+
      ps[i].x  = temp_x;
+
      ps[i].y  = temp_y;
+
      ps[i].clr.red  = temp_r;
+
      ps[i].clr.green  = temp_g;
+
      ps[i].clr.blue  = temp_b;
+
 
+
      i++;
+
  }
+
 
+
  /* remember how many points we read */
+
 
+
  count = i;
+
 
+
  /*** this section eliminates the duplicate values ***/
+
 
+
  /* look at each element in turn */
+
 
+
  for (i=0; i<count; i++) {
+
 
+
      /* check for duplicates in all the remaining elements */
+
 
+
      for (j=i+1; j<count; j++)  {
+
          if ((ps[j].x == ps[i].x)  &&  (ps[j].y == ps[i].y))  {
+
 
+
            /* we have found duplicate so shift all the rest */
+
 
+
            for (k=j; k<count-1; k++) {
+
                ps[k] = ps[k+1];
+
            }
+
            count = count - 1;
+
            j--;  /* decrement j so that when it is incremented in the    */
+
                  /* for loop it will still index the same element,        */
+
                  /* i.e. the element that was shifted into the j position */
+
          }
+
      }
+
  }
+
 
+
  /* now write out the x, y, r, g, b values to the output file */
+
 
+
  for (i=0; i<count; i++) {
+
      fprintf(fout, "%5d %5d %5d %5d %5d \n",  
+
                    ps[i].x, ps[i].y, ps[i].clr.red, ps[i].clr.green, ps[i].clr.blue);
+
  }
+
  fclose(fin);
+
  fclose(fout);
+
}
+

Revision as of 03:01, 29 January 2017

Here are some code segments for the examples in the course on principles of computer programming.

/* Example 1                                       */
/* This is a C program to ask you to type a letter */
/* and then to tell you what you typed             */

#include <stdio.h>

main() { 
   char letter;

   printf("Please type a letter & then press Return >>");
   scanf("%c",&letter);
   printf("You typed the letter %c", letter);
}
/* Example 2                                       */
/* This is a C program to ask you to enter two     */
/* numbers; it then compares them and prints a     */
/* message to say whether they are equal or not    */

#include <stdio.h> 

main() {
 
   int first_number, second_number;

   printf("Type a number and then press Enter >>");
   scanf("%d",&first_number);

  printf("Type another number and then press Enter >>");
  scanf("%d",&second_number);

  if (first_number == second_number) 
     printf("The two numbers %d are identical", first_number);
  else
     printf("The two numbers %d and %d are different",  first_number, second_number);
}
/* Example 2b                                                          */
/* This is a C program to ask you to enter three   */
/* numbers; it then compares them and prints a   */
/* message to say whether they are equal or not  */  

#include <stdio.h> 

void main() {

   int first_number, second_number, third_number;

   printf("Please type three numbers .... \n");
   printf("Enter the first number >>");
   scanf("%d",&first_number);

   printf("Enter the second number >>");
   scanf("%d",&second_number);

   printf("Enter the third number >>");
   scanf("%d",&third_number);


   if (first_number == second_number)
      if (second_number == third_number)
         printf("The three numbers %d are identical", 
                 first_number);

   if (first_number != second_number)
      if (second_number != third_number)
         if (first_number != third_number)
            printf("The three numbers %d %d %d are all different", 
                   first_number, second_number, third_number);
 
} 
/* Example 3a                                        */
/* Compute the total value of 7 Scrabble letters     */
/* Input:  the user is prompted to enter each letter */
/*         in turn                                   */
/* Output: the program prints the sum of the seven   */
/*         individual letter values                  */
 
#include <stdio.h> 
#include <ctype.h>

#define TRUE  1 
#define FALSE 0

void main() {

   char letter, enter;
   int scrabble_value, 
       total_scrabble_value,   
       i;   /*  not the same as 'i'  */
   int debug; 

 
   /* debug is a flag.  If it is TRUE we will execute some printf */
   /* statements to help see what the program is doing.           */
   /* if it is FALSE, we won't!                                   */

   debug = TRUE;

   /* initialize variables */

   total_scrabble_value = 0;
   scrabble_value = 0;

   /* use a for loop to read seven values*/

   for (i=0; i < 7; i++) 
   {
      printf("Please type a letter and then press Return >>");
      scanf("%c",&letter);
      scanf("%c",&enter);        /* skip enter character */

      letter = toupper(letter);  /* convert the letter to uppercase    */
                                 /* note this works even if the letter */
                                 /* is already in upper case           */

      if ((letter == 'A') || 
          (letter == 'E') ||
          (letter == 'I') || 
          (letter == 'L') || 
          (letter == 'N') || 
          (letter == 'O') || 
          (letter == 'R') || 
          (letter == 'S') || 
          (letter == 'T') || 
          (letter == 'U')) 

      {
         scrabble_value = 1;
         if (debug == TRUE)
            printf("the letter %c has the value %d\n", letter, scrabble_value);
      }
      else 
         if ((letter == 'D') || 
             (letter == 'G')) 
         {
            scrabble_value = 2;
            if (debug == TRUE) {
               printf("the letter %c has the value %d\n", letter, scrabble_value);
            } 
         } 
         else 
            if ((letter == 'B') || 
                (letter == 'C') || 
                (letter == 'M') || 
                (letter == 'P')) 
            { 
               scrabble_value = 3;
               if (debug == TRUE)
                  printf("the letter %c has the value %d\n", letter, scrabble_value);
            } 
            else 
               if ((letter == 'F') || 
                   (letter == 'H') || 
                   (letter == 'V') || 
                   (letter == 'W') || 
                   (letter == 'Y')) 
               { 
                 scrabble_value = 4;
                  if (debug == TRUE)
                     printf("the letter %c has the value %d\n", letter, scrabble_value);
               } 
               else 
                  if ((letter == 'K')) 
                  {
                     scrabble_value = 5;
                     if (debug == TRUE)
                        printf("the letter %c has the value %d\n", letter, scrabble_value);
                  } 
                  else 
                     if ((letter == 'J') || 
                         (letter == 'X') ) 
                     {
                        scrabble_value = 8;
                        if (debug == TRUE)
                           printf("the letter %c has the value %d\n", letter, scrabble_value);
                     } 
                     else 
                        if ((letter == 'Z') || 
                            (letter == 'Q') ) 
                        {
                           scrabble_value = 10;
                           if (debug == TRUE)
                              printf("the letter %c has the value %d\n", letter, scrabble_value);
                        } 
   
                        else

                           printf("You typed the character %c ... that's not allowed\n", letter);

      /* now add the value to the total */
      
      total_scrabble_value = total_scrabble_value + scrabble_value;
  }  
 
   printf("The Scrabble value of the seven letters is %d", 
           total_scrabble_value);
} 
/* Example 3b                                        */
/* Compute the total value of 7 Scrabble letters     */
/* Input:  the user is prompted to enter each letter */
/*         in turn                                   */
/* Output: the program prints the sum of the seven   */
/*         individual letter values                  */
 
#include <stdio.h> 
#include <ctype.h>

#define TRUE  1
#define FALSE 0

void main() {

   char letter, enter;
   int scrabble_value, 
       total_scrabble_value,   
       i;   /*  not the same as 'i'  */
   int debug;


   /* debug is a flag.  If it is TRUE we will execute some printf */
   /* statements to help see what the program is doing.           */
   /* if it is FALSE, we won't!                                   */

   debug = TRUE;

   /* initialize variables */

   total_scrabble_value = 0;
   scrabble_value = 0;

   /* use a for loop to read seven values*/

   for (i=0; i < 7; i++) 
   {
      printf("Please type a letter and then press Return >>");
      scanf("%c",&letter);
      scanf("%c",&enter);        /* skip enter character */

      letter = toupper(letter);  /* convert the letter to uppercase    */
                                 /* note this works even if the letter */
                                 /* is already in upper case           */


      switch (letter) {

         case 'A':
         case 'E':
         case 'I':
         case 'L':
         case 'N':
         case 'O':
         case 'R':
         case 'S':
         case 'T':
         case 'U':  scrabble_value = 1;
                    if (debug == TRUE)
                       printf("the letter %c has the value %d\n", letter, scrabble_value);
                    break;

         case 'D':
         case 'G':  scrabble_value = 2;
                    if (debug == TRUE) {
                       printf("the letter %c has the value %d\n", letter, scrabble_value);
                    }
                    break;

         case 'B':
         case 'C':  
         case 'M':
         case 'P':  scrabble_value = 3;
                    if (debug == TRUE)
                       printf("the letter %c has the value %d\n", letter, scrabble_value);
                    break;

         case 'F':
         case 'H':  
         case 'V':
         case 'W':  
         case 'Y':  scrabble_value = 4;
                    if (debug == TRUE)
                        printf("the letter %c has the value %d\n", letter, scrabble_value);
                    break;

         case 'K':  scrabble_value = 5;
                    if (debug == TRUE)
                       printf("the letter %c has the value %d\n", letter, scrabble_value);
                    break;

         case 'J':
         case 'X':  scrabble_value = 8;
                    if (debug == TRUE)
                       printf("the letter %c has the value %d\n", letter, scrabble_value);
                    break;

         case 'Z':
         case 'Q':  scrabble_value = 10;
                    if (debug == TRUE)
                        printf("the letter %c has the value %d\n", letter, scrabble_value);
                    break;

         default:   printf("You typed the character %c ... that's not allowed\n", letter);
                    break;

      } /* end of the switch statement */

      /* now add the value to the total */
      
      total_scrabble_value = total_scrabble_value + scrabble_value;
   }

   printf("The Scrabble value of the seven letters is %d", 
           total_scrabble_value);
} 
/* A program to prompt the user three times and reads three numbers. */
/* It compare these three numbers and tell the user whether          */
/*                                                                   */
/* - all three numbers are the same                                  */
/* - all three numbers are different                                 */
/* - just two numbers are the same                                   */
/*   in this case, it also tells the user which two numbers they are */
/*                                                                   */
/* The program continues to ask the user for input until he enters   */
/* three zeros.                                                      */   

#include <stdio.h> 

#define TRUE  1
#define FALSE 0

void main() {
   int n1, n2, n3;

   /* give the numbers initial values */

   n1 = 1; 
   n2 = 1; 
   n3 = 1;

   /* while the three numbers are not all zero */

   while ((n1 != 0) && (n2 != 0) && (n3 != 0)) {
 
      printf("Please enter the first number  >>");
      scanf("%d",&n1);
  
      printf("Please enter the second number >>");
      scanf("%d",&n2);

      printf("Please enter the third number  >>");
      scanf("%d",&n3);

      
      /* check to see if they are all the same */

      if ((n1 == n2) && (n2 == n3) && (n1 == n3)) {
         printf(" The three numbers are all the same. \n"); 
      } 
      else {
         if ((n1 != n2) && (n2 != n3) && (n1 != n3)) {
	          printf("The three numbers are all the different.\n");
	       }
         else {
     
            /* two are the same -  which are they? */

            if (n1 == n2) {
	            printf("The first and second numbers are the same: %d\n”,
               n1, n2);
	         }
	         else {
	            if (n2 == n3) {
	               printf("The second and third numbers are the same: %d\n",
                  n2, n3);
	            }

	            else {  /* no need to check if the first and third    */
		               /* are the same ... it's the only possibility */
        	    printf("The first and third numbers are the same:%d\n",
                   n1, n2);                                                         
	            }
	         }
	      }
       }
    }
}  
/* a program to call a function called max */
/* max returns the maximum of two floating point numbers */ 

#include <stdio.h>

float max(float a, float b)
{
    float  c;  /* local variable */

   if (a >  b) {
      c = a;  
   }
  else {
    c = b;   
  }
  return(c);
} 



void main()
{
   FILE *fp_in, *fp_out; 

   float x, y, z;
   int end_of_file;
 

   /* open the files */
   /* no checking for the moment */

   fp_in = fopen("input.txt", "r");
   fp_out = fopen("max.txt", "w");


   end_of_file = fscanf(fp_in, "%f %f", &x, &y);
   while (end_of_file != EOF) 
   {

      z = max(x, y);
      fprintf(fp_out, "%5.2f\n ", z);

     end_of_file = fscanf(fp_in, "%f %f", &x, &y);

   };


   fclose(fp_in);
   fclose(fp_out);

}
/* Program to read pairs of numbers from the input file    */
/* and calls a function max which returns the maximum of   */
/* of two floating point numbers.                          */
/* This maximum is then written to an output file          */
/* the input file is read until we reach the end of file   */


#include <stdio.h>

float max(float a, float b)
{
  float  c;  /* local variable */ 

  if (a >  b) {
    c = a;  
  } 
  else {
    c = b;   
  } 
  return(c);
}

void main()
{
   FILE *fp_in, *fp_out;

   float x, y, z;
   int end_of_file;


   /* open the files             */
   /* no checking for the moment */

   fp_in = fopen("input.txt", "r");
   fp_out = fopen("max.txt", "w");


   /* read until we reach the end of file ... version A */

   end_of_file = fscanf(fp_in, "%f %f", &x, &y);
   while (end_of_file != EOF) 
   {
      z = max(x, y);
      fprintf(fp_out, "%5.2f\n ", z);

      end_of_file = fscanf(fp_in, "%f %f", &x, &y);

   };

   /* read until we reach the end of file ... version B */
   /* note: this version is equivalent to version A     */
   /* but it puts the fscanf in the while condition     */

   /*   while (fscanf(fp_in, "%f %f", &x, &y) != EOF)   */
   /*   {                                               */
   /*      z = max(x, y);                               */
   /*      fprintf(fp_out, "%5.2f\n ", z);              */
   /*    };                                              */

   fclose(fp_in);
   fclose(fp_out);

} 
/* Program to read a sequence of numbers from the input file,    */
/* compute the average of the numbers (ignoring zeros)           */
/* replace all occurrences of zero with the average              */
/* and write the numbers to an output file                       */

/* Note: we use four loops ... we could use fewer but it         */
/* means doing more than one thing in each loop ...              */
/* we will do this next day.                                     */

#include <stdio.h>

#define MAX 100

void main()
{
   FILE *fp_in, *fp_out;

   float numbers[MAX];
   float average, sum=0;
   int n, count, i, non_zeros;
   int end_of_file;


   /* open the files             */
   /* no checking for the moment */

   fp_in = fopen("input.txt", "r");
   fp_out = fopen("output.txt", "w");


   /* read until we reach the end of file ... version A */
   /* store all the numbers in an array                 */

   count= 0;
   end_of_file = fscanf(fp_in, "%d", &n);
   while (end_of_file != EOF) 
   { 
      numbers[count] = n;
      count = count + 1;
      end_of_file = fscanf(fp_in, "%d", &n);
   } 

   /* the integers are in the array numbers and the variable count */
   /* hold the number we read                                      */

   /* find the average but ignore the zeros */

   sum = 0;
   non_zeros = 0;
   for (i=0; i<count; i++)
   { 
     if (numbers[i] != 0) {
        sum = sum + numbers[i];
        non_zeros = non_zeros + 1;
     } 
   }
   average = sum / non_zeros; 


   /* replace the zero with the average */

   for (i=0; i<count; i++)
   {
     if (numbers[i] == 0) {
        numbers[i]= average;
     }
   } 
 

   /* write out all the numbers to the output file */

   for (i=0; i<count; i++)
   {
     fprintf(fp_out, "%f ", numbers[i]);
   } 
 
   fclose(fp_in);
   fclose(fp_out);
}
/* Program to read a file of integer numbers, 5 per line        */
/* the 5 numbers represent the x, y, r, g, b values of a point  */
/* Each point is stored in an array                             */
/* Write out the r, g, b values of each point to an output file */
/*                                                              */
/* Input file: points.txt                                       */
/* Output file: colours.txt                                     */
/*                                                              */
/* NOTE: this program is intended to illustrate the use of      */
/*       structures in C                                        */ 

#include <stdio.h> 

main() {
  
   /*** define structure types ***/

   struct colour {
      int red;
      int green;
      int blue;
   }; 

   struct point {
      int x;
      int y;
      struct colour clr;
   }; 

   FILE *fin, *fout;

   struct point ps[100];  /* assume a maximum of 100 points in the input file */

   int temp_r, temp_g, temp_b, temp_x, temp_y,  i, count;

   fin = fopen("points.txt", "r");
   if (fin == 0) {
      printf("Error ... can't open file points.txt\n");
      exit(0);
   } 

   fout = fopen("colours.txt", "w");
   if (fout == 0) {
      printf("Error ... can't open file colours.txt\n");
      exit(0);
   } 

   /*  files are open so now we read in the point information */

   i = 0;

   while (fscanf(fin, "%d %d %d %d %d", &temp_x, &temp_y, 
                                        &temp_r, &temp_g, &temp_b) != EOF)   {

       /* store the values read in my array of points */

       ps[i].x  = temp_x;
       ps[i].y  = temp_y;
       ps[i].clr.red  = temp_r;
       ps[i].clr.green  = temp_g;
       ps[i].clr.blue  = temp_b;

       i++;
   }

   /* remember how many points we read */

   count = i;

   /* now write out just the rgb values to the output file */

   for (i=0; i<count; i++) {
      fprintf(fout, "%d %d %d \n", ps[i].clr.red, ps[i].clr.green, ps[i].clr.blue);
   }
   fclose(fin);
   fclose(fout);
} 
/* Program to read a file of integer numbers, 5 per line        */
/* the 5 numbers represent the x, y, r, g, b values of a point  */
/* Each point is stored in an array                             */
/* Remove all duplicate points (i.e. points with the same x y   */
/* value.                                                       */
/* Write out the x, y, r, g, b values of each point to an       */
/* file                                                         */
/*                                                              */
/* Input file: points.txt                                       */
/* Output file: new_points.txt                                  */
/*                                                              */
/* NOTE: this program is intended to illustrate the use of      */
/*       structures in C                                        */ 

#include <stdio.h>

main() {
  
   /*** define structure types ***/

   struct colour {
      int red;
      int green;
      int blue;
   }; 
 
   struct point {
      int x;
      int y;
      struct colour clr;
   }; 

   FILE *fin, *fout;
   struct point ps[100];  /* assume a maximum of 100 points in the input file */
   int temp_r, temp_g, temp_b, temp_x, temp_y,  i, j, k, count;

   fin = fopen("points.txt", "r");
   if (fin == 0) {
      printf("Error ... can't open file points.txt\n");
      exit(0);
   } 

   fout = fopen("new_points.txt", "w");
   if (fout == 0) {
      printf("Error ... can't open file colours.txt\n");
      exit(0);
   } 

   /*  files are open so now we read in the point information */

   i = 0;
   while (fscanf(fin, "%d %d %d %d %d", &temp_x, &temp_y, 
                                        &temp_r, &temp_g, &temp_b) != EOF)   {

       /* store the values read in my array of points */

       ps[i].x  = temp_x;
       ps[i].y  = temp_y;
       ps[i].clr.red  = temp_r;
       ps[i].clr.green  = temp_g;
       ps[i].clr.blue  = temp_b;

       i++;
   }

   /* remember how many points we read */

   count = i;

   /*** this section eliminates the duplicate values ***/

   /* look at each element in turn */

   for (i=0; i<count; i++) {

       /* check for duplicates in all the remaining elements */

       for (j=i+1; j<count; j++)  {
          if ((ps[j].x == ps[i].x)  &&  (ps[j].y == ps[i].y))  {

             /* we have found duplicate so shift all the rest */

             for (k=j; k<count-1; k++) {
                ps[k] = ps[k+1];
             }
             count = count - 1;
             j--;  /* decrement j so that when it is incremented in the     */
                   /* for loop it will still index the same element,        */
                   /* i.e. the element that was shifted into the j position */
          }
       } 
   }

   /* now write out the x, y, r, g, b values to the output file */

   for (i=0; i<count; i++) {
      fprintf(fout, "%5d %5d %5d %5d %5d \n", 
                    ps[i].x, ps[i].y, ps[i].clr.red, ps[i].clr.green, ps[i].clr.blue);
   } 
   fclose(fin);
   fclose(fout);
}