Transcript void

418115: Structured Programming
การบรรยายครัง้ ที่ 3 & 4
ประมุข ขันเงิน
[email protected]
โปรแกรม #1
void main()
{
}
โปรแกรม #1
 โปรแกรมนี้ทำอะไร?
 ไม่ได้ ทำอะไร
 ข้ ำงในไม่มีคำสั่งอะไรเลย
 เข้ ำมำแล้ วก็ออกไป
โปรแกรม #1
 main() คืออะไร?
 ฟังก์ชัน
 ฟังก์ชันคืออะไร?
 โปรแกรมย่อย
 ทำหน้ ำที่เฉพำะตัวอย่ำงหนึ่ง
 ให้ โปรแกรมใหญ่เรียกใช้
 แล้ วโปรแกรมใหญ่ล่ะ?
 ระบบปฏิบัติกำร (OS)
โปรแกรม #2
#include <stdio.h>
void main()
{
printf(“Hello, world!\n”);
}
โปรแกรม #2
 โปรแกรมนี้ทำอะไร?
 พิมพ์ Hello, world!
โปรแกรม #2
 #include <stdio.h> คืออะไร?
 ใช้ บอกว่ำเรำจะไปเอำฟังก์ชันจำกไฟล์ช่ ือ stdio.h มำใช้
 stdio.h เป็ นไฟล์ท่เี รำเรียกว่ำ header file
 มันบรรจุช่ ือและข้ อมูลอื่นๆ ของฟังก์ชันที่ฟังก์ชัน main ของเรำจะไปเรียกใช้ ได้
โปรแกรม #2
 #include <stdio.h> คืออะไร?
 ใช้ บอกว่ำเรำจะไปเอำฟังก์ชันจำกไฟล์ช่ ือ stdio.h มำใช้
 stdio.h เป็ นไฟล์ท่เี รำเรียกว่ำ header file
 มันบรรจุช่ ือและข้ อมูลอื่นๆ ของฟังก์ชันที่ฟังก์ชัน main ของเรำจะไปเรียกใช้ ได้
 เรำใช้ ฟังก์ชันอะไรจำก stdio.h?
 printf
โปรแกรม #2
 printf มีไว้ ทำอะไร?
 พิมพ์ข้อควำมออกทำง standard output
 standard output คืออะไร?
 ช่องทำงแสดงผลลัพธ์ท่รี ะบบปฏิบัติกำรสร้ ำงให้ โปรแกรมตำมปกติ
 ส่วนมำกคือหน้ ำจอ
 แต่เรำสำมำรถบอกให้ ระบบปฏิบัตกิ ำรต่อ standard output เข้ ำไฟล์หรือกำร์ดเน็ต
เวิร์กก็ได้
โปรแกรม #2
 “Hello, world!\n” คืออะไร?
 ข้ อมูลประเภทข้ อควำม
 ภำษำ C เรียกข้ อมูลประเภทนี้ว่ำ สตริง (string)
 ในภำษำ C เรำเขียนข้ อควำมประเภท string ได้ ด้วยกำรใช้ เครื่องหมำยฟันหนู (“)
ล้ อมรอบข้ อควำมที่ต้องกำร
 ตัวอย่ำงเช่น “one”, “Franscesca Lucchini”, “3.1415”
โปรแกรม #2
 อ้ ำว! ทำไมพิมพ์ออกมำแล้ วไม่เห็นมี \n?
 ข้ อควำม \n เป็ นข้ อควำมพิเศษ
 เรียกว่ำ escape sequence
 ตัว \n แทน การเว้นบรรทัด
โปรแกรม #3
 ผลลัพธ์ของโปรแกรมนี้ควรจะเป็ นอย่ำงไร?
#include <stdio.h>
void main()
{
printf(“one\ntwo\nthree\n”);
printf(“four\nfive\nsix\n”);
}
โปรแกรม #3
one
two
three
four
five
six
Escape Sequence อืน่ ๆ
Escape Sequence
\t
\0
\’
\”
\\
ความหมาย
อักขระ tab
อักขระ NULL (ใช้ ส้ นิ สุดสตริง)
อักขระ ‘ (ฝนทอง)
อักขระ “ (ฟันหนู)
อักขระ \ (backspace)
แบบฝึ กหัด #1
 เขียนโปรแกรมเพื่อพิมพ์ข้อควำม
a\b\\”c”
de’f’
แบบฝึ กหัด #1
#include <stdio.h>
void main()
{
printf(“a\\b\\\\\”c\”\n”);
printf(“de\’f\’”);
}
แบบฝึ กหัด #1
#include <stdio.h>
void main()
{
printf(“a\\b\\\\\”c\”\n”);
printf(“de’f’”);
}
เครือ่ งหมายเซมิโคลอน (;)
 เวลำเรำเรียกฟังก์ชันหนึ่งครึ่ง ถือเป็ นคำสั่งหนึ่งคำสั่ง
 มีคำสั่งแบบอื่นๆ อีกมำกมำยที่จะได้ เรียน
 ทุกคาสังต้
