2013年3月31日 星期日

Ultrasonic Sensor!

const unsigned int PING_SENSOR_IO_PIN=7; //輸出
const unsigned int PING_SENSOR_IO_PIN2=8; //接收
const unsigned int BAUD_RATE=9600;
void setup(){
Serial.begin(BAUD_RATE);
}
void loop()
{
pinMode(PING_SENSOR_IO_PIN,OUTPUT); //輸出端
pinMode(PING_SENSOR_IO_PIN2,INPUT); //接受端
digitalWrite(PING_SENSOR_IO_PIN,LOW); //先設定低波
delayMicroseconds(2); //2微渺
digitalWrite(PING_SENSOR_IO_PIN,HIGH); //發射高坡
delayMicroseconds(5); //5毫秒
digitalWrite(PING_SENSOR_IO_PIN,LOW); //低波
const unsigned long duration=pulseIn(PING_SENSOR_IO_PIN2,HIGH);
//pulseln 假如回傳746, 746/29/2= 12cm
//因為超音波1秒343公尺,1/343=0.0029155 聲音前進一公分=29.155微秒
//為何又要/2呢? 因為 傳送+接收 =兩倍時間
if(duration==0)
{
Serial.println("Warning:we did not get a pulse from sensor");
}
else
{
Serial.println(duration); //可顯示 duration目前數值 經過計算 duration/29/2= CM
Serial.print("Distance to nearest object:");
Serial.print(microseconds_to_cm(duration)); //呼叫副程式(參數)
Serial.println("cm");
}
delay(100);
}
unsigned long microseconds_to_cm(const unsigned long microseconds) //副程式(帶入duration)
{
return microseconds / 29 / 2; //duration/29/2=return!!
}


腳位紀錄
HC-SR04
VCC=5V
Trig =output
Echo=intput
Gnd =Gnd

以下為Float 寫法


const unsigned int PING_SENSOR_IO_PIN = 7;
const unsigned int PING_SENSOR_IO_PIN2 = 8;
const unsigned int BAUD_RATE = 9600;
const float MICROSECONDS_PER_CM = 29.155;// 聲音一公分所需時間
const float MOUNTING_GAP = 0.2;
const float SENSOR_OFFSET = MOUNTING_GAP * MICROSECONDS_PER_CM * 2; //麵包版與SENSOR距離
void setup() {
Serial.begin(BAUD_RATE);
}
void loop() {
const unsigned long duration = measure_distance(); //呼叫1
if (duration == 0) //如果沒收到訊號時
Serial.println("Warning: We did not get a pulse from sensor.");
else
output_distance(duration);//收到訊號時 呼叫2 帶參數duration
}
const float microseconds_to_cm(const unsigned long microseconds)//副程式3
{
const float net_distance = max(0, microseconds - SENSOR_OFFSET);
//dutation=1502 -11.6=1490.4
return net_distance / MICROSECONDS_PER_CM / 2; //1490.4/29.155/2=25.559
}
const unsigned long measure_distance()//副程式1
{
pinMode(PING_SENSOR_IO_PIN, OUTPUT); //輸出模式
digitalWrite(PING_SENSOR_IO_PIN, LOW); //低頻
delayMicroseconds(2);
digitalWrite(PING_SENSOR_IO_PIN, HIGH); //高頻
delayMicroseconds(5);
digitalWrite(PING_SENSOR_IO_PIN, LOW); //低頻
pinMode(PING_SENSOR_IO_PIN2, INPUT); //定義接收端
return pulseIn(PING_SENSOR_IO_PIN2, HIGH);//利用pulseln方法 接收高頻
}
void output_distance(const unsigned long duration)//副程式2
{
Serial.print(duration);
Serial.print("Distance to nearest object: ");
Serial.print(microseconds_to_cm(duration)); //呼叫3 帶入 duration
Serial.println(" cm");
}

Using the Serial port!

