Что нового

[Математика] Генератор примеров сложение\вычитание

Renz

Осваивающий
Сообщения
63
Репутация
36
AutoIt: v3.3.6.1

Версия: 0.1

Категория: Математика

Описание: Генератор примеров по математике для детей 1-2 класс.
Есть настройки макс. 1-2 чисел, время на решение примера,количество примеров,
выбор знака. Ответ можно подтверждать кнопкой {SPACE}.
(Цель написания скрипта - сын пошел в 2 класс. Проверял остаточные знания после лета.:smile:)

Код:
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Const $sIniSetup = @ScriptDir &"\"& "setup.ini"
;~ Const $sIniSetup = "c:" &"\"& "setup.ini"
If FileExists ( $sIniSetup ) = 0 Then	
	$sData = "fi=9" & @LF & "si=9" & @LF & "time=15" & @LF & "num=20" & @LF & "sign=1"
	IniWriteSection($sIniSetup, "Setup", $sData)
EndIf



$Form1 = GUICreate("Сложение\Вычитание", 288, 180, 475, 271)
$MenuItem2 = GUICtrlCreateMenu("Настройки")
$MenuItem1 = GUICtrlCreateMenuItem("Настройки", $MenuItem2)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
$Label1 = GUICtrlCreateLabel("", 24, 24, 40, 41) ; f int
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$Label2 = GUICtrlCreateLabel("", 88, 24, 40, 41) ;s int
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$Label3 = GUICtrlCreateLabel("", 64, 24, 23, 41) ;zn
GUICtrlSetFont(-1, 22, 400, 0, "MS Sans Serif")
$Group1 = GUICtrlCreateGroup("Пример:", 8, 8, 161, 65)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label4 = GUICtrlCreateLabel("", 136, 24, 23, 41) ;=
GUICtrlSetFont(-1, 22, 400, 0, "MS Sans Serif")
$Input1 = GUICtrlCreateInput("", 176, 24, 89, 45)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$Button1 = GUICtrlCreateButton("Старт", 56, 128, 75, 25)
$Button2 = GUICtrlCreateButton("Стоп", 144, 128, 75, 25)
$Label5 = GUICtrlCreateLabel("", 56, 80, 196, 41)
GUICtrlSetFont(-1, 22, 800, 0, "MS Sans Serif")
$Button3 = GUICtrlCreateButton("Ответ", 176, 0, 75, 17)
;присваеваем кнопке ответ аксел {спейс} и скрываем её
Dim $Form1_AccelTable[1][2] = [["{SPACE}", $Button3]]
GUISetAccelerators($Form1_AccelTable)
GUICtrlSetState($Button3,$GUI_HIDE)
GUISwitch($Form1)
GUISetState(@SW_SHOW)


While 1
	$nMsg = GUIGetMsg(1)
	If $nMsg[0] = $GUI_EVENT_CLOSE Then 
		Exit
	ElseIf	$nMsg[0] = $MenuItem1 Then
		OpenSetup()
	ElseIf	$nMsg[0] = $Button1 Then
		GUICtrlSetState ($Input1,$GUI_FOCUS)
		; primer
		$iMaxFI = IniRead($sIniSetup,"Setup","fi","9") ; max f i
		$iMaxSI = IniRead($sIniSetup,"Setup","si","9"); max s i
		$iTime = IniRead($sIniSetup,"Setup","time","15")*1000; time
		$iNum = IniRead($sIniSetup,"Setup","num","20"); kol
		$iSign = IniRead($sIniSetup,"Setup","sign","1"); znak
		$iNeusp =0
		$iReshil =0
		$iNepravReshil =0
		
		For $i =1 To $iNum
			If $iSign = 1 Then ;+
				$iRez = Primer($Label1,$Label2,$Label3,$Label4,$iMaxSI,$iMaxFI,$iSign)
			ElseIf $iSign = 2 Then ;-
				$iRez = Primer($Label1,$Label2,$Label3,$Label4,$iMaxSI,$iMaxFI,$iSign)
			Else ;+\-
				$iSignGen = Random(1,2,1)
				If $iSignGen = 1 Then ;+
					$iRez = Primer($Label1,$Label2,$Label3,$Label4,$iMaxSI,$iMaxFI,$iSignGen)
				ElseIf $iSignGen = 2 Then ;-
					$iRez = Primer($Label1,$Label2,$Label3,$Label4,$iMaxSI,$iMaxFI,$iSignGen)
				Else
					MsgBox(0,"Error","Ошибка в генераторе +\- !!!!")
				EndIf	
			EndIf
		
			$begin = TimerInit()
			While 1
				$nMsg = GUIGetMsg(1)
				;проверяем прошло ли время отведен на пример
				If TimerDiff($begin) > $iTime Then
					;проверяем ответ по завершению времени
					$iOtvet = GUICtrlRead($Input1)
					If $iOtvet = $iRez Then
						$iReshil +=1
						GUICtrlSetData($Label5,"Правильно")
						GUICtrlSetColor($Label5,0x5da130)
						GUICtrlSetState ( $Label5, $GUI_SHOW )
						Sleep(3000)
					ElseIf String($iOtvet) ="" Then
						GUICtrlSetData($Label5,"Неуспели")
						GUICtrlSetColor($Label5,0xff0000)
						GUICtrlSetState ( $Label5, $GUI_SHOW )
						Sleep(3000)
						$iNeusp +=1
					ElseIf $iOtvet <> $iRez Then
						GUICtrlSetData($Label5,"Неправильно")
						GUICtrlSetColor($Label5,0xff0000)
						GUICtrlSetState ( $Label5, $GUI_SHOW )
						Sleep(3000)
						$iNepravReshil +=1
					EndIf
					GUICtrlSetData ( $Input1, "")
					GUICtrlSetState ( $Input1, $GUI_SHOW )
					ExitLoop
				ElseIf $nMsg[0] = $Button2 Then
					ExitLoop 2
				;проверяем ответ по кнопке спейс
				ElseIf $nMsg[0] = $Button3 Then
					$iOtvet = GUICtrlRead($Input1)
					If $iOtvet = $iRez Then
						$iReshil +=1
						GUICtrlSetData($Label5,"Правильно")
						GUICtrlSetColor($Label5,0x5da130)
						GUICtrlSetState ( $Label5, $GUI_SHOW )
						Sleep(3000)
					Else
						GUICtrlSetData($Label5,"Неправильно")
						GUICtrlSetColor($Label5,0xff0000)
						GUICtrlSetState ( $Label5, $GUI_SHOW )
						Sleep(3000)
						$iNepravReshil +=1
					EndIf
					GUICtrlSetData ( $Input1, "")
					GUICtrlSetState ( $Input1, $GUI_SHOW )
					ExitLoop
				EndIf
			WEnd
			
			GUICtrlSetData($Label5,"")
			GUICtrlSetState ( $Label5, $GUI_SHOW )
