2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Pascal: обучающая игрушка для второклассника
Сообщение08.05.2006, 15:55 
Делаю игрушку для сына, чтоб на каникулах не забыл словарные слова.
Как сделать так, чтобы каждое слово из этого диктанта выдавалось пользователю только 1 раз? Чем больше думаю об этом, тем больше запутываюсь. Буду благодарна за любые идеи! :wink:
В общей сложности будет 50 слов.
Код:
Program Diktant;
Uses Graph, CRT;
Var
clovo:string;
variant, ocenka,n:Integer;
nbukva,bukva:Char;
gd, gm:Integer;
Font: Integer;

Begin
gd:=Detect;
InitGraph(gd,gm,'a:\');
SetBkColor(7);
SetColor(LightGreen);
Font:=InstallUserFont('Brus');
SetTextStyle(Font, 0, 3);
OutTextXY(115, 240, 'СЛОВАРНЫЙ ДИКТАНТ');
OutTextXY(115, 340,'НАЖМИТЕ КЛАВИШУ ВВОД');
ReadLn;
ClearDevice;
     Randomize;
     ocenka:=0;
     n:=0;
     Repeat
     variant:=Random(11);
     If variant=1
   Then
       Begin
       nbukva:='е';
       clovo:='Б...реза';
       End
     Else
    If variant=2
       Then
      Begin
           clovo:='Быстр...';
           nbukva:='о';
      End
    Else
        If variant=3
      Then
          Begin
         clovo:='Вдру...';
          nbukva:='г';
          End
        Else
       If variant=4
          Then
         Begin
              clovo:='Весел...';
              nbukva:='о';
         End
       Else
           If variant=5
         Then
             Begin
             clovo:='Вет...р';
             nbukva:='е';
             End
           Else
          If variant=6
             Then
            Begin
              clovo:='В...робей';
                 nbukva:='о';
            End
          Else
              If variant=7
            Then
              Begin
             clovo:='В...рона';
             nbukva:='о';
                                    End
              Else
             If variant=8
            Then
            Begin
             clovo:='Гор...д';
                 nbukva:='о';
            End
             Else
                If variant=9
               Then
              Begin            
                                              clovo:='Дев...чка';
                nbukva:='о';
             End
            Else
             Begin
                  clovo:='Д...журный';
                     nbukva:='е';

             End;
     OutTextXY(250,240,clovo);
     bukva:=readkey;
     If bukva=nbukva
   Then ocenka:=ocenka+1;
     n:=n+1;
     ClearDevice;
     Until n=10;
     if (ocenka>=9) and (ocenka=10) then
       OutTextXY(125, 240,'Ваша оценка 5')
     else
    if (ocenka>=7) and (ocenka<8>=4) and (ocenka<7)
then
        OutTextXY(125, 240,'Ваша оценка 3')
        else
       OutTextXY(125, 240,'Ваша оценка 2');
       ReadLn;
     End.

 
 
 
 
Сообщение08.05.2006, 17:08 
Такой вариант не подойдет?

var
slova[1..50]: string; {- слова}
bukvy[1..50]: char ; {- буквы}
index[1..50]: integer; {- индексы активных (не просмотренных) слов}
nindex: integer; {- число активных слов}
i,k,m: integer;

0. Инициализация
for i:=1 to 50 do index[i] := i;
nindex = 50

1. Очередной шаг
a) выбрать случайное число k от 1 до nindex
индекс очередного активного слова:
m := index[k];
b) показать слово slova[m]
проверить букву bukva[m]
c) удалить текущее слово из активных
for i:=k+1 to nindex do index[i-1] := index[i];
nindex := nindex - 1;
d) проверить, не пора ли на отдых
if nindex=0 then <END>;

 
 
 
 
Сообщение08.05.2006, 23:07 
Увидел предыдущий ответ и вспомнил более красивое решение: массив index делаем из элементов типа boolean, инициализируем его одинаковыми значениями, например true, и дальше полученное случайное число используем в качестве индекса, и соответствующий элемент скидываем в false - т.е. помечаем что слово с такием номером уже выпадало.
В коде это будет как то так:

var
slova[1..50]: string; {- слова}
bukvy[1..50]: char ; {- буквы}
index[1..50]: boolean; { false - вариант уже был, true - не был }
nindex: integer; {- число активных слов}
i,k,m: integer;