const unsigned int LED_PIN = 13; //Declare LED_PIN= 13pin
const unsigned int BAUD_RATE = 9600; //BAUD RATE=9600
void setup()
{
pinMode(LED_PIN, OUTPUT); //Define this 13pin is output
Serial.begin(BAUD_RATE); // Using this "Serial.begin()" function to start the class
//You can specify the Baud Rate of the Arduino from the computer to exchange messages
//Usually we use 9600 bps。Of course, you can also use other speed
//But usually no more than115,200 bps..
}
void loop()
{
if (Serial.available() > 0) //Serial.available() whether a message is received?
//If the received data Will return the byte If no data is returned -1
{
int command = Serial.read(); //Declare "command" is "Serial.read()" ,
//using "Serial.read()" Read data
if (command == '1') // if typing 1
{
digitalWrite(LED_PIN, HIGH); // LED on!!
Serial.println("LED on"); //Serial show ON
}
else if (command == '2') //if typing 2
{
digitalWrite(LED_PIN, LOW); // LED off
Serial.println("LED off"); //Serial show OFF
}
else
{
Serial.print("Unknown command: "); //if typing any key!
Serial.println(command); // show any key
}
}
}

Arduino Basis functions

輸入輸出函數
pinMode(pin, mode)

將數位腳位(digital pin)指定為輸入或輸出。

範例 :

pinMode(7,INPUT); // 將腳位 7 設定為輸入模式


digitalWrite(pin, value)

將數位腳位指定為開或關。腳位必須先透過pinMode明示為輸入或輸出模式digitalWrite才能生效。

範例 :

digitalWrite(8,HIGH); //將腳位 8設定輸出高電位


int digitalRead(pin)

將輸入腳位的值讀出,當感測到腳位處於高電位時時回傳HIGH,否則回傳LOW。

範例 :

val = digitalRead(7); // 讀出腳位 7 的值並指定給 val


int analogRead(pin)

讀出類比腳位的電壓並回傳一個 0到1023 的數值表示相對應的0到5的電壓值。

範例 :

val = analogRead(0); //讀出類比腳位 0 的值並指定給 val變數


analogWrite(pin, value)

改變PWM腳位的輸出電壓值,腳位通常會在3、5、6、9、10與11。Value變數範圍0-255,例如:輸出電壓2.5伏特(V),該值大約是128。

範例 :

analogWrite(9,128); // 輸出電壓約2.5伏特(V)


unsigned long pulseIn(pin, value)

設定讀取腳位狀態的持續時間,例如使用紅外線、加速度感測器測得某一項數值時,在時間單位內不會改變狀態。

範例 :

time = pulsein(7,HIGH); // 設定腳位7的狀態在時間單位內保持為HIGH


shiftOut(dataPin, clockPin, bitOrder, value)

把資料傳給用來延伸數位輸出的暫存器,函式使用一個腳位表示資料、一個腳位表示時脈。bitOrder用來表示位元間移動的方式(LSBFIRST最低有效位元或是MSBFIRST最高有效位元),最後value會以byte形式輸出。此函式通常使用在延伸數位的輸出。

範例 :

shiftOut(dataPin, clockPin, LSBFIRST, 255);


//-----------------------------------------------------------------------------------------------------------
時間函數
控制與計算晶片執行期間的時間


unsigned long millis()

回傳晶片開始執行到目前的毫秒

範例:

duration = millis()-lastTime; // 表示自"lastTime"至當下的時間

delay(ms)

暫停晶片執行多少毫秒

範例:

delay(500); //暫停半秒(500毫秒)


delay Microseconds(us)

暫停晶片執行多少微秒

範例:

delayMicroseconds(1000); //暫停1豪秒

//-----------------------------------------------------------------------------------------------------------
數學函式
三角函數以及基本的數學運算


min(x, y)

回傳兩數之間較小者

範例:

val = min(10,20); // 回傳10


max(x, y)

回傳兩數之間較大者

範例:

val = max(10,20); // 回傳20


abs(x)

回傳該數的絕對值,可以將負數轉正數。

範例:

val = abs(-5); // 回傳5


constrain(x, a, b)

判斷x變數位於a與b之間的狀態。x若小於a回傳a;介於a與b之間回傳x本身;大於b回傳b

範例:

val = constrain(analogRead(0), 0, 255); // 忽略大於255的數


map(value, fromLow, fromHigh, toLow, toHigh)

將value變數依照fromLow與fromHigh範圍,對等轉換至toLow與toHigh範圍。時常使用於讀取類比訊號,轉換至程式所需要的範圍值。


例如:

val = map(analogRead(0),0,1023,100, 200); // 將analog0 所讀取到的訊號對等轉換至100 – 200之間的數值。


