Structured programming is a programming paradigm that emphasizes the use of clear, logical control structures and modular design. In COBOL, structured programming principles help create programs that are easier to understand, debug, test, and maintain.
Structured programming is a methodology that uses:
These principles make programs more readable, maintainable, and less prone to errors.
Benefit | Description | Impact |
---|---|---|
Readability | Code is easier to understand and follow | Faster development and debugging |
Maintainability | Changes can be made more easily and safely | Reduced maintenance costs |
Testability | Individual modules can be tested independently | Better quality assurance |
Reusability | Modules can be reused in different programs | Increased productivity |
Reliability | Structured code is less prone to logical errors | Fewer bugs and system failures |
Structured programming is built on three fundamental control structures: sequence, selection, and iteration. These structures can be combined to create any program logic.
Statements are executed in order, one after another:
1234567891011121314151617181920212223242526PROCEDURE DIVISION. MAIN-PROCESS. * Sequence structure - statements execute in order PERFORM INITIALIZATION PERFORM PROCESS-DATA PERFORM FINALIZATION STOP RUN. INITIALIZATION. OPEN INPUT CUSTOMER-FILE OPEN OUTPUT REPORT-FILE MOVE 0 TO RECORD-COUNT. PROCESS-DATA. READ CUSTOMER-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END ADD 1 TO RECORD-COUNT PERFORM WRITE-REPORT-LINE END-READ. FINALIZATION. CLOSE CUSTOMER-FILE CLOSE REPORT-FILE DISPLAY "Records processed: " RECORD-COUNT.
Each statement executes in sequence, creating a clear, predictable flow.
Different code paths are executed based on conditions:
1234567891011121314151617181920212223PROCESS-CUSTOMER-RECORD. * Selection structure - different paths based on conditions IF CUSTOMER-TYPE = "PREMIUM" PERFORM PROCESS-PREMIUM-CUSTOMER ELSE IF CUSTOMER-TYPE = "STANDARD" PERFORM PROCESS-STANDARD-CUSTOMER ELSE PERFORM PROCESS-BASIC-CUSTOMER END-IF END-IF. PROCESS-PREMIUM-CUSTOMER. COMPUTE DISCOUNT = ORDER-AMOUNT * 0.15 MOVE "P" TO CUSTOMER-STATUS. PROCESS-STANDARD-CUSTOMER. COMPUTE DISCOUNT = ORDER-AMOUNT * 0.10 MOVE "S" TO CUSTOMER-STATUS. PROCESS-BASIC-CUSTOMER. COMPUTE DISCOUNT = ORDER-AMOUNT * 0.05 MOVE "B" TO CUSTOMER-STATUS.
IF-ELSE statements provide clear decision-making logic.
Code blocks are repeated based on conditions:
12345678910111213141516171819202122232425262728PROCESS-ALL-RECORDS. * Iteration structure - repeating operations PERFORM UNTIL END-OF-FILE READ CUSTOMER-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END PERFORM PROCESS-CUSTOMER-RECORD ADD 1 TO RECORD-COUNT END-READ END-PERFORM. PROCESS-CUSTOMER-RECORDS-TIMES. * Iteration with counter PERFORM VARYING RECORD-NUMBER FROM 1 BY 1 UNTIL RECORD-NUMBER > MAX-RECORDS PERFORM PROCESS-SINGLE-RECORD END-PERFORM. PROCESS-CUSTOMER-RECORDS-WHILE. * Iteration with condition PERFORM WITH TEST BEFORE UNTIL RECORD-COUNT >= MAX-RECORDS PERFORM READ-NEXT-RECORD IF RECORD-VALID PERFORM PROCESS-VALID-RECORD END-IF END-PERFORM.
PERFORM statements provide various iteration patterns for different needs.
Structure | COBOL Implementation | Use Case | Flow |
---|---|---|---|
Sequence | Statement order | Linear processing | Top to bottom |
Selection | IF-ELSE, EVALUATE | Decision making | Conditional branching |
Iteration | PERFORM loops | Repeated operations | Looping |
Modular design breaks programs into smaller, manageable units called paragraphs. Each paragraph has a single, well-defined purpose and can be called independently.
Paragraphs are named sections of code that can be called with PERFORM:
12345678910111213141516171819202122232425262728293031PROCEDURE DIVISION. MAIN-PROCESS. * Main program logic - calls other paragraphs PERFORM INITIALIZATION PERFORM PROCESS-DATA PERFORM FINALIZATION STOP RUN. INITIALIZATION. * Single purpose: Initialize program OPEN INPUT CUSTOMER-FILE OPEN OUTPUT REPORT-FILE MOVE 0 TO RECORD-COUNT MOVE "N" TO EOF-FLAG. PROCESS-DATA. * Single purpose: Process all records PERFORM UNTIL END-OF-FILE PERFORM READ-CUSTOMER-RECORD IF NOT END-OF-FILE PERFORM PROCESS-CUSTOMER-RECORD PERFORM WRITE-REPORT-LINE END-IF END-PERFORM. FINALIZATION. * Single purpose: Clean up and finish CLOSE CUSTOMER-FILE CLOSE REPORT-FILE DISPLAY "Processing complete" DISPLAY "Records processed: " RECORD-COUNT.
Each paragraph has a clear, single responsibility and can be tested independently.
Create utility paragraphs for common operations:
1234567891011121314151617181920212223242526272829303132333435363738394041VALIDATE-CUSTOMER-DATA. * Reusable validation logic MOVE "Y" TO VALID-FLAG * Check customer ID IF CUSTOMER-ID = SPACES OR CUSTOMER-ID = ZEROS MOVE "N" TO VALID-FLAG MOVE "Invalid customer ID" TO ERROR-MESSAGE END-IF * Check customer name IF CUSTOMER-NAME = SPACES MOVE "N" TO VALID-FLAG MOVE "Customer name required" TO ERROR-MESSAGE END-IF * Check amount IF ORDER-AMOUNT <= 0 MOVE "N" TO VALID-FLAG MOVE "Invalid order amount" TO ERROR-MESSAGE END-IF. CALCULATE-DISCOUNT. * Reusable calculation logic EVALUATE CUSTOMER-TYPE WHEN "PREMIUM" COMPUTE DISCOUNT = ORDER-AMOUNT * 0.15 WHEN "STANDARD" COMPUTE DISCOUNT = ORDER-AMOUNT * 0.10 WHEN "BASIC" COMPUTE DISCOUNT = ORDER-AMOUNT * 0.05 WHEN OTHER MOVE 0 TO DISCOUNT END-EVALUATE. LOG-ERROR. * Reusable error logging ADD 1 TO ERROR-COUNT MOVE CURRENT-DATE TO ERROR-DATE MOVE CURRENT-TIME TO ERROR-TIME WRITE ERROR-RECORD FROM ERROR-LINE.
Utility paragraphs can be called from multiple places, reducing code duplication.
Good Examples:
Sections provide a higher level of organization than paragraphs, allowing you to group related functionality together. They are useful for organizing large programs into logical divisions.
Sections contain multiple paragraphs and provide major program divisions:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION-SECTION PERFORM PROCESSING-SECTION PERFORM FINALIZATION-SECTION STOP RUN. INITIALIZATION-SECTION SECTION. * Section for all initialization activities OPEN-FILES. OPEN INPUT CUSTOMER-FILE OPEN OUTPUT REPORT-FILE OPEN OUTPUT ERROR-FILE. INITIALIZE-COUNTERS. MOVE 0 TO RECORD-COUNT MOVE 0 TO ERROR-COUNT MOVE "N" TO EOF-FLAG. WRITE-REPORT-HEADER. MOVE CURRENT-DATE TO REPORT-DATE MOVE CURRENT-TIME TO REPORT-TIME WRITE REPORT-RECORD FROM HEADER-LINE. PROCESSING-SECTION SECTION. * Section for main processing logic PROCESS-ALL-RECORDS. PERFORM UNTIL END-OF-FILE PERFORM READ-CUSTOMER-RECORD IF NOT END-OF-FILE PERFORM VALIDATE-CUSTOMER-RECORD IF VALID-RECORD PERFORM PROCESS-VALID-RECORD ELSE PERFORM LOG-INVALID-RECORD END-IF END-IF END-PERFORM. READ-CUSTOMER-RECORD. READ CUSTOMER-FILE AT END MOVE "Y" TO EOF-FLAG NOT AT END ADD 1 TO RECORD-COUNT END-READ. VALIDATE-CUSTOMER-RECORD. PERFORM VALIDATE-CUSTOMER-DATA IF VALID-FLAG = "Y" MOVE "Y" TO VALID-RECORD ELSE MOVE "N" TO VALID-RECORD END-IF. FINALIZATION-SECTION SECTION. * Section for cleanup and reporting CLOSE-FILES. CLOSE CUSTOMER-FILE CLOSE REPORT-FILE CLOSE ERROR-FILE. DISPLAY-STATISTICS. DISPLAY "Processing complete" DISPLAY "Records processed: " RECORD-COUNT DISPLAY "Errors encountered: " ERROR-COUNT.
Sections provide logical grouping and can be called with PERFORM section-name.
Feature | Paragraphs | Sections |
---|---|---|
Definition | paragraph-name. | section-name SECTION. |
Content | Single code block | Multiple paragraphs |
Calling | PERFORM paragraph-name | PERFORM section-name |
Use Case | Individual functions | Major program divisions |
Scope | Small, focused tasks | Large, related operations |
Top-down design is a problem-solving approach that starts with the overall problem and breaks it down into smaller, manageable subproblems. This approach is fundamental to structured programming.
Top-down design follows these steps:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162* Level 1: Main Program PROCEDURE DIVISION. MAIN-PROCESS. PERFORM INITIALIZATION PERFORM PROCESS-CUSTOMERS PERFORM FINALIZATION STOP RUN. * Level 2: Major Functions INITIALIZATION. PERFORM OPEN-FILES PERFORM INITIALIZE-COUNTERS PERFORM WRITE-REPORT-HEADER. PROCESS-CUSTOMERS. PERFORM UNTIL END-OF-FILE PERFORM READ-CUSTOMER-RECORD IF NOT END-OF-FILE PERFORM PROCESS-SINGLE-CUSTOMER END-IF END-PERFORM. FINALIZATION. PERFORM CLOSE-FILES PERFORM DISPLAY-STATISTICS. * Level 3: Detailed Operations PROCESS-SINGLE-CUSTOMER. PERFORM VALIDATE-CUSTOMER-DATA IF VALID-CUSTOMER PERFORM CALCULATE-CUSTOMER-TOTALS PERFORM WRITE-CUSTOMER-REPORT ELSE PERFORM LOG-CUSTOMER-ERROR END-IF. VALIDATE-CUSTOMER-DATA. PERFORM CHECK-CUSTOMER-ID PERFORM CHECK-CUSTOMER-NAME PERFORM CHECK-CUSTOMER-AMOUNT. CALCULATE-CUSTOMER-TOTALS. PERFORM CALCULATE-DISCOUNT PERFORM CALCULATE-TAX PERFORM CALCULATE-FINAL-AMOUNT. * Level 4: Simple Operations CHECK-CUSTOMER-ID. IF CUSTOMER-ID = SPACES OR CUSTOMER-ID = ZEROS MOVE "N" TO VALID-CUSTOMER MOVE "Invalid customer ID" TO ERROR-MESSAGE END-IF. CALCULATE-DISCOUNT. EVALUATE CUSTOMER-TYPE WHEN "PREMIUM" COMPUTE DISCOUNT = ORDER-AMOUNT * 0.15 WHEN "STANDARD" COMPUTE DISCOUNT = ORDER-AMOUNT * 0.10 WHEN OTHER MOVE 0 TO DISCOUNT END-EVALUATE.
Each level breaks down the problem into smaller, more manageable pieces.
Proper error handling is essential in structured programming. It ensures that programs can handle unexpected conditions gracefully and provide meaningful feedback.
Implement error handling using structured programming principles:
12345678910111213141516171819202122232425262728293031323334353637PROCESS-CUSTOMER-RECORD. * Structured error handling PERFORM VALIDATE-CUSTOMER-DATA IF VALID-CUSTOMER PERFORM PROCESS-VALID-CUSTOMER ELSE PERFORM HANDLE-CUSTOMER-ERROR END-IF. VALIDATE-CUSTOMER-DATA. MOVE "Y" TO VALID-CUSTOMER PERFORM CHECK-CUSTOMER-ID IF VALID-CUSTOMER = "Y" PERFORM CHECK-CUSTOMER-NAME END-IF IF VALID-CUSTOMER = "Y" PERFORM CHECK-CUSTOMER-AMOUNT END-IF. CHECK-CUSTOMER-ID. IF CUSTOMER-ID = SPACES OR CUSTOMER-ID = ZEROS MOVE "N" TO VALID-CUSTOMER MOVE "Invalid customer ID" TO ERROR-MESSAGE PERFORM LOG-VALIDATION-ERROR END-IF. HANDLE-CUSTOMER-ERROR. ADD 1 TO ERROR-COUNT PERFORM LOG-CUSTOMER-ERROR PERFORM WRITE-ERROR-REPORT. LOG-VALIDATION-ERROR. MOVE CUSTOMER-ID TO ERROR-CUSTOMER-ID MOVE ERROR-MESSAGE TO ERROR-DESCRIPTION MOVE CURRENT-DATE TO ERROR-DATE MOVE CURRENT-TIME TO ERROR-TIME WRITE ERROR-RECORD FROM ERROR-LINE.
Each error condition is handled in a structured, predictable way.
Handle file operation errors systematically:
12345678910111213141516171819202122232425262728293031323334353637383940OPEN-FILES. PERFORM OPEN-INPUT-FILE IF INPUT-FILE-STATUS = "00" PERFORM OPEN-OUTPUT-FILE IF OUTPUT-FILE-STATUS NOT = "00" PERFORM HANDLE-OUTPUT-FILE-ERROR END-IF ELSE PERFORM HANDLE-INPUT-FILE-ERROR END-IF. OPEN-INPUT-FILE. OPEN INPUT CUSTOMER-FILE MOVE CUSTOMER-FILE-STATUS TO INPUT-FILE-STATUS. OPEN-OUTPUT-FILE. OPEN OUTPUT REPORT-FILE MOVE REPORT-FILE-STATUS TO OUTPUT-FILE-STATUS. HANDLE-INPUT-FILE-ERROR. EVALUATE INPUT-FILE-STATUS WHEN "35" DISPLAY "Customer file not found" WHEN "37" DISPLAY "Insufficient permissions for customer file" WHEN OTHER DISPLAY "Input file error: " INPUT-FILE-STATUS END-EVALUATE MOVE 1 TO RETURN-CODE STOP RUN. HANDLE-OUTPUT-FILE-ERROR. EVALUATE OUTPUT-FILE-STATUS WHEN "37" DISPLAY "Insufficient permissions for report file" WHEN OTHER DISPLAY "Output file error: " OUTPUT-FILE-STATUS END-EVALUATE MOVE 2 TO RETURN-CODE STOP RUN.
File errors are handled with specific error codes and appropriate actions.
Following these best practices ensures that your COBOL programs are well-structured, maintainable, and reliable.
Aspect | Guideline | Benefit |
---|---|---|
Paragraph Size | Keep under 50 lines | Easier to understand and test |
Nesting Depth | Limit to 3-4 levels | Prevents complex logic |
Variable Names | Use descriptive names | Self-documenting code |
Comments | Explain why, not what | Clarifies intent |
Error Handling | Handle all exceptions | Robust programs |
1. What are the three basic control structures in structured programming?
2. What is the purpose of the PERFORM statement in structured COBOL programming?
3. Which COBOL feature helps implement the selection control structure?
4. What is the main benefit of using structured programming in COBOL?
5. What is a paragraph in COBOL structured programming?
Understanding the PERFORM statement for modular programming.
IF, EVALUATE, and other control structures in COBOL.
Creating and using subprograms for modular design.
How to organize COBOL programs effectively.
Implementing proper error handling in COBOL.