่ องจบด้วยเครือ่ งหมายเซมิโคลอน (;) เสมอ
 ระวังใส่เครื่องหมำยเซมิโคลอนหลังทุกคำสั่งด้ วย
โปรแกรม #4
#include <stdio.h>
void main()
{
printf(“First value is %d.\n”, 5);
printf(“Second value is %d.\n”,
7);
}
โปรแกรม #4
 printf(“First value is %d.”, 5);
 ข้ อมูลที่เรำป้ อนให้ ฟังก์ชันเวลำสั่งให้ มันทำงำน
เรียกว่ำ อาร์กิวเมนต์ (argument)
 เวลำมี argument หลำยๆ ตัว เรำจะคั่นมันด้ วยเครื่องหมำยคอมมำ (,)
 ตอนนี้ printf มี argument สองตัว
1. สตริง “First value is %d.”
2. ตัวเลขจำนวนเต็ม 5
โปรแกรม #4
 อำร์กวิ เมนต์ตวั แรกของ printf จะต้ องเป็ นสตริงเสมอ
 เพรำะมันคือข้ อควำมที่เรำจะพิมพ์ออกไป
 แล้ วอำร์กวิ เมนต์ตวั อื่นๆ ที่ตำมมำล่ะ?
 มันจะถูกนำไปแทนค่ำใส่ใน ชุดอักขระจัดรูปแบบ
 แล้ วชุดอักขระจัดรูปแบบที่ว่ำนั่นอยู่ไหน?
 “First value is %d.”
 %d บอกว่ำมันจะพิมพ์ค่ำที่เอำมำแทนเป็ น เลขฐานสิบ (decimal)
โปรแกรม #4
 ผลลัพธ์ของโปรแกรม
First value is 5.
Second value is 7.
โปรแกรม #5
#incluce <stdio.h>
void main()
{
printf(“Sum of %d and %d is %d.\n”, 9, 4, 9+4);
printf(“Difference of %d and %d is %d.\n”,9, 4, 9-4);
printf(“Product of %d and %d is %d.\n”, 9, 4, 9*4);
printf(“Quotient of %d by %d is %d\n”, 9, 4, 9/4);
printf(“Modulus of %d by %d is %d\n”, 9, 4, 9%4);
}
โปรแกรม #5
 ผลลัพธ์
Sum of 9 and 4 is 13.
Difference of 9 and 4 is 5.
Product of 9 and 4 is 36.
Quotient of 9 and 4 is 2.
Modulus of 9 and 4 is 1.
โปรแกรม #5
 printf(“Sum of %d and %d is %d.\n”, 9, 4, 9+4);
 แสดงให้ เรำเห็นว่ำ printf จะมี argument กี่ตัวก็ได้
 argument ตัวที่ตำมหลังมำจะถูกนำไปแทรกที่อกั ขระจัดรูปแบบ
ตำมลำดับที่อกั ขระจัดรูปแบบปรำกฏ
โปรแกรม #5
 9+4, 9-4, 9*4, 9/4
และ
9%4
 เรำเรียกพวกนี้ว่ำ นิพจน์
 นิพจน์มีผลลัพธ์ ซึ่งจะเป็ นค่ำหนึ่งค่ำ
 เครื่องหมำยสำหรับกำรคำนวณเชิงคณิตศำสตร์
 เครื่องหมำย + และ - แทนกำรบวกและกำรลบ ตำมลำดับ
 เครื่องหมำย * แทนกำรคูณ
 เครื่องหมำย / แทนกำรหำร
 ถ้ ำเอำจำนวนเต็มมำหำรกันก็จะได้ จำนวนเต็ม
 เครื่องหมำย % แทนกำรหำรเอำเศษ
โปรแกรม #5
 เครื่องหมำยพวกนี้มลี ำดับควำมสำคัญเหมือนกับในทำงคณิตศำสตร์
 + และ – มีควำมสำคัญเท่ำกัน
 * และ / และ % มีควำมสำคัญเท่ำกัน
 * และ / และ % มีควำมสำคัญมำกกว่ำ + และ –
 เรำสำมำรถใช้ วงเล็บเพื่อจัดลำดับกำรคำนวณได้
แบบฝึ กหัด #2
 ผลลัพธ์ของโปรแกรมนี้คืออะไร?
#include <stdio.h>
void main()
{
printf(“%d\n”, 7+10%3);
printf(“%d\n”, (7+10)%3);
printf(“%d\n”, 7+10%3*4-(5*20));
}
แบบฝึ กหัด #2
8
2
-89
โปรแกรม #6
#incluce <stdio.h>
void main()
{
printf(“%f
printf(“%f
printf(“%f
printf(“%f
}
+
*
/
%f
%f
%f
%f
=
=
=
=
%f\n”,
%f\n”,
%f\n”,
%f\n”,
9.0,
9.0,
9.0,
9.0,
4.0,
4.0,
4.0,
4.0,
9.0+4.0);
9.0-4.0);
9.0*4.0);
9.0/4.0);
โปรแกรม #6
 ผลลัพธ์ของโปรแกรม