double pow(base, exponent)

回傳一個數(base)的指數(exponent)值。

範例:

double x = pow(y, 32); // 設定x為y的32次方


double sqrt(x)

回傳double型態的取平方根值。

範例:

double a = sqrt(1138); // 回傳1138平方根的近似值 33.73425674438


double sin(rad)

回傳角度(radians)的三角函數sine值。

範例:

double sine = sin(2); // 近似值 0.90929737091


double cos(rad)

回傳角度(radians)的三角函數cosine值。

範例

double cosine = cos(2); //近似值-0.41614685058


double tan(rad)

回傳角度(radians)的三角函數tangent值。

範例

double tangent = tan(2); //近似值-2.18503975868

//-----------------------------------------------------------------------------------------------------------
亂數函式
產生亂數


randomSeed(seed)

事實上在Arduino裡的亂數是可以被預知的。所以如果需要一個真正的亂數,可以呼叫此函式重新設定產生亂數種子。你可以使用亂數當作亂數的種子,以確保數字以隨機的方式出現,通常會使用類比輸入當作亂數種子,藉此可以產生與環境有關的亂數(例如:無線電波、宇宙雷射線、電話和螢光燈發出的電磁波等)。

範例:

randomSeed(analogRead(5)); // 使用類比輸入當作亂數種子


long random(max)

long random(min, max)

回傳指定區間的亂數,型態為long。如果沒有指定最小值,預設為0。


範例:

long randnum = random(0, 100); // 回傳0 – 99 之間的數字

long randnum = random(11); // 回傳 0 -10之間的數字

//-----------------------------------------------------------------------------------------------------------
序列通訊
你可以在第五章看見一些使用序列埠與電腦交換訊息的範例,以下是函式解釋。


Serial.begin(speed)

你可以指定Arduino從電腦交換訊息的速率,通常我們使用9600 bps。當然也可以使用其他的速度,但是通常不會超過115,200 bps(每秒位元組)。


範例:

Serial.begin(9600);


Serial.print(data)

Serial.print(data, encoding)

經序列埠傳送資料,提供編碼方式的選項。如果沒有指定,預設以一般文字傳送。


範例:

Serial.print(75); // 列印出 "75"

Serial.print(75, DEC); //列印出 "75"

Serial.print(75, HEX); // "4B" (75 的十六進位)

Serial.print(75, OCT); // "113" (75 in的八進位)

Serial.print(75, BIN); // "1001011" (75的二進位)

Serial.print(75, BYTE); // "K" (以byte進行傳送,顯示以ASCII編碼方式) BYTE Arduino 1.0 已後不用


Serial.println(data)

Serial.println(data, encoding)

與Serial.print()相同,但會在資料尾端加上換行字元( )。意思如同你在鍵盤上打了一些資料後按下Enter。

範例:

Serial.println(75); //列印出"75 "

Serial.println(75, DEC); //列印出"75 "

Serial.println(75, HEX); // "4B "

Serial.println(75, OCT); // "113 "

Serial.println(75, BIN); // "1001011 "

Serial.println(75, BYTE); // "K "

int Serial.available()

回傳有多少位元組(bytes)的資料尚未被read()函式讀取,如果回傳值是0代表所有序列埠上資料都已經被read()函式讀取。

範例:

int count = Serial.available();


int Serial.read()

讀取1byte的序列資料

範例:

int data = Serial.read();


Serial.flush()

有時候因為資料速度太快,超過程式處理資料的速度,你可以使用此函式清除緩衝區內的資料。經過此函式可以確保緩衝區(buffer)內的資料都是最新的。

範例:

Serial.flush();

My first blinking LED program

const unsigned int LED_PIN=13;
const unsigned int PAUSE=500;

//Declare2個const常數 unsigned無號數 int 0 to 65535

//LEDPIN=13pin腳位置

//PAUSE=Setting500毫秒PAUSE Time



void setup() //將會初始化 ARDUINO開發版的所有連接的裝置只執行一次

{
pinMode(LED_PIN,OUTPUT);


//設定13pin 為輸出
}


void loop() //LOOP將會持續呼叫

{
digitalWrite(LED_PIN,HIGH);


//13pin為 高電位
delay(PAUSE);


//延遲500毫秒
digitalWrite(LED_PIN,LOW);


//13pin為 低電位
delay(PAUSE);


//延遲 500毫秒
}

