How to group words by first letter in Pascal

1 Answer

0 votes
program GroupWordsProgram;

type
  TString = string[64];

  { A group of words that share the same first letter }
  TWordGroup = record
    Letter : char;
    Words  : array[1..20] of TString;  { fixed-size list for simplicity }
    Count  : integer;
  end;

  { Named array types for use in parameters }
  TWordArray   = array[1..10] of TString;
  TGroupArray  = array[1..26] of TWordGroup;

var
  Words: TWordArray;
  Groups: TGroupArray;
  GroupCount: integer;


{---------------------------------------------------------------}
{ Groups words by their first letter }
{---------------------------------------------------------------}
procedure GroupByFirstLetter(
  var Input: TWordArray;
  InputCount: integer;
  var Output: TGroupArray;
  var OutCount: integer);
var
  i, g: integer;
  First: char;
  Found: boolean;
begin
  OutCount := 0;

  for i := 1 to InputCount do
  begin
    First := UpCase(Input[i][1]);  { extract first letter }
    Found := False;

    { Check if a group for this letter already exists }
    for g := 1 to OutCount do
      if Output[g].Letter = First then
      begin
        Found := True;
        Inc(Output[g].Count);
        Output[g].Words[Output[g].Count] := Input[i];
        Break;
      end;

    { If no group exists, create a new one }
    if not Found then
    begin
      Inc(OutCount);
      Output[OutCount].Letter := First;
      Output[OutCount].Count := 1;
      Output[OutCount].Words[1] := Input[i];
    end;
  end;
end;


{---------------------------------------------------------------}
{ Main program }
{---------------------------------------------------------------}
var
  i, j: integer;
begin
  { Initialize word list }
  Words[1] := 'Python';
  Words[2] := 'JavaScript';
  Words[3] := 'C';
  Words[4] := 'Java';
  Words[5] := 'C#';
  Words[6] := 'PHP';
  Words[7] := 'C++';
  Words[8] := 'Pascal';
  Words[9] := 'SQL';
  Words[10] := 'Rust';

  GroupByFirstLetter(Words, 10, Groups, GroupCount);

  { Print results }
  for i := 1 to GroupCount do
  begin
    Write(Groups[i].Letter, ': ');
    Write('[');
    for j := 1 to Groups[i].Count do
    begin
      Write(Groups[i].Words[j]);
      if j < Groups[i].Count then
        Write(', ');
    end;
    Writeln(']');
  end;
end.



(*
run:

P: [Python, PHP, Pascal]
J: [JavaScript, Java]
C: [C, C#, C++]
S: [SQL]
R: [Rust]

*)


 



answered Jan 17 by avibootz
...