チーム2214
*課題名
素因数分解ゲーム
研究者名
Tsubasa Baba
Zen Matsugu
ソースコード
#include <m8c.h> #include "PSoCAPI.h" #include <stdio.h> #include <stdlib.h>
// LCDでx表示させるために変換する関数
//ex) 100(10) → 100(16)
int changetohex(int x) { int i,j,hex,base; int y = x; base = 1; hex = 0; for(i = 0;y != 0;i++){ y = y / 10; } for(j = 0;j < i;j++){ hex = hex + (x%10)*base; base = base * 16; x = x / 10; } return hex; } void main(void) { int a,n,i,j,no,num,f[10]; char c[5],d[5]; char * strPtr;
//問題をrand関数で決定
no = rand()%10;
if(no == 0) num = 111; else if(no == 1) num = 141; else if(no == 2) num = 323; else if(no == 3) num = 414; else if(no == 4) num = 606; else if(no == 5) num = 737; else if(no == 6) num = 767; else if(no == 7) num = 949; else if(no == 8) num = 437; else if(no == 9) num = 513; n = num; i = 0;
UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE); M8C_EnableGInt ; UART_CPutString("Factorize the number into prime factors.\r\n");
//問題の数字を文字として配列dに格納
itoa(d,num,10);
UART_PutString(d); UART_CPutString("\r\n"); LCD_1_Start(); LCD_1_Position(0,0); LCD_1_PrCString("START!!"); LCD_1_Position(1,0);
//問題の数字をLCDに表示
LCD_1_PrHexInt(changetohex(num)); while(1) { if(UART_bCmdCheck()) { while(strPtr = UART_szGetParam()) {
//文字として入力された値を整数に変換
a = atoi(strPtr); LCD_1_Position(1,0);
//入力された値をLCDに表示
LCD_1_PrHexInt(changetohex(a));
//入力された値が問題の数と同じだった場合
if(n == a) UART_CPutString("Inputed number is not prime factor. Retry\r\n");
//入力された値が素因数だった場合
if((num % a == 0) && (n != a)){
//素因数を配列fに順に格納
f[i] = a; i++;
//問題の数を入力された素因数で割る
num = num / a;
//素因数分解が完了
if(num == 1){ UART_CPutString("Congraturation!!\r\n"); LCD_1_Position(0,0); LCD_1_PrCString("Congraturation!!");
//素因数を順にTera Termに表示
for(j = 0;j < i;j++){ itoa(c,f[j],10); UART_PutString(c); UART_CPutString(" "); } UART_CPutString("\r\n"); break; } }
//入力された値が素因数でなかった場合
else if(num % a != 0) UART_CPutString("Inputed number is not prime factor. Retry\r\n");
//numを文字に変換し、Tera Termに表示
itoa(c,num,10); UART_CPutString(" <"); UART_PutString(c); UART_CPutString(">\r\n"); } UART_CmdReset(); } } }
モジュール・基盤
Uart_1 を参照
実行結果
実際にTera TermとLCDを用いて素因数分解を行った画像
実行するとLCDにSTARTという文字列と因数分解する対象の数字が表示される。
入力されたものが因数でない場合Retryとなり、因数だった場合はそれで割った数字が出力される。
(画像では45,17,23,19という順に入力した。)
因数分解が終了すればCongraturationCongratulationsと因数がすべて表示される。
成功すればLCDにも同様に表示される。下は最後に入力した数である。
考察・改善点
・出題される問題数を10題にしぼりrand関数によってランダムに抽選されるプログラムを書いたが、毎回決まった数が生成されてしまった。
srand関数によって乱数を生成する方法も不可能であった。これはPSoCに時間情報を取得するTime関数が備わっていないからであろう。
代替案としてPSoCのTimeモジュールを使ったり、ADC変換した際の不安定な値から乱数を生成する方法が考えられる。
・キーボードから入力されたものはstrPtrという文字列に格納される。因数分解をする際これらを整数型に変える必要がある。
これを実現する関数がatoi,itoaである。
・LCDに表示される数は16進数である。よって100という数字を出力したければ、256という数字を入力しなければならない。
100(10) → 100(16)
参考
チーム1721
Uart_1
- 最終更新:2022-05-17 17:11:35