2011/10/02

C++ - iostream

สวัสดีครับ ไม่ได้มาเขียนบล็อกตั้งนาน ผมขอพักเรื่อง Object Pascal ไปก่อนนะครับ
วันนี้ขอพูดถึงภาษา C++ แต่จะขอไม่พูดถึงไวยากรณ์พื้นฐานของภาษา C
เช่น if ใช้ยังไง switch case เขียนยังไง while, do while, for เขียนยังไง
ผมจะคิดว่า ทุกคนในที่นี้มีความรู้ภาษา C มาพอสมควรแล้ว

โพสนี้ผมจะพูดเรื่อง iostream ว่ามันคืออะไร ?

ขอนำภาพจาก Wikipedia มาใช้นะครับ

(ref: http://en.wikipedia.org/wiki/Standard_streams)

ปกติแล้วในภาษา C เราจะใช้คำสั่ง printf ที่อยู่ใน stdio.h (Standard Input Output) ในการแสดงข้อความ
ใน Standard Stream จะมี stream อยู่ 3 ตัว คือ stdin (Standard Input), stdout (Standard Output), stderr (Standard Error)

ในภาษา C++ จะเรียก stream ทั้ง 3 แบบว่า cin, cout, cerr
ซึ่ง stream ทั้ง 3 อยู่ใน namespace ที่ชื่อว่า std
วิธีการใช้เราจะต้องประกาศ header ที่ชื่อว่า iostream ก่อน โดยการใช้ #include 

#include <iostream>

เวลาเราจะเรียกใช้ เราต้องเขียน namespace ข้างหน้า
และเราจะใช้ bit shifts ในการส่งค่าให้กับ stream
เช่น ในภาษา C เราเขียนว่า
    printf("Hello World.\n");
เราสามารถใช้ iostream ได้เป็น
    std::cout << "Hello World.\n";
หรือจะใช้ endl (End Line) แทน \n ได้
    std::cout << "Hello World." << std::endl;
นอกจากนี้เรายังสามารถใส่ตัวแปรลงไปได้เลย
    int a = 10;
    std::cout << a << std::endl;

สำหรับการใช้ cin รับค่า
ปกติในภาษา C เราจะใช้ scanf รับค่า
เราต้องรู้ว่า %s %d %c %f มันคืออะไร
แต่ถ้าใช้ cin เราไม่จำเป็นที่จะต้องใช้ เพราะเราสามารถใส่ค่าลงในตัวแปรได้เลย
    int a;
    std::cin >> a;
ถ้าต้องการรับหลายค่าก็แค่
    int a, b, c;
    std::cin >> a >> b >> c;

ส่วน cerr จะไม่ขอพูดถึง

บางคนอาจจะคิดว่า std::cout มันยาวกว่า printf ต้องพิมพ์เยอะเสียเวลา
เราสามารถประกาศให้โปรแกรมของเรารู้จักกับเจ้า std เลย
และเวลาเรียกใช้เราไม่ต้องพิมพ์ std:: อีก
โดยการประกาศ using namespace std; ไว้ข้างบน
ลองดูตัวอย่าง

#include <iostream>


using namespace std;


int main()
{
    cout << "Input an Integer: ";
    int a;
    cin >> a;
    cout << a << " x " << a << " = " << a * a << endl;
    return 0;
}

หวังว่าการใช้ iostream จะช่วยให้เขียนโปรแกรมง่ายขึ้นนะครับ

2011/09/04

Object Pascal - เก็บตก #1

สวัสดีครับ
คิดว่าหลาย ๆ คนอาจจะลองทำโจทย์ดูแล้ว แต่อาจจะไม่ออก
ผมต้องขอโทษจริง ๆ ครับ ลืมบอกคำสั่งที่สำคัญไป

อย่างแรกคือ ความยาวของ String เราจะใช้ ฟังก์ชัน Length หาความยาวเช่น
var S: string = 'Test String';
Write(Length(S));
จะได้ผลออกมาว่า 11

สำหรับการประกาศ String ที่มีการกำหนดขนาด เช่น
var S: string[40];
ค่าอักขระ แต่ละตัวจะเป็น #0 ทั้งหมด
เราสามารถเช็คได้ว่า string มีตัวอักษรทั้งหมดกี่ตัวโดยการตรวจสอบค่า #0 เช่น



ส่วนการบ้านข้อ 20 ขอเปลี่ยนโจทย์หน่อยละกัน ให้ง่ายกว่าเดิม
ขอเปลี่ยนเป็น
20) ให้รับค่าเข้าไป 10 ค่า แล้วหาค่าที่ซ้ำกันอย่างน้อยครึ่งหนึ่ง เช่น
1 2 3 4 4 4 4 5 6 4 คำตอบคือ 4
1 5 6 6 6 8 7 4 2 3 คำตอบคือ none เพราะไม่มีค่าที่ซ้ำกันเกินครึ่ง


