2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Pascal: обучающая игрушка для второклассника
Сообщение08.05.2006, 15:55 


06/01/06
66
Делаю игрушку для сына, чтоб на каникулах не забыл словарные слова.
Как сделать так, чтобы каждое слово из этого диктанта выдавалось пользователю только 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 
Заслуженный участник


15/05/05
3445
USA
Такой вариант не подойдет?

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 


13/09/05
55
Увидел предыдущий ответ и вспомнил более красивое решение: массив 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 
Заслуженный участник


15/05/05
3445
USA
serga писал(а):
1. Очередной шаг
a) выбрать случайное число k, до тех пор пока попадется неиспользованное

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

 Профиль  
                  
 
 
Сообщение09.05.2006, 11:38 
Заслуженный участник
Аватара пользователя


23/07/05
17976
Москва
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 


06/01/06
66
Спасибо, большое! :wink:

 Профиль  
                  
 
 
Сообщение09.05.2006, 14:06 


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

 Профиль  
                  
 
 
Сообщение09.05.2006, 14:47 


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

 Профиль  
                  
 
 
Сообщение09.05.2006, 15:20 
Заслуженный участник


15/05/05
3445
USA
Someone писал(а):
Достаточно присвоить index[k]:=index[nindex];Dec[nindex];

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

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

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

 Профиль  
                  
 
 
Сообщение10.05.2006, 07:37 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Цитата:
Вариант понравился, очень. Но добиться работающей программы не получилось.

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

 Профиль  
                  
 
 
Сообщение10.05.2006, 14:28 


06/01/06
66
Ну вот чего-то такое получилось неработающее :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 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
С кодировкой все в порядке, это OEM DOS, как и положено в текстовом редакторе BP 7.0. Счас, попробуем откомпилить и разобратся.

 Профиль  
                  
 
 
Сообщение11.05.2006, 20:56 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Вот, написал, вроде работает:
Код:
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 


13/09/05
55
Исправил видимые баги, но не компилировал.

Код:
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 


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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group