การเขียนโปรแกรมคอมพิวเตอร 1 header file computer...

18
การเขียนโปรแกรมคอมพิวเตอร์ 1 Computer Programming I ฟังก์ชันไลบรารีมาตรฐาน (Standard Library Functions) สตริง (String) สัปดาห์ที12 ภิญโญ แท้ประสาทสิทธิEmails : pinyotae+111 at gmail dot com, pinyo at su.ac.th Web : http://www.cs.su.ac.th/~pinyotae/compro1/ Facebook Group : ComputerProgramming@CPSU ภาควิชาคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยศิลปากร หัวข้อเนื้อหา ฟังก์ชันไลบรารีมาตรฐานคืออะไร Header File กับฟังก์ชันไลบรารีมาตรฐาน ฟังก์ชันคณิตศาสตร์ ข้อมูลชนิดตัวอักขระ (character) ฟังก์ชันเกี่ยวกับตัวอักขระ สตริง ฟังก์ชันจัดการสตริง 16 สิงหาคม 2556 2 ภิญโญ แท้ประสาทสิทธิ์ มหาวิทยาลัยศิลปากร รู้จักกับไลบรารีมาตรฐาน ไลบรารี (Library) คือศูนย์รวมชุดคําสั่ง (Function) เป็นเหมือนห้องสมุดที่รวมสิ่งที่มีคนเขียนไว้ก่อนหน้าให้เราอ้างอิงได้ทันที ไลบรารีมาตรฐาน คือ ศูนย์รวมชุดคําสั่งมาตรฐานที่มีในคอมไพเลอร์ ภาษาซีเกือบทุกตัว คอมไพเลอร์ภาษาซีที่ได้มาตรฐานจะมีไลบรารีเหล่านี ทําให้เราสามารถเปลี่ยนคอมไพเลอร์เป็นของยี่ห้ออื่นได้ (แต่ก็ต้องเป็นภาษาซีเหมือนเดิม) แท้จริงภาษาซีเป็นมากกว่าภาษา เพราะมันเป็นสิ่งที่ถูกกําหนดไว้เป็น มาตรฐานสากลด้วย (เป็นมาตรฐาน ISO แบบหนึ่ง) ภิญโญ แท้ประสาทสิทธิ์ มหาวิทยาลัยศิลปากร 3 16 สิงหาคม 2556 ฟังก์ชันไลบรารีมาตรฐาน คือฟังก์ชันที่ถูกกําหนดไว้ในมาตรฐานภาษาซี เรียกใช้ได้จากไลบรารีมาตรฐาน เรียกใช้ได้จากคอมไพเลอร์หลายยี่ห้อ ตัวอย่างที่เราใช้มาตลอดก็คือ scanf กับ printf ยังมีฟังก์ชันพื้นฐานที่สําคัญอีกมากที่เราจะได้ใช้บ่อย ๆ เช่น sqrt เป็นฟังก์ชันสําหรับหาค่ารากที่สองของตัวแปรหรือตัวเลข ฟังก์ชันไลบรารีมาตรฐานมักจะเกี่ยวข้องกับงานพื้นฐานที่ขาดไม่ได้ ภิญโญ แท้ประสาทสิทธิ์ มหาวิทยาลัยศิลปากร 4 16 สิงหาคม 2556

Upload: others

Post on 19-Jan-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

การเขยนโปรแกรมคอมพวเตอร 1

Computer Programming I

ฟงกชนไลบรารมาตรฐาน (Standard Library Functions)สตรง (String)

สปดาหท 12

ภญโญ แทประสาทสทธ

Emails : pinyotae+111 at gmail dot com, pinyo at su.ac.th

Web : http://www.cs.su.ac.th/~pinyotae/compro1/

Facebook Group : ComputerProgramming@CPSU

ภาควชาคอมพวเตอร คณะวทยาศาสตร มหาวทยาลยศลปากร

หวขอเนอหา• ฟงกชนไลบรารมาตรฐานคออะไร

• Header File กบฟงกชนไลบรารมาตรฐาน

• ฟงกชนคณตศาสตร

• ขอมลชนดตวอกขระ (character)

• ฟงกชนเกยวกบตวอกขระ

• สตรง

• ฟงกชนจดการสตรง

16 สงหาคม 2556 2ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

รจกกบไลบรารมาตรฐาน

• ไลบราร (Library) คอศนยรวมชดคาสง (Function)

• เปนเหมอนหองสมดทรวมสงทมคนเขยนไวกอนหนาใหเราอางองไดทนท

• ไลบรารมาตรฐาน คอ ศนยรวมชดคาสงมาตรฐานทมในคอมไพเลอรภาษาซเกอบทกตว

� คอมไพเลอรภาษาซทไดมาตรฐานจะมไลบรารเหลาน

� ทาใหเราสามารถเปลยนคอมไพเลอรเปนของยหออนได(แตกตองเปนภาษาซเหมอนเดม)

• แทจรงภาษาซเปนมากกวาภาษา เพราะมนเปนสงทถกกาหนดไวเปนมาตรฐานสากลดวย (เปนมาตรฐาน ISO แบบหนง)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 316 สงหาคม 2556

ฟงกชนไลบรารมาตรฐาน

• คอฟงกชนทถกกาหนดไวในมาตรฐานภาษาซ

� เรยกใชไดจากไลบรารมาตรฐาน

� เรยกใชไดจากคอมไพเลอรหลายยหอ

• ตวอยางทเราใชมาตลอดกคอ scanf กบ printf

� ยงมฟงกชนพนฐานทสาคญอกมากทเราจะไดใชบอย ๆเชน sqrt เปนฟงกชนสาหรบหาคารากทสองของตวแปรหรอตวเลข

� ฟงกชนไลบรารมาตรฐานมกจะเกยวของกบงานพนฐานทขาดไมได

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 416 สงหาคม 2556

Page 2: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

ความสาคญของไลบรารมาตฐาน

• การใชไลบรารมาตรฐานในโปรแกรมของเราจะทาใหการนาโปรแกรมไปใชในระบบปฏบตการอนเปนไปโดยงาย

� เขยนโปรแกรมบนวนโดวส แตสามารถนาไปคอมไพลใหมใหทางานบน Mac

หรอ Linux ได

� การนาไปคอมไพลใหมในคอมไพลเลอรยหออนได เรยกวา “ม portability”

• ลดเวลาในการเขยนโปรแกรมใหม เพราะโปรแกรมทเขยนขนมาสามารถนาไปใชไดอยางแพรหลาย

• แตไลบรารมาตรฐานกไมไดครอบคลมการทางานทกอยาง

� ในทางปฏบตเราตองพงไลบรารทไมใชมาตรฐานสากลดวย

� ไลบรารทไมใชมาตรฐานบางอนกสามารถนาไปใชไดกวางขวาง บางอนกไม

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 516 สงหาคม 2556

Header File กบฟงกชนไลบรารมาตรฐาน

• เวลาเราเขยนวา #include <stdio.h> แทจรงแลวเรากาลงอางถงไลบรารมาตรฐานผานสงทเรยกวา header file

• header file เปนไฟลทบรรจการประกาศฟงกชนหรอคาคงทเอาไว

� โดยมากจะลงทายดวย .h (แตกไมแนเสมอไป)