使用typeof,GetType()搜尋類別中的方法與值

在記錄本章時,需複習關於建構類別的結構,才明白SHOW出的方法 或值是什麼 先簡單建立一個 超速類別判斷 類別CODE如下



public class Pass//叫PASS類好了
        {
            private int s;//宣告私用整數型態s 給 speed用來回傳速度的容器
            private string R="";//放字串
            public void Run()//執行判斷方法
            {
                if (s > 65)//此方法 取s值做判斷
                    R = "超速";// 判斷後將決定R的決定
                else
                    R = "沒超數";
            }
            public int speed//建立公用 整數型態
            {
                get//如果SPEED=輸入的數字 將回傳 s
                {
                    return s;//要回傳s
                }
                set
                {
                    if (value >= 0 && value <= 65)
                    {
                        s = value;//
                    }
                    else if (value > 66)
                    {
                        s = 66;//只要超過66 s值就是66了
                    }
                   
                }
            }
            public string RESULT//宣告公用類別回傳R用的
            {
                get
                {
                    Run();
                    return R;
                }
            }
        }



再來 我們做一個BUTTON模擬執行 是否成功吧!

BUTTON CODE如下



private void button3_Click(object sender, EventArgs e)
        {
            int a=120;
            Pass HW = new Pass();//HW是 PASS類
            HW.speed = a;//假如時數120KM 把值給 HW中的PASS
            HW.Run();// RUN方法 會依據SPEED的值做IF-ELSE判斷
            //最後再將 判斷結果傳回RESULT
            MessageBox.Show("目前時數"+a+"KM"+"超過"+HW.speed + "KM" + HW.RESULT);
        }
MESSAGEBOX SHOW出 目前時數120 超過66超速


再來是本章重點 用typeof來看看 PASS中有啥!


private void btn_Get_Click(object sender, EventArgs e)
        {
            Type type = typeof(Pass);//取得pass類型的Type物件
            foreach (MethodInfo method in type.GetMethods())//搜尋pass類別中
                                                            //定義的所有"公共"方法
                //指定給 method  型態為Methodinfo
            {
                rtbox_text.AppendText("方法名稱:" + method.Name + Environment.NewLine);//輸出方法名稱
                foreach (ParameterInfo parameter in method.GetParameters())//深度
                                                             //搜尋公共方法中所有參數
                {
                    rtbox_text.AppendText(
                        "  參數:" + parameter.Name + Environment.NewLine);//輸出參
                                                                          //數名稱
                }
            }
        }

再來 利用GetType() 取型態



private void button1_Click(object sender, EventArgs e)
        {
            string TR = "";//拿來裝搜尋結果
            foreach (Control c in Controls)//逐一搜尋控控制項
            /*關於controls為何可搜尋WINDOSFORM中的控制項
             *
             *Control 可以當做是控制項集合的父代。
             * 例如,將數個控制項加入 Form 時,
             * 每一個控制項都是指派給表單之
             * Controls 屬性的 Control.ControlCollection 成員
             * (衍生自 Control 類別)。
             * 來自於MSDN
             */
            {
                TR += c+"\n";
                if (c.GetType() == typeof(Label))
                {
                    ((Label)c).Text = "TT";
                    TR += "找到了" + c.GetType() + "修改Text插入TT" + "\n";
                }
                else
                {
                    TR+="不是你要的控制項LABLE"+"\n";
                }
                richTextBox1.Text = TR;//SHOW出來!
            }
        }

richtextbox輸出 如下

System.Windows.Forms.RichTextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.Label, Text: label1
找到了System.Windows.Forms.Label修改Text插入TT
System.Windows.Forms.Button, Text: 建構超數類別測試
不是你要的控制項LABLE
System.Windows.Forms.Button, Text: button2
不是你要的控制項LABLE
System.Windows.Forms.TextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.Button, Text: 搜尋
不是你要的控制項LABLE
System.Windows.Forms.TextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.RichTextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.Button, Text: 取得
不是你要的控制項LABLE

此時 FROM上的LABLE 變成 TT
相當好用 可以搜尋 又可以 改變他

2013年3月26日 星期二

checked檢查有無溢出

下面紀錄 型態範圍溢出的處理方式
使用int 型態
如果超過2,147,483,648 至2,147,483,647 將 SHOW出訊息告知




