C Programming

Suggested Model Answers


Exercise C1 The program output is,

Prog1

	Programming in C is easy.
	And so is Pascal.

Prog2

	The black dog was big. The cow jumped over the moon.

Prog3


	Hello...
	..oh my
	...when do i stop?


Exercise C2  Typical program output is,

	The sum of 35 and 18 is 53


Exercise C3  Invalid variable names,

	value$sum	- must be an underscore, $ sign is illegal
	exit flag	- no spaces allowed
	3lotsofmoney	- must start with a-z or an underscore
	char		- reserved keyword

When  %X\n is used, the hex digits a to f become A to F


Exercise C4  Constants

	#define smallvalue  0.312
	#define letter      'W'
	#define smallint    37


Exercise C5

	The % of 50 by 10 is 0.00



Exercise C6

	#include <stdio.h>

	main ()
	{
		int  n = 1, t_number = 0;

		for ( ; n <= 200; n++ )
			t_number = t_number + n;

		printf("The 200th triangular number is %d\n", t_number);
	}


Exercise C7

	a == 2	this is an equality test
	a  = 2	this is an assignment

	/* program which illustrates relational assignments */
	#include <stdio.h>

	main()
	{
		int val1 = 50, val2 = 20, sum = 0;

		printf("50 + 20 is %d\n", val1 + val2 );
		printf("50 - 20 is %d\n", val1 - val2 );
		printf("50 * 20 is %d\n", val1 * val2 );
		printf("50 / 20 is %d\n", val1 / val2 );
	}


Exercise C8

	Prints result with two leading places


Exercise C9

	main() 
	{
		int  n = 1, t_number = 0, input;

		printf("Enter a number\n");
		scanf("%d", &input);
		for( ; n <= input; n++ )
			t_number = t_number + n;

		printf("The triangular_number of %d is %d\n", input, t_number);
	}



Exercise C10

        #include <stdio.h>

        main()
        {
                int grade;      /* to hold the entered grade */
                float average;  /* the average mark */
                int loop;       /* loop count */
                int sum;        /* running total of all entered grades */
                int valid_entry;        /* for validation of entered grade */
                int failures;   /* number of people with less than 65 */

                sum = 0;        /* initialise running total to 0 */
                failures = 0;

                for( loop = 0; loop < 5; loop = loop + 1 ) 
                {
                        valid_entry = 0;
                        while( valid_entry == 0 ) 
                        {
                                printf("Enter mark (1-100):");
                                scanf(" %d", &grade );
                                if ((grade > 1 ) && (grade < 100 )) 
                                {
                                        valid_entry = 1;
                                }
                        }
                        if( grade < 65 )
                                failures++;
                        sum = sum + grade;
                }
                average = (float) sum / loop;
                printf("The average mark was %.2f\n", average );
                printf("The number less than 65 was %d\n", failures );
        }



Exercise C11

	#include <stdio.h>

	main ()
	{
	  int   invalid_operator = 0;
	  char  operator;
	  float number1, number2, result;

	  printf("Enter two numbers and an operator in the format\n");
	  printf(" number1  operator  number2\n");
	  scanf( "%f %c %f", &number1, &operator, &number2);

	  switch( operator )
	  {
	    case '*' : result = number1 * number2; break;
	    case '-' : result = number1 - number2; break;
	    case '/' : result = number1 / number2; break;
	    case '+' : result = number1 + number2; break;
	    default  : invalid_operator = 1;
	  }

	  switch ( invalid_operator )
	  {
	    case 1:  printf("Invalid operator.\n");     break;
	    default: printf("%2.2f %c %2.2f is %2.2f\n",
	             number1,operator,number2,result);  break;
	  }
	}


Exercise C12

	max_value = 5


Exercise C13

	#include <stdio.h>

	main()
	{
		static int m[][] = { {10,5,-3}, {9, 0, 0}, {32,20,1}, {0,0,8} };
		int row, column, sum;

		sum = 0;
		for( row = 0; row < 4; row++ ) 
			for( column = 0; column < 3; column++ ) 
				sum = sum + m[row][column];
		printf("The total is %d\n", sum );
	}


Exercise C14
 Variables declared type static are initialised to zero. They are created and 
initialised only once, in their own data segment. As such, they are permanent, 
and still remain once the function terminates (but disappear when the program 
terminates).

 Variables which are not declared as type static are type automatic by default.
C creates these on the stack, thus they can assume non zero values when created, 
and also disappear once the function that creates them terminates.


