น้องวงศ์แชร์แนวคำถาม ในกลุ่มโปรแกรมเมอร์ไทย ลองแกะ for ดู

ตอน i=9 ไล่ ascii ผิดครับ ภาพนี้แก้ไข
ตอน i=9 ไล่ ascii ผิดครับ ภาพนี้แก้ไข

<introduction>
อ่านโจทย์ที่น้อง Wongsakorn แชร์มาในกลุ่มสมาคมโปรแกรมเมอร์ไทย
บอกว่าเป็นแนวข้อสอบที่ ม. เห็นแล้วก็สนใจ สมาชิกเข้าไปเม้นท์เพียบ
https://www.facebook.com/groups/ThaiPGAssociateSociety/
มาโปรแแกรมเดียวแต่มี 12 คำถาม
เท่าที่ดูเป็นภาษา C ปรับเพิ่ม include แล้วเอาไปลองที่ jdoodle.com ได้
https://www.jdoodle.com/c-online-compiler
</introduction>

https://gist.github.com/thaiall/3f682a040fa1ebdd5d68dcbdede05750

<question>
คำถาม 12 ข้อมีดังนี้
1. loop for ทำงานกี่รอบ
2. ถ้า i=9 แล้วค่า t1 คืออะไร
3. ถ้า i=9 แล้วค่า s2[9] คืออะไร
4. ถ้า i=5 แล้วค่า t1 คืออะไร
5. ถ้า i=5 แล้วค่า t2 คืออะไร
6. ถ้า i=1 แล้วค่า t1 คืออะไร
7. ถ้า i=1 แล้วค่า t2 คืออะไร
8. ถ้า i=1 แล้วค่า s2[1] คืออะไร
9. ถ้าออก for แล้วค่า i คืออะไร
10. ถ้าออก for แล้วค่า sum คืออะไร
11. ถ้าออก for แล้วค่า s1[1] คืออะไร
12. ถ้าออก for แล้วค่า s2[7] คืออะไร
</question>

<process>
1. ดู code แล้วก็ต้องลองนำไป compile
เพราะถ้าตอบแล้วก็อยากพิสูจน์คำตอบ ว่าใช่หรือไม่
สุดท้ายแล้ว ผมก็ไม่ได้แก้ code ให้เฉลยตามโจทย์
เพราะดูผลจาก excel ก็น่าจะได้คำตอบครบแล้ว
แต่อาจนับผิดตำแหน่งใน Ascii table นั่นก็เป็น human error หละครับ

2. ลอง code ภาษา C
ที่ https://www.jdoodle.com/c-online-compiler

3. source code ไม่ได้มีเฉพาะ while, for และ variable
แต่มี function เข้ามาเกี่ยวข้อง ตัวแปรแบบ Array of character
และการตรวจสอบค่าก็เกี่ยวกับ Ascii table ชัดเจน
https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

4. ค่าของ Array of character และ strlen
ทดสอบ code กันก่อน ไปดู code จริง

#include <stdio.h>
 #include <string.h>
 void main() {
 char var1[] ="abcdef"; // strlen คืนค่า 6
 char var2[5] = "abc"; // size of the array is determined at compile-time
 char var3[5] = {'a', 'b', 'c', '\0'};
 char var4[3] = "abc";
 printf("%zu\n %zu\n",strlen(var1),strlen(var2)); //6 3
 printf("%zu\n %zu\n",strlen(var3),strlen(var4)); //3 3
 printf("%zu\n %s\n %c\n %c\n",strlen(var3),var4,var4[0],var4[2]); //3 abc a c
 // http://www.cplusplus.com/reference/cstdio/printf/
 // var1 = "abc"; can not do this for array of character in c language
 }

5. ฟังก์ชัน strcmp กับ strcat กับ strcpy
ทดสอบ code กันก่อน ไปดู code จริง
https://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm

void main() {
 #include <stdio.h>
 #include <string.h>
 void main() {
 char var1[] ="abcd";
 char var2[5] = "abc";
 char var3[5] = "ABC";
 char var4[2] = {'a','\0'};
 char var5[2] = {'0','\0'}; //
 if(strcmp(var1,var2)>0) printf("true"); else printf("false"); // true : [3] 100 > 0
 if(strcmp(var2,var3)>0) printf("true"); else printf("false"); // true : [0] 97 > 65
 if(strcmp(var3,var4)>0) printf("true"); else printf("false"); // false : [0] 65 > 97
 if(strcmp(var4,var5)>0) printf("true"); else printf("false"); // true : [0] 97 > 30
 if(strcmp(var5,var1)>0) printf("true"); else printf("false"); // false : [0] 30 > 97
 strcpy(var4,var2); // var4 replaced by var2
 if(strcmp(var2,var4)==0) printf("true"); else printf("false"); // true : [0] abc = abc
 printf("%s %s",var2,var4); //abc abc
 strcpy(var5,var1); // var5 replaced by var1
 printf("%s %s",var1,var5); //abcd abcd
 strcat(var3,var4); // var3 = var3(ABC) + var4(abc) = ABCabc
 printf("%s %s",var3,var4); //ABCabc abc
 }

6. โปรแกรมนี้ใช้ mod ด้วย
ทดสอบ code กันก่อน ไปดู code จริง

char var1[] ="abcd";
printf("%i",var1[0] % 2); // 1
printf("%i",var1[1] % 2); // 0
printf("%i",var1[2] % 2); // 1

ในโจทย์ต้อง mod y คือตัวที่ 25 ในภาษาอังกฤษ น่าจะ mod 2 แล้วได้ 1 นะ

7. มีคำถามเรื่อง i ที่ออกจาก for แล้ว
ภาษา c จะคำนวนค่า i แล้วเปรียบเทียบ
ดังนั้นค่า i จะเป็นค่าที่อยู่นอกเงื่อนไขของ for

int i;
for(i=5;i>0;i=i-2) {}
printf("%i",i); // -1

8.มีคำถามหนึ่งที่เค้าไม่ได้ถาม แต่ผมสงสัย
คือ char ที่ไม่มีค่า หาก -1 จะได้เท่าใด คำตอบ คือ -1 เหมือนเดิม
เพราะค่าที่จองไว้ default เป็น 0 หมด
แต่ถ้าพิมพ์ค่าที่เกินจากที่จอง โปรแกรมไม่ error แต่เอาที่ไหนมาก็ไม่รู้
เช่น v[20] ออกมาเป็น 55 นั่นหละครับ

char v[10] = "abcde";
v[9] = v[9] - 1;
printf("%i %i %i %i %i",v[1],v[5],v[6],v[9],v[20]); // 98 0 0 -1 55

9. ถ้าเข้าใจฟังก์ชันทั้ง 4 แล้วก็เหลือแต่วน loop
ปกติก็จะทำเป็นตารางแบบ excel มี header แยก column ตามตัวแปร หรือตามชอบ
row ก็เป็นค่าของ i เท่าที่ดู code ก็ไม่เปลี่ยนค่า i กระทันหัน วนจนจบเลย
จากนี้ผมจะไปเปิด excel ช่วยล่ะครับ

10. สรุปว่าคำตอบทั้งหมด ผมไม่ได้ตอบนะ
แต่ดูจาก excel ที่ได้จากการไล่ค่าใน loop
ซึ่งเก็บเรื่องนี้ไว้ไปเล่าต่อ หากมีโอกาสน่ะครับ
เพราะผมเล่า for ซ้อน for กับ mod แค่นั้นก็เหนื่อยล่ะ
</process>

ภาพนี้ไล่ลำดับ i=9 ผิด ทำภาพมาใหม่อยู่ด้านบน
ภาพนี้ไล่ลำดับ i=9 ผิด ทำภาพมาใหม่อยู่ด้านบน