private void btn_Get_Click(object sender, EventArgs e)
        {
            int bt_One, bt_Two;//定義兩個int類型變數
                               //int範圍在-2,147,483,648 至2,147,483,647
            //把textbox.text 1跟2 分別 out進 bt1,bt2
            //如果輸入不是數值 回傳false跳到 最下面的else區
            //在做個IF判斷  當TryPsrse的兩個條件為true 繼續執行下方 checked判斷是否溢出
            if (int.TryParse(txt_Add_One.Text, out bt_One) && int.TryParse(txt_Add_Two.Text, out bt_Two))
            {
                try
                {
                    checked { bt_One += bt_Two; }//checked判斷兩數值是否超過
                                                 //-2,147,483,648 至2,147,483,647
                    //如果超過  跳到 catch show 出 messagebox
                    txt_Result.Text = bt_One.ToString();//輸出相加後的結果
                }
                catch (OverflowException ex)
                {
                    MessageBox.Show("種數已經溢出來了", "出錯!");//輸出異常訊息
                }
            }
            else
            {
                MessageBox.Show("請輸入-2,147,483,648 至2,147,483,647
以內的數字!");//輸出錯誤訊息
            }
        }

IF ELSE基礎與~Radiobutton.checked簡介

IF Else 為邏輯判斷基礎 下面簡單介紹 與使用 Radiobutton當作條件式!


private void button1_Click(object sender, EventArgs e)
        {//下面的Checked傳回兩種true,否則為 false
            if (rbtn_true.Checked)//判斷radiobutton 是不是TRUE 是的化執行下去 不是就跳去ELSE
            {//也就是說 本判斷式,只有判斷 rbtn_true 是TRUE 或是FALSE
                MessageBox.Show("正常報銷!");//正常報銷//如果是TRUE SHOW這!
            }
            else//如果不是 SHOW這
            {
                MessageBox.Show("不符合規定報銷!");//不符合規定報銷
            }
        }

2013年3月25日 星期一

使用條件式?: 判斷是否閏年


namespace GetYear
{
    public partial class Frm_Main : Form
    {
        public Frm_Main()
        {
            InitializeComponent();
        }
        private void btn_GetMessage_Click(object sender, EventArgs e)
        {
            ushort P_usint_temp;//定義局部變數不帶正負號的 16 位元整數 0~65535
            if (ushort.TryParse(txt_year.Text, out P_usint_temp))// 使用TryParse會回傳true或false
            {
                MessageBox.Show((P_usint_temp % 4 == 0 && P_usint_temp % 100 != 0)
                    || P_usint_temp % 400 == 0 ? "輸入的是閏年!" : "輸入的不是閏年!",
                    "提示!");
                //?:三元運算子 如果 是true show出 輸入是閏年 false則 不是閏年
            }
            else//在if判斷中如果false就show這
            {
                MessageBox.Show(//提示輸入數值不正確
                    "請輸入正確數值!", "提示!");
            }
        }
    }
}

2013年3月20日 星期三

左位移運算子
<<
右位移運算子
>>
G<<N 或 Y>>N
N可以是 int uint long ulong sbyte short ushort
而 byte sbyte short ushort 類型的數值 位移操作後 值得類型 將自動轉int

以下範例


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace GetCode
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btn_Get_Click(object sender, EventArgs e)
{
try
{
char chr = txt_chr.Text[0];//0代表取第一個字
//假設TEXTBOX輸入"一等" chr回傳19968的UNICODE的值
byte[] big5_bt = Encoding.GetEncoding("big5").GetBytes(new Char[] { chr });
//宣告陣列 存入Char[0] =19968 遇到了 Encoding.GetEncoding("big5") 轉成繁體中文2BYTE =164 跟 64
int n = (int)big5_bt[0] << 8;
//將big5_bt[0]=164 轉乘 二進制=10100100 左移動8位 補0 =10100100+00000000= n =41984
n += (int)big5_bt[1];
//41984+64=42048
//第一個字節移8位後與第二個字節相加得到中文編碼
txt_Num.Text = n.ToString();//顯示漢字編碼
}
catch (Exception)
{
MessageBox.Show(//異常提示訊息
"請輸入中文字符!", "出現錯誤!");
}
}
}
}

