Posted by : Unknown วันพฤหัสบดีที่ 1 ตุลาคม พ.ศ. 2558

[C#] แนะแนวทำโจทย์เขียนโปรแกรม
 เปลี่ยนลำดับตัวเลขเป็นรูปสามเหลี่ยมไล่ลำดับ


โจทย์เนื้อเรื่อง : ไม่รู้จำไม่ได้ข้ามละกัน 
ใจความของโจทย์ : ให้รับจำนวนคี่ N ที่มีค่าระหว่าง 1-9 แล้วนำมาจัดเรียงลำดับจั้งแต่จำนวนคี่ 1 จนถึงจำนวน N เป็นจำนวน N แถวโดยตั้งแต่แถวที่2จะมีสัญลักษณ์ * ค่อยๆเพิ่มมาจนกลายเป็นรูป 3 เหลี่ยม (ขออภัยสำหรับคำอธิบายโจทย์งงๆดูรูปกันดีกว่าเข้าใจกว่าเยอะ)


เรามาส่องหลักการกันดีกว่าขนับ
แปะ Code ไว้ก่อน : 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TriangleNum
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void checkinput()
        {
            int x;
            if((!int.TryParse(textBox1.Text,out x)) && textBox1.Text != "")
            {
                MessageBox.Show("กรุณากรอกตัวเลขเท่านั้น");
                textBox1.Text = "";
                return;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int num = Convert.ToInt32(textBox1.Text);
            if(num%2 == 0 || num>9)
            {
                MessageBox.Show("กรุณากรอกเฉพาะเลขคี่ 1-9 เท่านั้น");
                textBox1.Text = "";
                return;
            }
            else
            {
                num = Convert.ToInt32(textBox1.Text);
                textBox1.Text = "";
                button1.Enabled = false;
                textBox1.Enabled = false;
                sort(num);
            }
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            checkinput();
        }
        private void sort(int x)
        {
            string strshow = "";
            for(int i = 1; i <= x; i+=2)
            {
                if (i == 1)
                {
                    for (int j = 1; j <= x; j+=2) {
                        textBox2.Text += j.ToString();
                            }
                    textBox2.Text += Environment.NewLine;
                }
                else
                {
                    for(int k = 1; k < i; k+=2)
                    {
                        strshow += "*";
                    }
                    for(int l = i; l <= x; l += 2)
                    {
                        strshow += l.ToString();
                    }
                    strshow += Environment.NewLine;
                }
            }
            textBox2.Text += strshow;
        }
    }
}

สูตรคณิตศาสตร์ที่เกี่ยวข้อง : สูตรง่ายๆที่คิดออกของเลขคี่คือ 2n+1 ซึ่งหากกำหนดให้ค่าเริ่มต้นเป็น 1 แน่ๆ (เพราะโจทย์กำหนดว่ามันคือเลขคี่ที่มีค่าระหว่าง 1-9) ดังนั้นเราก็บวกลูปเพิ่มไปครั้งละ 2 ก็ได้ลำดับเลขคี่แล้วววว อะบางทีอ่านแล้วงงลองดูนี่ก็แล้วกัน

โอเคเรารู้คณิตศาสตร์กันมานิดๆละเรามาวิเคราะห์โปรแกรมกันดีกว่า
จากรูปอธิบายข้างบนนี้ทำให้คุณได้รู้ว่าแถวแรกสุดไม่มีอะไรมากเลยนอกจากหมุนลูปเลขคี่ปกติเพราะฉะนั้นเขียนมันเป็นเงื่อนไขแยกที่ทำครั้งเดียวซะก็จบ (อาทิเช่นถ้า i คือลูปนับจำนวนบรรทัดแล้วเมื่อ i = 1 หรือก็คือบรรทัดแรกจะทำการหมุนลูปซ้อนข้างในอีกทีเพื่อไล่เลขคี่จากมากไปน้อยเป็นต้น)
ส่วนในบรรทัดที่ 2 จนถึงสุดท้ายจะมี * เพิ่มขึ้นมาตามจำนวน (บรรทัด-1) ครัช
ทีนี้แหละเข้าสู่เรื่องซับซ้อนกันได้ละนั้นคือลูปซ้อนครับเนื่องจากการหมุนลูปเพื่อนับจำนวนบรรทัดเราได้ทำการหมุนโดยเพิ่มค่าขึ้นทีละ 2 และค่าแรก (i=1) เราไม่นับเพราะบรรทัดที่ 1 ก็แค่เรียงลำดับเลขเฉยๆดังนั้นเราะจเริ่มนับตั้งแต่บรรทัดที่ 2 ที่ i=2 ดังนั้นการเขียนลูปให้เพิ่มค่าในอัตราส่วนที่ห่างกัน 1 เท่าๆกันตลอดด้วยวิธีการบวกลูปเพิ่มขึ้นครั้งละสองจะมีหลักการดังนี้
แล้วก็เก็บดอกจันอันนี้ใส่ตัวแปรสตริงดองไว้ก่อนรอเอาตัวเลขมาต่อสริงข้างหลังต่อ
โดยการต่อตัวเลขข้างหลังนั้นหลักการก็ไม่ต่างจากดอกจันมากนักเปลี่ยนเพียงแค่
for(int l = i; l <= x; l += 2) ค่าตัวแปรเริ่มต้นของการหมุนลูปเท่ากับค่าของตัวแปรลูปนับจำนวนบรรทัดสาเหตุเป็นเพราะตัวเลขตำแหน่งที่ 1 จะเริ่มหายในแถวที่ 2 เพราะฉะนั้นการเริ่มวนลูปที่จำนวนแถวขณะนั้นจะทำให้ตัดการวนลูปในจำนวนก่อนหน้าทิ้งไปทำให้ได้ค่าเริ่มต้นตัวเลขไม่ซ้ำตำแหน่งและไม่ซ้ำตัวเลข
สุดท้ายต่อสตริงตัวดอกจันและตัวเลขที่ผ่านการวนเข้าด้วยกันแล้วเว้น 1 บรรทัดไว้นอกลูปจบครัชที่เหลือการพวกเก็บรายละเอียดกันบัคกันใส่ข้อมูลอย่างอื่นที่ไม่ใช่ตัวเลขลงใน textBox พวกนี้
ซึ่งเอาง่ายๆผมว่าอ่านที่ผมอธิบายมันยากกว่าเอา Code ไปนั่งดูเองนะเพราะงั้นโหลดไปก็แล้วกัน


สุดท้ายนี้หวังว่าบทความนี้จะสามารถเป็นที่พึงพาทางใจสำหรับผู้ที่สนใจศึกษาหรือใช้ในการเตรียมตัวเข้าแข่งเข้าสอบอะไรก็ว่าไปครับจาก แอดโซระสุดหล่อ




{ 1 ความคิดเห็น... read them below or add one }

  1. Slot Games by Aristocrat | Mapyro
    Slot Games by Aristocrat | Mapyro. Best 동해 출장안마 Free Online Slot Games by 통영 출장안마 Aristocrat. 구리 출장샵 1. Jackpot city 1. 춘천 출장안마 Pirate Gold. 1. Wheel of Fortune. 1. 양산 출장샵 Pragmatic Play.

    ตอบลบ

- Copyright © 2013 Acedia-Anime Song Translation - Shiroi - Powered by Blogger - Designed by Johanes Djogan -