2011/09/03

Object Pascal - Array

สวัสดีครับ กลับมาวันเสาร์ตามสัญญา

วันนี้เราจะมาดูกันว่า Array คืออะไร !!!!

Array คือตัวแปรแถวลำดับ...
ถ้าจะให้พูดง่าย ๆ ก็คือตัวแปรที่มีชนิดเดียวกันหลาย ๆ ตัว นั้นเอง

สมมติว่า ถ้าจะเก็บค่าคะแนนสอบของนักเรียน 100 คน เราจะต้องประกาศตัวแปร 100 ตัวแปรหรอ !!!!
เราจึงจะใช้ตัวแปรแบบ Array มาแก้ปัญหานี้กัน

วิธีการประกาศก็ง่ายแสนง่าย ลองดูตัวอย่างกัน

var
  Score: array[0..99] of Integer;

จากภาพ เป็นการประกาศตัวแปรชื่อ Score เป็นตัวแปร Array ที่มีสมาชิก 100 ตัว มี Index ตั้งแต่ 0 ถึง 99 เก็บข้อมูลจำนวนเต็ม

ลองดูที่ 0..99 เลขข้างหน้า (0) คือ Index เริ่มต้น เลขข้างหลังคือ Index สุดท้าย เราสามารถเริ่มที่อะไรก็ได้ ไม่จำเป็นต้องเป็น 0 เช่น

var
  Arr1: array[6..20] of Integer;
  Arr2: array[-10..5] of Double;

Arr1 มีสมาชิก 20 - 6 + 1 = 15 ตัว
Arr2 มีสมาชิก 5 - (-10) + 1 = 16 ตัว

เวลาจะเรียกใช้ Array ก็เรียกเป็น
Arr[Index] เช่น

var
  Arr: array[1..3] of Integer;
  I: Integer;


begin
  Arr[1] := 50;
  I := 2;
  Arr[I] := 300;
  Arr[3] := I;
  Writeln(Arr[1]], ' ', Arr[2], ' ', Arr[3]);
end.


เอาหล่ะ ลองมาดู Array 2 มิติกันบ้างดีกว่า

วิธีการประกาศจะมี 2 แบบ คือ


วีธีการเรียกใช้จึงต่างกัน


แล้ว 2 แบบนั้น มันต่างกันยังไง ?
  Arr1 เป็น Array 2 มิติ ของ จำนวนเต็ม ขนาด 6 x 4
  Arr2 เป็น Array 1 มิติ ของ Array 1 มิติ ของ จำนวนเต็ม
การประกาศ Array แบบที่ 2 จะดีกว่าแบบที่ 1 อยู่... ดีกว่ายังไง ? เดียวก่อนละกัน

มาดู Array หลาย ๆ มิติกันก่อนนะ
วิธีการประกาศ การใช้ก็เหมือน ๆ กัน




นอกจากนี้ String ก็ยังเหมือนกับ Array 1 มิติอีกแหน่ะ
หรือก็คือ String เป็น Array of Char ก็ว่าได้
การประกาศ String เราสามารถกำหนดได้ว่าจะให้ String นั้นเก็บค่าได้เท่าไร หรือจะไม่กำหนดก็ได้ เช่น

var
  Str1: string;
  Str2: string[16];

เราสามารถเรียกดูตัวอักขระ ในแต่ละตำแหน่งได้ เช่น Str1[3] ฯลฯ

เรายังสามารถประกาศตัวแปรแบบ Array[0..n-1] of Char แล้วใช้เป็น String ได้อีกด้วย
แต่ !!! ตัว Index เริ่มต้นจะต้องเป็น 0 เท่านั้น แต่จะมีความแตกต่างอยู่อย่างหนึ่งคือ
String จะมี Index เริ่มต้นที่ 1
ส่วน Array[0..n-1] of Char จะมี Index เริ่มต้นที่ 0
ลองดูตัวอย่างกันสักนิด