� เมอเราสง #include ไฟลแบบนแลวโปรแกรมเราจะสามารถเรยกฟงกชนหรอคาคงททมการประกาศเอาไว� ทาใหโปรแกรมของเรามความสามารถมากขน

� เชนแตกอนโปรแกรมเรารบขอมลเขาและแสดงผลไมไดแตพอรวม stdio.h มากทาใหโปรแกรมเรามความสามารถเพมขน

� ไลบรารมาตรฐานถกแบงเปนหมวดหมตามเฮดเดอรไฟล

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 616 สงหาคม 2556

เฮดเดอรไฟลทสาคญ

• ดานคณตศาสตร math.h

• คาคงทสาคญ (เชน INT_MAX) limits.h

• อรรถประโยชน (เชน ขอหนวยความจา เปลยนตวอกษรใหเปนตวเลข)stdlib.h

• ตวอกขระ (character) ctype.h

• สายอกขระ (string) string.h

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 716 สงหาคม 2556

ฟงกชนคณตศาสตร (1)

• เราสามารถเรยกฟงกชนคณตศาสตรขนสงไดจาก math.h

• หมวดเลขยกกาลง

� ฟงกชน sqrt ใชหารากทสองแมแบบฟงกชน double sqrt ( double input );

� ฟงกชน pow ใชคานวณผลการยกกาลงแมแบบฟงกชน double pow ( double base, double exp );

� ฟงกชน exp ใชคานวณผลการยกกาลงโดยมฐานเปน e (~ 2.71828)แมแบบฟงกชน double exp ( double arg );

� ฟงกชน log ใชคานวณคา logarithm โดยมฐานเปน eแมแบบฟงกชน double log ( double arg );

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 816 สงหาคม 2556

Page 3: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

หดใชฟงกชน sqrt

• การทเราจะใชฟงกชนพวกนไดเราจะตองรจกวธอานแมแบบฟงกชนdouble sqrt ( double input );

• อยาลมวาฟงกชนขนตนดวย return type ซงระบชนดขอมลทฟงกชนจะสงกลบมา ในทนคอเลขทศนยมความแมนยาสง

• สวนตวหลกกคอชอฟงกชน ซงในทนคอ sqrt

• อนพตของฟงกชนเปนขอมลชนดเลขทศนยมความแมนยาสง

• ดงนนเราสามารถหารากทสองของ x และเกบผลลพธไวใน result ไดโดยdouble result;

result = sqrt( x );

หรอจะเขยนรวบเปนคาสงเดยวกนไดผลเปน double result = sqrt( x );

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 916 สงหาคม 2556

การประยกตใชฟงกชน sqrt

• หาความยาวดานสามเหลยมตรงขามมมฉาก

� � �� � ��

• สตรขางบนแทจรงแลวมาจาก �� � �� � ��

ตวอยาง จงเขยนโปรแกรมทรบความยาวดานประกอบมมฉากทงสองเปนจานวนจรงบวก แลวคานวณหาความยาวดานตรงขามมมฉาก พรอมแสดงผลการคานวณออกมาทางจอภาพวเคราะห จานวนจรงหมายความรวมถงทงจานวนเตมและเลขทศนยม ซงเทยบเคยงไดกบ float หรอ double การใหคา a และ b เปนเลขแบบ double นบเปนทางทปลอดภย เพราะเกบขอมลไดมากกวาและละเอยดกวา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1016 สงหาคม 2556

โคดการหาความยาวดานสามเหลยมตรงขามมมฉาก

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1116 สงหาคม 2556

#include <stdio.h>#include <math.h>

void main() {double a, b;scanf("% l f % l f", &a, &b);

double result = sqrt (a*a + b*b);printf("%lf", result);

}

เราเรยกใช header file ไดหลายอนพรอมกน ในทนโปรแกรมเราจะม

ความสามารถดานคณตศาสตรขนสงพรอมทงรบขอมลและแสดงผลลพธได

ถาเปน double ใหใช L เลกหนา f

เรยก sqrt เหมอนฟงกชนทวไป คาของพารามเตอรสามารถนามาคานวณทในวงเลบกได (เหมอน printf)

การประยกตใชฟงกชน pow

• มความจาเปนเมอเลขชกาลงไมเปนจานวนเตม เชน ถาเราอยากรวา3.14�.��มคาเทาใด

• ใชไดในกรณทเลขชกาลงมคามาก หรอเลขชกาลงตดคาตวแปร เชน ถาเราตองการหาคาของ 3.14�หรอ ��เปนตน

• ใชในการหาคารากทสามของระบบสมการ

ตวอยาง จงหาคา �เมอกาหนดให � � ��โดยท �เปนอนพตจากผใช

วเคราะห เราสามารถหาคา x ไดจาก � � �� � ��

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1216 สงหาคม 2556

Page 4: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

โคดแสดงการใช pow หาคารากทสาม

• แมแบบฟงกชน double pow ( double base, double exp );

เพอความงายในการพจารณาความถกตอง ลองแทน y ใหเปน 8 หรอ 125

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1316 สงหาคม 2556

#include <stdio.h>#include <math.h>

void main() {double x, y;scanf("%lf", &y);

x = pow(y, 1.0/3.0);printf("%lf", x);

}

ฟงกชนคณตศาสตร (2)หมวดตรโกณมต

� ฟงกชนพนฐาน sin, cos, และ tanแมแบบฟงกชน double sin ( double arg );cos กบ tan มรปแบบการใชงานแบบเดยวกน

� ฟงกชนหามม asin, acos, atan, และ atan2 (คอการหาคา arcsin, arccos, arctan แบบ quadrant เดยวและ arctan แบบ 2 quadrant)แมแบบฟงกชน double asin ( double arg );

asin, acos และ atan มแมแบบคลายกน ตางกนเฉพาะ atan2 เทานนdouble atan2 ( double y, double x );

หนวยของมมเปนเรเดยน ไมใชองศาatan2 ใชเครองหมายของพารามเตอรในการหา quadrant

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1416 สงหาคม 2556

การประยกตใชฟงกชนตรโกณมต

• หาความดานสามเหลยมทตดมมฉาก

• เรารวาเราตองคานวณ 50 ∗ sin�60°�

• เรองทเราตองระวงในการใชฟงกชนตรโกณมตในภาษาซกคอวาหนวยของมมไมใชองศา แตเปนเรเดยน

• ตองเปลยนหนวยใหเปนเรเดยนดวย�

���เมอ A เปนมมในหนวยองศา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1516 สงหาคม 2556

5060°

จงคานวณหาความยาวของ x เมอกาหนดความยาวดานตรงขามมมฉากและขนาดมมมาใหดงภาพ

โคดตวอยางการใชฟงกชนตรโกณมต

• เราสามารถอางถงคา ไดจากคาคงทชอวา M_PI (มากบ math.h)

• ถาจาชอคาคงทไมได กใชความรทางคณตศาสตรชวยได เชน เพราะวา

arctan( 1 ) = �

�ถาเราเขยนโคดวา

double pi = 4.0 * atan(1.0) เรากจะไดคา มาเหมอนกน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1616 สงหาคม 2556

#include <stdio.h>#include <math.h>

void main() {double angle = (60.0 / 180.0 ) * M_PI;printf("%lf", 50 * sin (angle));

}

