По сабжу - кто-то предложил использовать 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;
а также сильно сократилось количество переменных и констант (снижающих универсальность).