По сабжу - кто-то предложил использовать Delphi...
Вот - вариант первоначальной программы в виде консольного приложения Delphi: 
Код:
program Dictant;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows;
const
  N = 10;
var
  i,k,ocenka : Integer;
  c : Char;
  s : string;
  index : array [1..N] of boolean;
  words : array [1..N] of string;
begin
  s := 'СЛОВАРНЫЙ ДИКТАНТ';  CharToOem(PChar(s),PChar(s)); Writeln(s);
  s := 'НАЖМИ КЛАВИШУ ВВОД'; CharToOem(PChar(s),PChar(s)); Writeln(s);
  ReadLn;
  { слова: }
  words[01] := 'Б...реза';
  words[02] := 'Быстр...';
  words[03] := 'Вдру...';
  words[04] := 'Весел...';
  words[05] := 'Вет...р';
  words[06] := 'В...робей';
  words[07] := 'В...рон ';
  words[08] := 'Гор...д';
  words[09] := 'Дев...чка';
  words[10] := 'Д...журный';{}
  { Строка пропущенных букв: }
  s := 'еогоеоооое'; CharToOem(PChar(s),PChar(s));
  for i := 1 to N do CharToOem(PChar(words[i]),PChar(words[i]));
  Randomize;
  ocenka := 0;
  for i := 1 to N do begin
    repeat k := 1+Random(N) until not index[k];
    index[k] := true;
    Write(words[k],' ? -> '); Readln(c);
    if c = s[k] then inc(ocenka);
  end;
  if ocenka >= 9 then
    s := 'Ваша оценка 5' else
      if ocenka >= 7 then
        s := 'Ваша оценка 3' else
          s := 'Ваша оценка 2';
  CharToOem(PChar(s),PChar(s)); Writeln(s);
  ReadLn;
end.
На самом деле консольное приложение Delphi не сильно отличается от привычного Вам варианта - т.к. внешне работа идёт в режиме эмуляции DOS-консоли - как и в Турбо-Паскале, поэтому Вам легко будет постепенно переходить на новый продукт.
Но при этом там открываются новые возможности использования весьма полезных класссов - для начала, например: TStringList!
TStringList в Delphi - это класс для хранения коллекции строк, обладающий богатыми возможностями для манипулирования ими.
Как пример - ещё один вариант той же программы, более универсальной:
список слов диктанта теперь хранится во внешнем текстовом файле с расширением <имя экзешника программы>.ini ("Dictant.ini"), а не в программе, которую раньше при изменении списка слов требовалось перекомпилировать каждый раз, меняя при этом все константы. 
Теперь экзешник универсален и требует лишь "подсовывания" соответствующего текстового файла в виде списка строк формата: (содержимое внешнего текстового файла Dictant.ini)
Б...реза=е
Быстр...=о
Вдру...=г
...
и т.д.
Вот другой вариант той же программы (тоже - в консольном режиме), но с использованием TStringList:
Код:
program Dictant;
{$APPTYPE CONSOLE}
uses
  SysUtils,Classes,Windows;
var
  n,k,q : Integer;
      c : Char;
      s : string;
begin
  s := 'СЛОВАРНЫЙ ДИКТАНТ';  CharToOem(PChar(s),PChar(s)); Writeln(s);
  s := 'НАЖМИ КЛАВИШУ ВВОД'; CharToOem(PChar(s),PChar(s)); Writeln(s);
  ReadLn;
 
   Randomize;
   q := 0;
  with TStringList.Create do begin
    LoadFromFile(ChangeFileExt(ParamStr(0),'.ini'));     // <-- считывание ini-файла
    n := Count;
    s := Text; CharToOem(PChar(s),PChar(s)); Text := s;  //  <-- конвертация ini-файла 
    while Count > 0 do begin
      k := Random(Count);
      Write(n-Count+1:3,') ',Names[k],' - '); Readln(c);
      if c = ValueFromIndex[k][1] then inc(q);
      Delete(k);
    end;
    Free
  end;
  WriteLn;
  s := 'Ваша оценка: '; CharToOem(PChar(s),PChar(s));
  Writeln(s,2+int(3*q/n):2:0);
  ReadLn;
end.
Длина списка произвольна и "на ходу" может изменяться без перекомпиляции самой программы. Конвертация же Ansi-OEM ini-файла необходима только в том случае, если текст строк диктанта набирается в кодировке Ansi (из под Windows), в противном случае эту строчку следует закомментировать.
Рабочее же тело программы (при сильно  возросшей универсальности!) свелось всего к нескольки строкам:
Код:
    while Count > 0 do begin
      k := Random(Count);
      Write(n-Count+1:3,') ',Names[k],' - '); Readln(c);
      if c = ValueFromIndex[k][1] then inc(q);
      Delete(k);
    end;
а также сильно сократилось количество переменных и констант (снижающих универсальность).