關於技巧 左移*2 右移/2
EX
164 /41984=256=2的8次方=8個0
164*256=41984

2013年3月9日 星期六

Char觀念ASCCII與Unicode






private void button4_Click(object sender, EventArgs e)
        {
            char[] chars = new char[6];
            chars[0] = 'A';      // 陣列中的Chars[0]=ASCCII碼65 
            chars[1] = 'X';      // 陣列中的Chars[1]=ASCCII碼88
            //明白Chars會把字元轉成ASCCII碼!!
            //換個玩法吧!!
            chars[2] = (char)88; // 88是ASCII碼 將88以char型態轉給 [2] 還是等於X
            chars[3] = '\u0058';   // 將88轉Unicode輸入先轉16進制=78  改寫成\u0078
            chars[4] = '健';//中文也一樣 已知健=ASCII碼為20581
            chars[5] = '\u5065';//輸入為UNICODE的話需要 轉將20581 ASCII碼

                                //                    轉16進制為\u5065
            foreach (char c in chars)
            {
                MessageBox.Show(c+"");
            }
        }

2013年3月8日 星期五

Encoding方法與類別字元編碼轉換應用

要明白Encoding類別的轉換就必須先明白Unicode編碼的原理!
編碼是將 Unicode 字元集轉換成位元組序列的處理程序。
解碼正好相反,它是將已編碼的位元組序列轉換成 Unicode 字元集的處理程序。
我們都知道8bit 等於1byte
Unicode 標準會指派字碼指標 (數字) 給每個受支援指令碼中的每個字元。
Unicode Transformation Format (UTF) 是用來編碼該字碼指標的方法。
Unicode 標準 3.2 版使用下列 UTF:
UTF-8,將每個字碼指標表示成 1 到 4 個位元組的序列。

更多細節網址如下 MSDN
http://msdn.microsoft.com/zh-tw/library/system.text.encoding(v=VS.80).aspx



通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字符集。
UCS包含了已知語言的所有字元。除了拉丁語、希臘語、斯拉夫語、希伯來語、阿拉伯語、亞美尼亞語、喬治亞語,還包括中文、日文、韓文這樣的方塊文字,UCS還包括大量的圖形、印刷、數學、科學符號。
ISO/IEC 10646定義了一個31位的字符集。
ISO/IEC 10646-1標準第一次發表於1993年,現在的公開版本是ISO/IEC 10646-1:2000。ISO/IEC 10646-2在2001年發表。
UCS不僅給每個字元分配一個代碼,而且賦予了一個正式的名字。表示一個UCS或Unicode值的十六進制數通常在前面加上「U+」,例如「U+0041」代表字元「A」。

關於ISO 10646是字形標準 Wiki
http://zh.wikipedia.org/wiki/ISO_10646

UTF-16可看成是UCS-2的父集。在沒有輔助平面字元(surrogate code points)前,UTF-16與UCS-2所指的是同一的意思。但當引入輔助平面字元後,就稱為UTF-16了。現在若有軟體聲稱自己支援UCS-2編碼,那其實是暗指它不能支援在UTF-16中超過2bytes的字集。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼。
UCS-2 使用16bit 編碼空間
如上觀念已知Unicode=16bit 16進制A=0041 轉成10進制=65 轉2進制=100 0001

來看以下程式碼如何轉換吧!