Exercise C15

	#include <stdio.h>
	int calc_result( int, int, int );

	int calc_result( int var1, int var2, int var3 )
	{
	  int sum;

	  sum = var1 + var2 + var3;
	  return( sum );           /* return( var1 + var2 + var3 ); */
	}

	main()
	{
	  int numb1 = 2, numb2 = 3, numb3=4, answer=0;

	  answer = calc_result( numb1, numb2, numb3 );
	  printf("%d + %d + %d = %d\n", numb1, numb2, numb3, answer);
	}



Exercise C16

	#include <stdio.h>

	int add2darray( int [][5], int );	/* function prototype */

	int add2darray( int array[][5], int rows )
	{
		int total = 0, columns, row;
		
		for( row = 0; row < rows; row++ )
			for( columns = 0; columns < 5; columns++ )
				total = total + array[row][columns];
		return total;
	}

	main()
	{
		int numbers[][] = { {1, 2, 35, 7, 10}, {6, 7, 4, 1, 0} };
		int sum;

		sum = add2darray( numbers, 2 );
		printf("the sum of numbers is %d\n", sum );
	}


Exercise C17

	time = time - 5;
	a = a * (b + c);



Exercise C18

	#include <stdio.h>
	void sort_array( int [], int );

	void sort_array( values, number_of_elements )
	int values[], number_of_elements;
	{
	  int index_pointer, base_pointer = 0, temp;

	  while ( base_pointer < (number_of_elements - 1) )
	  {
	    index_pointer = base_pointer + 1;
	    while ( index_pointer < number_of_elements )
	    {
	      if( values[base_pointer] > values[index_pointer] )
	      {
	        temp = values[base_pointer];
	        values[base_pointer]  = values[index_pointer];
	        values[index_pointer] = temp;
	      }
	      ++index_pointer;
	    }
	    ++base_pointer;
	  }
	}

	main ()
	{
	  static int array[] = { 4, 0, 8, 3, 2, 9, 6, 1, 7, 5 };
	  int number_of_elements = 10, loop_count = 0;

	  printf("Before the sort, the contents are\n");
	  for ( ; loop_count < number_of_elements; ++loop_count )
	    printf("Array[%d] is %d\n", loop_count,array[loop_count]);

	  sort_array( array, number_of_elements );

	  printf("After the sort, the contents are\n");
	  loop_count = 0;
	  for( ; loop_count < number_of_elements; ++loop_count )
	    printf("Array[%d] is %d\n", loop_count,array[loop_count]);
	}



Exercise C19

	#include <stdio.h>
	long int triang_rec( long int );

	long int triang_rec( long int number )
	{
	    long int result;

	    if( number == 0l )
	      result = 0l;
	    else
	      result = number + triang_rec( number - 1 );
	    return( result );
	}

	main ()
	{
	  int request;
	  long int triang_rec(), answer;

	  printf("Enter number to be calculated.\n");
	  scanf( "%d", &request);

	  answer = triang_rec( (long int) request );
	  printf("The triangular answer is %l\n", answer);
	}


	Note this version of function triang_rec

	#include <stdio.h>
	long int triang_rec( long int );

	long int triang_rec( long int number )
	{
	   return((number == 0l) ? 0l : number*triang_rec( number-1));
	}


Exercise C20

	b



Exercise C21

	#include <stdio.h>

	struct date {
		int day, month, year;
	};

	int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	struct date today, tommorrow;

	void gettodaysdate( void );

	void gettodaysdate( void )
	{
		int valid = 0;
		
		while( valid == 0 ) {
			printf("Enter in the current year (1990-1999)-->");
			scanf("&d", &today.year);
			if( (today.year < 1990) || (today.year > 1999) ) 
				printf("\007Invalid year\n");
			else
				valid = 1;
		}
		valid = 0;
		while( valid == 0 ) {
			printf("Enter in the current month (1-12)-->");
			scanf("&d", &today.month);
			if( (today.month < 1) || (today.month > 12) ) 
				printf("\007Invalid month\n");
			else
				valid = 1;
		}
		valid = 0;
		while( valid == 0 ) {
			printf("Enter in the current day (1-%d)-->", days[today.month-1]);
			scanf("&d", &today.day);
			if( (today.day < 1) || (today.day > days[today.month-1]) ) 
				printf("\007Invalid day\n");
			else
				valid = 1;
		}
	}

	main()
	{

		gettodaysdate();
		tommorrow = today;
		tommorrow.day++;
		if( tommorrow.day > days[tommorrow.month-1] ) {
			tommorrow.day = 1;
			tommorrow.month++;
			if( tommorrow.month > 12 )
				tommorrow.year++;
		}
		printf("Tommorrows date is %02d:%02d:%02d\n", \
			tommorrow.day, tommorrow.month, tommorrow.year );
	}