9.000000
9.000000
9.000000
9.000000
+
*
/
4.000000
4.000000
4.000000
4.000000
=
=
=
=
13.000000
13.000000
36.000000
2.250000
โปรแกรม #6
 ภำษำ C สำมำรถจัดกำรเลขทศนิยมได้ เช่นกัน
 ค่ำของเลขทศนิยม เวลำพิมพ์ต้องมีจุดทศนิยม มิฉะนั้นภำษำ C จะคิดว่ำเป็ น
จำนวนเต็ม
 มีเครื่องหมำยที่เรำใช้ ได้ ส่เี ครื่องหมำยคือ +, -, *, /
 เวลำเอำเลขทศนิยมไปหำรเลขทศนิยมก็จะได้ เลขทศนิยมกลับมำ
 เรำสำมำรถพิมพ์ค่ำเลขทศนิยมได้ ด้วยอักขระจัดรูปแบบ %f
โปรแกรม #7
#include <stdio.h>
void main()
{
int age;
age = 15;
printf(“The child age is %d\n”, age);
}
โปรแกรม #7
 ผลลัพธ์ของโปรแกรม
The child age is 15.
ตัวแปร (Variable)
 ตำแหน่งในหน่วยควำมจำ เก็บข้ อมูลหนึ่งชิ้น
 ตัวแปรต้ องมี ชื่อ
 ตัวแปรช่วยให้ เรำแทน ข้อมู ล ด้ วย ชื่อ ทำให้ ไม่จำเป็ นต้ องรู้ค่ำของมัน
 ในโปรแกรม #7 มีตวั แปรหนึ่งตัว ชื่อ age
 เรำพิมพ์ค่ำของ age ออกทำงด้ วย printf ได้ เหมือนกับพิมพ์ค่ำตัวเลข
printf(“The child age is %d\n”, age);
การประกาศตัวแปร
 เป็ นกำรบอกว่ำ
 มีตัวแปรชื่อนี้
 ตัวแปรชื่อที่เรำประกำศชนิดอะไร
 ถ้ ำจะประกำศตัวแปรแค่ตวั เดียว ให้ ส่งั
ชนิดข้อมูล ชื่อตัวแปร1;
 หรือถ้ ำจะประกำศพร้ อมกันทีละหลำยๆ ตัวก็ได้
ชนิดข้อมูล ชื่อตัวแปร 1, ชื่อตัวแปร 2, ชื่อตัวแปร 3, …, ชื่อตัวแปร n;
ตัวอย่าง
int age;
int x, y, z;
float area, length;
 int คือชนิดของตัวแปรที่เก็บจำนวนเต็มแบบหนึ่ง
 float คือชนิดของตัวแปรที่เก็บจำนวนจริงแบบหนึ่ง
การกาหนดค่าให้ตวั แปร (Assignment)
 ใช้ เครื่องหมำยเท่ำกับ (=) โดยมีรป
ู แบบดังนี้
ชื่อตัวแปร = นิพจน์;
ยกตัวอย่ำงเช่น x = 5; หรือ y = (10*3)%7;
 ตัวแปรก็สำมำรถเข้ ำไปอยู่ในนิพจน์ได้ เช่น x = 10*y+y/5;
 แม้ แต่ตวั แปรตัวเดียวกันก็สำมำรถไปอยู่ท้งั สองฟำกของเครื่องหมำยเท่ำกับได้
 x = x+1;
 z = z*z + 2*z + 1
 โปรแกรมจะอ่ำนค่ำที่เก็บในหน่วยควำมจำมำใช้ ในกำรคำนวณทำงด้ ำนซ้ ำย เมื่อ
คำนวณเสร็จแล้ วจะเอำผลลัพธ์ไปเขียนทับลงในตัวแปรที่อยู่ในด้ ำนขวำ
 ถ้ ำ x เท่ำกับ 5 หลังจำกสั่ง x = x+1 จะได้ x เท่ำกับ 6
 ถ้ ำ z เท่ำกับ 3 หลังจำกสั่ง z = z*z + 2*z + 1 แล้ ว z จะมีค่ำเท่ำกับ 16
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
x = x + y * z;
z = y – x - z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
x =2
x + y * z;
z = y – x - z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
x =2
x +5
y * z;
z = y – x - z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
x =2
x +5
y *6
z;
z = y – x - z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
z = y – x - z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
z =5
y – x - z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
z =5
y – 32
x - z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
z =5
y – 32
x -6
z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
-33z = 5y – 32
x -6
z;
y = 4 * x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
-33z = 5y – 32
x -6
z;
y = 4 * 32
x / y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
-33z = 5y – 32
x -6
z;
y = 4 * 32
x /5
y
printf(“%d %d %d\n”, x, y, z);
}
แบบฝึ กหัด #3
#include <stdio.h>
void main()
{
int x, y, z;
x = 2; y = 5; z = 6;
32x = 2x + 5y * 6z;
-33z = 5y – 32
x -6
z;
x /5
y
24y = 4 * 32
printf(“%d %d %d\n”, x, y, z);
}
โปรแกรม #3
 ผลลัพธ์ของโปรแกรม
