チーム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という文字列と因数分解する対象の数字が表示される。
PXL_20220517_053440380_convert_20220517144713.jpg

入力されたものが因数でない場合Retryとなり、因数だった場合はそれで割った数字が出力される。
(画像では45,17,23,19という順に入力した。)
因数分解が終了すればCongraturationCongratulationsと因数がすべて表示される。
teraterm.png

成功すればLCDにも同様に表示される。下は最後に入力した数である。
PXL_20220517_055003751_convert_20220517145233.jpg

考察・改善点

・出題される問題数を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

このWIKIを編集するにはパスワード入力が必要です

認証パスワード