Google Colaboratory ⑭ 線形探索

線形探索のコードです。

 

%%js

const arr = ["a", "b", "c", "d"];

const linearSearch = (array, target) => {
  //見つかったらその時点で終了
  for(let i=0; i< array.length; i++){
    if(array[i] == target){
      return i;
    }
  }
  return -1;
}

switch(linearSearch(arr, "d")){
  case -1:
    console.log("ありませんでした")
  case 0:
    console.log("a");
  case 1:
    console.log("b");
  case 2:
    console.log("c");
  case 3:
    console.log("d");
}

拡張性のあるクイズアプリ簡易版⑥

さて、今日は、試験勉強からは少し離れてアプリ作成に戻ります。

どこまでやったか忘れたので下記からスタートです。

import { StatusBar } from "expo-status-bar";
import { StyleSheet, Text, View, Button, ScrollView } from "react-native";
import { useEffect, useState } from "react";
import { problemArrayData } from "./setData/dataSet_first.js";

export default function App() {
  const [correctAnswer, setCorrectAnswer] = useState("");
  const [problemText, setProblemText] = useState("");
  const [totalAnswerNumber, setTotalAnswerNumber] = useState(0);
  const [correctAnswerNumber, setCorrectAnswerNumber] = useState(0);
  const [finishedText, setFinishedText] = useState("");
  const [curiousNumber, setCuriousNumber] = useState(20);
  const [problemNumber, setProblemNumber] = useState(0);

  const [correctText, setCorrectText] = useState("");
  const [explanationText, setExplanationText] = useState("");
  const [explanationSentence, setExplanationSentence] = useState("");

  const pressNextHandler = () => {
    const randomNumber = Math.floor(Math.random() * 19);
    setProblemNumber(randomNumber);
    setCorrectAnswer(problemArrayData[randomNumber].correctAnswer);
    setCorrectText("");
    setExplanationText("");
    setProblemText(problemArrayData[randomNumber].problemText);
    setExplanationSentence(problemArrayData[randomNumber].explanationSentence);
    setTotalAnswerNumber((prevState) => prevState + 1);
  };

  const pressFinishHandler = () => {
    setFinishedText(
      `Finished!\r\n解いた問題数は${totalAnswerNumber}\r\n正答数は${correctAnswerNumber}です。`
    );
  };

  const pressHandler = (selectedText) => {
    if (correctAnswer == selectedText) {
      setCorrectText("Correct");
      setExplanationText("");
      setCorrectAnswerNumber((prevState) => prevState + 1);
      setCuriousNumber((prevState) => prevState - 1);
    } else {
      setCorrectText("Incorrect!");
      setExplanationText(
        `正解は${correctAnswer}でした。\r\n${explanationSentence}`
      );
      setCuriousNumber((prevState) => prevState - 2);
    }
  };

  const pressHandler_a = () => {
    pressHandler("a");
  };

  const pressHandler_b = () => {
    pressHandler("b");
  };

  const pressHandler_c = () => {
    pressHandler("c");
  };

  const pressHandler_d = () => {
    pressHandler("d");
  };

  useEffect(() => {
    pressNextHandler();
  }, );

  return (
    <ScrollView style={styles.container}>
      <Text>好奇心ポイント:{curiousNumber}</Text>
      <View style={styles.nextFinishButtonContainer}>
        <Button
          title="次の問題"
          onPress={pressNextHandler}
          disabled={curiousNumber < 1 ? true : false}
        />
        <Button title="終了" onPress={pressFinishHandler} />
      </View>
      <Text style={{ fontSize: 20 }}>{problemText}</Text>
      <View style={styles.selectButtonContainer}>
        <Button title="a" onPress={pressHandler_a} />
        <Button title="b" onPress={pressHandler_b} />
        <Button title="c" onPress={pressHandler_c} />
        <Button title="d" onPress={pressHandler_d} />
      </View>
      <Text style={{ fontSize: 20 }}>{correctText}</Text>
      <Text style={{ fontSize: 20 }}>{explanationText}</Text>
      <Text style={styles.finishedText}>{finishedText}</Text>
    </ScrollView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#00ff00",
  },
  nextFinishButtonContainer: {
    flexDirection: "row",
    justifyContent: "space-around",
    width: "80%",
  },
  selectButtonContainer: {
    flexDirection: "row",
    justifyContent: "space-around",
    width: "80%",
  },
  finishedText: {
    marginTop: 30,
    fontSize: 20,
  },
});