private void button1_Click(object sender, EventArgs e)
        {
            //建立範例字串
            string unicodeString = "AAAThis string contains the unicode character Pi(\u03a0)\u263c";
            //建立 ASCII碼
            Encoding ascii = Encoding.ASCII;
            //建立Unicode 或 UTF8編碼較省空間
            Encoding unicode = Encoding.UTF8;//unicode使用16bit UTF8使用7bit 關於UTF8不多做說明了
            //利用byte 呼叫unicode字串 看看結果如何
            //利用把每個字分解成8bit以一個byte[]陣列存取10進制
            //會發現[0]=65 [1]=65 [2]=65 這代表 前面3個字串A的10進制表示法
            byte[] unicodeBytes = unicode.GetBytes(unicodeString);
            //將 Unicode或UTF8 轉 ASCII碼
            //目前使用UTF8較省記憶體
            /*
            
              注意!!   Encoding.Convert   為轉換用語法如下
              public static byte[] Convert (Encoding srcEncoding,Encoding dstEncoding,byte[] bytes)
              語法備註:1.srcEncoding = bytes 的編碼格式。
                       2.dstEncoding=目標編碼格式。
                       3.bytes要轉換的位元組。
           
            */
            byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
            //GetCharCount 方法 語法如下
            /*
               public override int GetCharCount(byte[] bytes,int index,int count)
               參數說明如下:
                        bytes型別:System.Byte[]   包含要解碼之位元組序列的位元組陣列。
                        index型別:System.Int32    要解碼的第一個位元組索引。
                        count型別:System.Int32    要解碼的位元組數。
               詳細請查略MSDN網址如下
               http://msdn.microsoft.com/zh-tw/library/x0s90hwc(v=vs.90).aspx
             */
            //以下將轉換成字元陣列
            char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
            //再利用GetChars 方法進行解碼
            //語法如下
            /*
               public abstract int GetChars (byte[] bytes,int byteIndex,int byteCount,char[] chars,int charIndex)
               參數說明如下:
                         bytes包含要解碼之位元組序列的位元組陣列。
                         byteIndex要解碼的第一個位元組索引。
                         byteCount要解碼的位元組數。
                         chars包含結果字元集的字元陣列。
                         charIndex要開始寫入結果字元集的索引。
             */
            ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
            //將 asciChars轉成字串輸出
            string asciiString = new string(asciiChars);
            MessageBox.Show(unicodeString);
            MessageBox.Show(asciiString);
            //END!!
        }

關於取自原陣列2方法GetChars()與ToCharArray()複習


private void button2_Click(object sender, EventArgs e)
        {
            string RR = "ABCD";
           
           
            Encoding uni = Encoding.ASCII;
            byte[] EE = uni.GetBytes(RR);
            //unicode得到的長度=    EE有4BYTE = [0]65[1]66[2]67[3]68
            //                      0代表取一位 1代表取第二位索引
            //                      EE.Length就是取EE的長度 [0][1][3][4] =4個 長度4
            char[] chars = new char[uni.GetCharCount(EE,0,EE.Length)];
            //將指定位元組陣列中的位元組序列解碼成指定的字元陣列。
            uni.GetChars(EE, 0, EE.Length, chars, 0);
            string GG = new String(chars);
            MessageBox.Show(GG);
        }









再來利用ToCharArray取字元陣列 算是意外的發現 似乎更簡單

private void button3_Click(object sender, EventArgs e)
        {
            string QP = "ggyy77889900";
            string YY = "";
            char[] ttst = QP.ToCharArray(); //也可以使用ToCharArray取字元陣列
            for (int i = 0; i <= ttst.Length - 1; i++)
            {
                YY += ttst[i];
            }
            MessageBox.Show(YY);
        }

2013年3月5日 星期二

加密的概念^運算子

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Encrypt
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int G, Y;//輸入兩數值
            if(int.TryParse(textBox1.Text, out G)&&(int.TryParse(textBox2.Text,out Y)))//看是否輸入數字並且把數值裝進G跟Y
            {
                textBox3.Text=(G^Y).ToString();//進行兩數值 二進位比對運算
            }
            else//如果int.Parse輸入不是數字 則回傳 False 回傳值為0! 進入已下下判斷
            {
                MessageBox.Show("請輸入數字打錯了");//跟使用者說打錯哩!
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int G1 = int.Parse(textBox3.Text);//剛剛加密後的數值
            int Y2 = int.Parse(textBox2.Text);//KEY!
            textBox4.Text = (G1 ^ Y2).ToString();
        }
    }
}


^ 運算子 form msdn http://msdn.microsoft.com/zh-tw/library/zkacc7k1(v=vs.80).aspx

TryParse判斷字串是否表示數與轉型

  int i = 0;
  string s = "108";
  bool result = int.TryParse(s, out i); //i  = 108

msdn http://msdn.microsoft.com/zh-tw/library/bb384043.aspx
PS:
如果字串包含非數字字元或者數值對於您指定的特定型別而言太大或太小,TryParse 會傳回 false 並且將 out 參數設為零。否則,會傳回 true 並且將 out 參數設為字串的數值。


2013/11/30 補充

判斷使用者輸入是否為Double雙精準
也可以使用 TryParse

