ภาษาซี (C Language)
datatype | TurboC | Programming
    สารบัญ
  1. กลุ่ม b01.. : พื้นฐานการแสดงผลอย่างง่าย
  2. กลุ่ม b02.. : รับ แสดงผล เลือก และการทำซ้ำ
  3. กลุ่ม b03.. : ทบทวนการทำซ้ำซ้อนทำซ้ำ
  4. กลุ่ม b04.. : function ในภาษา C++ แบบต่าง ๆ
  5. รูปแบบข้อมูล (Data Type)
ความหมายของภาษาซี
ภาษาซี คือ ภาษาคอมพิวเตอร์ใช้สำหรับพัฒนาโปรแกรมทั่วไป ถูกพัฒนาโดยเดนนิส ริสชี่ (Dennis Ritchie) เมื่อประมาณต้นปีค.ศ. 1970 เพื่อใช้งานบนระบบปฏิบัติการยูนิกส์ ต่อมาถูกนำไปใช้ในระบบปฏิบัติการต่าง ๆ จนถูกใช้เป็นภาษาพื้นฐานสำหรับภาษาอื่น เช่น ภาษาจาวา (Java) ภาษาพีเอชพี (PHP) ภาษาซีชาร์ป (C#) ภาษาซีพลัสพลัส (C++) ภาษาเพิร์ล (Perl) ภาษาไพทอล (Python) หรือภาษารูบี้ (Ruby)

Dev-C++ 5.11
+ https://sourceforge.net/projects/orwelldevcpp/
+ http://orwelldevcpp.blogspot.com/



ตัวอย่างรหัสต้นฉบับสำหรับ Turbo C++ 3.0
#include <stdio.h>
void main() {
printf("hello");
getchar();
}
    ตัวอย่างรหัสต้นฉบับที่พัฒนาด้วย TC และ CL
  1. b0101.cpp (CL)
    - include, void, printf, getch
    เริ่มต้นเขียนโปรแกรมอย่างง่าย ๆ
  2. b0102.cpp (CL)
    - printf, return(0)
    แสดงการใช้ return แทน void สำหรับโปรแกรมย่อย
  3. b0103.cpp (CL)
    - printf, d, i++, ++i, i+=2
    แสดงการคำนวณภายใต้คำสั่ง printf
  4. b0104.cpp (CL)
    - printf, d,f,e,s,d,o,x,u
    แสดงการกำนหนดการแสดงผลของตัวเลขแบบต่าง ๆ
  5. b0105.cpp (CL)
    - short, long, printf
    แสดงการพิมพ์เลข double ได้สูงถึง 2147483647
  6. b0106.cpp (CL)
    - cout
    แสดงการพิมพ์ด้วยคำสั่ง cout
  7. b0107.cpp (CL)
    - clrscr, cout
    แสดงการพิมพ์ด้วยคำสั่ง cout หลายค่า
  8. b0108.cpp (CL)
    - clrscr, cin, cout
    รับค่า นำมาคำนวน และแสดงผล
  9. b0109.cpp (CL)
    - define, cout, printf
    ประกาศ และพิมพ์ด้วย cout
  10. b0110.cpp (CL)
    - cout, do while
    การใช้ cout คู่กับ do while
  11. b0111.cpp (CL)
    - cout, for
    การใช้ cout คู่กับ for แบบคำสั่งเดียว
  12. b0201.cpp (CL)
    - int, scanf, d
    แสดงการรับ และแสดงผลค่าจากแป้นพิมพ์
  13. b0202.cpp (CL)
    - char, gets, s[30]
    รับตัวอักษรหลายตัวแล้วนำไปแสดงผล
  14. b0203.cpp (CL)
    - int, while
    แสดงการทำซ้ำเพื่อพิมพ์ตัวเลขด้วย while
  15. b0204.cpp (CL)
    - for
    แสดงการทำซ้ำเพื่อพิมพ์ตัวเลขด้วย for
  16. b0205.cpp (CL)
    - scanf, if, printf
    แสดงการเปรียบเทียบด้วย if กับตัวเลข
  17. b0206.cpp (CL)
    - clrscr, char, getch, if, printf
    แสดงการเปรียบเทียบด้วย if กับตัวอักษร
  18. b0207.cpp (CL)
    - clrscr, char[3], scanf, strcmp, getch, if
    แสดงการเปรียบเทียบด้วย if กับชุดตัวอักษร
  19. b0208.cpp (CL)
    - scanf, switch
    รับค่า แล้วเลือกกระทำด้วย switch
  20. b0209.cpp (CL)
    - int, cin, cout, if, else if, else
    ใช้คำสั่งเปรียบเทียบ int กับ else if
  21. b0301.cpp (CL)
    - for, for
    แสดงการทำงานของ for ซ้อน for
  22. b0302.cpp (CL)
    - scanf, for, for
    for ซ้อน for โดยควบคุมด้วยค่าที่รับจากแป้นพิมพ์(*)
  23. b0303.cpp (CL)
    - scanf, for, for
    for ซ้อน for โดยควบคุมด้วยค่าที่รับจากแป้นพิมพ์(j)
  24. b0304.cpp (CL)
    - scanf, for, for
    for ซ้อน for โดยควบคุมด้วยค่าที่รับจากแป้นพิมพ์(i)
  25. b0401.cpp (CL)
    - function, cout
    การเรียก function 2 ครั้งอย่างง่าย
  26. b0402.cpp (CL)
    - function, char, int, cout
    การเรียก 2 function พร้อมส่งค่าผ่าน function
  27. b0403.cpp (CL)
    - function, return
    การส่งค่า และรับค่าคืนจาก function
  28. b0501.cpp (CL)
    - array int
    รับค่าลงอาเรย์แบบ int และนำมาแสดงอย่างง่าย
  29. b0502.cpp (CL)
    - array int, for
    รับค่าลงอาเรย์แบบ int และนำมาแสดง โดยใช้ for ช่วย
  30. b0503.cpp (CL)
    - array int, for
    รับค่าลงอาเรย์แบบ int และนำมาแสดง พร้อมหาค่า max
  31. b0504.cpp (CL)
    - array int, for
    กำหนดค่าให้อาเรย์ และนำมาแสดง พร้อมหาค่า max
  32. b0505.cpp (CL)
    - array char, 2 dimension
    การกำหนดอาเรย์ 2 มิติแบบตัวอักษร และการนำค่ามาแสดงผล
  33. b0506.cpp (CL)
    - array char, pointer of string
    ตัวชี้อาเรย์ ทำงานคล้าย string
  34. b0507.cpp (CL)
    - array char, pointer of string, 2 dimension
    นับความยาวของแต่ละ string พร้อมแยกตัวอักษรทีละตัว
  35. b0508.cpp (CL)
    - array char, double, function, calculation, max
    3 function : รับเข้าอาเรย์, คำนวณและแสดง, หาผลรวม
  36. b0510.cpp (CL)
    - array double, bubble sort, average
    function : เรียงเลขแบบ bubble sort
  37. b0511.cpp (CL)
    - array int, bubble sort, avg, max, min of 3 array
    function : เรียงแบบ bubble sort อาเรย์ 3 ชุด หา max, min, avg
Turbo C++ 3.0 
DOS> tcc  x.cpp
DOS> x
// AntiVir : DOS/Candy DOS virus 
// if this code have code: name:
#include <stdio.h> // printf, gets
#include <conio.h> // getch
void main(){
  char *code,*name,*address; 
  printf("code : "); gets(code); 
  printf("name : "); gets(name); 
  printf("address : "); gets(address); 
  printf("%s %s %s \n",code,name,address); 
  getch();
}

Visual Studio 8
http://msdn.microsoft.com/en-us/library/59zy697d(VS.80).aspx
start : Visual Studio 2005 Command Prompt
  DOS> cl cl0101.cpp
  DOS> cl /clr cl0101.cpp
  - ถ้า #include <iostream> ต้องใช้ /clr
  - /clr ทำให้มีการเรียกใช้ Incremental Linker
  - ให้ใช้ getchar() แทน getch()
  - ใช้ getchar() จะต้อง #include <stdio.h>
  - ใช้ system("PAUSE") จะต้อง #include <stdlib.h>
  - ถ้าใช้ cout ต้อง
    #include <iostream> และ using namespace std; // for cout 
    จึงจะใช้ cout << "a" << endl;
    แต่ถ้า #include <iostream> อย่างเดียว
    สามารถใช้ std::cout << "a";
  - จะใช้ system() ต้อง #include <iostream>
  - ใช้ scanf หรือ gets อาจพบ warning
    ให้ใช้ DOS>cl /clr x.cpp /D_CRT_SECURE_NO_DEPRECATE 

// Read from File with word split #include <stdio.h> int main() { FILE *fp; char userFile[40] = {"x.cpp"}; fp = fopen(userFile,"r"); char info[100]; while((fscanf(fp,"%s",info)) != EOF) printf("%s\n",info); fclose(fp); return 0; }
// Write to File #include <stdio.h> int main() { FILE *fp; char userFile[40] = {"y.txt"}; fp = fopen(userFile,"w"); fprintf(fp, "abc"); fclose(fp); return 0; }
// Assembly char my_getch() { char chr; _asm { mov ah, 07H INT 21H mov chr, al } return chr; }
ตัวแปลภาษา (Compiler) BCC 5.5.1
+ http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/
Download Site : Borland C++ 5.5 9 MB . .
Configuration สำหรับ Compile ใน Editplus เมื่อใช้ BCC 5.5.1
- ให้กำหนด Command : C:\Borland\BCC55\Bin\bcc32.exe
- ให้กำหนด Argument : -IC:\Borland\BCC55\Include -LC:\Borland\BCC55\Lib -n$(FileDir) $(FilePath)
- ให้กำหนด Initial directory : C:\Borland\BCC55\Bin
- ให้ click ที่ Capture Output
Configuration สำหรับ Run ใน Editplus เมื่อใช้ BCC 5.5.1 (กรณีไม่รับค่าจากแป้นพิมพ์)
- ให้กำหนด Command : $(FileNameNoExt)
- ให้กำหนด Initial directory : $(FileDir)
- ให้ click ที่ Capture Output
มีปัญหาเรื่องการ compile หรือ run
- เพื่อนท่านหนึ่งโทรมาถามว่า run ใน Command line ไม่มีปัญหา แต่พบปัญหาการหยุดรับค่าจากแป้นพิมพ์ เมื่อใช้ EditPlus
- ให้กำหนด Command เป็น "c:\windows\system32\cmd.exe" "/k"
- ให้กำหนด Argument เป็น $(FileNameNoExt) หรือ E:\KEEPSRC\$(FileNameNoExt)
- ไม่ click ที่ Capture Output เพื่อไม่ให้ run ใน Output window
- ถ้าต้องการ Compile ผ่าน Command Line ควรสร้างแฟ้ม bcc32.cfg ในห้อง bin แล้วเพิ่ม 2 บรรทัดนี้ลงไป
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib" - ตัวอย่างการแปลผ่าน Command Line คือ DOS>bcc32 x.cpp - ผลการแปลผ่าน Command Line
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
x.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
แปลโปรแกรมที่มี main จะได้แฟ้ม .obj และ .exe และ .tds
#include <stdio.h>
#include <conio.h>
main(void) {
  clrscr(); // use conio.h
  printf("hello"); // use stdio.h
}

โปรแกรม adtqueue.cpp ไม่ต้องแปล ถูก include ได้เลย ถ้าพยายามแปลจะพบ error
Error: Unresolved external '_main' referenced from C:\BORLAND\BCC55\LIB\C0X32.OBJ
typedef struct node { 
  void* dataPtr;
  struct node* next;
} QUEUE_NODE;
typedef struct {
  QUEUE_NODE* front;
  QUEUE_NODE* rear;
  int count;
} QUEUE;
QUEUE* createQueue (void);
QUEUE* destroyQueue (QUEUE* queue);

โปรแกรมจัดการ Queue (มีเพียง createQueue กับ destroyQueue)
+ http://www.dreamincode.net/forums/showtopic49439.htm
+ http://www.thaiall.com/datastructure/queue.htm
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "adtqueue.cpp"
void printQueue(QUEUE* queue);
main(void) {
  clrscr(); // use conio.h
  printf("hello"); // use stdio.h
  QUEUE* queue1;
  queue1 = createQueue();
  QUEUE* queue2 = createQueue();
  printQueue(queue1);
  destroyQueue (queue1); 
  destroyQueue (queue2); 
}
//
QUEUE* createQueue (void) {
  QUEUE* queue;
  queue = (QUEUE*) malloc (sizeof (QUEUE)); // malloc use stdlib.h
  if (queue) {
    queue->front = NULL;
    queue->rear = NULL;
    queue->count = 0;
  }
  return queue;
}
//
QUEUE* destroyQueue (QUEUE* queue) {
  QUEUE_NODE* deletePtr;
  if (queue) {
  while (queue->front != NULL) {
    free (queue->front->dataPtr);
    deletePtr    = queue->front;
    queue->front = queue->front->next; 
    free (deletePtr); 
  } 
  free (queue);
  } 
  return NULL;
}
//
void printQueue(QUEUE* queue){
  QUEUE_NODE* node = queue->front;
  printf ("Front=>");
  while (node) {
    printf ("%3d", *(int*)node->dataPtr);
    node = node->next;
  }
  printf(" <=Rear\n");
  return;
}

ตัวแปลภาษา (Compiler) TurboC 3.0
Download Site : TurboC 3.0 [3 MB]
วิธีแก้ปัญหา
ถ้า Compile ไม่ผ่าน เพราะหาห้อง include ไม่พบ เมื่อใช้ TCC ผ่าน command line หรือ Editplus แต่ไม่พบปัญหาใน TC
- ถ้าโปรแกรมทั้งหมดกองรวมกันอยู่ในห้อง c:\tc
- แก้แฟ้ม Turboc.cfg จาก -IC:\TC\INCLUDE เป็น -IC:\TC


บทเรียนพิเศษ (Extra Lesson)
โปรแกรมค้นหาตัวอักษรใน string
หัวหน้าผมใช้โปรแกรมลักษณะนี้ออกข้อสอบ จึงต้องทดสอบโปรแกรม เตรียมสอนนักศึกษา
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
main(void) {
  clrscr();
  char string[6];
  char *ptr, z=‘z‘;
  strcpy(string, "abcdef");
  ptr = strchr(string, z);
  if (strlen(ptr) == 0) cout << "not found z";
  ptr = strchr(string, ‘c‘);
  if (strlen(ptr) > 0) cout << "found c";
  getch();
}

ศึกษาเรื่อง date เพราะมีนักศึกษาคนหนึ่งโทรมาถาม
พบตัวอย่างที่ http://www.cs.duke.edu/~ola/ap/dates/
นำตัวแปร myMonth myDate และ myYear ไปใช้ต่อได้
#include <time.h>
#include <stdio.h>
#include <conio.h>
void main() {
  clrscr();
  static struct tm timeHolder;
  static struct tm *date = &timeHolder;
  time_t tloc;
  time(&tloc);
  date = localtime(&tloc);
  int myMonth = date->tm_mon + 1;
  int myDay   = date->tm_mday;
  int myYear  = date->tm_year + 1900;
  printf("%d%d%d",myMonth,myDay,myYear);
  getch(); // 9122007 (9 Dec 2007)
}

อีเมลจากเพื่อนชาวไทย ที่ให้คำแนะนำทีมงาน
1. คุณศร [sorn_kkc@hotmail.com] : ส่งโปรแกรมนี้มาให้ผมตอบคำถาม
คำถามของคุณศร : เขียนโปรแกรมส่งข้อมูลผ่าน port printer โดยควบคุมหลอด LED ปรากฎว่าไม่ได้ผลตามโปรแกรมที่เขียน
จากการค้นคว้าเพิ่มเติม ได้พบหนังสือภาษาซี ของ ดอนสัน ปงผาบ อ.คณะเทคโนโลยีอุตสาหกรรม ม.ราชภัฏลำปาง
จึงเข้าใจว่า LED คืออะไร
.. ผลการทดสอบต่อวงจรครั้งแรก ก็ได้มา 7 ภาพข้างล่างนี้ พร้อมแผลพุพองที่นิ้วกลางซ้ายอีกแผล

และนี่คือจุดเริ่มต้นที่จะใช้ภาษาอื่น ๆ คุมอุปกรณ์ผ่าน printer port

โปรแกรมนี้มีปัญหาใน WindowsXP แต่ใน WinMe กับ Win98 OK ..
2. คุณโอม [ohm10513@hotmail.com] : ส่ง e-mail มาแนะนำโปรแกรม userport.exe ใน etteam.com
ที่หา download ได้จาก etteam.com สามารถแก้ปัญหาเรื่อง Printer Port ใน Windows XP ได้ [ UserPort.zip 33 KB ]
กว่าจะทดสอบผ่าน ต้องหาวิธี compile ผ่าน command line ที่ทำงานควบคู่กับ tasm32 และ userport และแก้ IOPort.c
มีรายละเอียดการทดสอบสร้าง IOPort.exe ด้วย BCC5.5 ที่ทำงานร่วมกับ UserPort.exe ใน http://www.thaiall.com/printer
ตัวอย่างการเขียนโปรแกรมภาษา C ที่แทรกด้วยโค้ดของภาษา Assembly
ตัวอย่างโปรแกรมที่แปลด้วย Turbo C 3.0 ทำหน้าที่พิมพ์ A ทางจอภาพ โดยใช้ Interrupt 21h
c:\tc>tcc  x.cpp
void main() {
  asm {
  mov ah,02h;
  mov dl,41h;
  int 21h;
  }
}
ตัวอย่างโปรแกรมที่แปลด้วย Borland C 5.5
ทำหน้าที่พิมพ์เลข 11 เพราะเป็นผลบวกที่ได้จากภาษา assembly เช่น 
c:\borland\bcc55\bin>bcc32  x.cpp
#include <stdio.h>
void main() {
  int r;
  asm {
  mov eax, 5;
  mov ebx, 6;
  add eax,ebx;
  mov r,eax;
  }
  printf("%d",r);
}
https://dotnetfiddle.net/
http://rextester.com/
http://rextester.com/GNGHF8383 (pointer in clang)
https://csharppad.com/
https://repl.it/repls/AttentiveClientsideSystemresource
https://www.jdoodle.com/compile-c-sharp-online
https://www.tutorialspoint.com/compile_csharp_online.php
https://www.learncs.org/
https://www.codeguru.com/csharp/using-unsafe-code-and-pointers-in-c.htm
https://ideone.com/

+
quora.com/What-is-a-pointer-variable
+ /datastructure/queue.htm
#include <stdio.h>
void main() {
  int a = 5;
  int *b;
  b = &a;
  printf("%d \n",a); // 5
  printf("%d \n",b); // 1703752
  printf("%d \n",&a); // 1703752
  printf("%d \n",&b); // 1703748
}
#include <stdio.h>
void main() {
  int a = 5;
  int *b;
  b = &a; // reference by pointer
  int c = *b; // reference by value
  int **d; // this is pointer of pointer
  // ===  
  printf("%d \n",a); // 5
  printf("%d \n",b); // 1703752
  printf("%d \n",&a); // 1703752
  printf("%d \n",&b); // 1703748
  printf("%d \n",*b); // 5  
  // ===
  // compile error for printf("%d \n",*a);
  // compile error for printf("%d \n",**a);
  // compile error for printf("%d \n",*c);
  // compile error for printf("%d \n",**c);
  // compile error for printf("%d \n",**b); 
  printf("%d \n",c); // 5
  printf("%d \n",&c); // 1703744  
  // ===
  a = 6;
  printf("%d \n",*b); //  6 
  printf("%d \n",c); // 5
  printf("%d \n",&b); // 1703748  
  // ===
  // compile error for d = &a;
  d = &b;
  printf("%d \n",d); // 1703748    
  printf("%d \n",*d); // 1703752    
  printf("%d \n",**d); // 6 
}
แนะนำเว็บ
+ http://www.etteam.com/downloadf.html (มี compiler manual และ code แก้ปัญหา อาทิ userport.zip)
+ http://www.beyondlogic.org/spp/parallel.htm (Have detail of pin number)
+ http://www.xmlblaster.org/...TestQueue.html
+ http://www.dreamincode.net/forums/showtopic49439.htm (Data Structure : ADT Source Code of Queue )
! http://my.tele2.ee/chipmcu/ing/prog705j.htm (อ่าน e-prom จาก printer port)
! http://www.nelnickrobotics.com/printer_port.html (ภาพวงจรการเชื่อมต่ออุปกรณ์)
! http://www.machinegrid.com/content/view/30/84/ (แสดงการประยุกต์กับมอเตอร์)

ตัวอย่างภาษาซี กับส่งข้อมูลออกทาง Printer Port ที่ http://www.thaiall.com/printer
mingw64 บน git
mingw64 คือ โครงการพัฒนาระบบสนับสนุนการใช้ตัวแปลภาษา GCC Compiler บนระบบปฏิบัติการวินโดว์ ถูก Fork จากโครงการ mingw.org ตั้งแต่ปี 2550 ให้ใช้งานบนระบบปฏิบัติการ 64 bit พบว่า mingw64 ถูกติดตั้งมาพร้อมกับ Git 2.23.0 for windows [45.5 MB - git-scm.com] ทำให้เรียกใช้ Git Gui และ Git Bash ได้ เมื่อเข้า Git Bash ก็จะพบกับ mingw64 และใช้คำสั่ง Linux ได้ อาทิ id, pwd, ls, ping, netstat, df, du, ps, kill, date, set, env, mount, umount, cd, mkdir, rmdir, cp, rm, mv, cat, chmod, grep, tail, find, vi, gzip, tar ที่ใช้ไม่ได้ อาทิ top, man, service, su, sudo, fsck, lspci, whereis, pico, last, useradd, userdel, usermod, crontab, reboot, shutdown ใช้คำสั่ง DOS บน mingw64 ไม่ได้ อาทิ type, copy, cls, del, tree ตรวจสอบว่ามีคำสั่งอะไรที่ mingw64 สนับสนุน โดยดูรายการคำสั่งได้ในห้อง C:\Program Files\Git\usr\bin จากภาพตัวอย่างด้านข้าง เป็นการใช้ FTP เชื่อมต่อไปยัง Nectec แล้วคัดลอกมาจัดการบน DOS
rspsocial
Thaiall.com