Page 5: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

การใชกฎของ cosine

• เวลาทเราคณเวคเตอรสองตวดวย dot product ตามสตร ⋅ � � � cos �

• สถานการณหนงหนงทเราพบบอยกคอ เรารเวคเตอร และ � แตเราอยากจะรวาเวคเตอรทงสองทามมกนเทาไหร ดงนนเราจงตองทาการปรบสตร ยายขางกนสกเลกนอยเปน

cos � � ⋅ �

จากนนใช arccosเรากจะไดวามม � คอ

� � arccos� ⋅ �

� �

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1716 สงหาคม 2556

ตวอยางการใช acos หาคามมของเวคเตอร

ตวอยาง กาหนดเวคเตอร �32

และ �� � 14

จงเขยนโปรแกรมเพอ

คานวณหามมระหวางเวคเตอรทงสองน

วเคราะหเราตองการหาคา � � arccos��⋅

� �

1. เราสามารถคานวณคา dot product ไดจาก (3 x 1) + (2 x 4)

2. ขนาดของเวคเตอรทงสองหาไดจาก � 3� � 2�และ�� � 1� � 4�

3. ถาหาคาของ ⋅�

� ไดสาเรจ เรากนาใชกบฟงกชน acosเพอหา

ผลลพธสดทาย (ไดผลลพธเปนมมในหนวยเรเดยนเชนเดม)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1816 สงหาคม 2556

โคดการหามมระหวางเวคเตอร

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 1916 สงหาคม 2556

#include <stdio.h>#include <math.h>

void main() {double x1 = 3, y1 = 2, x2 = 1, y2 = 4;double dot = x1*x2 + y1*y2;double size1 = sqrt(x1*x1 + y1*y1);double size2 = sqrt(x2*x2 + y2*y2);

double theta = acos (dot / (size1*size2));

printf("Angle = %lf", theta);}

ฟงกชนคณตศาสตร (3)

หมวดเศษทศนยม

� ฟงกชนปดคาขน ceilแมแบบฟงกชน double ceil ( double x );

เชน ถา x = 1.23 ผลทไดคอ 2.00ถา x = -1.23 ผลทไดคอ -1.00 (เพราะวา -1.00 มคามากกวา -2.00)

� ฟงกชนปดคาลง floorแมแบบฟงกชน double floor ( double x );

เชน ถา x = 1.23 ผลทไดคอ 1.00ถา x = -1.23 ผลทไดคอ -2.00 (เพราะวา -2.00 มคานอยกวา -1.00)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2016 สงหาคม 2556

Page 6: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

ตวอยางการใช ceil และ floor

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2116 สงหาคม 2556

#include <stdio.h>#include <math.h>

void main() {double x = 1.23;double y = -1.23;

double ceil_x = ceil ( x );double ceil_y = ceil ( y );printf("%lf %lf\n", ceil_x, ceil_y);

double floor_x = floor ( x );double floor_y = floor ( y );printf("%lf %lf\n", floor_x, floor_y);

}

ขอมลชนดตวอกขระ

• ทผานมาเราเนนการทางานกบขอมลชนดจานวนเตมกบจานวนจรง

• แตขอมลชนดตวอกขระ (character) กมความสาคญมาก

� เปนพนฐานของการเกบขอมลจาพวกชอและขอความตาง ๆ

� เปนพนฐานของการแสดงผลลพธหลาย ๆ อยาง

• คาวาตวอกขระในทนหมายถงตวอกษรโดด

� ไมใชขอความ แตเปนเปนตวอกษรแคตวเดยว

� หมายความรวมถงเครองหมายวรรคตอน และ ตวเลข

� รวมถงตวอกษรพเศษทมองไมเหน เชน ชองวาง (space), ตวขนบรรทดใหม (new line), หรอแมกระทงเสยงเตอน (bell)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2216 สงหาคม 2556

การใชตวอกขระ

• ชนดขอมลทเขยนในภาษาซคอ char

• เวลาประกาศตวแปรเราทาแบบปรกตคอ

� ชนดขอมล char ตามดวยชอตวแปร เชน char c;

� เราระบคาเรมตนพรอมการประกาศไดเชนเดยวกบตวแปรทวไปแตจะมรปแบบของการระบตวอกษรทเปนเอกลกษณ ไมเหมอนตวเลข

• การระบตวอกษรทตองการ

� ถาเราจะระบใหตวแปรมคาเทากบตว a เราไมสามารถเขยนวาchar c = a; แบบนผด เพราะการเขยน a แบบนเหมอนชอตวแปรทวไป

� เราตองครอบดวยเครองหมาย อญประกาศเดยว (‘เขาเดยว’) เชนchar c = ‘a’;

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2316 สงหาคม 2556

เรองทคนมกจะงง

เวลาเราระบคาตวอกษร ถาเราเจาะจงตวใดตวหนง เรากระบลงไปไดเลยพรอมเครองหมายอญประกาศเดยว เชน char c = ‘a’;

� แตถาเรามตวแปรประเภท char อยสองตว เชนchar x = ‘a’; และ char c; เราสามารถระบใหตวแปร c มคาเทากบตวแปร x ดวยการเขยนวา c = x; แบบนได

� จากตวอยางขางบน c จะมคาเทากบอกขระ ‘a’

เครองหมายอญประกาศเดยวใชระบตวอกขระ ถาไมใสจะหมายถงตวแปร

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2416 สงหาคม 2556

Page 7: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

ตวตนทแทจรงของตวอกขระ

• ตวอกขระแทจรงแลวอยในฐานะ ‘รหสตวเลข’ คอ เครองเกบตวเลขเอาไว แตตอนแสดงผลมนเปลยนตวเลขเปนตวอกษรใหเราอานออก

• เปนการเชอมตอกนระหวางรปแบบทเครองเขาใจกบรปแบบทมนษยเขาใจ

� เครองเขาใจแตตวเลข (เกบขอมลทกอยางเปนเลขฐานสองอยภายใน)

� มนษยใชการอานขอความหรอตวอกษร ไมไดถนดการอานตวเลข

� เราจงใหเครองเกบตวเลขไว แตตอนแสดงผลใหมนแปลงตวเลขเปนตวอกษรใหเราอาน

• เพอใหการเกบรหสตวเลขของอกขระเปนสงทเขาใจตรงกนจงไดมการกาหนดมาตรฐานขนมา หนงในมาตรฐานทใชกนอยางแพรหลายคอ ASCII

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2516 สงหาคม 2556

รจกรหส ASCII

• ยอมาจาก American Standard Code for Information Interchange

• เขยนเปนไทยวา ‘แอสก’ (ออกเสยงคลายคาวา แอส – ค)

• อกขระแตละตวจะมตวเลขประจาอย เชน A มคาตวเลขเทากบ 65 และ a มคาตวเลขเทากบ 97

• ตวเลกกบตวใหญถอวาเปนคนละตวกน

• มอกขระพเศษประกอบอยใน ASCII Code เชน

� ‘\0’ มคาตวเลขเทากบ 0 ใชสาหรบแทนจดสนสดของขอความ (สตรง)เรานยมเรยกอกขระตวนวา null character (อกขระศนย)

� ‘\t’ มคาตวเลขเทากบ 9 ใชสาหรบแทนจดตงระยะกนหนา (tab)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2616 สงหาคม 2556

