Archive for ตุลาคม 2015

[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 ไปนั่งดูเองนะเพราะงั้นโหลดไปก็แล้วกัน


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




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

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

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