;~ 			$i +=1
		Next
		;выводим результат
		MsgBox(0,"Результат","Всего примеров: " & $i-1 & @CRLF & "Решено: "& $iReshil & @CRLF & "Неправильно: "& $iNepravReshil & @CRLF & "Неуспели: "& $iNeusp)
	EndIf		
WEnd

Func OpenSetup()
	$Form2 = GUICreate("Настройки", 212, 185, 192, 114)
	$Label21 = GUICtrlCreateLabel("Максимум первое число:", 24, 12, 132, 17)
	$Label22 = GUICtrlCreateLabel("Максимум второе число:", 23, 41, 131, 17)
	$Label23 = GUICtrlCreateLabel("Время на один пример , сек:", 0, 68, 150, 17)
	$Label24 = GUICtrlCreateLabel("Количество примеров:", 29, 98, 119, 17)
	$Input21 = GUICtrlCreateInput(IniRead($sIniSetup,"Setup","fi","9"), 160, 8, 33, 21) ; max f i
	$Input22 = GUICtrlCreateInput(IniRead($sIniSetup,"Setup","si","9"), 160, 37, 33, 21); max s i
	$Input23 = GUICtrlCreateInput(IniRead($sIniSetup,"Setup","time","15"), 160, 64, 33, 21); time
	$Input24 = GUICtrlCreateInput(IniRead($sIniSetup,"Setup","num","20"), 160, 94, 33, 21); kol
	$Button21 = GUICtrlCreateButton("Применить", 24, 152, 75, 25)
	$Button22 = GUICtrlCreateButton("Отмена", 105, 152, 75, 25)
	$Radio21 = GUICtrlCreateRadio("+", 8, 128, 33, 17)
	$Radio22 = GUICtrlCreateRadio("-", 54, 128, 33, 17)
	$Radio23 = GUICtrlCreateRadio("+\-", 95, 128, 33, 17)
	;устанавливаем значение радио из настроек
	$iSign = IniRead($sIniSetup,"Setup","sign","1")
	If $iSign = 1 Then 
		GUICtrlSetState ( $Radio21, $GUI_CHECKED )
	ElseIf $iSign = 2 Then
		GUICtrlSetState ( $Radio22, $GUI_CHECKED )
	Else
		GUICtrlSetState ( $Radio23, $GUI_CHECKED )
	EndIf

	GUISwitch($Form2)
	GUISetState(@SW_SHOW,$Form2)
	While 1
		$nMsg = GUIGetMsg(1)
		If $nMsg[0] = $Button21 Then
			If GUICtrlRead ( $Input21 ) < GUICtrlRead ( $Input22 ) Then 
				MsgBox(48,"Ошибка","Первое число должно быть равно\больше второго!")
			Else
				IniWrite ( $sIniSetup, "Setup", "fi", GUICtrlRead ( $Input21 ) )
				IniWrite ( $sIniSetup, "Setup", "si", GUICtrlRead ( $Input22 ) )
				IniWrite ( $sIniSetup, "Setup", "time", GUICtrlRead ( $Input23 ) )
				IniWrite ( $sIniSetup, "Setup", "num", GUICtrlRead ( $Input24 ) )
				;записываем изм из радио в настройки
				If BitAnd(GUICtrlRead($Radio21),$GUI_CHECKED) = $GUI_CHECKED Then
					IniWrite ( $sIniSetup, "Setup", "sign", "1" )
				ElseIf BitAnd(GUICtrlRead($Radio22),$GUI_CHECKED) = $GUI_CHECKED Then
					IniWrite ( $sIniSetup, "Setup", "sign", "2" )
				Else
					IniWrite ( $sIniSetup, "Setup", "sign", "3" )
				EndIf
				ExitLoop
			EndIf
				
		ElseIf $nMsg[0] = $Button22 Then
			ExitLoop
		EndIf
	WEnd
	GUIDelete ()
