Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
การเขยนโปรแกรมคอมพวเตอร 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
ความสาคญของไลบรารมาตฐาน
• การใชไลบรารมาตรฐานในโปรแกรมของเราจะทาใหการนาโปรแกรมไปใชในระบบปฏบตการอนเปนไปโดยงาย
� เขยนโปรแกรมบนวนโดวส แตสามารถนาไปคอมไพลใหมใหทางานบน 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
หดใชฟงกชน 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
โคดแสดงการใช 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));
}
การใชกฎของ 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
ตวอยางการใช 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
ตวตนทแทจรงของตวอกขระ
• ตวอกขระแทจรงแลวอยในฐานะ ‘รหสตวเลข’ คอ เครองเกบตวเลขเอาไว แตตอนแสดงผลมนเปลยนตวเลขเปนตวอกษรใหเราอานออก
• เปนการเชอมตอกนระหวางรปแบบทเครองเขาใจกบรปแบบทมนษยเขาใจ
� เครองเขาใจแตตวเลข (เกบขอมลทกอยางเปนเลขฐานสองอยภายใน)
� มนษยใชการอานขอความหรอตวอกษร ไมไดถนดการอานตวเลข
� เราจงใหเครองเกบตวเลขไว แตตอนแสดงผลใหมนแปลงตวเลขเปนตวอกษรใหเราอาน
• เพอใหการเกบรหสตวเลขของอกขระเปนสงทเขาใจตรงกนจงไดมการกาหนดมาตรฐานขนมา หนงในมาตรฐานทใชกนอยางแพรหลายคอ 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 ) { … }
โคดสาหรบการแปลงตวอกษรใหญใหกลายเปนตวอกษรเลก
• ลองเปลยนคาเรมตนตวแปร 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
แบบฝกหด (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ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร
ฟงกชนเกยวกบตวอกขระ
• เรยกใชไดจากเฮดเดอร #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
ทดสอบความเขาใจ
จากหนาทแลว ถาเรา
• ถาเปลยน 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
การประกาศตวแปรสตรง
ทาไดหลายแบบ แตทนยมทสดคอ
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
รปแบบการประกาศอาเรยของอกขระ• การประกาศสตรงเราจะไดอาเรยของอกขระซงปดทายดวยอกขระศนย
• การปดทายดวยอกขระศนยเปนสงทสาคญมาก เพราะฟงกชนไลบรารมาตรฐานทใชจดการสตรงใชอกขระศนยหาจดสนสดขอความ
• แตหากเราจาเปนทจะตองใชอาเรยของ 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
ตวอยางโปรแกรมรบคาสตรงจากผใช
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#
โปรแกรมแปลงขอความใหเปนตวพมพใหญ
ภญโญ แทประสาทสทธ มหาวทยาลยศลปากร 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!
โคดตวอยางการใช 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);
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
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