牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

数字を使わない1~20の足し算と引き算の練習 WEB サイトを作ってみたメモ

数字を使わない1~20の足し算と引き算の練習 WEB サイト

URL

画面

ドットで数字を表す問題を表示

「こたえ」ボタンを押すと式と答えを表示

操作

  • 「こたえ」ボタン押下で1~20の数の式と答えを表示
  • 「つぎのもんだい」ボタン押下で次の問題を表示し、最上部の問題数のカウントを足す
  • 「やりなおし」ボタン押下で最上部の問題数のカウントをリセット
  • 上部のタブ
    • 「たしざん」
      • 足し算1~20の数同士の問題をランダム表示
    • 「ひきざん」
      • 引き算1~20の数同士の問題をランダム表示
    • 「たしざんとひきざん」
      • 足し算と引き算の1~20の数同士の問題をランダム表示

作った経緯

掛け算や割り算はできるけど、桁数が増えると間違いが多い。日によって全問正解したり、全問間違えたり。
問題を解くのを横で見ていて、簡単な足し算・引き算で間違っていることに気がついたので。

計算できない原因を探っていたら

気になるポイントをいくつか挙げてみた

  • 同じ問題でランダムに間違ったり正解したりすることがある
  • 足し算なのに数が減ることがある(引き算の場合は逆に増える)

原因として考えられそうなのが

  • 計算を量としてとらえておらず、式を暗記している
    • (大量に問題を繰り返し解かさせたのが逆に悪い結果をもたらしたのかもしれない)
    • 掛け算は81パターンしかないけど、足し算は1~20同士だけで400パターン。 1~100同士で10,000パターン。

解決策としての数字を使わないドットで数を表して計算の練習

スコア:取り組む前

1~20同士の通常の式の足し算の計算

  • 正解率:20問中16~17問
  • 1問に10~50秒かかることが多々ある
  • 2分間で解けるのが7~12問(正解率を無視して)

スコア:数字を使わないドットで足し算と引き算の計算

1週間毎日2分間で何問解けるかを2~25セット。(1~20同士での足し算・引き算をランダムで) 式と答えを口頭で言ってから「こたえ」ボタンで答えを表示してもらった。

  • 最高:2分間26問
  • 平均:2分間18問
    • (15+16+15+17+16+19+19+26+18+16+15+20+21+14+19+18+20+20+19)/19
  • 正解率:全問中1問だけ間違うか全問正解

効果・感想

スコアを比べると、1週間毎日取り組んで計算力・正解率ともに向上しているように思われる。しばらく継続して続けていきたい。1回2分やるだけなので負担も少なそうだし。

参考

算数の勉強を教えるにあたり下記書籍がとても参考になりました

(再)ChatGPT に ReactJS + react-router + redux を利用した検索機能がある一覧表示のサンプルコードを教えてもらったのでメモ

前置き

前回 と少し変えて質問してみた 同じ質問でも違うこと返答になるけど、質問の仕方で ChatoGPT の返答の質が上がりそうな気もする。

(ChatGPT の画面全体をうまくスクショで撮れなくて分割になってしまった)

ChatGPT に質問

reactjs を と react-router v6 利用した検索機能がある一覧表示のサンプルコードを教えてください

これを redux を利用したものに変更してください

続きを教えてください

最終的な reactjs + react-router v6 + redux を利用した App.js のコード

import React from "react";
import { BrowserRouter as Router, Routes, Route, Link, useParams, useNavigate } from "react-router-dom";
import { createStore } from "redux";
import { Provider, useDispatch, useSelector } from "react-redux";

const initialState = {
  data: [
    { id: 1, name: "John", age: 25 },
    { id: 2, name: "Jane", age: 30 },
    { id: 3, name: "Bob", age: 40 },
    { id: 4, name: "Alice", age: 22 }
  ],
  filter: ""
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "SET_FILTER":
      return { ...state, filter: action.payload };
    default:
      return state;
  }
};

const store = createStore(reducer);

const List = () => {
  const dispatch = useDispatch();
  const navigate = useNavigate();
  const { data, filter } = useSelector((state) => state);

  const handleFilterChange = (e) => {
    dispatch({ type: "SET_FILTER", payload: e.target.value });
  };

  const filteredData = data.filter((item) =>
    item.name.toLowerCase().includes(filter.toLowerCase())
  );

  const handleItemClick = (id) => {
    navigate(`/details/${id}`);
  };

  return (
    <div>
      <input type="text" value={filter} onChange={handleFilterChange} />
      <ul>
        {filteredData.map((item) => (
          <li key={item.id} onClick={() => handleItemClick(item.id)}>
            {item.name}, {item.age}
          </li>
        ))}
      </ul>
    </div>
  );
};

const Details = () => {
  const { id } = useParams();

  const { data } = useSelector((state) => state);

  const item = data.find((item) => item.id === parseInt(id));

  return (
    <div>
      <h2>{item.name}</h2>
      <p>Age: {item.age}</p>
    </div>
  );
};

const App = () => {
  return (
    <Provider store={store}>
      <Router>
        <nav>
          <Link to="/">List</Link>
        </nav>

        <Routes>
          <Route path="/" element={<List />} />
          <Route path="/details/:id" element={<Details />} />
        </Routes>
      </Router>
    </Provider>
  );
};

export default App;

ブラウザで表示させる

このあたりの説明がなかった

$ npx create-react-app sample-search-app
$ cd sample-search-app
$ npm install react-router-dom react-redux redux
$ npm run start