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

更新於 發佈於 閱讀時間約 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|芽芽的程式之旅

「專案管理」已經是現代人的必修課,在工作中你可能是專案經理,或專案團隊的一員,學習專案管理能讓你的工作更加順遂;而在人生中,很多事情背後的本質也是專案,了解專案管理的概念,則能夠讓你對於自己人生有更多的主動權。這一系列,芽芽把專案管理的精華,濃縮成五分中可以讀完的篇幅,希望能把專案管理的知識,用更簡單的方式分享給大家。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
網路上提到自學程式的文章,都會說自學程式非常地辛苦,而且要很自律,決心夠強;而當自己踏上這條路後,才發現何止是辛苦,根本是佈滿荊棘,常常寸步難行,且被刺地遍體鱗傷(喂~是不是有點太浮誇了),但在每個寫出程式豁然開朗的當下,卻又成就感滿滿,所以想藉著寫部落格紀錄一下自己的學習過程!
網路上提到自學程式的文章,都會說自學程式非常地辛苦,而且要很自律,決心夠強;而當自己踏上這條路後,才發現何止是辛苦,根本是佈滿荊棘,常常寸步難行,且被刺地遍體鱗傷(喂~是不是有點太浮誇了),但在每個寫出程式豁然開朗的當下,卻又成就感滿滿,所以想藉著寫部落格紀錄一下自己的學習過程!
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
「蛤!?到底什麼是編碼?網路上都查不到一個簡單的定義!」 剛進研究室的你,被教授指派了許多任務,其中一件是要把質性資料給「編碼」,你是不是也像我一樣霧煞煞QQ 快點進來看看,我幫你統整了一篇簡單易懂的說明,讓你快速了解編碼是什麼!!
Thumbnail
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
今天要來介紹的是Python中資料型別的函數, 這幾天學習的素材是Youtube上“程式柴大大的Python 6 小時初學者課程”,一步一步帶著大家操作並解,學習中也別忘了要多多練習,練習的部分我是把我學到的東西請Chatgpt幫我出類似的題型並讓我練習。 以下我先寫出一個簡單的code,再加以
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
※ 質數判斷 質數:除了1跟本身,沒有其他的因數。 因數:可以整除的數字。 用到的運算符號:「%」 mod 求餘數。 整除: mod完為0,沒有餘數。 ※ 使用for迴圈 let x = 97 // 可以修改成其他數值來測試 //flag標記 let isNotPrime = false
  也就是說,這個題目最主要要考的東西其實遠遠不是兩個三位數相加那麼簡單。它要測驗的核心其實是「學生是否有辦法把應用題轉譯為算式,並計算出正確答案」。當我們帶著這份思考去重新看那道題目時,我們會發現這個我們成年人沒有看懂的要求,不僅僅是要學生寫出計算過程,更核心的是在確認「解題過程」。
Thumbnail
邏輯運算子 它們在許多情境下都是程式語言中重要的工具,用於進行條件判斷和控制流程 在日常中總會遇到有些需要思考判斷的問題,比如要買東西,就會考慮到CP值,東西要好且要便宜,就是and的概念,如果在一些比較複雜的狀況,例如想晚餐吃什麼,就會想火鍋或燒烤都行,這就是or的概念。
Thumbnail
在Python中,數值運算非常直觀,你可以使用標準的數學運算符號進行基本的數值運算。以下是一些基本的數值運算: 進行計算時,按照「先乘除後加減」的規則,並優先計算小括號刮起來的運算式。 print('答案:' ,(1+1)*2) #​答案: 4 復合型態的運算子 指定運算子 = 若是結合算術
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
「蛤!?到底什麼是編碼?網路上都查不到一個簡單的定義!」 剛進研究室的你,被教授指派了許多任務,其中一件是要把質性資料給「編碼」,你是不是也像我一樣霧煞煞QQ 快點進來看看,我幫你統整了一篇簡單易懂的說明,讓你快速了解編碼是什麼!!
Thumbnail
題目敘述 Integer to English Words 給定一個整數num 請轉換成對應的的英文數字表達(One, Two, Three, ... 那種數字表達式)
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
今天要來介紹的是Python中資料型別的函數, 這幾天學習的素材是Youtube上“程式柴大大的Python 6 小時初學者課程”,一步一步帶著大家操作並解,學習中也別忘了要多多練習,練習的部分我是把我學到的東西請Chatgpt幫我出類似的題型並讓我練習。 以下我先寫出一個簡單的code,再加以
數學系的訓練,與上面閱讀原始碼的優先順序,本質上是反過來的。在數學的訓練中,是先把函數定義的非常清楚,再進一步去看函數應用在具體的數據上會發生什麼行為,然後就到此為止,不太會再有進一步的討論。但如上面西尾泰和所述,工程師看事情的角度,是先掌握全局,然後再進一步細化每一層的細節。
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
※ 質數判斷 質數:除了1跟本身,沒有其他的因數。 因數:可以整除的數字。 用到的運算符號:「%」 mod 求餘數。 整除: mod完為0,沒有餘數。 ※ 使用for迴圈 let x = 97 // 可以修改成其他數值來測試 //flag標記 let isNotPrime = false
  也就是說,這個題目最主要要考的東西其實遠遠不是兩個三位數相加那麼簡單。它要測驗的核心其實是「學生是否有辦法把應用題轉譯為算式,並計算出正確答案」。當我們帶著這份思考去重新看那道題目時,我們會發現這個我們成年人沒有看懂的要求,不僅僅是要學生寫出計算過程,更核心的是在確認「解題過程」。
Thumbnail
邏輯運算子 它們在許多情境下都是程式語言中重要的工具,用於進行條件判斷和控制流程 在日常中總會遇到有些需要思考判斷的問題,比如要買東西,就會考慮到CP值,東西要好且要便宜,就是and的概念,如果在一些比較複雜的狀況,例如想晚餐吃什麼,就會想火鍋或燒烤都行,這就是or的概念。
Thumbnail
在Python中,數值運算非常直觀,你可以使用標準的數學運算符號進行基本的數值運算。以下是一些基本的數值運算: 進行計算時,按照「先乘除後加減」的規則,並優先計算小括號刮起來的運算式。 print('答案:' ,(1+1)*2) #​答案: 4 復合型態的運算子 指定運算子 = 若是結合算術