0. Инициализация
for i:=1 to 50 do index[i] := true;
nindex = 50;

1. Очередной шаг
a) выбрать случайное число k, до тех пор пока попадется неиспользованное
Repeat
k :=Random(50);
Until index[k]=true;
b) показать слово slova[m]
проверить букву bukva[m]
c) пометить, что k-e слово уже использовано
index[k] := false;
nindex := nindex - 1;
d) проверить, не пора ли на отдых
if nindex=0 then <END>;

 
 
 
 
Сообщение09.05.2006, 00:48 
serga писал(а):
1. Очередной шаг
a) выбрать случайное число k, до тех пор пока попадется неиспользованное

Я подчеркнул то место в Вашей версии, из-за которого я не использую ее в боевых условиях, хотя это решение и более короткое. Я лишь чуть-чуть имел дело с параллельными программами, но с тех пор стараюсь избегать алгоритмов с недетерминированным поведением.
Для данной задачи Ваше решение лучше.

 
 
 
 
Сообщение09.05.2006, 11:38 
Аватара пользователя
Yuri Gendelman писал(а):
c) удалить текущее слово из активных
for i:=k+1 to nindex do index[i-1] := index[i];
nindex := nindex - 1;


Достаточно присвоить index[k]:=index[nindex];Dec(nindex);

Если необходимо сохранить список попарно различных индексов, то переставляем:
i:=index[k];index[k]:=index[nindex];index[nindex]:=i;Dec(nindex);

Исправление: скобки в Dec(nindex), естественно, должны быть круглые, а не квадратные. Исправил.

 
 
 
 
Сообщение09.05.2006, 12:49 
Спасибо, большое! :wink:

 
 
 
 
Сообщение09.05.2006, 14:06 
Кстати, можно не заводить отдельно массив букв, а в массиве слов надо чтобы все слова были в нижнем регистре, а та буква, которую надо вписать, в верхнем. Потом можно модифицировать слово так, как нужно на выходе. Причем в таком варианте можно одно слово на несколько правил и слова не будут повторяться.
P. S. Для грамотности лучше читайте ему диктанты.

 
 
 
 
Сообщение09.05.2006, 14:47 
Вариант понравился, очень. Но добиться работающей программы не получилось. Я не большой специалист в Паскале. Наверное поэтому. Запуталась теперь в том, как показывать слово и особенно проверять букву. Ведь действительно есть буквы, которые повторяются. Зачем их тогда 50?
А диктантами в школе ребенка пытают. Дома хочется все-таки к этому с фантазией подойти. Пацан вегетативно не любит занятия по русскому, при том что мама - журналист.

 
 
 
 
Сообщение09.05.2006, 15:20 
Someone писал(а):
Достаточно присвоить index[k]:=index[nindex];Dec[nindex];

По-моему это наилучший вариант. Голосую ЗА.

Alenka_kiss писал(а):
Пацан вегетативно не любит занятия по русскому, при том что мама - журналист.

Значит мальчик развивается нормально. А вот мама - журналист со знанием Pascal - большая редкость. :)

 
 
 
 
Сообщение10.05.2006, 07:37 
Аватара пользователя
Цитата:
Вариант понравился, очень. Но добиться работающей программы не получилось.

Давайте сюда Вашу неработающую программу (последний вариант). Попробуем из нее рабочую сделать :)

 
 
 
 
Сообщение10.05.2006, 14:28 
Ну вот чего-то такое получилось неработающее :cry:
Может кто поможет разобраться окончательно :roll: (Сами слова в варианте ваше, что=-то кодировка сбилась и они такие получились).
Код:
Program Diktant;

Uses Graph, CRT;