EndFunc
	
Func Primer($Label1,$Label2,$Label3,$Label4,$iMaxSI,$iMaxFI,$iSign)
	If $iSign =1 Then
		$iSI = Random(1,$iMaxSI,1)
		$iFI = Random(1,$iMaxFI,1)
		$iRez = $iFI+$iSI
		;отображаем пример сложение
		GUICtrlSetData($Label1,$iFI)
		GUICtrlSetData($Label2,$iSI)
		GUICtrlSetData($Label3,"+")
		GUICtrlSetData($Label4,"=")
		GUICtrlSetState ( $Label1, $GUI_SHOW )
		GUICtrlSetState ( $Label2, $GUI_SHOW )
		GUICtrlSetState ( $Label3, $GUI_SHOW )
		GUICtrlSetState ( $Label4, $GUI_SHOW )
		Return $iRez
	ElseIf $iSign =2 Then
		$iFI = Random(1,$iMaxFI,1) + Random(1,$iMaxFI,1)
		$j =0
		While 1
			$iSI = Random(1,$iMaxSI,1)
			If $iSI < $iFI Then
				ExitLoop
			EndIf
			$j+=1
			If $j =20 Then ; от возможного зациклив
				$iFI = $iSI + Random(1,5,1)
				ExitLoop
			EndIf
		WEnd
		$iRez = $iFI-$iSI
		;отображаем пример вычитание
		GUICtrlSetData($Label1,$iFI)
		GUICtrlSetData($Label2,$iSI)
		GUICtrlSetData($Label3,"-")
		GUICtrlSetData($Label4,"=")
		GUICtrlSetState ( $Label1, $GUI_SHOW )
		GUICtrlSetState ( $Label2, $GUI_SHOW )
		GUICtrlSetState ( $Label3, $GUI_SHOW )
		GUICtrlSetState ( $Label4, $GUI_SHOW )
		Return $iRez
	EndIf
	MsgBox(0,"Error","Выход из фукции Primer() без результата!!!!")
EndFunc

Файл: EXE

Снимок:


Источник: http://autoit-script.ru
Автор(ы): Renz
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Банальная, но практичная программка, и для дела. Еще бы оформление соответствующее сделать... Все-таки 2-ой класс.

+1
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Соглашусь с Yashied`ом.
Действительно, хоть и простая, но практичная программка :smile:
 

VladUs

Скриптер
Сообщения
621
Репутация
181
1. В окне "Настройки" нет реакции на системную кнопку закрытия окна (крестик)
2. После запуска (нажатия кнопки "старт") нет реакции на меню "Настройки -> настройки", а так же на системную кнопку закрытия окна (крестик). Наверное необходимо, после нажатия "Старт", пункт меню делать отключенным, а если нажимается системная кнопка закрытия окна во время тестирования, то выводить сообщение типа "В данный момент выполняется тестирование. Для выхода из программы, сначало нажмите кнопку "стоп" ".
Я бы еще добавил на форму отсчет таймера, чтобы знать сколько тебе времени осталось.
А так же добавил, чтобы результат писался в лог-файл. Чтобы знать какие именно ответы правельные, а какие нет.
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
36
Спс VladUs учту в следующей версии :scratch:
Yashied нужен был функционал в первую очередь :smile: Ваше предложение по оформлению?
Все-таки 2-ой класс.
Я не совсем понял что имелось ввиду.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
36
Для детей 7-8 лет, IMHO, лучше более цветастый интерфейс, шрифт побольше, ну и т.д.
Я об этом думал :smile: Повторюсь.
нужен был функционал в первую очередь
"Свистелки и пирделки" можно и потом прикрутить. ;D
Идея была чтобы при правильном ответе происходило какое-то действие с достижением
определенной цели. Но пока мысли в кучу собрать не магу. Как говорится: Идей много,а вот как до воплощения дело доходит...
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
36
А зачем после ввода ждать 15 сек? Сделать кнопку "Следующий" или ">".

Кнопка есть, она просто скрыта. Ждать не надо - жамкай {SPACE}.
 
Верх