程式題目練習:怎麼判斷質數?如何把觀念應用到題目,用程式解決問題?文組生的自學程式之路|芽芽的程式之旅

2023/08/20閱讀時間約 8 分鐘

從跟著教學影片把老師的程式抄過一遍,變成看到題目能把題目轉為程式,對於初學者來說蠻困難的。所以我想以初學者的角度來分享自己怎麼適應這段轉換的過程,以及我解題的方法是什麼。(也順便紀錄一下自己的思路)

  • 主題:流程控制為主的綜合小應用
  • 題目:讓使用者輸入一個數字,並用程式判斷該數字是否質數。提示:使用迴圈與 % 運算子。(題目來源:彭彭老師的課程
raw-image

解決問題的流程

剛開始的時候我其實也不知道怎麼解題,跟工程師男友聊天時他提到,在收到PM提供的需求後,他會先去找出題目的關鍵字、思考要怎麼寫、最後才是開始動手寫程式

這個過程其實跟平常工作中接到任何任務的時候一樣,先確認主管的目標、目的、需求、條件、時間、資源等等,先簡單規劃自己要怎麼做,才開始實際執行。

簡單來說解題的步驟就是:

  1. 拆解題目
  2. 規劃程式架構(開頭寫什麼、中間寫什麼、最後會寫什麼)
  3. 動手嘗試
  4. 反覆修正
  5. 完成

• • •

拆解題目

以這題來說,題目中的關鍵字為「輸入」、「是否」、「質數」。很難以解釋我是怎麼抓出關鍵字的,但據我觀察關鍵字不外乎是動詞、名詞、或Yes or No,大家可以試著從這部份著手。

找出關鍵字後,就可以找出需要用到的工具,比如:

  • 輸入→標準輸入
  • 是否→需要用到判斷式或是迴圈
  • 質數→有點印象,像是2、3、11這種是質數,但具體定義我講不出來,需要用Google搜尋
  • 質數的定義→%餘數運算子。因為Google說質數是指在大於1的自然數中,除了1和該數自身外,無法被其他自然數整除的數(也可定義為只有1與該數本身兩個正因數的數)。而這句話的重點在於「整除」,整除代表沒有餘數,所以可以用%運算子。

• • •

規劃程式架構

在拆解完題目後,我就來翻我的筆記(因為對於語法還不熟,沒有直接背起來),思考我的程式寫出來可能會長什麼樣。

開頭要有標準輸入,所以第一行會是:

import java.util.Scanner;

接著就可以接Java需要寫的兩行程式碼:

public class 檔名{
public static void main (String[ ]args){
}
}

中間要讓使用者輸入,所以要先寫出標準輸入的語法:

Scanner s=new Scanner(System.in);
//s是變數,名稱可以自己定義,你要叫s1、s2、s3......都可以​
int x=s.nextInt();
//如果要定義輸入的是字串,就定義String text=s.next();
s.close();
//使用完畢後需要關閉Scanner

最後再開始寫怎麼判斷是不是質數的程式碼。

• • •

動手嘗試及反覆修正

寫程式一定是寫寫改改的,即使很厲害的軟體工程師,在他們順順寫完Code之後,還是會進行檢查和修正,以工程師的術語來說就是「try and error」。

目前針對這個題目,我把我的寫法放在下一段~

• • •

參考寫法

第一版

可以運作,但是使用者輸入指令不明確,如果今天使用者輸入Hello,或是輸入一個超過Int範圍的數字,這個程式就死掉了,所以不能假設使用者輸入整數。(要把使用者想得很笨很笨)

import java.util.Scanner; 
public class Exerciseloop1{
    public static void main(String[]args){
        Scanner s=new Scanner(System.in);
        System.out.println("請輸入一個整數");
        String text=s.next();

        int x=Integer.parseInt(text);
        int i=1;
        int counter=0;
        //counter代表因數的數量
       
        while(x>=i){
            if(x%i==0){
             counter=counter+1;
            i+=1;
            }else if(x%i!=0){
                i+=1;
            }
         }
        if(counter==2){
            System.out.println("這個數字是質數");  
         } else{
            System.out.println("這個數字不是質數");
         }  
        s.close();
        }      
  }      

於是爬文後,我找到了一個判斷字處是不是整數的工具。不過中間卡了很久,因為不知道要怎麼套進來、程式要放在哪一排比較好、原本的程式碼要怎麼調整。(所以雖然網路上都有寫好的東西可以抄,但是要抄得正確,就跟考試作弊一樣也是一種技術?)

• • •

第二版

奮鬥很久後產出這個版本,大致算成功。

import java.util.Scanner; 
public class Exerciseloop{
    public static void main(String[]args){
        Scanner s1=new Scanner(System.in);
        System.out.println("我是質數判斷機,請輸入一個整數");
        String text1=s1.next();
        boolean integertext1ornot=text1.matches("-?\\d+");
       
        while(integertext1ornot==true){
          int x=Integer.parseInt(text1);
          int i=1;
          int counter=0;
          //counter代表因數的數量

          //能不能整除,用%運算子
          while(x>=i){
            if(x%i==0){
             counter=counter+1;
            i+=1;
            }else if(x%i!=0){
                i+=1;
            }
         }

         if(counter==2){
            System.out.println("這個數字是質數");  
            break;
         } else{
            System.out.println("這個數字不是質數");
            break;
         }  
        }
       
        //輸入的字串不是整數的時候
        while(integertext1ornot==false){
            System.out.println("輸入錯誤,判斷失敗");  
            break;
        }
        s1.close();      
  }
}        

美中不足的就是使用者只能輸入一次資料,電腦會判斷是質數/不是質數/輸入錯誤,然而當使用者輸入錯誤,想再重新輸入,我就要重新按一次run,讓程式重頭開始跑,不能直接跳出請重新輸入。這個地方也讓我卡了很久,但目前還是沒研究成功。(總之這版目前好歹還算是個能跑的程式。)

心得

雖然覺得自己很笨,花了五個小時才解決一題,但至少可以勉強寫出個東西來,挺感動的!過程中對於原本學的while、if、標準輸入、資料型態、字串轉換成整數這幾個工具用的稍微熟練 一些,也自己學了字串判斷整數的語法。

事實證明笨鳥慢飛,只要你願意花時間投入、願意耐住性子爬文找解法(成為工程師必備)、再加上身邊有人能給你指點(這個就不是必須了,但絕對是加分),每個人都有機會學會怎麼寫程式!

• • •

如果你喜歡芽芽的分享、想知道更多的職場乾貨、或想聽聽芽芽發發牢騷,

歡迎留言、按愛心、收藏、追蹤、以及贊助芽芽,給芽芽一點點的鼓勵:)

• • •

繼續閱讀👉文組生的自學程式之路:為什麼選擇Java、哪裡有Java教學、怎麼學Java|芽芽的程式之旅

芽芽|生活體驗家
芽芽|生活體驗家
公館大學畢,求學時除上課跟翹課,踩著高跟鞋跳舞的日子佔了大半時光。曾誤打誤撞進入精品果醬公司實習、畢業後跑到百貨公司櫃姐、如今窩在補習班裡擔任特別無助的主管特助兼產品部門小菜雞。喜歡寫職場觀察及工作知識,偶爾發發追劇心得,或碎念生活近況。合作邀約:[email protected]✉️
留言0
查看全部
發表第一個留言支持創作者!