Var
clovo:string;
variant, ocenka,n:Integer;
nbukva,bukva:Char;
gd, gm:Integer;
Font: Integer;
index:array [1..10] of boolean;   { false - вариант уже был, true - не был }
i, k, nindex:Integer;
Begin
gd:=Detect;
InitGraph(gd,gm,'a:\');

SetBkColor(7);
SetColor(LightGreen);
Font:=InstallUserFont('Brus');
SetTextStyle(Font, 0, 3);

OutTextXY(115, 240, '‘‹Ћ‚ЂђЌ›‰ „?Љ’ЂЌ’');

OutTextXY(115, 340,'ЌЂ†Њ? Љ‹Ђ‚?˜“ ‚‚Ћ„');


ReadLn;
ClearDevice;
for i:=1 to 10 do index[i] := true;
      Randomize;
     ocenka:=0;
    nindex := 10;

     Repeat

     k:=Random(11);
     
     If k=1
   Then
       Begin
       nbukva:='Ґ';
       clovo:='Ѓ...१ ';
      index[1] := false;
       End
     Else
    If k=2
       Then
      Begin
           clovo:='Ѓлбва...';
           nbukva:='®';
           index[2] := false;
      End
    Else
        If k=3
      Then
          Begin
          clovo:='‚¤аг...';
          nbukva:='Ј';
          index[3] := false;
          End
        Else
       If k=4
          Then
         Begin
              clovo:='‚ҐбҐ«...';
              nbukva:='®';
              index[4] := false;
         End
       Else
           If k=5
         Then
             Begin
             clovo:='‚Ґв...а';
             nbukva:='Ґ';
            index[5] := false;
             End
           Else
          If k=6
             Then
            Begin
                 clovo:='‚...а®ЎҐ©';
                 nbukva:='®';
                 index[6] := false;
            End
          Else
              If k=7
            Then
                Begin
                clovo:='‚...а®­ ';
                nbukva:='®';
                index[7] := false;
                End
              Else
             If k=8
                Then
               Begin
                    clovo:='ѓ®а...¤';
                    nbukva:='®';
                    index[8] := false;
               End
             Else
                 If k=9
               Then
                   Begin
                   clovo:='„Ґў...зЄ ';
                   nbukva:='®';
                   index[9] := false;
                   End
             Else
                 If k=10
                 Then
                Begin
                     clovo:='„...¦га­л©';
                     nbukva:='Ґ';
                     index[10] := false;
                   End;



     OutTextXY(250,240,clovo);
     bukva:=readkey;
     If bukva=nbukva
   Then ocenka:=ocenka+1;
     ClearDevice;
     Until index[i]=true;
     nindex := nindex - 1;
     if nindex=0 then
     if (ocenka>=9) and (ocenka=10) then
       OutTextXY(125, 240,'Ваша оценка 5')
     else
    if (ocenka>=7) and (ocenka<8>=4) and (ocenka<7) then
        OutTextXY(125, 240,'Ваша оценка 3')
        else
       OutTextXY(125, 240,'Ваша оценка 2');
       ReadLn;
     end.

 
 
 
 
Сообщение11.05.2006, 19:47 
Аватара пользователя
С кодировкой все в порядке, это OEM DOS, как и положено в текстовом редакторе BP 7.0. Счас, попробуем откомпилить и разобратся.

 
 
 
 
Сообщение11.05.2006, 20:56 
Аватара пользователя
Вот, написал, вроде работает:
Код:
Program Diktant;

Uses Graph, CRT;


Var
clovo:string;
variant, ocenka,n:Integer;
nbukva,bukva:Char;
gd, gm:Integer;
Font: Integer;
index:array [1..10] of boolean;   { false - трЁшрэЄ єцх с_ы, true - эх с_ы }
words:array [1..10] of string;
letters: array [1..10] of char;
i, k, nindex:Integer;
Begin
   gd:=Detect;
   InitGraph(gd,gm,'');

   SetBkColor(7);
   SetColor(LightGreen);
   Font:=InstallUserFont('Brus');
   SetTextStyle(Font, 0, 3);

   OutTextXY(115, 240, 'СЛОВАРНЫЙ ДИКТАНТ');

   OutTextXY(115, 340,'НАЖМИ КЛАВИШУ ВВОД');
   ReadLn;

{ слова: }
   words[1] := 'Б...реза';
   words[2] := 'Быстр...';
   words[3] := 'Вдру...';
   words[4] := 'Весел...';
   words[5] := 'Вет...р';
   words[6] := 'В...робей';
   words[7] := 'В...рон ';
   words[8] := 'Гор...д';
   words[9] := 'Дев...чка';
   words[10] := 'Д...журный';
{ Строка пропущенных букв: }
   letters := 'еогоеоооое';

   ClearDevice;
   for i:=1 to 10 do
      index[i] := true;
   Randomize;
   ocenka:=0;
   nindex := 10;


   Repeat
      k:=Random(11);
      If not index[k] Then
         continue;
      nbukva:=letters[k];
      index[k] := false;

      OutTextXY(250,240,words[k]);
      bukva:=readkey;
      If bukva=nbukva then
         ocenka:=ocenka+1;
      ClearDevice;
      nindex := nindex - 1;
   Until nindex = 0;

   if ocenka >= 9  then
      OutTextXY(125, 240,'Ваша оценка 5')
   else if ocenka >= 7 then
      OutTextXY(125, 240,'Ваша оценка 3')
   else
      OutTextXY(125, 240,'Ваша оценка 2');
   ReadLn;
end.

Если что-нить не понятно как тут что происходит - спрашивайте, постараюсь ответить. Удачи Вам в нелегком деле воспитания подрастающего поколения :)

 
 
 
 