Exercise C22

	#include <stdio.h>

	struct  date  {        /* Global definition of date */
		int day, month, year;
	};

	main()
	{
		struct date dates[5];
		int i;

		for( i = 0; i < 5; ++i ) {
			printf("Please enter the date (dd:mm:yy)" );
			scanf("%d:%d:%d", &dates[i].day, &dates[i].month,
				&dates[i].year );
		}
	}


Exercise C23

	count = 10, x = 10;

	Q Q
	/ /
	( (


Exercise C24

	i1 = 5, i2 = 12, *p1 = 5; *p2 = 5


Exercise C25

	Name = Baked Beans
	ID = 312
	Price = 2.75


Exercise C26

	Name = Apple Pie
	ID = 123
	Price = 1.65

	Name = Greggs Coffee
	ID = 773
	Price = 3.20



Exercise C27

	#include <stdio.h>

	main( int argc, char *argv[])
	{
	  FILE *in_file, *out_file, *fopen();
	  int c;

	  if( argc != 3 )
	  {
	    printf("Incorrect, format is FCOPY source dest\n");
	    exit(2);
	  }
	  in_file = fopen( argv[1], "r");
	  if( in_file == NULL )  printf("Cannot open %s for reading\n", argv[1]);
	  else
	  {
	    out_file = fopen( argv[2], "w");
	    if ( out_file == NULL )   printf("Cannot open %s for writing\n", argv[2]);
	    else
	    {
	       printf("File copy program, copying %s to %s\n", argv[1],  argv[2]);
	       while ( (c=getc( in_file) ) != EOF )  putc( c, out_file );
	       putc( c, out_file);                  /* copy EOF */
	       printf("File has been copied.\n");
	       fclose( out_file);
	    }
	  fclose( in_file);
	  }
	}


Practise Exercise 1: Answers

1.	int  sum;

2.	char  letter;

3.	#define  TRUE  1

4.	float  money;

5.	double  arctan;

6.	int  total = 0;

7.	int loop;

8.	#define GST  0.125


Practise Exercise 2: Answers

1.	total = number1;

2.	sum = loop_count  +  petrol_cost;

3.	discount = total  /  10;

4.	letter = 'W';

5.	costing = (float) sum  / 0.25;


Practise Exercise 3: Answers

1.	printf("%d", sum );

2.	printf("Welcome\n");

3.	printf("%c", letter );

4.	printf("%f", discount );

5.	printf("%.2f", dump );

6.	scanf("%d", &sum );

7.	scanf("%f", &discount_rate );

8.	scanf("  %c", &operator );



Practise Exercise 4: Answers

1.	for(  loop = 1;  loop <= 10; loop++ )
	    printf("%d\n", loop );

2.	for(  loop = 1; loop <= 5; loop++ ) {
	   for( count = 1; count <= loop; count++ )
	      printf("%d", loop );
	   printf("\n");
	}

3.	total = 0;
	for(  loop = 10; loop <= 100; loop++ )
	   total = total + loop;

	or

	for(  loop = 10, total = 0; loop <= 100; loop++ )
	   total = total + loop;

5.	for( loop = 'A';  loop <= 'Z';  loop++ )
	   printf("%c", loop );


Practise Exercise 5:  Answers

1.	loop = 1;
	while( loop <= 10 ) {
		printf("%d", loop );
		loop++;
	}

2.	loop = 1;
	while ( loop <= 5 ) {
		count = 1;
		while( count <= loop )
			printf("%d", loop);
		printf("\n");
	}

3.	if( sum < 65 )
		printf("Sorry. Try again");

4.	if( total == good_guess )
		printf("%d", total );
	else
		printf("%d", good_guess );



Practise Exercise 6: Answers

1.	if( (sum == 10)  && (total < 20) )
		printf("incorrect.");

2.	if(  (flag == 1)  ||  (letter != 'X') )
		exit_flag = 0;
	else
		exit_flag = 1;

3.	switch( letter ) {
		case 'X' : sum = 0; break;
		case 'Z' : valid_flag = 1; break;
		case 'A' : sum = 1; break;
		default: printf("Unknown letter -->%c\n", letter ); break;
	}


Practise Exercise 7: Answers

1.	char  letters[10];

2.	letters[3] = 'Z';

3.	total = 0;
	for( loop = 0; loop < 5; loop++ )
		total = total + numbers[loop];

4.	float  balances[3][5];

5.	total = 0.0;
	for( row = 0; row < 3; row++ )
		for( column = 0; column < 5; column++ )
			total = total + balances[row][column];

6.	char  words[] = "Hello";

7.	strcpy(  stuff, "Welcome" );

8.	printf("%d", totals[2] );

9.	printf("%s", words );

10.	scanf(" %s", &words[0] );

	or

	scanf("  %s", words );

11.	for( loop = 0; loop < 5; loop++ )
	   scanf(" %c", &words[loop] );



Practise Exercise 8: Answers

1.	void  menu( void )
	{
		printf("Menu choices");
	}

2.	void  menu( void );

3.	void  print(  char  message[] )
	{
		printf("%s", message );
	}

4.	void  print(  char  [] );

5.	int  total( int  array[], int elements )
	{
		int  count, total = 0;
		for( count = 0; count < elements; count++ )
			total = total + array[count];
		return total;
	}

6.	int  total(  int  [],  int );


Practise Exercise 9: Answers

1.	struct  client {
		int     count;
		char  text[10];
		float  balance;
	};

2.	struct  date  today;

3.	struct  client  clients[10];

4.	clients[2].count = 10;

5.	printf("%s", clients[0].text );

6.	struct birthdays
	{
		struct time  btime;
		struct date  bdate;
	};



Practise Exercise 9A: Answers

1.	FILE *input_file;

2.	input_file = fopen( "results.dat", "rt" );

3.	if( input_file == NULL ) {
		printf("Unable to open file.\n");\
		exit(1);
	}

4. 	int ch, loop = 0;

	ch = fgetc( input_file );
	while( ch != '\n' ) {
		buffer[loop] = ch;
		loop++;
		ch = fgetc( input_file );
	}
	buffer[loop] = NULL;

5.	fclose( input_file );


Practise Exercise 10: Answers

1.	int  *address;

2.	temp = &balance;

3.	*letter = 'W';

4.	count = 20, *temp = 20, sum = 20

5.	char  *message = "Hello";

6.	array = (char *) getmem( 200 );


Practise Exercise 11: Answers

1.	struct  date  *dates;

2.	(*dates).day = 10;
	or
	dates->day = 10;

3.	struct  machine  {
		int  name;
		char  *memory;
	};

4.	mpu641->memory = (char *) NULL;

5.	mpu641->memory = CPUtype;

	[ 	-> means mpu641 is a pointer to a structure			]
	[	memory is a pointer, so is assigned an address (note &)		]
	[	the name of an array is equivalent to address of first element	]

6.	mpu641->name = 10;

	[ 	-> means mpu641 is a pointer to a structure		]
	[	name is a variable, so normal assignment is possible	]


7.	*(times->day) = 10;

	[ 	-> means times is a pointer to a structure		]
	[	day is a pointer, so to assign a value requires * operator	]
	[	*times->day is not quite correct				]
	[	using the pointer times, goto the day field		]	times->day
	[	this is an address					]	x
	[ 	let the contents of this address be equal to 10		]	*(x) = 10


8.	*(times[2]->month) = 12;



Practise Exercise 11a: Answers
1. Before call to editrecord()
        item.name = "Red Plum Jam"
        item.id = 0
        item.price = 0.0

2. After return from editrecord()
        item.name = "Baked Beans"
        item.id = 220
        item.price = 2.20

3. The final values of values, item.name, item.id, item.price
        item.name = "Baked Beans"
        item.id = 220
        item.price = 2.75



Practise Exercise 12: Answers

1.	struct  node  {
		int  data;
		struct  node  *next_node;
	};

2.	struct  node  node1, node2, node3;

3.	node1.next = &node2;
	node2.next = &node3;
	node3.next = (struct node *) NULL;

4.	while( list != (struct node *) NULL ) {
		printf("data = %d\n", list->data );
		list = list->next_node;
	}

5.	terminates the list at node2, effectively deleting node3 from the list.

6.	new_node->next = list->next;
	list->next = new_node;

7.	void  delete_node( struct node *head, struct node *delnode )
	{
		struct node *list;

		list = head;
		while( list->next != delnode ) {
			list = list->node;

		list->next = delnode->next;
	}

8.	void insert_node( struct node *head, struct node *newnode, struct node *prevnode )
	{
		struct node *list;

		list = head;
		while( list != prevnode )
			list = list->next;

		newnode->next = list->next;
		list->next = newnode;
	}



Practise Exercise 13: Answers

1.	FILE *input_file;

2.	input_file = fopen( "results.dat", "rt" );

3.	if( input_file == NULL ) {
		printf("Unable to open file\n");
		exit( 1 );
	}

4.	loop = 0;
	ch = fgetc( input_file );
	while( (ch != '\n') && (ch != EOF) ) {
		buffer[loop] = ch;
		loop++;
		ch = fgetc( input_file );
	}
	buffer[loop] = 0;

5.	fclose( input_file );

©Copyright B Brown. 1984-1998. All rights reserved.