32 24 -33
ชือ่ (Identifier)
 ชื่อในภำษำ C จะต้ องเป็ นไปตำมกฏดังนี้
 ประกอบขึ้นจำกตัวเลข ตัวอักษร หรือเครื่องหมำย underscore (_)
 name, student, a10, light_saber, _times, _101
 one man ไม่ใช่ช่ ือชื่อเดียว แต่เป็ นชื่อสองชื่อ
 idolm@ster ไม่ใช่ช่ ือที่ถูกต้ อง
 ตัวอักขระตัวแรกต้ องไม่เป็ นตัวเลข
 10a ไม่ใช่ช่ ือที่ถูกต้ อง
 ตัวพิมพ์ใหญ่และตัวพิมพ์เลขถือเป็ นคนละชื่อกัน
 salary, Salary, SALARY คนละชื่อกันทั้งสิ้น
 ชื่อจะต้ องไม่ซำ้ กับคำสงวน (reserved words)
คาสงวน (Reserved Words)
 คำที่เป็ นส่วนประกอบของภำษำ C โดยตรง ห้ ำมใช้ เป็ นชื่อ
 มี 36 คำ
 สังเกตง่ำยๆ เวลำพิมพ์โปรแกรมใน IDE เกือบทุกตัวแล้ วสีของมันจะแตกต่ำงกับ
ชื่ออื่นๆ
 ตอนนี้เรำรู้ reserved words สองคำ คือ
 void
 int
ตัวแปรชนิดต่างๆ
 มีตวั แปรพื้นฐำนอยู่ 5 แบบ
 int = เลขจำนวนเต็ม
 float = เลขทศนิยมควำมละเอียดต่ำ
 double = เลขทศนิยมควำมละเอียดสูง (กว่ำ float 2 เท่ำ)
 char = ตัวอักขระ
 void = ไม่ระบุชนิด
ตัวแปรชนิดต่างๆ
 สำหรับตัวแปรประเภท int เรำสำมำรถใส่คำเพิ่มเพื่อกำหนดเครื่องหมำยและควำมสั้น
ยำวได้
 unsigned = เก็บเฉพำะค่ำที่ไม่เป็ นลบ
 short = ให้ ใช้ หน่วยควำมจำน้ อยลงครึ่งหนึ่ง
 long = ให้ ใช้ หน่วยควำมจำเพิ่มขึ้นสองเท่ำ
 ดังนั้นมีชนิดตัวแปรแบบ int ที่เป็ นไปได้ อยู่ 6 แบบ
int,
unsigned int,
short int, unsigned short int,
long int,
unsigned long int
 short int สำมำรถเขียนย่อเป็ น short ได้
long int สำมำรถเขียนย่อเป็ น long ได้
ตัวแปรชนิดต่างๆ
ชนิดตัวแปร
จานวนบิต
ค่าตา่ สุด
ค่าสูงสุด
int
32
-2,147,483,648
2,147,483,647
unsigned int
32
0
4,294,967,295
short
16
-32,768
32,767
unsigned short
16
0
65,536
long
32
-2,147,483,648
2,147,483,647
unsigned long
32
0
4,294,967,295
ตัวแปรชนิดต่างๆ
 สมัยนี้ (ต่ำงกับประมำณ 10 ปี ก่อน) int กับ long มีควำมหมำยเดียวกัน
 ถ้ ำอยำกใช้ เลข 64 บิตจริง ให้ ใช้ ตวั แปรชนิด long long
 ค่ำต่ำสุด -9,223,372,036,854,775,808
 ค่ำสูงสุด 9,223,372,036,854,775,807
โปรแกรม #8
#include <stdio.h>
void main()
{
int a = 1000000000;
short b = 1000000000;
long c = 1000000000;
long long d = 1000000000;
printf(“%d %d %d %d\n”, a, b, c, d);
}
โปรแกรม #8
 ผลลัพธ์ของโปรแกรม