ตารางรหส ASCII

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2716 สงหาคม 2556

การดาเนนการเลขคณตกบตวอกขระ

• เพราะตวอกขระแทจรงเปนตวเลข

� เราสามารถดาเนนการคานวณทางตวเลขกบมนได

� บวกลบคาอกขระได

� เปรยบเทยบความมากนอยของตวเลขตาง ๆ ได

ตวอยาง เปลยนตวอกษรใหญใหกลายเปนเลก

• เรารวาตวอกษรใหญในภาษาองกฤษมคาตวเลขนอยกวาตวอกษรเลกอย 32

• เรารดวยวาตวอกษรใหญมคาตงแต 65 ไปจนถง 90ดงนนถาเรามอกขระ c เราสามารถรไดวามนเปนตวอกขระใหญหรอไมโดย

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2816 สงหาคม 2556

if ( c >= 65 && c <= 90 ) { … }

Page 8: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

โคดสาหรบการแปลงตวอกษรใหญใหกลายเปนตวอกษรเลก

• ลองเปลยนคาเรมตนตวแปร c เปน ‘B’, ‘C’ หรอ ‘Z’

• ลองเปลยนคาเรมตนตวแปร c เปน ‘a’, ‘b’, ‘c’ หรอ ‘z’

• ลองเปลยนคาเรมตนตวแปร c เปน ‘+’, ‘-’, ‘*’ หรอ ‘/’

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 2916 สงหาคม 2556

void main() {

char c = ‘A';

if( c >= 65 && c <= 90 ) {

c += 32;

}

printf("%c", c);

}

จะบวกคาของ char กยงได

เราทาการเปรยบเทยบ char

ไดเหมอนตวเลขทวไป

การรบคาอกขระจากผใช

เราใชคาสง scanf ไดตามปรกต แตใหใช %c ในการระบประเภทขอมล

ตวอยาง

เรองควรทราบ

• ถงแมวาในโปรแกรมเราจะใช ‘ ’ ครอบอกขระไว แตเวลารบขอมลจากผใชอยาใส ‘ ’ เขาไปเปนอนขาด

• บนวนโดวสเวลาทเรากด Enter มนจะมอกขระขนบรรทดใหมกบขนตนบรรทดใหมแยกออกจากกน ทาใหมตวอกษรเกนมาตวหนง(ถาโปรแกรมรบอนพตมาตวเดยว ปญหาตวอกษรเกนจะไมมผลใด ๆ)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3016 สงหาคม 2556

char c;

scanf(“%c”, &c);

โปรแกรมรบและแปลงคาตวพมพตวใหญเปนตวเลกตวอยาง จงเขยนโปรแกรมทรบตวอกขระจากผใชมาตวหนง หากตวอกขระนนเปนตวพมพใหญ ใหเปลยนเปนตวพมพเลก แลวพมพผลลพธออกมาทางจอภาพ แตหากไมใชตวพมพใหญ ใหพมพตวอกขระทไดมาจากผใชออกมาทางจอภาพ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3116 สงหาคม 2556

char c;scanf("%c", &c);

if( c >= 65 && c <= 90 ) {

c += 32;

}

printf("%c", c);

แบบฝกหด (1)

1. จงเขยนโปรแกรมรบตวอกขระจากผใชมาตวหนง หากตวอกขระนนเปนตวพมพใหญ ใหเปลยนเปนตวพมพเลก แตหากไมใชตวพมพใหญ ใหพมพตวอกขระทไดมาจากผใชออกมามาทางจอภาพ

2. จงเขยนโปรแกรมรบตวอกขระจากผใชมาตวหนง หากตวอกขระนนเปนตวพมพใหญ ใหเปลยนเปนตวพมพเลก แตหากตวอกขระจากผใชเปนตวพมพเลก ใหเปลยนเปนตวพมพใหญ แลวพมพผลการเปลยนออกมาทางจอภาพ หากตวอกขระทไดมาไมใชตวอกษรภาษาองกฤษ (ไมใชตว A-Z หรอ a-z) ใหพมพตวอกขระทไดมาจากผใชออกมามาทางจอภาพ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3216 สงหาคม 2556

Page 9: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

แบบฝกหด (2)

3. จงเขยนโปรแกรมทเปลยนตวอกขระเปนตวถดไป โดยหากผใชพมพตวอกขระมาเปน A โปรแกรมจะเปลยนเปน B ถาผใชใสตวอกขระมาเปน B, C, D, …, Y โปรแกรมจะเปลยนเปน C, D, E, …, Z แตถาผใชใสตว Z เขามาโปรแกรมจะเปลยนเปน A

ในกรณทผใชใสตวพมพเลก โปรแกรมจะเปลยนตวอกขระใหเปนตวถดไปในลกษณะเดยวกน (เปลยน a เปน b, b เปน c, …, z เปน a) สดทายโปรแกรมจะแสดงผลการเปลยนตวอกขระออกมาทางจอภาพ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3316 สงหาคม 2556

โคดโปรแกรมเปลยนตวอกขระไปตวทอยตดกน

8/16/2013 34ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

char inputChar, outputChar;scanf("%c", &inputChar);

// Perform conversion (except Z and z)if(inputChar >= 65 && inputChar < 90) {

