Functions-Data Structure Programming-Lab Task, Exercises of Data Structures and Algorithms

This is code assigned in lab of course. It was assigned by Jay Singh at Aligarh Muslim University for Data Structure course. It includes: Simple, Function, Program, Prototype, Definition, Argument, Global, Variable, Parameter, Return, Statement, Sums

Typology: Exercises

2011/2012

Uploaded on 07/11/2012

dhanvant
dhanvant 🇮🇳

4.9

(9)

89 documents

1 / 12

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
6.096 Problem Set 2
For this p r ob l em set, you shou l d be able to put all your code for each section into a single
source/text file (though you may have to comment out earlier parts of your solution to test
later parts). Clearly mark each subsection with comments, and submi t a .zip file containing
all your source/t ext files.
1 Additional Material
1.1 Functions
1.1.1 Default Arguments
Say you have a function with 1 argument, but that argument is usually the same. For
instance, say we want a function that prints a message n times, but most of the time it will
only need to print it once:
1 vo id printNTimes( cha r * ms g , int n ) {
2 fo r ( int i = 0; i < n ; + + i ) {
3 co u t < < m sg ;
4 }
5 }
Rather than writi n g printNTimes("Some message", 1); every time, C++ allows de-
fault arguments to be defined for a function:
1 vo i d printNTimes ( ch a r * msg , in t n = 1 ) {
2 fo r ( int i = 0; i < n ; + + i) {
3 co u t < < m sg ;
4 }
5 }
Declaring the function argument as int n = 1 allows us to call the function with printNTimes("Some
message");. The compiler automatically inserts 1 as the second argument.
You may have multiple default arguments for a function:
1 vo i d printNTimes ( cha r * m s g = "\ n " , i nt n = 1) {
2 fo r ( int i = 0; i < n ; + + i ) {
3 co u t < < m sg ;
1
Docsity.com
pf3
pf4
pf5
pf8
pf9
pfa

Partial preview of the text

Download Functions-Data Structure Programming-Lab Task and more Exercises Data Structures and Algorithms in PDF only on Docsity!

6.096 Problem Set 2

For this problem set, you should be able to put all your code for each section into a single

source/text file (though you may have to comment out earlier parts of your solution to test

later parts). Clearly mark each subsection with comments, and submit a .zip file containing

all your source/text files.

1 Additional Material 1.1 Functions

1.1.1 Default Arguments

Say you have a function with 1 argument, but that argument is usually the same. For

instance, say we want a function that prints a message n times, but most of the time it will

only need to print it once:

1 void printNTimes ( char * msg , int n ) { 2 for ( int i = 0; i < n ; ++ i ) { 3 cout << msg ; 4 } 5 }

Rather than writing printNTimes("Some message", 1); every time, C++ allows de

fault arguments to be defined for a function:

1 void printNTimes ( char * msg , int n = 1) { 2 for ( int i = 0; i < n ; ++ i ) { 3 cout << msg ; 4 } 5 }

Declaring the function argument as int n = 1 allows us to call the function with printNTimes("Some

message");. The compiler automatically inserts 1 as the second argument.

You may have multiple default arguments for a function:

1 void printNTimes ( char * msg = " \ n " , int n = 1) { 2 for ( int i = 0; i < n ; ++ i ) { 3 cout << msg ;

Now, to print one newline, we can simply write printNTimes();. However, C++ does

not allow skipping arguments, so we could not print k newlines by writing printNTimes(k);.

To do that, we’d need to say printNTimes("\n", k);.

1.1.2 Constant Arguments

It’s often useful to specify that arguments to a function should be treated as constants. As

with regular variables, we can declare function arguments to be const:

1 void print ( const int n ) { 2 cout << n ; 3 }

This is particularly useful when we are passing values by reference to a function, but

don’t want to allow the function to make any changes to the original value:

1 void print ( const long & x ) { // Pass - by - reference avoids overhead 2 // of copying large number 3 cout << x ; 4 } 5 6 int main () { 7 long x = 234923592; 8 print ( x ) ; // We are guaranteed that x 9 // will not be changed by this 10 return 0; 11 }

In general, if you know a value shouldn’t be changing (particularly a function argument),

you should declare it const. That way, the compiler can catch you if you messed up and

tried to change it somewhere.

1.1.3 Random Number Generation Functions

The C++ standard libraries include the rand() function for generating random numbers

between 0 and RAND MAX (an integer constant defined by the compiler). These numbers

are not truly random; they are a random-seeming but deterministic sequence based on a

particular “seed” number. To make sure we don’t keep getting the same random-number

sequence, we generally use the current time as the seed number. Here is an example of how

this is done:

1 # include < iostream > 2 # include < cstdlib > // C standard library 3 // defines rand () , srand () , RAND_MAX

6 int main () { 7 int * randNumPtr = getRandNumPtr () ; 8 cout << * randNumPtr ; // ERROR 9 return 0; 10 }

Line 8 will likely crash the program or print a strange value, since it is trying to access

memory that is no longer in use – x from getRandNumPtr has been deallocated.

1.3 Arrays and Pointers

1.3.1 Arrays of Pointers

Arrays can contain any type of value, including pointers. One common application of this

is arrays of strings, i.e., arrays of char *’s. For instance:

1 const char * suitNames [] = { " Clubs " , " Diamonds " , " Spades " , " Clubs " }; 2 cout << " Enter a suit number (1 -4) : " ; 3 unsigned int suitNum ; 4 cin >> suitNum ; 5 if ( suitNum <= 3) 6 cout << suitNames [ suitNum - 1];

1.3.2 Pointers to Array Elements

It is important to note that arrays in C++ are pointers to continuous regions in memory.

Therefore the following code is valid:

const int ARRAY_LEN = 100; int arr [ ARRAY_LEN ]; int * p = arr ; int * q = & arr [0];

Now p and q point to exactly the same location as arr (ie. arr[0]), and p, q and arr

can be used interchangeably. You can also make a pointer to some element in the middle of

an array (similarly to q):

1 int * z = & arr [10]; 1.4 Global Scope

We discussed in lecture how variables can be declared at global scope or file scope – if

a variable is declared outside of any function, it can be used anywhere in the file. For

anything besides global constants, this is usually a bad idea; if you need to access the same

variable from multiple functions, most often you should simply pass the variable around as

an argument between the functions. Avoid global variables when you can.

2 A Simple Function

What would the following program print out? (Answer without using a computer.) [5 points]

1 void f ( const int a = 5) 2 { 3 std :: cout << a *2 << " \ n " ; 4 } 5 6 int a = 123; 7 int main () 8 { 9 f (1) ; 10 f ( a ) ; 11 int b = 3; 12 f ( b ) ; 13 int a = 4; 14 f ( a ) ; 15 f () ; 16 } 3 Fix the Function

Identify the errors in the following programs, and explain how you would correct them to

make them do what they were apparently meant to do. [8 points – 1 point per fix]

1 # include < iostream > 2 3 int main () { 4 printNum (35) ; 5 return 0; 6 } 7 8 void printNum ( int number ) { std :: cout << number ; }

(Give two ways to fix this code.)

1 # include < iostream >

3 int sum ( const int x , const int y ) { 4 return x + y ; 5 } 6 7 int main () { 8 std :: cout << sum (1 , 2 , 3) ; // Should print 6 9 return 0; 10 }

1 # include < iostream > 2 const int ARRAY_LEN = 10; 3 4 int main () { 5 int arr [ ARRAY_LEN ] = {10}; // Note implicit initialization of 6 // other elements 7 int * xPtr = arr , yPtr = arr + ARRAY_LEN - 1; 8 std :: cout << * xPtr << ’ ’ << * yPtr ; // Should output 10 0 9 return 0; 10 } 4 Sums

Make sure to use const arguments where appropriate throughout this problem (and all the

others).

Write a single sum function that returns the sum of two integers. Also write the equivalent

function for taking the sum of two doubles. [4 points]

Explain why, given your functions from part 1, sum(1, 10.0) is a syntax error. (Hint: Think

about promotion and demotion – the conversion of arguments between types in a function

call.) [1 point]

Write 2 more functions such that you can find the sum of anywhere between 2 and 4 integers

by writing sum(num1, num2, ...). [2+2 points]

Now write just one function that, using default arguments, allows you to take the sum of

anywhere between 2 and 4 integers. What would happen if you put both this definition and

your 3-argument function from part 3 into the same file, and called sum(3, 5, 7)? Why?

[5 + 1 points]

Write a single sum function capable of handling an arbitrary number of integers. It should

take two arguments, include a loop, and return an integer. (Hint: What data types can you

use to represent an arbitrarily large set of integers in two arguments?) [5 points]

Now rewrite your function from 4.5 to use recursion instead of a loop. The function signature

should not change. Thinking about pointer arithmetic may help you. [8 points]

5 Calculating π

This problem is a bit tricky, but it’s a good exercise in writing a program that actually does

something neat. It will also familiarize you with using random numbers.

Using a “Monte Carlo” method – that is, a randomized simulation – we can compute a

good approximation of π. Consider a circle of radius 1, centered on the origin and circum

scribed by a square, like so:

}^1

Imagine that this is a dartboard and that you are tossing darts at it randomly. With

enough darts, the ratio of darts in the circle to total darts thrown should be the ratio between

the area of the circle (call it a) and the area of the square (4): total^ darts^4

darts in circle =^ a. We can use

this ratio to calculate a, from which we can then find π = ra 2.

We can simplify the math by only considering the first quadrant, calculating the ratio of

the top right square’s area to the area of the single quadrant. Thus, we will actually find a 4 ,

a

and then compute π = 4 × r^42.

We’ll build a function step by step to do all this.

Your function should transpose the WIDTH × LENGTH matrix in input, placing the LENGTH ×

WIDTH transposed matrix into output. (See http://en.wikipedia.org/wiki/Transpose#Examples

for examples of what it means to transpose a matrix.) [6 points]

What would happen if, instead of having output be an “out argument,” we simply declared

a new array within transpose and returned that array? [2 points]

Rewrite your function from part 2 to use pointer-offset notation instead of array-subscript

notation. [3 points]

7 Pointers and Strings

Write a function that returns the length of a string (char *), excluding the final NULL

character. It should not use any standard-library functions. You may use arithmetic and

dereference operators, but not the indexing operator ([]). [5 points]

Write a function that swaps two integer values using call-by-reference. [3 points]

Rewrite your function from part 2 to use pointers instead of references. [4 points]

Write a function similar to the one in part 3, but instead of swapping two values, it swaps

two pointers to point to each other’s values. Your function should work correctly for the

following example invocation:

1 int x = 5 , y = 6; 2 int * ptr1 = &x , * ptr2 = & y ; 3 swap (& ptr1 , & ptr2 ) ; 4 cout << * ptr1 << ’ ’ << * ptr2 ; // Prints "6 5"

[5 points]

Assume that the following variable declaration has already been made:

1 char * oddOrEven = " Never odd or even " ;

Write a single statement to accomplish each of the following tasks (assuming for each one

that the previous ones have already been run). Make sure you understand what happens in

each of them. [8 points – 1 point each]

1. Create a pointer to a char value named nthCharPtr pointing to the 6th character of

oddOrEven (remember that the first item has index 0). Use the indexing operator.

2. Using pointer arithmetic, update nthCharPtr to point to the 4th character in oddOrEven.

3. Print the value currently pointed to by nthCharPtr.

4. Create a new pointer to a pointer (a char **) named pointerPtr that points to

nthCharPtr.

5. Print the value stored in pointerPtr.

6. Using pointerPtr, print the value pointed to by nthCharPtr.

7. Update nthCharPtr to point to the next character in oddOrEven (i.e. one character

past the location it currently points to).

8. Using pointer arithmetic, print out how far away from the character currently pointed

to by nthCharPtr is from the start of the string.