• No results found

Lab 1. C++ Review. Objective:

N/A
N/A
Protected

Academic year: 2021

Share "Lab 1. C++ Review. Objective:"

Copied!
14
0
0

Loading.... (view fulltext now)

Full text

(1)

Lab 1

C++ Review

Objective:

To Revise and Practice following C++ Programming Features:

 Functions

 Structures

 Classes

 Function and class Templates

 File I/O

(2)

Fundamental Data Types

Category Available data types

Boolean bool

Character char signed char unsigned char

Signed integer short int long

Unsigned integer unsigned short unsigned unsigned long

Floating point float double long double

Named Constants

The value of these constants cannot be changed during program execution.

C style constants:

#define zero 0

C++ style constants:

const int zero = 0;

const float PI = 3.14159;

Type Aliases

Renaming existing datatypes:

typedef float real;

This means that “real” may now be used in place of “float”

Defining new datatypes based on existing datatypes:

typedef char* str;

This means “str” can be used in place of “char*”

(3)

Arithmetic Expressions

Binary operators: , , *, /, % Unary operators: +, , ++,   Usual precedence rules apply

Unary operators are right-associative: ++ X  means ++ (X ) Binary operators are left-associative: A / B * C means (A / B) * C Relational & Logical Expressions

Relational operators: <, >, <=, >=

Equality operators: = =, !=

Logical operators:

Unary: !

Binary: &&, | |

Examples:

(5 = = 4) && (a < b) // false, since 5 != 4 (5 = = 5) | | (a < b) // true, since 5 = = 5

Conditional Expressions

expression ? expression : expression

Executed like if  else statement, but has a value Example:

larger = (A > B) ? A : B;

(4)

Functions

A function is a group of statements that is executed when it is called from some point of the program.

Example 1.1

int max1( int X, int Y ) {

return (X > Y) ? X : Y; // result returned as function value

}

void max2( int X, int Y, int &Larger ) {

Larger = (X > Y) ? X : Y; // result returned by reference

}

void max3( int X, int Y, int *Larger )

{ *Larger = (X > Y) ? X : Y; // result returned by pointer

}

Structures

A structure is a group of data elements grouped together under one name. These data elements, known as members, can have different types.

struct Student {

char name[30];

int section;

float total_points;

};

Student class[30];

Student *ptr = class;

class[0].name is the same as ptr-> name

Initialization:

Student Ali = {“Ali Ahmed”, 8, 592.5};

 Structures may be copied with “=”

 Structures may be passed to functions by value

 Structures may be returned from functions

 Structures may be nested

 Arrays of structures may be defined

(5)

Classes

Class is the capsule that is used to encapsulate an abstract data type.

A class defines a new data type. You can create many objects of this type.

A class is composed of one or more members (data and functions).

Class definition usually placed in an include (.h) file for ease of use.

Example 1.2: A Complex Number Class

#include <iostream>

#include <math.h>

using namespace std;

class Complex { private:

float re; float im;

public:

Complex(float r,float i) {re = r; im = i;}

Complex(float r) {re = r; im = 0.0;}

~Complex() {};

double Magnitude() // calculate magnitude

{ return sqrt(re*re + Imag()*Imag()); }

float Real() {return re;} // return real part float Imag() {return im;} // return imaginary part

Complex operator+(Complex b)

{return Complex(re + b.re, im + b.im);}

Complex operator=(Complex b)

{re = b.re;im = b.im; return *this;}

};

int

main()

{

Complex a(1.0,1.0);

Complex *b = new Complex(5.0);

Complex c(0,0);

cout << "a real = " << a.Real() << “ a imaginary = “ << a.Imag() << endl;

cout << "b real = " << b->Real() << “ b imaginary = “ << b->Imag() << endl;

c = a + (*b);

cout << "c real = " << c.Real() << “ c imaginary = “ << c.Imag() << endl;

delete b;

return 0;

}

Exercise 1.1

Add a function to multiply two complex numbers using operator overloading.

(6)

Function Templates

Function templates are special functions that can operate with generic types. This allows us to create a function template whose functionality can be adapted to more than one type without repeating the entire code for each type.

In C++ this can be achieved using template parameters. A template parameter is a special kind of parameter that can be used to pass a type as argument: just like regular function parameters can be used to pass values to a function, template parameters allow to pass also types to a function. These function templates can use these parameters as if they were any other regular type.

The format for declaring function templates with type parameters is:

template <class identifier> function_declaration;

Example 1.3

#include <iostream>

using namespace std;

template <class T>

T GetMax (T a, T b) {

T result;

result = (a>b)? a : b;

return (result);

}

int main () { int i=5, j=6, k;

long l=10, m=5, n;

k=GetMax<int>(i, j);

n=GetMax<long>(l, m);

cout << k << endl;

cout << n << endl;

return 0;

}

(7)

Class Templates

A class can have members that use template parameters as types.

template <class T>

class mypair {

T values [2];

public:

mypair (T first, T second) {

values[0]=first; values[1]=second;

} };

This class serves to store two elements of any valid type. For example, if we wanted to declare an object of this class to store two integer values of type int with the values 115 and 36 we would write:

mypair<int> myobject (115, 36);

this same class would also be used to create an object to store any other type:

mypair<double> myfloats (3.0, 2.18);

(8)

Example 1.4

#include <iostream>

using namespace std;

template <class T>

class mypair {

T a, b;

public:

mypair (T first, T second) {a=first; b=second;}

T getmax ();

};

template <class T>

T mypair<T>::getmax () {

T retval;

retval = a>b? a : b;

return retval;

}