注意点としては、ボタンのところの onPressに関数を渡すとき、それぞれのボタンに引数が異なる関数を渡すのではなく、それぞれのボタンに別の関数を渡さないとエラーが出ることがあるということでしょうか。

 

 

dataSet.jsとして、下記のようなオブジェクトの配列を作っておきます。

a、b、c、dのいずれかのボタンを押す仕様になってますので、現時点では、correctAnswerは、"a"、"b"、"c"、"d"のいずれかです。

[
  ・
  ・
  ・
{
    id: 6,
    correctAnswer: "b",
    problemText:
      "加減乗除を組み合わせた計算式の処理において,スタックを利用するのが適している処理はどれか。  \r\n a. 格納された計算の途中結果を,格納された順番に取り出す処理\r\n b. 計算の途中結果を格納し,別の計算を行った後で,その計算結果と途中結果との計算を行う処理\r\n c. 昇順に並べられた計算の途中結果のうち,中間にある途中結果だけ変更する処理\r\n d. リストの中間にある計算の途中結果に対して,新たな途中結果の挿入を行う処理",
    explanationSentence:
      "スタックは、後入先出し方式でデータを入出力するデータ構造で、データを追加するプッシュ命令(push)と最後に格納されたデータを取り出すポップ命令(pop)でデータ操作を行います。サブルーチン終了後の戻りアドレスや局所変数などを保持するのに使用されます。",
  },
  ・
  ・
  ・
]
 

 

あとで気づいたのですが、correctAnswerがかぶってますね。

データセットの方にも、App.jsの中の、pressHandlerの中にもある。

はじめ問題なく動いていたのに途中からエラーが出始めました。

いやー、こんなことあるんですね。変えておきます。

import { StatusBar } from "expo-status-bar";
import { StyleSheet, Text, View, Button, ScrollView } from "react-native";
import { useEffect, useState } from "react";
import { problemArrayData } from "./entity/ProblemEntity_third";

export default function App() {
  const [correctAnswerText, setCorrectAnswerText] = useState("");
  const [problemText, setProblemText] = useState("");
  const [totalAnswerNumber, setTotalAnswerNumber] = useState(0);
  const [correctAnswerNumber, setCorrectAnswerNumber] = useState(0);
  const [finishedText, setFinishedText] = useState("");
  const [curiousNumber, setCuriousNumber] = useState(20);
  const [problemNumber, setProblemNumber] = useState(0);

  const [correctText, setCorrectText] = useState("");
  const [explanationText, setExplanationText] = useState("");
  const [explanationSentence, setExplanationSentence] = useState("");

  const pressNextHandler = () => {
    const randomNumber = Math.floor(Math.random() * 19);
    setProblemNumber(randomNumber);
    setCorrectAnswerText(problemArrayData[randomNumber].correctAnswer);
    setCorrectText("");
    setExplanationText("");
    setProblemText(problemArrayData[randomNumber].problemText);
    setExplanationSentence(problemArrayData[randomNumber].explanationSentence);
    setTotalAnswerNumber((prevState) => prevState + 1);
  };

  const pressFinishHandler = () => {
    setFinishedText(
      `Finished!\r\n解いた問題数は${totalAnswerNumber}\r\n正答数は${correctAnswerNumber}です。`
    );
  };

  const pressHandler = (selectedText) => {
    if (correctAnswerText == selectedText) {
      setCorrectText("Correct");
      setExplanationText("");
      setCorrectAnswerNumber((prevState) => prevState + 1);
      setCuriousNumber((prevState) => prevState - 1);
    } else {
      setCorrectText("Incorrect!");
      setExplanationText(
        `正解は${correctAnswerText}でした。\r\n${explanationSentence}`
      );
      setCuriousNumber((prevState) => prevState - 2);
    }
  };

  const pressHandler_a = () => {
    pressHandler("a");
  };

  const pressHandler_b = () => {
    pressHandler("b");
  };

  const pressHandler_c = () => {
    pressHandler("c");
  };

  const pressHandler_d = () => {
    pressHandler("d");
  };

  useEffect(() => {
    pressNextHandler();
  }, );

  return (
    <ScrollView style={styles.container}>
      <Text>好奇心ポイント:{curiousNumber}</Text>
      <View style={styles.nextFinishButtonContainer}>
        <Button
          title="次の問題"
          onPress={pressNextHandler}
          disabled={curiousNumber < 1 ? true : false}
        />
        <Button title="終了" onPress={pressFinishHandler} />
      </View>
      <Text style={{ fontSize: 20 }}>{problemText}</Text>
      <View style={styles.selectButtonContainer}>
        <Button title="a" onPress={pressHandler_a} />
        <Button title="b" onPress={pressHandler_b} />
        <Button title="c" onPress={pressHandler_c} />
        <Button title="d" onPress={pressHandler_d} />
      </View>
      <Text style={{ fontSize: 20 }}>{correctText}</Text>
      <Text style={{ fontSize: 20 }}>{explanationText}</Text>
      <Text style={styles.finishedText}>{finishedText}</Text>
    </ScrollView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#00ff00",
  },
  nextFinishButtonContainer: {
    flexDirection: "row",
    justifyContent: "space-around",
    width: "80%",
  },
  selectButtonContainer: {
    flexDirection: "row",
    justifyContent: "space-around",
    width: "80%",
  },
  finishedText: {
    marginTop: 30,
    fontSize: 20,
  },
});

 

 

 