1000000000 -13824 1000000000 100000000
โปรแกรม #8
 เรำสำมำรถใช้ %d กับข้ อมูลประเภท int, short, long, และ long long ได้
 แต่บำงครั้งค่ำของ long long ที่พิมพ์จะไม่ถูกต้ อง (เรำจะดูเรื่องนี้ในโปรแกรม #9)
 เรำสำมำรถกำหนดค่ำที่เกินขอบเขตให้ ตวั แปรใดก็ได้
 ภำษำ C จะไม่บ่น ไม่ฟ้อง compile error
 แต่ค่ำที่ตัวแปรนั้นเก็บไว้ จริงๆ จะไม่ต้องกับค่ำที่เรำกำหนดให้
 เช่น กำหนดค่ำ 1,000,000,000 ให้ b แต่ควำมจริงมันเก็บ -13,824
 ต้องระวังไม่ให้ค่าทีเ่ รากาหนดให้ตวั แปรเกินขอบเขตของมัน
โปรแกรม #9
#include <stdio.h>
void main()
{
int a = 1000000000000;
short b = 1000000000000;
long c = 1000000000000;
long long d = 1000000000000;
printf(“%d %d %d %d\n”, a, b, c, d);
}
โปรแกรม #9
 เรำกำหนดค่ำ 1,000,000,000,000 ให้ กบ
ั ตัวแปรทุกตัว
 ค่ำนี้เกินขอบเขตของ int และ long (ไม่ต้องพูดถึง short)
 ดังนั้นน่ำจะได้ ผลลัพธ์คอื เลขตัวสุดท้ ำยที่พิมพ์ออกมำน่ำจะเท่ำกับ
1,000,000,000,000 แค่ตวั เดียว
 แต่ผลลัพธ์ท่ไี ด้ จริงๆ คือ:
-727379968 4096 -727379968 -727379968
โปรแกรม #9
 เกิดอะไรขึ้น?
 เวลำใช้ %d มันจะคิดว่ำค่ำที่ให้ มำเป็ น int ซึ่งมีขนำด 32 บิต
 หำกต้ องกำรพิมพ์ค่ำ 64 บิตของ long long จะต้ องใช้ %lld แทน
โปรแกรม #10
#include <stdio.h>
void main()
{
int a = 1000000000000;
short b = 1000000000000;
long c = 1000000000000;
long long d = 1000000000000;
printf(“%lld %lld %lld %lld\n”, a, b, c, d);
}
โปรแกรม #10
 ผลลัพธ์ของโปรแกรม
-727379968 4096 -727379968 1000000000000
 อธิบำยได้ หรือไม่?
 ตัวแปร a, b, และ c ถูกกำหนดค่ำที่เกินควำมสำมำรถของมัน ดังนั้นจึงเก็บค่ำที่ผดิ อยู่
แล้ ว
 ตัวแปร d เป็ นตัวแปรประเภท long long เมื่อพิมพ์ค่ำด้ วย %lld จึงทำให้ ได้ ค่ำที่
ถูกต้ องออกมำ แต่ถ้ำใช้ %d มันจะถูกคิดว่ำเป็ น int
อักขระจัดรูปแบบอืน่ ๆ สาหรับตัวแปรประเภทจานวนเต็ม
อักขระจัดรูปแบบ
ความหมาย
%o
เลขฐำน 8 (Octal)
%x
เลขฐำน 16 (heXadecimal) ใช้ ตัวพิมพ์เล็ก
%X
เลขฐำน 16 ใช้ ตัวพิมพ์ใหญ่
%u
ให้ คิดว่ำค่ำที่ให้ มำเป็ นตัวแปรแบบ unsigned
 ถ้ ำอยำกให้ คด
ิ ว่ำค่ำที่ให้ เป็ น long long ให้ เติม ll ไปข้ ำงหน้ ำ
 %lld, %llo, %llx, %llX, %llu
 ถ้ ำอยำกให้ คด
ิ ว่ำค่ำที่ให้ เป็ น short ให้ เติม h ไปข้ ำงหน้ ำ
 %hd, %ho, %hx, %hX, %hu
 ถ้ ำอยำกให้ คด
ิ ว่ำค่ำที่ให้ เป็ น long ให้ เติม l ไปข้ ำงหน้ ำ
 %ld, %lo, %lx, %lX, %lu
โปรแกรม #10
#include <stdio.h>
void main()
{
int x = 253;
int y = -1*x;
printf(“%d %u %o %x %X\n”, x, x, x, x, x);
printf(“%d %u %o %x %X\n”, y, y, y, y, y);
}
โปรแกรม #10
 ผลลัพธ์ของโปรแกรม
253 253 375 fd FD
-253 4294967043 37777777403 ffffff03 FFFFFF03
โปรแกรม #10
 ทำไม -253 พิมพ์ออกมำด้ วย %u แล้ วได้ ค่ำ 4294967043?
 เพรำะกำรเก็บค่ำของ -253 ในตัวแปรชนิด int ใช้ รป
ู แบบของบิตเดียวกันกับ
4294667043 ในตัวแปรชนิด unsigned int
 เรำจะดูรป
ู แบบของบิตได้ ท่ไี หน?
 ดูท่เี ลขฐำน 16 หรือเลขฐำน 8
1111
1111
1111
1111
1111
1111
0000
0011
F
F
F
F
F
F
0
3
 ถ้ ำอยำกรู้ควำมหมำยของรูปแบบบิตเหล่ำนี้ ให้ ดูกำรเก็บข้ อมูลจำนวนเต็มแบบ
Two’s Complement
 สังเกตว่ำกำรพิมพ์ตัวเลขในรูปเลขฐำน 8 และเลขฐำน 16 จะคิดว่ำเลขไม่ใช่ลบเสมอ
เพรำะมันจะพิมพ์ไปตำมรูปแบบของบิต
sizeof
 เรำสำมำรถหำจำนวนไบต์ท่ใี ช้ เก็บข้ อมูลชนิดหนึ่งๆ ได้ โดยใช้ เครื่องหมำย sizeof
โดยมีรปู แบบกำรใช้ ดงั นี้
sizeof(ชนิดของข้ อมูล)
 ยกตัวอย่ำงเช่น
 sizeof(int)
 sizeof(unsigned long long)
 sizeof(short)
 sizeof(unsigned long)
โปรแกรม #11
#include <stdio.h>
void main()
{
printf("The number of bytes in an int is %d.\n", sizeof(int));
printf("The number of bytes in a short int is %d.\n",
sizeof(short));
printf("The number of bytes in a long int is %d.\n", sizeof(long));
printf("The number of bytes in a long long is %d.\n", sizeof(long
long));
}
โปรแกรม #11
 ผลลัพธ์ของโปรแกรม
The
The
The
The
number
number
number
number
of
of
of
of
bytes
bytes
bytes
bytes
in
in
in
in
an int is 4.
a short int is 2.
a long int is 4.
a long long is 8.
ตัวแปรประเภท char
 เรำสำมำรถคิดว่ำมันแทนค่ำได้ สองแบบ
 ตัวอักษร เช่น a, B, c, +, -, ., !
 เลข 8 บิต มีค่ำตั้งแต่ -128 ถึง 127
 เวลำจะพิมพ์ค่ำของ char
 ใช้ %d ถ้ ำต้ องกำรพิมพ์ค่ำตัวเลขตั้งแต่ -128 ถึง 127
 ใช้ %u ถ้ ำต้ องกำรพิมพ์ค่ำตัวเลขตั้งแต่ 0 ถึง 255
 ใช้ %c ถ้ ำต้ องกำรพิมพ์ตัวอักษร
โปรแกรม #12
#include <stdio.h>
void main()
{
char x = 65;
printf("x as a number is %d.\n", x);
printf("x as a character is %c.\n", x);
}
โปรแกรม #12
 ผลลัพธ์ของโปรแกรม
x as a number is 65.
x as a character is A.
รหัส ASCII
 ทำไมค่ำ 65 ถึงพิมพ์ออกมำแล้ วได้ ตวั A?
 เพรำะ 65 คือรหัส ASCII ของตัวอักษร A
 รหัส ASCII คือรหัสที่ยอมรับกันเป็ นมำตรำฐำนให้ ใช้ แทนตัวอักษรที่ปรำกฏอยู่บน
คีย์บอร์ดและตัวอักษรที่ใช้ บ่อยหลำยๆ ตัว
ตัวแปรประเภท char
 เรำสำมำรถเขียนค่ำตัวอักษรในภำษำ C ได้
 ให้ ใช้ เครื่องหมำยฟันหนู (‘) ล้ อมรอบตัวอักษรนั้น
 ‘a’
 ‘B’
 ‘+’
 ‘9’
โปรแกรม #13
#include <stdio.h>
void main()
{
char x = '9';
printf("x as a number is %d.\n", x);
printf("x as a character is %c.\n",
x);
}
โปรแกรม #13
 ผลลัพธ์ของโปรแกรม
x as a number is 57.
x as a character is 9.
ตัวแปรประเภท char
 เนื่องจำกตัวแปรประเภท char จริงๆ แล้ วคือตัวเลขจำนวนเต็ม ดังนั้นคุณจึง
สำมำรถทำอย่ำงนี้ได้
 ‘A’ + 5
 ‘B’ * ‘x’
 100 / ‘a’
 เป็ นประโยชน์มำกสำมำรถใช้ เป็ น
 ‘A’ + 5 มีค่ำเท่ำกับ 70 ซึ่งคือรหัส ASCII ของตัว ‘F’ ซึ่งเป็ นตัวอักษรที่อยู่หลัง
A 5 ตัว
 ‘x’ – ‘a’ มีค่ำเท่ำกับ 23 ซึ่งหมำยควำมว่ำ ‘x’ อยู่หลัง ‘a’ ไป 23 ตัว
ตัวแปรประเภท string
 เรำสำมำรถประกำศตัวแปรประเภท string ได้ ด้วยคำสั่ง
char *ชื่อตัวแปร;
 เช่น char *name;
 หลังจำกนั้นก็สำมำรถกำหนดค่ำให้ มน
ั ได้ โดยใช้ เครื่องหมำยเท่ำกับ (=)
 เช่น name = “Dennis Richie”
 เวลำจะพิมพ์ค่ำ string ด้ วยคำสั่ง printf ให้ ใช้ ตวั อักขระจัดรูปแบบ %s
 เช่น printf(“%s\n”, name);
โปรแกรม #14
#include <stdio.h>
void main()
{
char *name;
name = "Dennis Ritchie";
printf("%s is the creator of the C language.\n",
name);
}
โปรแกรม #15
 ผลลัพธ์
Dennis Ritchie is one of the creator of the C language.
โปรแกรม #15
 สำมำรถเขียนให้ ส้น
ั ลงเล็กน้ อยได้ ดงั นี้
#include <stdio.h>
void main()
{
char *name = "Dennis Ritchie";
printf("%s is the creators of the C language.\n",
name);
}
ตัวแปรทีเ่ ก็บค่าจานวนจริง
 มีรวมทั้งหมด 3 ชนิด
 float ขนำด 32 บิต
 double ขนำด 64 บิต
 long double ขนำด 64 บิต
 long double กับ double จะเหมือนกันในสำยตำของส่วนมำก แต่สำหรับ
คอมไพเลอร์บำงตัว long double จะมีขนำด 128 บิต
 อักขระจัดรูปแบบที่ใช้ แสดงผลตัวแปรรูปแบบต่ำงๆ ได้ แต่
 float ใช้ %f
 double และ long double ใช้ %lf
อักขระจัดรูปแบบสาหรับค่าประเภทจานวนจริง
 %f คือกำรพิมพ์จำนวนจริงธรรมดำ
 %e คือกำรพิมพ์จำนวนจริงในรูปแบบ scientific notation
 เช่น 123.45 จะพิมพ์เป็ น 1.234500e+02 หมำยควำมถึง 1.2345  102
 %E คือกำรพิมพ์แบบ scientific notation เหมือนกัน แต่ใช้ ตวั E พิมพ์ใหญ่
โปรแกรม #16
#include <stdio.h>
void main()
{
float score;
score = 300.545;
printf("Score are %f, %e, and %E\n",
score, score, score);
}
โปรแกรม #16
 ผลลัพธ์ของโปรแกรม
Score are 300.545013, 3.005450e+002, and 3.005450E+002
โปรแกรม #16
 ทำไมมันถึงพิมพ์ 300.545013 ทั้งๆ ที่เรำสั่ง 300.545?
 นี่เป็ นเพรำะว่ำจำนวนจริงมีอยู่นับไม่ถ้วน
 แต่เรำใช้ พ้ ืนที่เพียง 32 บิต (ตัวแปรประเภท float) เก็บค่ำนั้น
 ทำให้ เรำเก็บจำนวนจริงได้ แค่บำงตัว
 300.545 เป็ นหนึ่งในจำนวนจริงที่เก็บไม่ได้
 เลยต้ องใช้ ค่ำที่ใกล้ มันมำกที่สดุ ที่เก็บได้ คือ 300.545013
 0.000013 ที่เกินมำเรียกว่ำ round-off error
โปรแกรม #16
 ทำอย่ำงไร round-off error จะหำยไป?
 มันหำยไปไม่ได้ นี่เป็ นข้ อจำกัดทำงทฤษฎี!
 แต่เรำสำมำรถทำให้ มน
ั ลดลงได้ ด้วยกำรใช้ ตวั แปรที่ให้ ควำมละเอียดสูงขึ้น
 ใช้ double แทน float
 อย่ำงไรก็ดีจะใช้ กต็ ้ องคิดดีๆ
 ใช้ แล้ วหน่วยควำมจำสำหรับเก็บข้ อมูลจะเพิ่มขึ้นสองเท่ำ!
โปรแกรม #17
#include <stdio.h>
void main()
{
double score;
score = 300.545;
printf("Score are %f, %e, and %E\n",
score, score, score);
}
โปรแกรม #17
 ผลลัพธ์ของโปรแกรม
Score are 300.545000, 3.005450e+002, and 3.005450E+002
การกาหนดจานวนตัวเลขและจานวนตัวเลขหลังทศนิยม
 เรำสำมำรถกำหนดจำนวนตัวเลขและจำนวนตัวเลขหลังทศนิยมได้ ด้วยตัวอักขระ
จัดรูปแบบ
%w.df
โดยที่ w และ d เป็ นจำนวนเต็มที่ไม่เป็ นลบ
 w แทนจำนวนตำแหน่งทั้งหมดในกำรแสดงผล รวมจุดทศนิยมหนึ่งตำแหน่ง
 d แทนจำนวนตำแหน่งหลังจุดทศนิยม
 ถ้ ำข้ อมูลมีน้อยกว่ำ w ตำแหน่ง โปรแกรมเติมช่องว่ำงหน้ ำข้ อมูลจนครบ w
ตำแหน่ง
 ยกตัวอย่ำงเช่น ถ้ ำเรำพิมพ์ค่ำ 12.35 ด้ วยอักษรจัดข้ อควำม %7.2f เรำจะได้
ข้ อควำม
(ว่ำง)
(ว่ำง)
1
2
.
3
5
โปรแกรม #18
#include <stdio.h>
void main()
{
double temp;
temp = 12.34;
printf("%7.2f, %10.3E, %10.3e\n", temp, temp, temp);
temp = 1.2365e-5;
printf("%7.2f, %10.3E, %10.3e\n", temp, temp, temp);
temp = 584.365E+17;
printf("%7.2f, %10.3E, %10.3e\n", temp, temp, temp);
}
โปรแกรม #18
 ผลลัพธ์ของโปรแกรม
12.34, 1.234E+001, 1.234e+001
0.00, 1.237E-005, 1.237e-005
58436500000000000000.00, 5.844E+019, 5.844e+019
โปรแกรม #18
 ผลลัพธ์ของโปรแกรม
__12.34, 1.234E+001, 1.234e+001
___0.00, 1.237E-005, 1.237e-005
58436500000000000000.00, 5.844E+019, 5.844e+019
+=, -=, *=, /=, %=
 สมมติว่ำ  เป็ นเครื่องหมำย
 ถ้ ำสั่ง
ตัวแปร = นิพจน์;
จะมีควำมหมำยเหมือนกับ
ตัวแปร = ตัวแปร  (นิพจน์);
 เช่น
x += 1;
y -= x*5;
มีควำมหมำยเหมือนกับ
มีควำมหมำยเหมือนกับ
x = x+1;
y = y – (x*5);
โปรแกรม #19
#include <stdio.h>
void main()
{
int a = 0, b = 5;
a += 4;
printf("a is %d\n",
a *= 3;
printf("a is %d\n",
a /= 4;
printf("a is %d\n",
a %= 5;
printf("a is %d\n",
a = 7;
a /= a - b;
printf("a is %d\n",
b *= b + a;
printf("b is %d\n",
}
a);
a);
a);
a);
a);
b);
โปรแกรม #19
 ผลลัพธ์ของโปรแกรม
a
a
a
a
a
b
is
is
is
is
is
is
4
12
3
3
3
40
++, - คำสั่ง x+=1; สำมำรถย่อเป็ น x++; หรือ ++x; ก็ได้ ฃ
 คำสั่ง x-=1; สำมำรถย่อเป็ น x--; หรือ --x; ก็ได้
โปรแกรม #20
#include <stdio.h>
void main()
{
int x = 8;
printf("x is %d\n",
x++;
printf("x is %d\n",
++x;
printf("x is %d\n",
x--;
printf("x is %d\n",
--x;
printf("x is %d\n",
}
x);
x);
x);
x);
x);
โปรแกรม #20
 ผลลัพธ์ของโปรแกรม
x
x
x
x
x
is
is
is
is
is
8
9
10
9
8
คาสัง่ scanf
 ใช้ รับข้ อมูลจำกทำง standard input
 ทำหน้ ำที่กลับกันกับ printf
 อยู่ใน stdio.h เหมือนกับ printf
 รูปแบบกำรใช้ งำน
scanf(ข้ อควำม, &ชื่อตัวแปร 1, &ชื่อตัวแปร 2, …, &ชื่อตัวแปร n);
 ข้ อควำมที่ให้ เป็ นอำร์กวิ เมนต์ของ scanf ไปจะต้ องมีอกั ขระจัดรูปแบบเท่ำกับ
จำนวนตัวแปรที่ให้ เป็ นอำร์กวิ เมนต์ต่อท้ ำย
 scanf จะอ่ำนข้ อควำมเข้ ำมำหนึ่งข้ อควำม แล้ วพยำยำมเอำข้ อควำมส่วนที่ตรงกับ
อักขระจัดรูปแบบไปใส่ในตัวแปรที่ตรงกับอักขระจัดรูปแบบนั้น
คาสัง่ scanf
 ยกตัวอย่ำงเช่น ถ้ ำเรำสั่ง
scanf(“%d %d”, &x, &y);
แล้ วผู้ใช้ ป้อนข้ อควำม
10 20
จะได้ ว่ำ x จะมีค่ำเท่ำกับ 10 และ y มีค่ำเท่ำกับ 20
โปรแกรม #21
#include <stdio.h>
void main()
{
int val;
printf("Enter a decimal integer: ");
scanf("%d", &val);
printf("The value is %o in octal, and %x in \
hexadecimal.\n", val, val);
printf("Enter an octal integer: ");
scanf("%o", &val);
printf("The value is %d in decimal.\n", val);
printf("Enter a hexadecimal integer: ");
scanf("%x", &val);
printf("The value is %d in decimal.\n", val);
}
โปรแกรม #21
 ผลลัพธ์ของโปรแกรม
Enter a decimal integer: 78
The value is 116 in octal, and 4e in hexadecimal.
Enter an octal integer: 116
The value is 78 in decimal.
Enter a hexadecimal integer: 4e
The value is 58446 in decimal.
(หมายเหตุ ตัวอักษรตัวพิมพ์หนำคือข้ อควำมที่ผ้ ูใช้ ป้อนเข้ ำทำงคีย์บอร์ด)
แบบฝึ กหัด #4
 เขียนโปรแกรมรับเลขจำนวนเต็มหนึ่งตัว สมมติว่ำตัวแปรนั้นคือ x เสร็จแล้ วพิมพ์
ค่ำ x, x2, และ x3
แบบฝึ กหัด #4
#include <stdio.h>
void main()
{
int x;
scanf("%d\n", &x);
printf("%d %d %d\n", x, x*x, x*x*x);
}
แบบฝึ กหัด #5
 จงเขียนโปรแกรมรับรัศมีของวงกลม แล้ วพิมพ์พ้ ืนที่และเส้ นรอบวงของวงกลมนั้น
โดยประมำณ ออกทำงหน้ ำจอ
แบบฝึ กหัด #5
#include <stdio.h>
void main()
{
float r;
float pi = 3.14159265;
scanf("%f\n", &r);
float area = pi * r * r;
float circumference = 2 * pi * r;
printf("%f %f\n", area, circumference);
}