Author: Saim Khalid

  • C++ Strings

    C++ provides following two types of string representations −

    • The C-style character string.
    • The string class type introduced with Standard C++.

    The C-Style Character String

    The C-style character string originated within the C language and continues to be supported within C++. This string is actually a one-dimensional array of characters which is terminated by a null character ‘\0’. Thus a null-terminated string contains the characters that comprise the string followed by a null.

    The following declaration and initialization create a string consisting of the word “Hello”. To hold the null character at the end of the array, the size of the character array containing the string is one more than the number of characters in the word “Hello.”

    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    

    If you follow the rule of array initialization, then you can write the above statement as follows −

    char greeting[] = "Hello";
    

    Following is the memory presentation of above defined string in C/C++ −

    String Presentation in C/C++

    Actually, you do not place the null character at the end of a string constant. The C++ compiler automatically places the ‘\0’ at the end of the string when it initializes the array. Let us try to print above-mentioned string −

    #include <iostream>
    
    using namespace std;
    
    int main () {
    
       char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    
       cout << "Greeting message: ";
       cout << greeting << endl;
    
       return 0;
    }

    When the above code is compiled and executed, it produces the following result −

    Greeting message: Hello
    

    C++ supports a wide range of functions that manipulate null-terminated strings −

    Sr.NoFunction & Purpose
    1strcpy(s1, s2);Copies string s2 into string s1.
    2strcat(s1, s2);Concatenates string s2 onto the end of string s1.
    3strlen(s1);Returns the length of string s1.
    4strcmp(s1, s2);Returns 0 if s1 and s2 are the same; less than 0 if s1<s2; greater than 0 if s1>s2.
    5strchr(s1, ch);Returns a pointer to the first occurrence of character ch in string s1.
    6strstr(s1, s2);Returns a pointer to the first occurrence of string s2 in string s1.

    Following example makes use of few of the above-mentioned functions −

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int main () {
    
       char str1[10] = "Hello";
       char str2[10] = "World";
       char str3[10];
       int  len ;
    
       // copy str1 into str3
       strcpy( str3, str1);
       cout << "strcpy( str3, str1) : " << str3 << endl;
    
       // concatenates str1 and str2
       strcat( str1, str2);
       cout << "strcat( str1, str2): " << str1 << endl;
    
       // total lenghth of str1 after concatenation
       len = strlen(str1);
       cout << "strlen(str1) : " << len << endl;
    
       return 0;
    }

    When the above code is compiled and executed, it produces result something as follows −

    strcpy( str3, str1) : Hello
    strcat( str1, str2): HelloWorld
    strlen(str1) : 10
    

    The String Class in C++

    The standard C++ library provides a string class type that supports all the operations mentioned above, additionally much more functionality. Let us check the following example −

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main () {
    
       string str1 = "Hello";
       string str2 = "World";
       string str3;
       int  len ;
    
       // copy str1 into str3
       str3 = str1;
       cout << "str3 : " << str3 << endl;
    
       // concatenates str1 and str2
       str3 = str1 + str2;
       cout << "str1 + str2 : " << str3 << endl;
    
       // total length of str3 after concatenation
       len = str3.size();
       cout << "str3.size() :  " << len << endl;
    
       return 0;
    }

    When the above code is compiled and executed, it produces result something as follows −

    str3 : Hello
    str1 + str2 : HelloWorld
    str3.size() :  10
    
  • Internal Sort

    Sorting of data in a file or merging of two or more files is a common necessity in almost all business-oriented applications. Sorting is used for arranging records either in ascending or descending order, so that sequential processing can be performed. There are two techniques which are used for sorting files in COBOL −

    • External sort is used to sort files by using the SORT utility in JCL. We have discussed this in the JCL chapter. As of now, we will focus on internal sort.
    • Internal sort is used to sort files within a COBOL program. SORT verb is used to sort a file.

    Sort Verb

    Three files are used in the sort process in COBOL −

    • Input file is the file which we have to sort either in ascending or descending order.
    • Work file is used to hold records while the sort process is in progress. Input file records are transferred to the work file for the sorting process. This file should be defined in the File-Section under SD entry.
    • Output file is the file which we get after the sorting process. It is the final output of the Sort verb.

    Syntax

    Following is the syntax to sort a file −

    SORT work-file ON ASCENDING KEY rec-key1
       [ON DESCENDING KEY rec-key2]
    USING input-file GIVING output-file.
    

    SORT performs the following operations −

    • Opens work-file in I-O mode, input-file in the INPUT mode and output-file in the OUTPUT mode.
    • Transfers the records present in the input-file to the work-file.
    • Sorts the SORT-FILE in ascending/descending sequence by rec-key.
    • Transfers the sorted records from the work-file to the output-file.
    • Closes the input-file and the output-file and deletes the work-file.

    Example

    In the following example, INPUT is the input file which needs to be sorted in ascending order −

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
    
      SELECT INPUT ASSIGN TO IN.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.
    DATA DIVISION. FILE SECTION. FD INPUT.
      01 INPUT-STUDENT.
         05 STUDENT-ID-I PIC 9(5).
         05 STUDENT-NAME-I PIC A(25).
    FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
    SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).
    PROCEDURE DIVISION. SORT WORK ON ASCENDING KEY STUDENT-ID-O USING INPUT GIVING OUTPUT. DISPLAY 'Sort Successful'. STOP RUN.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO
    //IN DD DSN = INPUT-FILE-NAME,DISP = SHR
    //OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR
    //WRK DD DSN = &&TEMP

    When you compile and execute the above program, it produces the following result −

    Sort Successful
    

    Merge Verb

    Two or more identically sequenced files are combined using Merge statement. Files used in the merge process −

    • Input Files − Input-1, Input-2
    • Work File
    • Output File

    Syntax

    Following is the syntax to merge two or more files −

    MERGE work-file ON ASCENDING KEY rec-key1
       [ON DESCENDING KEY rec-key2]
    
    USING input-1, input-2 GIVING output-file.

    Merge performs the following operations −

    • Opens the work-file in I-O mode, input-files in the INPUT mode and output-file in the OUTPUT mode.
    • Transfers the records present in the input-files to the work-file.
    • Sorts the SORT-FILE in ascending/descending sequence by rec-key.
    • Transfers the sorted records from the work-file to the output-file.
    • Closes the input-file and the output-file and deletes the work-file.

    Example

    In the following example, INPUT1 and INPUT2 are the input files which are to be merged in ascending order −

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
    
      SELECT INPUT1 ASSIGN TO IN1.
      SELECT INPUT2 ASSIGN TO IN2.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.
    DATA DIVISION. FILE SECTION. FD INPUT1.
      01 INPUT1-STUDENT.
         05 STUDENT-ID-I1 PIC 9(5).
         05 STUDENT-NAME-I1 PIC A(25).
    FD INPUT2.
      01 INPUT2-STUDENT.
         05 STUDENT-ID-I2 PIC 9(5).
         05 STUDENT-NAME-I2 PIC A(25).
    FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
    SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).
    PROCEDURE DIVISION. MERGE WORK ON ASCENDING KEY STUDENT-ID-O USING INPUT1, INPUT2 GIVING OUTPUT. DISPLAY 'Merge Successful'. STOP RUN.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO
    //IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR
    //IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR
    //OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR
    //WRK DD DSN = &&TEMP

    When you compile and execute the above program, it produces the following result −

    Merge Successful
    
  • C++ Arrays

    C++ provides a data structure, the array, which stores a fixed-size sequential collection of elements of the same type. An array is used to store a collection of data, but it is often more useful to think of an array as a collection of variables of the same type.

    Instead of declaring individual variables, such as number0, number1, …, and number99, you declare one array variable such as numbers and use numbers[0], numbers[1], and …, numbers[99] to represent individual variables. A specific element in an array is accessed by an index.

    All arrays consist of contiguous memory locations. The lowest address corresponds to the first element and the highest address to the last element.

    Declaring Arrays

    To declare an array in C++, the programmer specifies the type of the elements and the number of elements required by an array as follows −

    type arrayName [ arraySize ];
    

    This is called a single-dimension array. The arraySize must be an integer constant greater than zero and type can be any valid C++ data type. For example, to declare a 10-element array called balance of type double, use this statement −

    double balance[10];
    

    Initializing Arrays

    You can initialize C++ array elements either one by one or using a single statement as follows −

    double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
    

    The number of values between braces { } can not be larger than the number of elements that we declare for the array between square brackets [ ]. Following is an example to assign a single element of the array −

    If you omit the size of the array, an array just big enough to hold the initialization is created. Therefore, if you write −

    double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};
    

    You will create exactly the same array as you did in the previous example.

    balance[4] = 50.0;
    

    The above statement assigns element number 5th in the array a value of 50.0. Array with 4th index will be 5th, i.e., last element because all arrays have 0 as the index of their first element which is also called base index. Following is the pictorial representaion of the same array we discussed above −

    Array Presentation

    Accessing Array Elements

    An element is accessed by indexing the array name. This is done by placing the index of the element within square brackets after the name of the array. For example −

    double salary = balance[9];
    

    The above statement will take 10th element from the array and assign the value to salary variable. Following is an example, which will use all the above-mentioned three concepts viz. declaration, assignment and accessing arrays −

    #include <iostream>
    using namespace std;
     
    #include <iomanip>
    using std::setw;
     
    int main () {
    
       int n[ 10 ]; // n is an array of 10 integers
     
       // initialize elements of array n to 0          
       for ( int i = 0; i < 10; i++ ) {
    
      n&#91; i ] = i + 100; // set element at location i to i + 100
    } cout << "Element" << setw( 13 ) << "Value" << endl; // output each array element's value for ( int j = 0; j < 10; j++ ) {
      cout &lt;&lt; setw( 7 )&lt;&lt; j &lt;&lt; setw( 13 ) &lt;&lt; n&#91; j ] &lt;&lt; endl;
    } return 0; }

    This program makes use of setw() function to format the output. When the above code is compiled and executed, it produces the following result −

    Element        Value
    
      0          100
      1          101
      2          102
      3          103
      4          104
      5          105
      6          106
      7          107
      8          108
      9          109

    Arrays in C++

    Arrays are important to C++ and should need lots of more detail. There are following few important concepts, which should be clear to a C++ programmer −

    Sr.NoConcept & Description
    1Multi-dimensional arraysC++ supports multidimensional arrays. The simplest form of the multidimensional array is the two-dimensional array.
    2Pointer to an arrayYou can generate a pointer to the first element of an array by simply specifying the array name, without any index.
    3Passing arrays to functionsYou can pass to the function a pointer to an array by specifying the array’s name without an index.
    4Return array from functionsC++ allows a function to return an array.
  • Subroutines

    Cobol subroutine is a program that can be compiled independently but cannot be executed independently. There are two types of subroutines: internal subroutines like Perform statements and external subroutines like CALL verb.

    Call Verb

    Call verb is used to transfer the control from one program to another program. The program that contains the CALL verb is the Calling Program and the program being called is known as the Called Program. Calling program execution will halt until the called program finishes the execution. Exit Program statement is used in the Called program to transfer the control back.

    Called Program Constraints

    Following are the called program requirements −

    • Linkage section must be defined in the called program. It consists of data elements passed in the program. The data items should not have Value clause. PIC clause must be compatible with the variables passed through the calling program.
    • Procedure division using has a list of variables passed from the calling program and the order must be same as mentioned in the Call verb.
    • Exit program statement is used in the called program to transfer the control back. It must be the last statement in the called program.

    The parameters can be passed between programs in two ways −

    • By Reference
    • By Content

    Call By Reference

    If the values of variables in the called program are modified, then their new values will reflect in the calling program. If BY clause is not specified, then variables are always passed by reference.

    Syntax

    Following is the syntax of calling subroutine by reference −

    CALL sub-prog-name USING variable-1, variable-2.
    

    Example

    Following example is the MAIN calling program and UTIL is the called program −

    IDENTIFICATION DIVISION.
    PROGRAM-ID. MAIN.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
       01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
    
    PROCEDURE DIVISION.
       CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
       DISPLAY 'Student Id : ' WS-STUDENT-ID
       DISPLAY 'Student Name : ' WS-STUDENT-NAME
    STOP RUN.

    Called Program

    IDENTIFICATION DIVISION.
    PROGRAM-ID. UTIL.
    
    DATA DIVISION.
       LINKAGE SECTION.
       01 LS-STUDENT-ID PIC 9(4).
       01 LS-STUDENT-NAME PIC A(15).
    
    PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
       DISPLAY 'In Called Program'.
       MOVE 1111 TO LS-STUDENT-ID.
    EXIT PROGRAM.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = MAIN

    When you compile and execute the above program, it produces the following result −

    In Called Program
    Student Id : 1111
    Student Name : Tim
    

    Call By Content

    If the values of variables in the called program are modified, then their new values will not reflect in the calling program.

    Syntax

    Following is the syntax of calling subroutine by content −

    CALL sub-prog-name USING 
    BY CONTENT variable-1, BY CONTENT variable-2.
    

    Example

    Following example is the MAIN calling program and UTIL is the called program −

    IDENTIFICATION DIVISION.
    PROGRAM-ID. MAIN.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
       01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
    
    PROCEDURE DIVISION.
       CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
       DISPLAY 'Student Id : ' WS-STUDENT-ID
       DISPLAY 'Student Name : ' WS-STUDENT-NAME
    STOP RUN.

    Called Program

    IDENTIFICATION DIVISION.
    PROGRAM-ID. UTIL.
    
    DATA DIVISION.
       LINKAGE SECTION.
       01 LS-STUDENT-ID PIC 9(4).
       01 LS-STUDENT-NAME PIC A(15).
    
    PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
       DISPLAY 'In Called Program'.
       MOVE 1111 TO LS-STUDENT-ID.
    EXIT PROGRAM.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = MAIN

    When you compile and execute the above program, it produces the following result −

    In Called Program
    Student Id : 1000
    Student Name : Tim
    

    Types of Call

    There are two types of calls −

    • Static Call occurs when a program is compiled with the NODYNAM compiler option. A static called program is loaded into storage at compile time.
    • Dynamic Call occurs when a program is compiled with the DYNAM and NODLL compiler option. A dynamic called program is loaded into storage at runtime.
  • File Access Mode

    Till now, file organization schemes have been discussed. For each file organization scheme, different access modes can be used. Following are the types of file access modes −

    • Sequential Access
    • Random Access
    • Dynamic Access

    The syntaxes in this module, mentioned along with their respective terms, only refer to their usage in the program. The complete programs using these syntaxes would be discussed in the next chapter.

    Sequential Access

    When the access mode is sequential, the method of record retrieval changes as per the selected file organization.

    • For sequential files, records are accessed in the same order in which they were inserted.
    • For indexed files, the parameter used to fetch the records are the record key values.
    • For relative files, relative record keys are used to retrieve the records.

    Syntax

    Following is the syntax of sequential access mode −

    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name
       ORGANIZATION IS SEQUENTIAL
       ACCESS MODE IS SEQUENTIAL
    	
    	
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name
       ORGANIZATION IS INDEXED
       ACCESS MODE IS SEQUENTIAL
       RECORD KEY IS rec-key1
       ALTERNATE RECORD KEY IS rec-key2
    
    		
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name
       ORGANIZATION IS RELATIVE
       ACCESS MODE IS SEQUENTIAL
       RELATIVE KEY IS rec-key1
    

    Random Access

    When the access mode is RANDOM, the method of record retrieval changes as per the selected file organization.

    • For indexed files, records are accessed according to the value placed in a key field which can be primary or alternate key. There can be one or more alternate indexes.
    • For relative files , records are retrieved through relative record keys.

    Syntax

    Following is the syntax of random access mode −

    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name
       ORGANIZATION IS INDEXED
       ACCESS MODE IS RANDOM
       RECORD KEY IS rec-key1
       ALTERNATE RECORD KEY IS rec-key2
    
    		
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name
       ORGANIZATION IS RELATIVE
       ACCESS MODE IS RANDOM
       RELATIVE KEY IS rec-key1
    

    Dynamic Access

    Dynamic access supports both sequential and random access in the same program. With dynamic access, one file definition is used to perform both sequential and random processing like accessing some records in sequential order and other records by their keys.

    With relative and indexed files, the dynamic access mode allows you to switch back and forth between sequential access mode and random access mode while reading a file by using the NEXT phrase on the READ statement. NEXT and READ functionalities will be discussed in the next chapter.

    Syntax

    Following is the syntax of dynamic access mode −

    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name
       ORGANIZATION IS SEQUENTIAL
       ACCESS MODE IS DYNAMIC
       RECORD KEY IS rec-key1
       ALTERNATE RECORD KEY IS rec-key2
    
    		
    ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name
       ORGANIZATION IS RELATIVE
       ACCESS MODE IS DYNAMIC
       RELATIVE KEY IS rec-key1
    
  • File Organization

    File organization indicates how the records are organized in a file. There are different types of organizations for files so as to increase their efficiency of accessing the records. Following are the types of file organization schemes −

    • Sequential file organization
    • Indexed sequential file organization
    • Relative file organization

    The syntaxes in this module, mentioned along with their respective terms, only refer to their usage in the program. The complete programs using these syntaxes would be discussed in the chapter ‘File handling Verbs’.

    Sequential File Organization

    A sequential file consists of records that are stored and accessed in sequential order. Following are the key attributes of sequential file organization −

    • Records can be read in sequential order. For reading the 10th record, all the previous 9 records should be read.
    • Records are written in sequential order. A new record cannot be inserted in between. A new record is always inserted at the end of the file.
    • After placing a record into a sequential file, it is not possible to delete, shorten, or lengthen a record.
    • Order of the records, once inserted, can never be changed.
    • Updation of record is possible. A record can be overwritten, if the new record length is same as the old record length.
    • Sequential output files are good option for printing.

    Syntax

    Following is the syntax of sequential file organization −

    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name-jcl
       ORGANIZATION IS SEQUENTIAL
    

    Indexed Sequential File Organization

    An indexed sequential file consists of records that can be accessed sequentially. Direct access is also possible. It consists of two parts −

    • Data File contains records in sequential scheme.
    • Index File contains the primary key and its address in the data file.

    Following are the key attributes of sequential file organization −

    • Records can be read in sequential order just like in sequential file organization.
    • Records can be accessed randomly if the primary key is known. Index file is used to get the address of a record and then the record is fetched from the data file.
    • Sorted index is maintained in this file system which relates the key value to the position of the record in the file.
    • Alternate index can also be created to fetch the records.

    Syntax

    Following is the syntax of indexed sequential file organization −

    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name-jcl
       ORGANIZATION IS INDEXED
       RECORD KEY IS primary-key
       ALTERNATE RECORD KEY IS rec-key

    Relative File Organization

    A relative file consists of records ordered by their relative address. Following are the key attributes of relative file organization −

    • Records can be read in sequential order just like in sequential and indexed file organization.
    • Records can be accessed using relative key. Relative key represents the record’s location relative to the address of the start of the file.
    • Records can be inserted using relative key. Relative address is calculated using relative key.
    • Relative file provides the fastest access to the records.
    • The main disadvantage of this file system is that if some intermediate records are missing, they will also occupy space.

    Syntax

    Following is the syntax of relative file organization −

    INPUT-OUTPUT SECTION.
    FILE-CONTROL.
       SELECT file-name ASSIGN TO dd-name-jcl
       ORGANIZATION IS RELATIVE
       RELATIVE KEY IS rec-key
  • Numbers in C++

    Normally, when we work with Numbers, we use primitive data types such as int, short, long, float and double, etc. The number data types, their possible values and number ranges have been explained while discussing C++ Data Types.

    Defining Numbers in C++

    You have already defined numbers in various examples given in previous chapters. Here is another consolidated example to define various types of numbers in C++ −

    #include <iostream>
    using namespace std;
     
    int main () {
       // number definition:
       short  s;
       int    i;
       long   l;
       float  f;
       double d;
       
       // number assignments;
       s = 10;      
       i = 1000;    
       l = 1000000; 
       f = 230.47;  
       d = 30949.374;
       
       // number printing;
       cout << "short  s :" << s << endl;
       cout << "int    i :" << i << endl;
       cout << "long   l :" << l << endl;
       cout << "float  f :" << f << endl;
       cout << "double d :" << d << endl;
     
       return 0;
    }

    When the above code is compiled and executed, it produces the following result −

    short  s :10
    int    i :1000
    long   l :1000000
    float  f :230.47
    double d :30949.4
    

    Math Operations in C++

    In addition to the various functions you can create, C++ also includes some useful functions you can use. These functions are available in standard C and C++ libraries and called built-in functions. These are functions that can be included in your program and then use.

    C++ has a rich set of mathematical operations, which can be performed on various numbers. Following table lists down some useful built-in mathematical functions available in C++.

    To utilize these functions you need to include the math header file <cmath>.

    Sr.NoFunction & Purpose
    1double cos(double);This function takes an angle (as a double) and returns the cosine.
    2double sin(double);This function takes an angle (as a double) and returns the sine.
    3double tan(double);This function takes an angle (as a double) and returns the tangent.
    4double log(double);This function takes a number and returns the natural log of that number.
    5double pow(double, double);The first is a number you wish to raise and the second is the power you wish to raise it t
    6double hypot(double, double);If you pass this function the length of two sides of a right triangle, it will return you the length of the hypotenuse.
    7double sqrt(double);You pass this function a number and it gives you the square root.
    8int abs(int);This function returns the absolute value of an integer that is passed to it.
    9double fabs(double);This function returns the absolute value of any decimal number passed to it.
    10double floor(double);Finds the integer which is less than or equal to the argument passed to it.

    Following is a simple example to show few of the mathematical operations −

    #include <iostream>
    #include <cmath>
    using namespace std;
     
    int main () {
       // number definition:
       short  s = 10;
       int    i = -1000;
       long   l = 100000;
       float  f = 230.47;
       double d = 200.374;
    
       // mathematical operations;
       cout << "sin(d) :" << sin(d) << endl;
       cout << "abs(i)  :" << abs(i) << endl;
       cout << "floor(d) :" << floor(d) << endl;
       cout << "sqrt(f) :" << sqrt(f) << endl;
       cout << "pow( d, 2) :" << pow(d, 2) << endl;
     
       return 0;
    }

    When the above code is compiled and executed, it produces the following result −

    sign(d)     :-0.634939
    abs(i)      :1000
    floor(d)    :200
    sqrt(f)     :15.1812
    pow( d, 2 ) :40149.7
    

    Random Numbers in C++

    There are many cases where you will wish to generate a random number. There are actually two functions you will need to know about random number generation. The first is rand(), this function will only return a pseudo random number. The way to fix this is to first call the srand() function.

    Following is a simple example to generate few random numbers. This example makes use of time() function to get the number of seconds on your system time, to randomly seed the rand() function −

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
     
    int main () {
       int i,j;
     
       // set the seed
       srand( (unsigned)time( NULL ) );
    
       /* generate 10  random numbers. */
       for( i = 0; i < 10; i++ ) {
    
      // generate actual random number
      j = rand();
      cout &lt;&lt;" Random Number : " &lt;&lt; j &lt;&lt; endl;
    } return 0; }

    When the above code is compiled and executed, it produces the following result −

    Random Number : 1748144778
    Random Number : 630873888
    Random Number : 2134540646
    Random Number : 219404170
    Random Number : 902129458
    Random Number : 920445370
    Random Number : 1319072661
    Random Number : 257938873
    Random Number : 1256201101
    Random Number : 580322989
    
  • C++ Functions

    A function is a group of statements that together perform a task. Every C++ program has at least one function, which is main(), and all the most trivial programs can define additional functions.

    You can divide up your code into separate functions. How you divide up your code among different functions is up to you, but logically the division usually is such that each function performs a specific task.

    A function declaration tells the compiler about a function’s name, return type, and parameters. A function definition provides the actual body of the function.

    The C++ standard library provides numerous built-in functions that your program can call. For example, function strcat() to concatenate two strings, function memcpy() to copy one memory location to another location and many more functions.

    A function is known with various names like a method or a sub-routine or a procedure etc.

    Defining a Function

    The general form of a C++ function definition is as follows −

    return_type function_name( parameter list ) {
       body of the function
    }
    

    A C++ function definition consists of a function header and a function body. Here are all the parts of a function −

    • Return Type − A function may return a value. The return_type is the data type of the value the function returns. Some functions perform the desired operations without returning a value. In this case, the return_type is the keyword void.
    • Function Name − This is the actual name of the function. The function name and the parameter list together constitute the function signature.
    • Parameters − A parameter is like a placeholder. When a function is invoked, you pass a value to the parameter. This value is referred to as actual parameter or argument. The parameter list refers to the type, order, and number of the parameters of a function. Parameters are optional; that is, a function may contain no parameters.
    • Function Body − The function body contains a collection of statements that define what the function does.

    Example

    Following is the source code for a function called max(). This function takes two parameters num1 and num2 and return the biggest of both −

    // function returning the max between two numbers
     
    int max(int num1, int num2) {
       // local variable declaration
       int result;
     
       if (num1 > num2)
    
      result = num1;
    else
      result = num2;
    return result; }

    Function Declarations

    A function declaration tells the compiler about a function name and how to call the function. The actual body of the function can be defined separately.

    A function declaration has the following parts −

    return_type function_name( parameter list );
    

    For the above defined function max(), following is the function declaration −

    int max(int num1, int num2);
    

    Parameter names are not important in function declaration only their type is required, so following is also valid declaration −

    int max(int, int);
    

    Function declaration is required when you define a function in one source file and you call that function in another file. In such case, you should declare the function at the top of the file calling the function.

    Calling a Function

    While creating a C++ function, you give a definition of what the function has to do. To use a function, you will have to call or invoke that function.

    When a program calls a function, program control is transferred to the called function. A called function performs defined task and when it’s return statement is executed or when its function-ending closing brace is reached, it returns program control back to the main program.

    To call a function, you simply need to pass the required parameters along with function name, and if function returns a value, then you can store returned value. For example −

    #include <iostream>
    using namespace std;
     
    // function declaration
    int max(int num1, int num2);
     
    int main () {
       // local variable declaration:
       int a = 100;
       int b = 200;
       int ret;
     
       // calling a function to get max value.
       ret = max(a, b);
       cout << "Max value is : " << ret << endl;
     
       return 0;
    }
     
    // function returning the max between two numbers
    int max(int num1, int num2) {
       // local variable declaration
       int result;
     
       if (num1 > num2)
    
      result = num1;
    else
      result = num2;
    return result; }

    I kept max() function along with main() function and compiled the source code. While running final executable, it would produce the following result −

    Max value is : 200
    

    Function Arguments

    If a function is to use arguments, it must declare variables that accept the values of the arguments. These variables are called the formal parameters of the function.

    The formal parameters behave like other local variables inside the function and are created upon entry into the function and destroyed upon exit.

    While calling a function, there are two ways that arguments can be passed to a function −

    Sr.NoCall Type & Description
    1Call by ValueThis method copies the actual value of an argument into the formal parameter of the function. In this case, changes made to the parameter inside the function have no effect on the argument.
    2Call by PointerThis method copies the address of an argument into the formal parameter. Inside the function, the address is used to access the actual argument used in the call. This means that changes made to the parameter affect the argument.
    3Call by ReferenceThis method copies the reference of an argument into the formal parameter. Inside the function, the reference is used to access the actual argument used in the call. This means that changes made to the parameter affect the argument.

    By default, C++ uses call by value to pass arguments. In general, this means that code within a function cannot alter the arguments used to call the function and above mentioned example while calling max() function used the same method.

    Default Values for Parameters

    When you define a function, you can specify a default value for each of the last parameters. This value will be used if the corresponding argument is left blank when calling to the function.

    This is done by using the assignment operator and assigning values for the arguments in the function definition. If a value for that parameter is not passed when the function is called, the default given value is used, but if a value is specified, this default value is ignored and the passed value is used instead. Consider the following example −

    #include <iostream>
    using namespace std;
     
    int sum(int a, int b = 20) {
       int result;
       result = a + b;
      
       return (result);
    }
    int main () {
       // local variable declaration:
       int a = 100;
       int b = 200;
       int result;
     
       // calling a function to add the values.
       result = sum(a, b);
       cout << "Total value is :" << result << endl;
    
       // calling a function again as follows.
       result = sum(a);
       cout << "Total value is :" << result << endl;
     
       return 0;
    }

    When the above code is compiled and executed, it produces the following result −

    Total value is :300
    Total value is :120
    
  • File Handling

    The concept of files in COBOL is different from that in C/C++. While learning the basics of ‘File’ in COBOL, the concepts of both languages should not be corelated. Simple text files cannot be used in COBOL, instead PS (Physical Sequential) and VSAM files are used. PS files will be discussed in this module.

    To understand file handling in COBOL, one must know the basic terms. These terms only serve to understand the fundamentals of file handling. Further in depth terminology would be discussed in the chapter ‘File Handling Verbs’. Following are the basic terms −

    • Field
    • Record
    • Physical Record
    • Logical Record
    • File

    The following example helps in understanding these terms −

    Program Structure

    Field

    Field is used to indicate the data stored about an element. It represents a single element as shown in the above example such as student id, name, marks, total marks, and percentage. The number of characters in any field is known as field size, for example, student name can have 10 characters. Fields can have the following attributes −

    • Primary keys are those fields that are unique to each record and are used to identify a particular record. For example, in students marks file, each student will be having a unique student id which forms the primary key.
    • Secondary keys are unique or non-unique fields that are used to search for related data. For example, in students marks file, full name of student can be used as secondary key when student id is not known.
    • Descriptors fields are used to describe an entity. For example, in students marks file, marks and percentage fields that add meaning to the record are known descriptors.

    Record

    Record is a collection of fields that is used to describe an entity. One or more fields together form a record. For example, in students marks file, student id, name, marks, total marks, and percentage form one record. The cumulative size of all the fields in a record is known as the record size. The records present in a file may be of fixed length or variable length.

    Physical Record

    Physical record is the information that exists on the external device. It is also known as a block.

    Logical Record

    Logical record is the information used by the program. In COBOL programs, only one record can be handled at any point of time and it is called as logical record.

    File

    File is a collection of related records. For example, the students marks file consists of records of all the students.

  • Table Processing

    Arrays in COBOL are known as tables. An array is a linear data structure and is a collection of individual data items of same type. Data items of a table are internally sorted.

    Table Declaration

    Table is declared in Data Division. Occurs clause is used to define a table. Occurs clause indicates the repetition of data name definition. It can be used only with level numbers starting from 02 to 49. Do not use occurs clause with Redefines. Description of one-dimensional and two-dimensional table is as follows −

    One-Dimensional Table

    In a one-dimensional table, occurs clause is used only once in declaration. WSTABLE is the group item that contains table. WS-B names the table elements that occur 10 times.

    Syntax

    Following is the syntax for defining a one-dimensional table −

    01 WS-TABLE.
       05 WS-A PIC A(10) OCCURS 10 TIMES.
    

    Example

    Live Demo

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-TABLE.
    
      05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.     
    PROCEDURE DIVISION. DISPLAY "ONE-D TABLE : "WS-TABLE. STOP RUN.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO

    When you compile and execute the above program, it produces the following result −

    ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS
    

    Two-Dimensional Table

    A two-dimensional table is created with both data elements being variable length. For reference, go through the syntax and then try to analyze the table. The first array (WS-A) can occur from 1 to 10 times and the inner array (WS-C) can occur from 1 to 5 times. For each entry of WS-A, there will be corresponding 5 entries of WS-C.

    Syntax

    Following is the syntax for defining a two-dimensional table −

    01 WS-TABLE.
       05 WS-A OCCURS 10 TIMES.
    
      10 WS-B PIC A(10).
      10 WS-C OCCURS 5 TIMES.
         15 WS-D PIC X(6).

    Example

    Live Demo

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-TABLE.
    
      05 WS-A OCCURS 2 TIMES.
         10 WS-B PIC A(10) VALUE ' TUTORIALS'.
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(6) VALUE ' POINT'.
    PROCEDURE DIVISION. DISPLAY "TWO-D TABLE : "WS-TABLE. STOP RUN.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO

    When you compile and execute the above program, it produces the following result −

    TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT
    

    Subscript

    Table individual elements can be accessed by using subscript. Subscript values can range from 1 to the number of times the table occurs. A subscript can be any positive number. It does not require any declaration in data division. It is automatically created with occurs clause.

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-TABLE.
    
      05 WS-A OCCURS 3 TIMES.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(3).
    PROCEDURE DIVISION. MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE. DISPLAY 'WS-TABLE : ' WS-TABLE. DISPLAY 'WS-A(1) : ' WS-A(1). DISPLAY 'WS-C(1,1) : ' WS-C(1,1). DISPLAY 'WS-C(1,2) : ' WS-C(1,2). DISPLAY 'WS-A(2) : ' WS-A(2). DISPLAY 'WS-C(2,1) : ' WS-C(2,1). DISPLAY 'WS-C(2,2) : ' WS-C(2,2). DISPLAY 'WS-A(3) : ' WS-A(3). DISPLAY 'WS-C(3,1) : ' WS-C(3,1). DISPLAY 'WS-C(3,2) : ' WS-C(3,2). STOP RUN.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO

    When you compile and execute the above program, it produces the following result −

    WS-TABLE  : 12ABCDEF34GHIJKL56MNOPQR
    WS-A(1)   : 12ABCDEF
    WS-C(1,1) : ABC
    WS-C(1,2) : DEF
    WS-A(2)   : 34GHIJKL
    WS-C(2,1) : GHI
    WS-C(2,2) : JKL
    WS-A(3)   : 56MNOPQR
    WS-C(3,1) : MNO
    WS-C(3,2) : PQR
    

    Index

    Table elements can also be accessed using index. An index is a displacement of element from the start of the table. An index is declared with Occurs clause using INDEXED BY clause. The value of index can be changed using SET statement and PERFORM Varying option.

    Syntax

    Following is the syntax for defining Index in a table −

    01 WS-TABLE.
       05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.
    

    Example

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-TABLE.
    
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).
    PROCEDURE DIVISION. MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE. PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3 STOP RUN. A-PARA. PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2. C-PARA. DISPLAY WS-C(I,J).

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO

    When you compile and execute the above program, it produces the following result −

    ABC
    DEF
    GHI
    JKL
    MNO
    PQR
    

    Set Statement

    Set statement is used to change the index value. Set verb is used to initialize, increment, or decrement the index value. It is used with Search and Search All to locate elements in table.

    Syntax

    Following is the syntax for using a Set statement −

    SET I J TO positive-number
    SET I TO J
    SET I TO 5
    SET I J UP BY 1
    SET J DOWN BY 5
    

    Example

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-TABLE.
    
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).
    PROCEDURE DIVISION. MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE. SET I J TO 1. DISPLAY WS-C(I,J). SET I J UP BY 1. DISPLAY WS-C(I,J). STOP RUN.

    JCL to execute the above COBOL program.

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO

    When you compile and execute the above program, it produces the following result −

    ABC
    JKL
    

    Search

    Search is a linear search method, which is used to find elements inside the table. It can be performed on sorted as well as unsorted table. It is used only for tables declared by Index phrase. It starts with the initial value of index. If the searched element is not found, then the index is automatically incremented by 1 and it continues till the end of table.

    Example

    Live Demo

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-TABLE.
    
      05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
    01 WS-SRCH PIC A(1) VALUE 'M'. PROCEDURE DIVISION. MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE. SET I TO 1. SEARCH WS-A
      AT END DISPLAY 'M NOT FOUND IN TABLE'
      WHEN WS-A(I) = WS-SRCH
      DISPLAY 'LETTER M FOUND IN TABLE'
    END-SEARCH. STOP RUN.

    JCL to execute the above COBOL program.

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO

    When you compile and execute the above program, it produces the following result −

    LETTER M FOUND IN TABLE
    

    Search All

    Search All is a binary search method, which is used to find elements inside the table. Table must be in sorted order for Search All option. The index does not require initialization. In binary search, the table is divided into two halves and it determines in which half the searched element is present. This process repeats till the element is found or the end is reached.

    Example

    IDENTIFICATION DIVISION.
    PROGRAM-ID. HELLO.
    
    DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-TABLE.
    
      05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
      10 WS-NUM PIC 9(2).
      10 WS-NAME PIC A(3).
    PROCEDURE DIVISION. MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE. SEARCH ALL WS-RECORD
     AT END DISPLAY 'RECORD NOT FOUND'
     WHEN WS-NUM(I) = 93
     DISPLAY 'RECORD FOUND '
     DISPLAY WS-NUM(I)
     DISPLAY WS-NAME(I)
    END-SEARCH.

    JCL to execute the above COBOL program −

    //SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
    //STEP1 EXEC PGM = HELLO

    When you compile and execute the above program, it produces the following result −

    RECORD FOUND 
    93
    MNO