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);
}