拡張性のあるクイズアプリ簡易版⑤

いろいろ考えてみましたが、結局、

問題文および、似たような内容の選択肢を持つ『配列』からランダムに選択肢4つを持つ『配列』を取得し(この場合はシャフルは別でする必要なし)、アプリに表示すればよい。

この方針で作成していきます。

ex1)

データベースのトランザクションのACIDとセキュリティのCIAは似ているので区別。

A、C、Iがかぶっている。

ACIDでは、Aは、Atomicity(原子性)、CはConsistency(一貫性)、IはIsolation、Dは、Durability(耐久性)。

CIAでは、Cは、  、Iは、  、Aは

google colabolatory⑬ 1~nまでの整数のなかから異なる3つの整数を取り出し、配列で返す

どうも線形探索のアルゴリズムを先にやるべきなようです。

それができたとすると、

-1が返ってくれば、新たな配列に付け加えるとし、それ以外なら、新たな配列には付け加えず、もう一回繰り返します。

新たな配列の要素数が、3になれば終了とします。

google colabolatory⑫ 最大公約数を求めるアルゴリズム

【JavaScript】 最大公約数を求める

 

ユークリッドの互除法というのを勉強します。

Aを割られる数、Bを割る数とします。

A÷B = C ...  D

ここで、Cは商、Dは余りです。

次にすることは、

前回、割る数であったBを、割られる数とし、

前回の余りであるDを割る数とします。すなわち、

B÷D = E ... F

では次にすることは?

 

さてコードです。

%%js

function getGreatestCommonDivisionNumber(value1, value2){
  let r;
  a = value1;
  b = value2;

  do{
    r = a % b;
    a = b;
    b = r;
  }while(r!==0)

  return a;

}

console.log(getGreatestCommonDivisionNumber(824,1133));

 

JavaScriptなら、undefinedやnull値と0を比較しても異なっていれば、false判定になるので下記のようにも書けます。単純に理解するだけならこの方がよい。

%%js

function getGreatestCommonDivisionNumber(value1, value2){
  let r;
  a = value1;
  b = value2;

 while(r !== 0){
  r = a % b;
  a = b;
  b = r;
 }

  return a;

}

console.log(getGreatestCommonDivisionNumber(824,1133));

 

条件文(forやwhile, do while)は、三項演算子で書き換えが可能です。

 

上記HPでは、単なる三項演算子ではなく、中に再帰(リカーシブ)をいれてきてます。

google colabolatory⑪ JavaScriptでアルゴリズム([ソート編①]バブルソート)

ソートのアルゴリズムもやってみます。

まずはバブルソートです。

%%js
//バブルソートで昇順に並べかえる
const data = [8,5,2,4,7,3,1,9];

let arr = [...data];

function swap(array, idx1, idx2){
 let tmp = array[idx1];
 array[idx1] = array[idx2];
 array[idx2] = tmp;
}

function bubbleSort(array){
  let n = array.length;
  for(let i=0; i<n-1; i++){
    for(let j=n-1; j>i; j--){
      if(array[j-1] > array[j]){
         swap(array, j-1, j);
      }
    }
  }
}

bubbleSort(arr);
console.log(arr);

 

あくまでメモしているだけになります。

参考文献は、下記です。

新・明解Javaで学ぶアルゴリズムとデータ構造 第2版, (新・明解)