Сообщение11.05.2006, 21:22 
Исправил видимые баги, но не компилировал.

Код:
Program Diktant;

Uses Graph, CRT;

Var
  clovo:string;
  variant, ocenka,n:Integer;
  nbukva,bukva:Char;
  gd, gm:Integer;
  Font: Integer;
  index:array [1..10] of boolean;   { false - вариант уже был, true - не был }
  i, nindex:Integer;

Begin
  gd:=Detect;
  InitGraph(gd,gm,'a:\');
  SetBkColor(7);
  SetColor(LightGreen);
  Font:=InstallUserFont('Brus');
  SetTextStyle(Font, 0, 3);
  OutTextXY(115, 240, '‘‹Ћ‚ЂђЌ›‰ „?Љ’ЂЌ’');
  OutTextXY(115, 340,'ЌЂ†Њ? Љ‹Ђ‚?˜“ ‚‚Ћ„');
  ReadLn;
  ClearDevice;
  for i:=1 to 10 do index[i] := true;
  Randomize;
  ocenka:=0;
  nindex := 10;
  Repeat
    Repeat
      variant:=Random(9)+1;
    Until index[variant]=true;
    case variant of
      1:  nbukva:='Ґ'; clovo:='Ѓ...१ ';
      2:  clovo:='Ѓлбва...'; nbukva:='®';
      3:  clovo:='‚¤аг...'; nbukva:='Ј';
      4:  clovo:='‚ҐбҐ«...'; nbukva:='®';
      5:  clovo:='‚Ґв...а'; nbukva:='Ґ';
      6:  clovo:='‚...а®ЎҐ©'; nbukva:='®';
      7:  clovo:='‚...а®­ '; nbukva:='®';
      8:  clovo:='ѓ®а...¤'; nbukva:='®';
      9:  clovo:='„Ґў...зЄ '; nbukva:='®';
      10: clovo:='„...¦га­л©'; nbukva:='Ґ';
{      else }
    end;
    OutTextXY(250,240,clovo);
    bukva:=readkey;
    If bukva=nbukva
       Then ocenka:=ocenka+1;
    ClearDevice;
    index[variant] := false;
    nindex := nindex - 1;
  Until nindex=0;
  if ocenka >= 9  then
    OutTextXY(125, 240,'Ваша оценка 5')
  else if ocenka >= 7 then
    OutTextXY(125, 240,'Ваша оценка 4')
  else if ocenka >= 4 then
    OutTextXY(125, 240,'Ваша оценка 3')
  else
    OutTextXY(125, 240,'Ваша оценка 2');
  ReadLn;
end.

 
 
 
 
Сообщение13.05.2006, 07:41 
Sanyok писал(а):
Если что-нить не понятно как тут что происходит - спрашивайте, постараюсь ответить. Удачи Вам в нелегком деле воспитания подрастающего поколения :)

Спасибо Большое! У меня она тоже работает. "Подрастающее поколение" включилось в процесс. :) Уже есть замечания: хотелось бы, чтобы в случае правильного варианта программа сразу об этом сообщала и выдавала слово с правильной буквой, а в случае неправильного варианта - тоже сообщала об этом и предлагала попробывать ввести нужную букву еще раз. Соответственно придется менять и систему оценок. В общем, есть чем заняться на выходных.
Ну а так, восторгу сына не было предела и он сразу попросил сделать такую же по математике "потому что математику он любит". надеюсь эта программа привьет ему немного любви и к русскому языку. Тем более что в третьем классе словарные слова тоже есть.

 
 
 [ Сообщений: 28 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group