100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

Building a Console Application

A practical walkthrough of structuring a menu-driven Pascal console program, handling input safely, and organizing logic into units.

PracticeBeginner10 min readJul 10, 2026
Analogies

Structuring a Pascal Console Program

A console application in Pascal begins with the program header naming the executable, followed by a uses clause pulling in library units such as SysUtils for string/number conversion helpers or Crt for cursor and color control on older Turbo Pascal/Free Pascal targets. The body typically centers on a driving loop that displays a menu, reads a selection, and dispatches to the appropriate handler until the user chooses to quit, which keeps the top-level program block short and readable even as the application grows. Separating 'what the menu looks like' from 'what each option does' by delegating to individual procedures is what keeps this main loop from becoming an unreadable wall of logic.

🏏

Cricket analogy: A driving menu loop dispatching to handler procedures is like an umpire's decision review protocol: one central process reads the request (review, no review) and delegates to the specific replay procedure, rather than handling every scenario inline.

Handling User Input and Output

Console I/O in Pascal is centered on Write/Writeln for output and Read/Readln for input, but robust console applications must guard against invalid input rather than assuming every readln call returns a well-formed number. The SysUtils Val procedure (Val(S, Value, Code)) is the idiomatic safe alternative to a bare ReadLn into an integer variable, because it parses a string into a numeric value and sets Code to 0 on success or to the position of the offending character on failure, letting the program re-prompt instead of raising a runtime conversion error. Trimming and validating strings before use — checking for empty input, unexpected whitespace, or out-of-range values — is what separates a console tool that survives real users from one that only works in a scripted demo.

🏏

Cricket analogy: Using Val to safely parse input is like a third umpire double-checking a run-out with ball tracking before confirming the decision, rather than trusting the on-field call outright and risking an error.

Organizing Code into Units

Once a console application grows past a single menu with a couple of options, splitting it into units keeps the codebase navigable: a unit has an interface section declaring what other code can use, and an implementation section hiding the details behind it. A typical split for a console app is one unit for I/O helpers (safe number parsing, formatted printing), one for the core business logic (the actual calculations or data operations the tool performs), and the main program file left with only the menu loop and top-level wiring, which mirrors the separation-of-concerns best practice used across larger Pascal codebases. This structure also makes the business-logic unit reusable if the same functionality is later needed behind a GUI or a web service instead of a console menu.

🏏

Cricket analogy: A unit's interface/implementation split is like a team sheet published publicly (interface) versus the actual training ground tactics kept private (implementation) — outsiders see only what they need to.

pascal
program InventoryConsole;

uses
  SysUtils, InventoryLogic;  { InventoryLogic is a custom unit with business logic }

var
  Choice: string;
  Code: Integer;
  Quantity: Integer;
  Running: Boolean;
begin
  Running := True;
  while Running do
  begin
    Writeln;
    Writeln('=== Inventory Menu ===');
    Writeln('1. Add stock');
    Writeln('2. Remove stock');
    Writeln('3. Show total');
    Writeln('4. Quit');
    Write('Choose an option: ');
    Readln(Choice);

    case Choice of
      '1':
        begin
          Write('Quantity to add: ');
          Readln(Choice);
          Val(Choice, Quantity, Code);
          if Code = 0 then
            AddStock(Quantity)
          else
            Writeln('Invalid number, try again.');
        end;
      '2':
        begin
          Write('Quantity to remove: ');
          Readln(Choice);
          Val(Choice, Quantity, Code);
          if Code = 0 then
            RemoveStock(Quantity)
          else
            Writeln('Invalid number, try again.');
        end;
      '3': Writeln('Total stock: ', GetTotalStock);
      '4': Running := False;
    else
      Writeln('Unrecognized option.');
    end;
  end;
  Writeln('Goodbye!');
end.

Val(S, Value, Code) is the safe alternative to reading numbers directly into a typed variable: it never raises an exception, it always sets Code to 0 on a fully successful parse, and it reports the 1-based index of the first invalid character in Code otherwise, which makes it easy to build a clear error message for the user.

A menu loop that assumes every Readln returns exactly the expected format will crash or misbehave the first time a real user types an empty line, extra spaces, or a letter where a number was expected. Always validate with Val (or Trim plus explicit checks) before converting or acting on user input in a console application.

  • A console app's structure centers on a menu loop that reads a choice and dispatches to a handler procedure.
  • The uses clause declares dependencies like SysUtils or Crt before their routines can be called.
  • Use Val(S, Value, Code) to safely parse numeric input instead of assuming Readln always yields valid data.
  • Check Code = 0 after Val to confirm a successful parse before using the resulting value.
  • Split growing console applications into units with clear interface/implementation separation.
  • Keep business logic in its own unit so it can be reused behind a GUI or web front end later.
  • Always validate and re-prompt on bad input rather than assuming a scripted-demo-only input pattern.

Practice what you learned

Was this page helpful?

Topics covered

#Programming#PascalStudyNotes#BuildingAConsoleApplication#Building#Console#Application#Structuring#StudyNotes#SkillVeris#ExamPrep