範例如下
假如txt_value.Text控制項輸入10.5
剛好符合double將會SHOW出輸入的數值正確
如果txt_value.Text輸入 A 並不是double 則轉型失敗
傳回fales 將SHOW出 輸入的數值有誤,請重新輸入!", "提示!

double P_dbl_value;//定義變數
            if (double.TryParse(txt_value.Text, out P_dbl_value))
            {
                //txt_value.Clear();//清空TextBox
                MessageBox.Show("輸入的數值正確!");//提示正確訊息
            }
            else
            {
                MessageBox.Show(//提示錯誤訊息
                    "輸入的數值有誤,請重新輸入!", "提示!");
            }

2013年3月4日 星期一

關於 List 與 foreach的使用

        private void button1_Click(object sender, EventArgs e)
        {
            List<int> ggyy=new List<int>(); //建立 LIST 叫GGYY型態為INT存數字
            ggyy.Add(7788);  //加入一組數字叫7788 而GGYY會以陣列方式存取 GGYY[0]            ggyy.Add(9900);  //加入        9900                     GGYY[1]
            foreach (int GO in ggyy) //foreach 會以GGYY的 COUNT值=2 執行兩次
                                     //分別為GGYY[0]GGYY[1]
            {
                MessageBox.Show(GO.ToString());//將會SHOW出兩次訊息
            }
        }


List class Form MSDN http://msdn.microsoft.com/zh-tw/library/6sh2ey19(v=VS.80).aspx
foreach Form MSDN http://msdn.microsoft.com/zh-tw/library/ttw7t8t6(v=VS.80).aspx

2013年3月3日 星期日

關於program.cs

Program.cs為Windows的主程序檔 程式碼如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace TTTTTT
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

在觀察程式碼 可發現 前幾列using ......(為使用的命名空間)
關於命名空間 msdn有簡單明瞭的意思供參考 連結點如下
http://msdn.microsoft.com/zh-tw/library/0d941h9d.aspx


比如System.Windows.Forms 此命名空間,用於建立 Windows 架構應用程式
而在 Program.cs中 可找到System.Windows.Forms 命名空間下的 Application類別

而Application 提供 static 方法和屬性以管理應用程式,例如使用方法啟動或停止應用程式、處理 Windows 訊息,以及使用屬性取得有關應用程式的資訊。這個類別無法被繼承
MSDN 解釋 非常深奧 關於 static 什麼是靜態 說明網址如下
http://msdn.microsoft.com/zh-tw/library/79b3xss3.aspx

在這邊就不多做解釋了 主要解購 Program主要工作

再繼續往下看 可發現 一個 namespase 檔案名稱
MSDN http://msdn.microsoft.com/zh-tw/library/z2kcy19k.aspx

命名空間內的static void Main() 方法是您的程式的進入點

而Application.EnableVisualStyles 方法
這個方法會啟用應用程式的視覺化樣式。視覺化樣式的色彩、 字型及其他視覺元素構成作業系統的佈景主題。如果控制項和作業系統都支援它,將會繪製具有視覺化樣式的控制項。產生的效果, EnableVisualStyles()應用程式 ; 在建立任何的控制項之前,必須呼叫 一般而言, EnableVisualStyles()是第一行的Main函式。不同的資訊清單並不需要啟用視覺化樣式,當呼叫EnableVisualStyles()

而Application.SetCompatibleTextRenderingDefault 方法
http://msdn.microsoft.com/zh-tw/library/system.windows.forms.application.setcompatibletextrenderingdefault.aspx

而Application.Run(new Form())
http://msdn.microsoft.com/zh-tw/library/ms597010.aspx

可發現執行到此階段 將 跳轉至 Form.disigner.cs 檔
處理視窗所需要的原件BUTTON LABLE 等...
之後再回到 RUN方法!!

END

2013年3月2日 星期六

關於標記著作AssemblyInfo.cs文件

此文件在方案總館內可找到!用於說明此程式版權與資訊公司行號等...

程式模樣如下
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("關於Assemblyinfo")] //AssemblyTitle屬性為標題![assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] //Company公司名稱!!
[assembly: AssemblyCopyright("Copyright ©  2014")] //版權
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("****************************")]
// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]





更多屬性方法 可參考MSDN
http://msdn.microsoft.com/zh-tw/library/system.web.configuration.assemblyinfo(v=vs.100).aspx