int main () {

mypair <int> myobject (100, 75);

cout << myobject.getmax();

return 0;

}

Exercise 1.2

Add a function to compute minimum of two numbers in the above class.

(9)

Example 1.5

#include <iostream>

using namespace std;

template <class T, int N>

class mysequence {

T memblock [N];

public:

void setmember (int x, T value);

T getmember (int x);

};

template <class T, int N>

void mysequence<T,N>::setmember (int x, T value) {

memblock[x]=value;

}

template <class T, int N>

T mysequence<T, N>::getmember (int x) {

return memblock[x];

}

int main () {

mysequence <int,5> myints;

mysequence <double,5> myfloats;

myints.setmember (0,100);

myfloats.setmember (3, 3.1416);

cout << myints.getmember(0) << '\n';

cout << myfloats.getmember(3) << '\n';

return 0;

}

(10)

File Input/Output

 Files are classified as containing either text (i.e. characters) or binary data

 May read and write numbers from/to text files: C++ does the necessary translations

 #include <fstream> // for C++ file I/O Character Input with fstream

ifstream infile; // define infile

infile.open( “MyData” ); // open “MyData” file if( !infile )

cout << “Can’t open ” << “MyData” << endl;

infile >> chr; // read character from “MyData” file into chr

infile.close( ); // close “MyData” file

Useful Functions for Character Input

infile.ignore( n ); // skip next n input characters chr = infile.get( ); // same as infile >> chr

while( infile.get( ) != ‘\n’ ) ... // loop until end of line while( infile.get( ) != EOF ) ... // loop until end of file while( infile >> chr ) ... // loop until end of file

Character Output with fstream

ofstream outfile( “MyOut” ); // define & open outfile outfile << chr; // write chr to “MyOut” file outfile.put( chr ); // same as outfile << chr

outfile.close( ); // close “MyOut” file

Numeric I/O with Text File and fstream

If numeric data is read to/written from a variable of numeric type, then >> translates the data into the appropriate numeric representation

If “MyData” file contains

5280 2.718 3.141592653 then

int ftPerMile;

float e;

double pi;

infile >> ftPerMile >> e >> pi;

stores input as int, float, and double.

(11)

Example 1.6: To count number of characters in a Text file.

#include <iostream>

#include <fstream>

using namespace std;

int main(void) {

ofstream outFile;

outFile.open("fout.txt");

ifstream inFile("fin.txt");

char ch;

int count = 0;

while(inFile.get(ch)) {

outFile << ch;

count++;

}

outFile << "\n\n Character count = " << count << endl;

inFile.close();

outFile.close();

return 0;

}

Exercise 1.3

Modify the above program to count number of words and number of sentences along with the characters.

(12)

Exercise 1.4

Assume that a file contains the midterm1, midterm2 and final exam scores and names of students of a class. Write a C++ program to read the input file and produce an output file containing the original and average scores for each student. Suppose that the weights of the exams are as follows:

midterm1 – 25%

midterm2 – 25%

final – 50%.

The average score of a student is calculated using the formula:

FIN MT

MT 1 0 . 25 2 0 . 5 25

.

0

 

Solution:

#include <iostream>

#include <fstream>

using namespace std;

int main ( )

{ char name[10];

float mt1, mt2, final, avg;

ifstream fin ; //Create file input stream object ofstream fout ; //Create file output stream object

fin.open ( "input.dat") ; //Open input file fout.open ( "output.dat"); //Open output file

while (!fin.eof()) //Read data from input file {

fin >> name >> mt1 >> mt2 >> final;

avg = 0.25*mt1 + 0.25*mt2 + 0.5*final ; fout << name << '\t' << avg << endl ; //Write result to output file

}

fin.close ( ) ; //Close input file

fout.close ( ) ; //Close output file

}

(13)

Exercise 1.5

a) Declare a class named House for a real estate locator service. The following information should be included:

Owner: (a string of up to 20 characters) Address: (a string of up to 20 characters) Bedrooms: (an integer)

Price (floating point)

b) Declare available to be an array of 100 objects of class House.

c) Write a function to read values into the members of an object of House.

d) Write a driver program to test the data structures and the functions you have developed.

The driver program should read in house entries into the available array. After the code for entering the data, you should write code to output the data that you have entered to verify that it is correct.

Your program should look like this:

Enter Owner : M. Khan

Enter Address : G-9, Islamabad Number of Bedrooms ? : 4 Price : 4500000

Enter another house? N The output should look like:

Owner Address Bedrooms Price

M. Khan G-9, Islamabad 4 4500000

(14)

Exercise 1.6

Write a student grades "database" program. It will read data of students from a file and will let the user perform various operations on the data. You will have to store the student data in an array of objects.

Input:

The input file will look like:

4 // number of students

3 // number of grades (per student)

Hassan Khan 99 87 90 // name grade grade ... grade Sara Nazir 90 98 99

Ali Zaidi 55 43 0

Raza Ahmad 100 100 100

Data structure:

You will store all the information in an array of "student" objects. You may use the following class definition:

class student { private:

char name[30];

int grades[10];

float average;

public:

. . . };

Output:

Your program should work as follows:

 Ask the user for the filename and open the file.

 Read in the input from the file and store it in the student array.

 Compute and store an average for every student.

 Display the student data in tabular (formatted) form.

 Compute the class average.

 Compute the highest and lowest average grades.

 List all the students whose average grade is less than the class average.

References

Related documents

To accommodate this, the InetAddress class provides a method named getAllByName that can be used to get an array of references to InetAddress objects representing all (or at least