เราสามารถกำหนดให้ Str2 := ' ข้อความ' ได้
และยังให้ Str1 ที่มีชนิดตัวแปรเป็น string มารับข้อมูลจาก Str2 ได้เลย
แต่ไม่สามารถจะเขียนว่า Str2 := Str1 ได้
และถ้าเราประกาศตัวแปร Str1 เป็น string[80] เราก็ไม่สามารถที่จะให้ Str1 := Str2; ได้


วันนี้ขอจบแค่นี้ก่อน เดียวงงกว่าเดิมส่วนเรื่องที่ว่าการประกาศ Array แบบที่ 2 นั้นมันดียังไง ขอติดไว้ก่อน

ก่อนไปก็ฝากการบ้านไว้สักหน่อยดีกว่า หุหุ

13) ให้รับข้อความเข้ามา แล้วให้แสดงข้อความที่รับมาแบบย้อนจากหลังมาหน้า
เช่นรับเข้าไปว่า String ให้แสดงผลออกมาว่า gnirtS
14) ให้รับข้อความเข้ามาแล้วนับว่าในข้อความนั้นมีตัว i กี่ตัว ( ไม่ต้องนับตัว I ใหญ่ )
15) ให้รับคะแนนนักเรียนเข้ามา 10 คน ไปไว้ใน array ก่อน แล้วค่อยคำนวณหาค่าเฉลี่ย
16) ให้รับข้อความเข้ามาแล้วเปลี่ยนตัวอักษร '@' ให้เป็น ตัว 'a' แทน
17) ให้รับข้อความเข้ามาแล้วเปลี่ยนตัวอักษร '@' ให้เป็นคำว่า 'at' แทน
18) ให้รับค่าจำนวนเต็มเข้ามา 6 ตัว แล้วหาค่าที่มากที่สุด
19) ** ให้รับค่าจำนวนเต็มเข้ามา 10 ตัว แล้วเรียงลำดับข้อมูลจากมากไปน้อย
20) ** ให้รับค่าเข้าไป 10 ค่า แล้วหาค่าที่ซ้ำกันมากที่สุด (ฐานนิยม) (แก้โจทย์อยู่ใน เก็บตก #1)
21) * ให้รับข้อความเข้ามา แล้วแสดงข้อความ แต่ถ้าเจอคำว่า \n ให้ขึ้นบรรทัดใหม่
เช่น รับค่าเข้ามาเป็น
String Line 1\nLine 2\nNew Line
จะแสดงผลเป็น
String Line 1
Line 2
New Line

ลองไปทำกันดูนะครับ ส่วนข้อที่มี * ข้างหน้า จะค่อนข้างยากนิดนึง แต่ไม่เกินความรู้ตั้งแต่เรื่องแรก ๆ เลยครับ

2011/08/31

Object Pascal - Label

สวัสดีครับ การบ้านเป็นยังไงบ้างครับ ยากไปไหมเอ่ย ลองมาดูเฉลยกันเลย

7)

8)

9)

10)

11)

12)



มาถึงเรื่องของวันนี้กันดีกว่า นั้นก็คือเรื่อง Label นั้นเอง !!!

แล้วเจ้า Label มันคืออะไร ?
    มันก็คือตำแหน่งที่เรา mark ไว้เพื่อจะสามารถย้อนกลับมาทำงานได้ เรื่องนี้ไม่มีอะไร ลองดูตัวอย่างกันเลย (เพื่อความสะดวกขอเอาการบ้านข้อ 12 มาดัดแปลงละกัน)


ลองดูที่บรรทัดที่ 8 จะเห็นว่ามีการประกาศ Label ชื่อว่า Main ไว้
บรรทัดที่ 15 มีการกำหนดจุดเริ่มต้นของ Main
บรรทัดที่ 24 เป็นการกระโดดไปทำงานที่ Main
ส่วนคำสั่ง Exit ในบรรทัดที่ 19 เอาไว้ออกจากฟังก์ชั่นที่ทำงานอยู่ ในที่นี้หมายถึงออกจากโปรแกรม

ส่วนใหญ่แล้วจะไม่ค่อยได้ใช้ Label กันสักเท่าไร เพราะมีโอกาสที่จะใช้ผิดมาก (สับสนว่ามันกระโดดไปไหน ถ้ามี Label เยอะ ๆ)

วันนี้ก็เอาไว้เท่านี้ ไว้เจอกันใหม่วันเสาร์ครับ ^_^