outputChar = inputChar + 1;} else if(inputChar == 90) {

outputChar = 65;} else if(inputChar >= 97 && inputChar < 122) {

outputChar = inputChar + 1;} else if(inputChar == 122) {

outputChar = 97;} else {

outputChar = inputChar; // No conversion needed}printf("%c\n", outputChar);

ทจรงเราไมตองจาตวเลข ใชอกขระแทนตวเลขไดเลย

8/16/2013 35ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

char inputChar, outputChar;scanf("%c", &inputChar);

// Perform conversion (except Z and z)if(inputChar >= ‘A’ && inputChar < ‘Z’ ) {

outputChar = inputChar + 1;} else if(inputChar == ‘Z’ ) {

outputChar = ‘A’ ;} else if(inputChar >= ‘a’ && inputChar < ‘z’ ){

outputChar = inputChar + 1;} else if(inputChar == ‘z’ ) {

outputChar = ‘a’ ;} else {

outputChar = inputChar; // No conversion needed}printf("%c\n", outputChar);

หวขอเนอหา• ฟงกชนไลบรารมาตรฐานคออะไร

• Header File กบฟงกชนไลบรารมาตรฐาน

• ฟงกชนคณตศาสตร

• ขอมลชนดตวอกขระ (character)

• ฟงกชนเกยวกบตวอกขระ

• สตรง

• ฟงกชนจดการสตรง

16 สงหาคม 2556 36ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

Page 10: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

ฟงกชนเกยวกบตวอกขระ

• เรยกใชไดจากเฮดเดอร #include <ctype.h>

• มอยสฟงกชนทสาคญเปนพเศษคอ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3716 สงหาคม 2556

int islower( int c );

int isupper( int c );

int tolower( int c );

int toupper( int c );

ทดสอบวา c เปนตวพมพเลกหรอไม

ทดสอบวา c เปนตวพมพใหญหรอไม

คานวณตวพมพเลกของ c

คานวณตวพมพใหญของ c

อธบายการใชงานฟงกชนอกขระ (1)

• เพราะตวอกขระแทจรงเปนเลขจานวนเตมฟงกชนจงรบคาเปนเลขจานวนเตม (แตทจรงเราสง char ไปเปนพารามเตอร)

• ฟงกชน islower คนคา ‘จรง’ มาใหเมอพารามเตอรเปนตวพมพเลก และคนคา ‘เทจ’ มาใหเมอพารามเตอรไมใชตวพมพเลก

� คา ‘จรง’ คอเลขทไมใชศนย (จะตดลบกเรยกวา ‘จรง’) แตโดยปรกตคอมไพเลอรจะเลอกคนเลขหนงมาให

� คา ‘เทจ’ คอเลขศนย (มเลขศนยเพยงตวเดยวเทานนทแทนคาวาเทจ)

• ฟงกชน isupper คนคา ‘จรง’ มาใหเมอพารามเตอรเปนตวพมพใหญ และคนคา ‘เทจ’ มาใหเมอพารามเตอรไมใชตวพมพใหญ

• ถาเราใสพวกเครองหมายวรรคตอนเขาไป จะไดผลลพธเปนเทจ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3816 สงหาคม 2556

อธบายการใชงานฟงกชนอกขระ (2)

• ฟงกชน tolower จะคานวณดวา c เปนตวพมพใหญหรอไม ถาใชกจะคนรหสตวเลขทเปนตวพมพเลกของมนมาให ถาไมใชกจะไดคา c กลบคนมา

� คา c จะไมเปลยนแปลงเปนอนขาดไมวากรณใด

� ถาเราตองการรผลการแปลงเปนตวพมพเลก เราตองใชตวแปรไปรบผลทฟงกชน tolower คนมาให เชน

• ฟงกชน toupper จะคานวณดวา c เปนตวพมพเลกหรอไม ถาใชกจะคนรหสตวเลขทเปนตวพมพใหญของมนมาให ถาไมใชกจะไดคา c กลบคนมา

• ถาเราสงพวกเครองหมายวรรคตอนไปใหคาไดคนมาจะเปนคา c ทเราสงไป

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 3916 สงหาคม 2556

char c = ‘A’;

char result = tolower( c ); result จะมคาเปนตว ‘a’

ตวอยางการใชฟงกชนอกขระ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4016 สงหาคม 2556

#include <stdio.h>

#include <ctype.h>

void main() {

int c = ‘A';

printf("islower = %d\n", islower( c ) );

printf("isupper = %d\n", isupper( c ) );

printf("tolower = %c\n", tolower( c ) );

printf("toupper = %c\n", toupper( c ) );

}

ผลลพธislower = 0

isupper = 1

tolower = a

toupper = A

Page 11: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

ทดสอบความเขาใจ

จากหนาทแลว ถาเรา

• ถาเปลยน c จาก ‘A’ ไปเปน ‘a’ จะไดผลลพธเปนอยางไร

• ถาเปลยน c จาก ‘A’ ไปเปน ‘+’ จะไดผลลพธเปนอยางไร

• ถาเปลยน c จาก ‘A’ ไปเปน ‘ ’ จะไดผลลพธเปนอยางไร

• ถาเปลยน c จาก ‘A’ ไปเปน ‘\n’ จะไดผลลพธเปนอยางไร

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4116 สงหาคม 2556

ปญหาตวอกษรเกนมาเมอกด Enter

ตวอกษรทเกนมานจะถกโอนไปใสตวแปรถดไป

� ทาใหเรองมนนาสบสนมากหากโปรแกรมรบคาอนพตหลายตวจากผใช

� ถาไมจาเปนจรง ๆ ควรเลยงการรบขอมลเขาจากผใชในรปแบบตวอกษร

� ควรใชขอมลชนดขอความแทนตวอกขระ แลวจงแยกตวอกษรออกมาเพมเตมในภายหลง

เพอปองกนความสบสนกบความแตกตางน เราสามารถใชสตรงมาเกบขอมลตวอกขระทวไปกได

� ตวแปรชนดอกขระยงมความสาคญในการคานวณและแสดงผลตามปรกต

� แตบทบาทในการรบขอมลเขาจากผใชจะถกลดลงไป

ไมใชทกภาษา คอมไพเลอร หรอทกระบบปฏบตการจะเปนแบบน

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4216 สงหาคม 2556

หวขอเนอหา• ฟงกชนไลบรารมาตรฐานคออะไร

• Header File กบฟงกชนไลบรารมาตรฐาน

• ฟงกชนคณตศาสตร

• ขอมลชนดตวอกขระ (character)

• ฟงกชนเกยวกบตวอกขระ

• สตรง

• ฟงกชนไลบรารมาตรฐานสาหรบจดการสตรง

16 สงหาคม 2556 43ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

ขอมลชนดสตรง

• สตรงมชอเรยกทนยมอกสองชอคอ ‘สายอกขระ’ และ ‘ขอความ’

• สตรงเปนชนดขอมลขนสง เปนการนาตวอกขระมาตอกนในอาเรยใหกลายเปนขอความ

� อาเรยหนงชองจะมตวอกษรหนงตว

� อาเรยของสตรงจะมอกขระศนย (null character) มาปดทาย

� เชน ถาเราตองการเกบคาวา Silpakorn ขางในอาเรยทเปนสตรงเปนดงน

� ดงนนอาเรยตองมจานวนชองมากกวาจานวนตวอกขระทเราคดเกบจรง ๆ อยหนงชอง (ตองเผอทไวเกบอกขระศนยดวย)

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4416 สงหาคม 2556

S i l p a k o r n \0

Page 12: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

การประกาศตวแปรสตรง

ทาไดหลายแบบ แตทนยมทสดคอ

char myString[256] = “Silpakorn”;

� สงเกตการใชเครองหมาย “ ” แทนทจะเปน ‘ ’

� วธขางบนจะสรางพนทเกบอกขระไวมากถง 256 ตว และปดทายสตรงดวยอกขระศนยใหเราอตโนมต

� จานวน 256 ตวทวานบรวมอกขระศนยดวย ดงนนแทจรงมนเกบอกขระทเราตองการแสดงผลไดเพยง 255 ตว

� วธขางบนเปนทนยมเพราะวาพนทเกบขอมลมความยาวพอทจะเปลยนคาสตรงเปนอยางอนไดหลากหลาย โดยมพนทพอทจะเกบทงสตรงใหมและอกขระศนย

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4516 สงหาคม 2556

ตวอยางการประกาศสตรงจากการประกาศchar myString[256] = “Silpakorn”;เราจะไดอาเรยทภายในประกอบดวยตวอกขระดงน

• จะเหนไดวามอกขระศนยมาตอทายทตาแหนงท 9 ใหอตโนมต• มทวางทไมไดใชอยเยอะมาก (แทนดวย ? ในภาพดานบน) แตมนกทาใหเรา

สามารถเปลยนขอความในสตรงไดโดยงาย• การเตรยมทวางไวโดยปรกตเปนเรองด เพราะเราไมสามารถเปลยนความยาว

อาเรยไดในภาษา C แตบางทเราอยากเปลยนตวอกขระในอาเรย

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4616 สงหาคม 2556

อกขระในชองอาเรย S i l p a k o r n \0 ? … ?

ดชนในอาเรย 0 1 2 3 4 5 6 7 8 9 10 … 255

การประกาศตวแปรสตรงแบบไมกาหนดขนาด (1)บางทเรากไมตองการเปลยนคาสตรง ดงนนกไมจาเปนทจะตองเผอพนทเอาไว� ในกรณนใหเราประกาศสตรงเปนอาเรยของอกขระโดยทไมตองกาหนดขนาด

เชน char myString[ ] = “Silpakorn”;

� จากตวอยางขางบนเราจะไดอาเรยของอกขระทกาหนดพรอมกบอกขระศนยปดทายใหอตโนมตในลกษณะเดม

� อาเรยทไดจงมความยาวทงหมดสบอกขระ (เพราะรวมอกขระศนยดวย)

� เวลาทเราประกาศสตรงแบบนเรามกจะไมเปลยนขอความขางใน แตกสามารถเปลยนไดโดยไมเกดความผดพลาด ถาหากวาความยาวของขอความอนใหมนอยกวาหรอเทากบขอความแรก

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4716 สงหาคม 2556

อกขระในชองอาเรย S i l p a k o r n \0

ดชนในอาเรย 0 1 2 3 4 5 6 7 8 9

การประกาศตวแปรสตรงแบบไมกาหนดขนาด (2)• เนองจากอาเรยเปนพอยเตอร เราจงสามารถประกาศสตรงโดยใชพอยเตอรได• วธนจะใหผลแบบเดยวกบการประกาศโดยใชอาเรยโดยไมกาหนดขนาดตวอยางchar *myString = “Silpakorn”;

วธนเราจะไดอาเรยเกบคาวา Silpakorn พรอมอกขระศนยปดทายอตโนมต

ผลทไดเหมอนกบวธทผานมาทกอยาง คออาเรยจะมขนาดเทากบจานวนตวอกษรในขอความบวกกบอกขระศนย

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4816 สงหาคม 2556

อกขระในชองอาเรย S i l p a k o r n \0

ดชนในอาเรย 0 1 2 3 4 5 6 7 8 9

Page 13: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

รปแบบการประกาศอาเรยของอกขระ• การประกาศสตรงเราจะไดอาเรยของอกขระซงปดทายดวยอกขระศนย

• การปดทายดวยอกขระศนยเปนสงทสาคญมาก เพราะฟงกชนไลบรารมาตรฐานทใชจดการสตรงใชอกขระศนยหาจดสนสดขอความ

• แตหากเราจาเปนทจะตองใชอาเรยของ char ทว ๆ ไปเรากทาได เชน

char myString[ ] = {‘S’, ‘i’, ‘l’, ‘p’, ‘a’, ‘k’, ‘o’, ‘r’, ‘n’};(สงเกตดวยวาพอเปนอกขระแลวเราใช ‘ ’ แตพอเปนสตรงเราใช “ ”)

� วธประกาศแบบขางบนนจะทาใหไดอาเรยของ char ดงแสดงทางดานใต

� สงเกตดวยวาไมมอกขระศนยปดทาย ทาใหไมเหมาะกบการใชงานเปนขอความภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 4916 สงหาคม 2556

อกขระในชองอาเรย S i l p a k o r n

ดชนในอาเรย 0 1 2 3 4 5 6 7 8

การประกาศตวแปรสตรงแบบอน ๆยงมวธประกาศหรอสรางสตรงทมอกขระศนยปดทายแบบอน ๆ อยแตวธพวกนเตมไปดวยความรมรามไมกะทดรดจงไมเปนทนยม

� char myString[10] = {“Silpakorn”};

ทจรงวงเลบปกกาทจรงไมมความจาเปน การใสเปนความฟมเฟอย� char myString[10] = {‘S’, ‘i’, ‘l’, ‘p’, ‘a’, ‘k’, ‘o’, ‘r’, ‘n’, ‘\0’};

วธขางบนนอกจากจะเยนเยอแลวเรายงตองออกแรงใสอกขระศนยดวยตวเอง� ใสคาอกขระเขาไปทละตวกได แตฟมเฟอยอยางเปนทสด

char myString [10];

myString[0] = ‘S’;myString[1] = ‘i’; myString[2] = ‘l’;

myString[3] = ‘p’;myString[4] = ‘a’; myString[5] = ‘k’;

myString[6] = ‘o’;myString[7] = ‘r’; myString[8] = ‘n’;

myString[9] = ‘\0’;

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5016 สงหาคม 2556

วธการประกาศสตรงทผด• ในขณะทการประกาศทถกมหลายวธ วธทผดกมไมนอยเหมอนกน• ปญหาทพบบอย ๆ มดงน

� กาหนดขนาดอาเรยไว แตทเกบอกขระไมพอ เชนchar myString[9] = “Silpakorn”; ไมเผอทเกบอกขระศนยเอาไว

� สบสนเครองหมาย ‘ ’ กบ “ ” เชนchar myString[] = ‘Silpakorn’; ทจรงตองใช “ ”

char myString[] = {“S”, “i”, “l”, “p”, “a”, “k”, “o”, “r”, “n”, “\0”};

ทจรงตองใช ‘ ’

� ลมเครองหมาย เชน char myString[] = Silpakorn;

char myString[] = {Silpakorn};

� ลมใสอกขระศนยปดทายchar myString[] = {‘S’, ‘i’, ‘l’, ‘p’, ‘a’, ‘k’, ‘o’, ‘r’, ‘n’};

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5116 สงหาคม 2556

การรบและแสดงสตรงจากผใช

• เราใช scanf คกบ %s (ถาเปนอกขระเราใช %c)

• พดมาแคนดเหมอนจะไมมอะไร แตทจรงมนมเรองเยอะมากเพราะวา

� เพราะสตรงเปนอาเรยของอกขระ ดงนนเวลาใสคาเขาไป แทจรงเราใสคาเขาไปในอาเรยหลายชองพรอม ๆ กน (อะไรมนจะขนาดนน)

� ตวแปรอาเรยอยในฐานะตวช (pointer) เวลารบคาจาก scanf จะมอะไรทผดไปจากแบบอนทเราพบมากอนหนาอยบาง (คอไมตองใช &)

• ตอนแสดงผลเราใช printf คกบ %s

� ไมตองกงวลวามนเปนอาเรย ขอแคมอกขระศนยปดทายทกอยางจะดด

� เราใสชอตวแปรสตรงลงในใน printf เหมอนตวแปรทวไป

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5216 สงหาคม 2556

Page 14: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

ตวอยางโปรแกรมรบคาสตรงจากผใช

8/16/2013 ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 53

char firstName[256];char lastName[256];

printf("Enter your first name: ");scanf(" %s", firstName );printf("Enter your last name: ");scanf(" %s", lastName );

printf("Your name is %s %s", firstName,

lastName);

สงเกตวาเราใช firstName กบ lastName ใน scanfโดยไมม & เพราะสตรงเปนตวชอยแลว

เวลาใชสตรงกบ printf ใสชอตวแปรสตรงไปไดเลย แตใหระวงวาสตรงจะตองมอกขระศนยปดทายดวย

การดาเนนการทางตวเลขกบสตรง

เนองจากสตรงประกอบขนมาจากอกขระ

• การดาเนนการทางตวเลขททากบอกขระไดกจะทาบนสตรงไดในลกษณะเดยวกน

• แตเรากตองดงเอาคาอกขระออกมาประมวลผลทละตว

• การดงอกขระออกมาทาไดเหมอนกบการอานคาจากอาเรยทว ๆ ไป เชน

� char c0 = str[0]; หมายถงการดงอกขระตวแรกจาก str ไปเกบไวท c0

� str[3] = c0; หมายถงการกาหนดใหอกขระตวทสใน str มคาเทากบ c0

• หลงจากไดอกขระมาแลว เราสามารถดาเนนการบวกลบคาตวเลขกบอกขระหรอเปรยบเทยบคาตวเลขไดในลกษณะเดยวกบทเราทากบอกขระทวไป

8/16/2013 54ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

ตวอยางการดาเนนการทางตวเลขกบสตรง

การประยกตทพบบอยในการดาเนนการทางตวเลขกบสตรงกคอ

� การเปลยนอกขระในสตรงใหเปนตวใหญใหหมดทกตว

� การเปลยนอกขระในสตรงใหเปนตวเลกใหหมดทกตว

� การเปลยนอกขระทตนประโยคใหเปนตวใหญ (ไมโครซอฟตเวรดกทา)

หากเราไมใชฟงกชนไลบรารมาตรฐาน วธการทวไปของเรากคอเราตองดาเนนการทางตวเลขกบอกขระภายในสตรงทละตว

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5516 สงหาคม 2556

โจทย แปลงขอความใหเปนตวพมพใหญ

ตวอยาง จงเขยนโปรแกรมททาการเปลยนตวอกษรทกตวในขอความใหกลายเปนตวพมพใหญ โดยท

� ถาหากอกษรในขอความตวใดเปนตวเลก ใหโปรแกรมเปลยนเปนตวใหญ

� ถาตวอกษรเปนตวพมพใหญอยแลวใหคงไวเชนเดม

� ถาเปนตวอกษรอน ๆ เชน ตวเลข สญลกษณ เครองหมายวรรคตอน รวมทงอกขระพเศษ ใหคงไวเชนเดม

� กาหนดใหขอความทผใชปอนเขามามตวอกษรไมเกน 1023 ตวอกษร

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5616 สงหาคม 2556

ขอมลเขา ผลลพธ

Silpakorn

CP#

SILPAKORN

CP#

Page 15: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

โปรแกรมแปลงขอความใหเปนตวพมพใหญ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5716 สงหาคม 2556

scanf("%s", str);

int i = 0;while( str[i] != ‘\0’ ) {

if( str[i] >= ‘a’ && str[i] <= ‘z’ ) {str[i] -= 32; // Convert to uppercase

} ++i;}printf("%s", str);

เราดาเนนการแปลงตวอกษรทละตว จนกวาจะพบอกขระศนยซงเปนตวระบจดสนสดขอความ

ตรวจดวาเปนตวพมพเลกหรอไม

ขอจากดของการใช scanf กบสตรง

• การสนสดของขอความโดยทวไปแลวเรานบจากการพบอกขระศนย

• แตคาสง scanf จะตดขอความเมอพบชองวาง ตวกนหนา และการขนบรรทดใหม

� แตโดยทวไปเราอยากใหการรบขอความจากผใชสนสดเมอขนบรรทดใหม(ผใชกดปม Enter)

� เพอแกปญหานเราใชคาสงอนแทน scanf ในการรบขอความ

� คาสงทใชไดมหลายอน แตอนทเขาใจงายทสด (แมไมดนก) คอ gets

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5816 สงหาคม 2556

char str[1024];gets(str);

คาสง gets

• คาสง gets เปนคาสงทใชในการรบขอความจากผใช

� ขอความจะสนสดเมอพบการขนบรรทดใหม

� สามารถรบชองวางหรอตวกนหนาหลาย ๆ อนเกบไวไดในขอความเดยว

• คาสง gets สามารถใชไดดงแสดงในตวอยางดานใต

• เวลาเราใช gets เราไมตองระบ %s เหมอนกบทเราทาใน scanf

� เพราะตว gets ใชไดแตกบขอมลชนดขอความ

� สวน scanf ใชไดกบขอมลหลายชนดจงตองมการระบชนดขอมลดวย

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 5916 สงหาคม 2556

char str[1024];gets (str);

ตวอยางการใช gets แกปญหาชองวางในขอมลเขา

จงเขยนโปรแกรมททาการเปลยนตวอกษรทกตวในขอความใหกลายเปนตวพมพใหญ โดยทขอความไดมาจากผใชและอาจมชองวางหรอตวกนหนารวมอยดวย กาหนดใหขอความจากผใชสนสดเมอผใชสงขนบรรทดใหม

ตวอยางขอมลเขาและผลลพธ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6016 สงหาคม 2556

ขอมลเขา ผลลพธ

Silpakorn

CP#

You have to fight.

That’s incredible!

SILPAKORN

CP#

YOU HAVE TO FIGHT.

THAT’S INCREDIBLE!

Page 16: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

โคดตวอยางการใช gets แกปญหาชองวางในขอมลเขา

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6116 สงหาคม 2556

char str[1024];

gets(str);

int i = 0;while(str[i] != '\0') {

if(str[i] >= 97 && str[i] <= 122) {str[i] -= 32; // Convert to uppercase

}++i;

}printf("%s", str);

เปลยนจาก scanf เปน gets ทเดยวกพอแลว

หวขอเนอหา• ฟงกชนไลบรารมาตรฐานคออะไร

• Header File กบฟงกชนไลบรารมาตรฐาน

• ฟงกชนคณตศาสตร

• ขอมลชนดตวอกขระ (character)

• ฟงกชนเกยวกบตวอกขระ

• สตรง

• ฟงกชนไลบรารมาตรฐานสาหรบจดการสตรง

16 สงหาคม 2556 62ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร

ฟงกชนไลบรารมาตรฐานสาหรบจดการสตรง

• สามารถเรยกใชไดจาก string.h เชน #include <string.h>

• มฟงกชนทมประโยชนมากอยหลายตว เชน

� การหาความยาวของขอความ

� การเปรยบเทยบขอความ

� การนาสตรงสองอนมาตอกน

• ในทางทฤษฎ เราสามารถเขยนฟงกชนเหลานดวยตวเองได

� แตในเมอมคนทามาไวใหเราแลว เรากไมจาเปนตองเขยนใหม

� โคดใน string.h มกจะทางานเรวกวาทเราเขยนเอง

� แทบจะเปนไปไมไดเลยทจะฟงกชนใน string.h จะมขอผดพลาด

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6316 สงหาคม 2556

strlen คาสงหาความยาวสตรง

ตวอยางการใชงาน

� ตวอยางขางบนจะพมพเลข 9 ซงคอความยาวของสตรงออกมา

� ฟงกชนไมนบอกขระศนย (ซงโดยปรกตเรากไมอยากนบอยแลว)

� เรานยมใช strlen เพอใชในการหาจานวนตวอกขระและระบจานวนรอบในการวนลปทควรจะเปน

� สงเกตดวยวาเราใชชอตวแปรตรง ๆ เลย เพราะฟงกชนใน string.hรบสงสตรงในรปตวชตลอด

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6416 สงหาคม 2556

char myString[256] = "Silpakorn";int length = strlen(myString);printf("Length = %d", length);

Page 17: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

strcat คาสงตอสตรงสองอนเขาดวยกน

ตวอยางการใชงาน

• สาหรบตวอยางขางบนเราจะไดผลลพธเปน SilpakornUniversity

• strcat ไมใสชองวางให ถาอยากไดชองวางตองหาทางใสเอง

• บางคาสงเราจาเปนตองใชรปตวชอยางชดเจนเพอรบผลลพธ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6516 สงหาคม 2556

char str[256] = "Silpakorn";char str2[256] = "University";char* outString = strcat(str, str2);printf("%s", outString);

strcmp คาสงเปรยบเทยบสตรงเปนคาสงเปรยบเทยบอกขระแตละตวของสตรงจากซายไปขวาทละตว� รปแบบคาสงคอ int result = strcmp(char* string1, char* string2);

� การเปรยบเทยบจะทาจากซายไปขวาทละตวอกษรจนกวาจะพบความแตกตางของตวอกษรใน string1 และ string2 หรอสนสดขอความ� ความแตกตางวดกนทรหสแอสก ดงนนตวพมพใหญและเลกจะใหความแตกตางใน

การเปรยบเทยบ (case sensitive)

เมอพบความแตกตางของอกขระในสตรงทงสอง สงทเกดขนตามมาจะเปนดงน� ถารหสแอสกของอกขระดงกลาวใน string1 นอยกวา string2 ฟงกชนจะคนคาลบ

และถามากกวาจะไดคาบวก� ถาพบอกขระศนยใน string1 กอน string2 จะคนคาลบ� ถาถาพบอกขระศนยใน string2 กอน string1 จะคนคาบวก

ถาสตรงทงสองไมมความแตกตางใด ๆ เลย ฟงกชนจะคนคาศนยกลบมาให

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6616 สงหาคม 2556

ตวอยางการใช strcmp (1)

strcmp(“Hello world”, “hello World”);

� แบบนจะไดคาเปน -1 เพราะวา H ของ string1 เปนตวพมพใหญ ในขณะท h ใน string2 เปนตวพมพเลก

� เนองจากตวพมพใหญมคาแอสกนอยกวาตวพมพเลก จงสรปไดวา string1 < string2 และไดคาเปนลบ

strcmp(“hello world”, “hello World”);

� แบบนจะไดคาเปนบวก เพราะการเปรยบเทยบจะดาเนนไปทละตวจนกวาจะพบความแตกตาง ซงอยทตวอกษร W

� อกขระใน string1 เปนตวพมพเลกจงมคาแอสกมากกวา ผลลพธจงเปนบวก

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6716 สงหาคม 2556

ตวอยางการใช strcmp (2)strcmp(“Hello World”, “Hello World”);

ไดผลลพธเปนศนย เพราะสตรงเหมอนกนทกประการ

strcmp(“Hello”, “Hello World”);

ไดผลลพธเปนลบเพราะ string1 หมดกอนทจะพบความแตกตางในอกขระอน ๆ

strcmp(“BOOT”, “BUT”);

� ไดผลลพธเปนลบเนองจากอกขระทพบความแตกตางตวแรกคอตวทสองและ O มรหสแอสกนอยกวา U � ความยาวของสตรงไมใชตวตดสน แตเปนอกขระแรกทพบความแตกตางstrcmp(“Boot”, “BUt”);

� ไดคาเปนบวกเพราะอกขระแรกทพบความแตกตางคอตวทสอง � แต o เปนตวพมพเลกซงมคารหสแอสกมากกวาตวพมพใหญ ดงนนการเปรยบเทยบ

จงไดผลลพธเปนบวก

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6816 สงหาคม 2556

Page 18: การเขียนโปรแกรมคอมพิวเตอร 1 Header File Computer Programming I · การเขียนโปรแกรมคอมพิวเตอร

strcmpi เปรยบเทยบสตรงตามหลกพจนานกรม

• คาสง strcmp ใชการเปรยบเทยบรหสแอสกทาใหตวพมพใหญและตวพมพเลกถกพจารณาวาเปนคนละตวอกษร

• ทาใหตว Z มากอนตว a ซงขดกบหลกพจนานกรม

• เราแกปญหานไดดวยการใชคาสง int strcmpi (char* string1, char* string2)

� ตวอกษรใน string1 และ string2 จะถกมองวามรหสแอสกเหมอนตวพมพเลก

� ทาใหการเปรยบเทยบตวอกษรไมมความตางกนระหวางตวพมพใหญและเลก

� ใชรหสแอสกของตวพมพเลกในการเปรยบเทยบตวอกษรองกฤษกบเครองหมายวรรคตอนหรอสญลกษณพเศษ

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 6916 สงหาคม 2556

ตวอยางการใช strcmpi

• strcmpi(“Hello world”, “hello World”);

strcmpi(“hello world”, “hello World”);

strcmpi(“Hello World”, “Hello World”);

การเปรยบเทยบทงสามอนขางตนจะไดคาเปนศนยหมดเพราะตวใหญตวเลกไมมความหมายกบฟงกชน strcmpi

• strcmpi(“Boot”, “BUt”);

ไดคาเปนลบเพราะคาวา boot มากอน but ตามหลกพจนานกรม

• strcmpi(“bu^”, “BUT”);

ไดคาเปนลบเพราะวา ^ มากอนตว t (คาแอสกทใชเปรยบเทยบมาจากตวพมพเลก)

• strcmpi(“bu{“, “BUT”);

ไดคาเปนบวก เพราะ { มคา { มากกวา t

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 7016 สงหาคม 2556

สรปเกยวกบสตรง

• อกขระและสตรงเปนของคนละอยางแตสตรงสรางขนมาจากการนาอกขระมาตอกนดวยอาเรย

• อกขระแตละตวแทจรงแลวมตวเลขกากบอยตามมาตรฐานแอสก

• เราสามารถดาเนนการทางตวเลขกบอกขระและสตรงได

• สตรงทดควรจะมอกขระศนยปดทายเสมอ

• ดงนนเราตองเผอทในอาเรยไวเกบอกขระศนยในสตรงดวย

• มคาสงอรรถประโยชนมากมายใน string.h

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 7116 สงหาคม 2556

สรปเกยวกบฟงกชนไลบรารมาตรฐาน

• เราเรยกใชฟงกชนไลบรารมาตรฐานไดจากเฮดเดอรไฟลตาง ๆ

• ฟงกชนไลบรารมาตรฐานถกจดเปนหมวดหมตามเฮดเดอรไฟล

• ในหมวดคณตศาสตร มฟงกชนจานวนมากทการบวกลบคณหารปรกตไมสามารถทาใหเราหาคาออกมาไดในเวลาอนสน

• ในหมวดตวอกขระและสตรง สวนใหญแลวเราไมจาเปนตองใชเพราะการบวกลบคณหารและการเปรยบเทยบอกขระทวไป สามารถทาหนาทในฟงกชนมาตรฐานได

� แตการใชฟงกชนไลบรารมาตรฐานมกจะทาใหโปรแกรมเรวกวา และมความผดพลาดนอยกวา

� ถาใชฟงกชนไลบรารมาตรฐานเรากไมจาเปนตองออกแรงเขยนฟงกชนเอง

ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 7216 สงหาคม 2556