Showing posts with label C programming. Show all posts
Showing posts with label C programming. Show all posts

Monday, October 28, 2013

TeX และ ตาราง

มูลเหตุ ที่ต้องทำเอกสารขึ้นมา เพราะ ขี้เกียจทำกับมือ ซึ่ง งานแบบนี้แหละ คอมพิวเตอร์ถนัดนัก ก็แค่ตารางบวกเลข 0-9 ที่จับมาสุ่มบวกกันเองเข้า เท่านั้นแหละ  รวมแล้วก็ ๑๐๐ คู่ที่จับมาบวกกัน แล้วก็ สุ่มจับมาด้วย ซึ่งอันหลังนี้เองที่วุ่นวายหากทำกับมือ

แก้ปัญหาสุ่มจับมาด้วยโปรแกรมภาษา C ที่เขียนมา, วิ่งผ่าน cygwin บน windows XP, แล้วพิมพ์ออกมา ซึ่งแรกๆนั้นกลับ copy & paste มาลงใน template ของ MikTeX

ทำเองสองสามครั้งเข้า ชักขี้เกียจและฉลาดขึ้น เลยแก้ตัวโปรแกรมภาษา C นั้น ให้พิมพ์ส่วนที่ MikTeX ต้องการใช้มาด้วยซะเลยทีเดียว งวดนี้ พอ cut แล้วนำมา paste ให้ถูกช่อง ก็ได้ตารางออกมา ตารางที่ generate ออกมายังไงก็ไม่มีเหมือนกัน รับประกันว่า เด็กๆขืนลอกกันเองเข้าก็ทำผิดเท่านั้นเอง

ข้างล่างนี้คือ template สำหรับใช้งานด้วย TeX ผ่าน MikTeX และตรงที่ต้องนำมา paste นั้นก็ high light เอาไว้ให้แล้วด้วย คงพอดูออก

% !TEX TS-program = pdflatex
% !TEX encoding = TIS-620 Unicode


\documentclass{article} % use larger type & default would be 10pt

\usepackage[thai]{babel}

\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}


%%% PAGE DIMENSIONS
\usepackage{geometry} % to change the page dimensions
\geometry{a4paper} % or letterpaper (US) or a5paper or....

\usepackage{graphicx} % support the \includegraphics command and options

%\usepackage[parfill]{parskip} % Activate to begin paragraphs with an empty line rather than an indent

%%% PACKAGES
\usepackage{booktabs} % for much better looking tables
\usepackage{array} % for better arrays (eg matrices) in maths
\usepackage{paralist} % very flexible &customisable lists (eg. enumerate/itemize, etc.)
\usepackage{verbatim} % adds environment for commenting out blocks of text &for better verbatim
\usepackage{subfig} % make it possible to include more than one captioned figure/table in a single float
% These packages are all incorporated in the memoir class to one degree or another...

%%% HEADERS & FOOTERS
\usepackage{fancyhdr} % This should be set AFTER setting up the page geometry
\pagestyle{fancy} % options: empty , plain , fancy
\renewcommand{\headrulewidth}{0pt} % customise the layout...
\lhead{}\chead{}\rhead{}
\lfoot{}\cfoot{\thepage}\rfoot{}

%%% SECTION TITLE APPEARANCE
\usepackage{sectsty}
\allsectionsfont{\sffamily\mdseries\upshape} % (See the fntguide.pdf for font help)
% (This matches ConTeXt defaults)

%%% ToC (table of contents) APPEARANCE
\usepackage[nottoc,notlof,notlot]{tocbibind} % Put the bibliography in the ToC
\usepackage[titles,subfigure]{tocloft} % Alter the style of the Table of Contents
\renewcommand{\cftsecfont}{\rmfamily\mdseries\upshape}
\renewcommand{\cftsecpagefont}{\rmfamily\mdseries\upshape} % No bold!

%%% END Article customizations

%%% The "real" document content comes below...
\title{ตารางบวกเลข}
\author{ลุงตึ๋ง}
%\date{} % Activate to display a given date or no date (if empty),
         % otherwise the current date is printed 
\date{16 ตุลาคม พ.ศ. 2556}
\begin{document}
\maketitle

\section{ตารางรวมเลข} ตัวเลข 0 -- 9 สุ่มมาผลิตเป็นตารางสำหรับทดสอบความถูกต้อง และ ความเร็วในการบวกเลข
%% ตรงนี้ สำหรับนำมา paste
\tableofcontents
\end{document}

จบเท่านี้

ใครที่คิดว่าบวกเลขหลักเดียว 0-9 นั้นง่าย ไม่เถียงดอก แต่ขอได้ไหมว่า 
  1. อย่าผิดแม้แต่ข้อเดียว
  2. ทำให้เร็วที่สุด น้อยกว่า ๓๐๐ วินาฑีได้ ยิ่งดี เพราะเด็กที่ฉลาดและเก่งนั้น พอนับ หนึ่ง สอง พวกก็ตอบออกมาแล้ว ก็ราวๆ ๓๐๐ วินาฑีเมื่อรวมทุกข้อ
ขอแค่ ๒ อย่างนี้เท่านั้นแหละ
งวดหน้า จะสั่งให้โปรแกรม เขียนเอกสารนี้ออกมาเองทั้งหมดเลย โดยไม่ต้อง cut & paste เอา

ข้างล่างนี้คือเอกสารที่พิมพ์ออกทางกระดาษ A4 หลังจากที่ MikTeX process แล้วได้แฟ้ม .pdf ออกมา แล้วมอบให้เด็ก ทดสอบความสามารถของเขาเอง
แบบทดสอบการบวกเลข

ตั้งใจจำทำให้เพื่อน freshy วิดยา 14 ที่จากไปเมื่อต้นเดือนนี้ แต่ก็ไม่ทัน ถึงอย่างนั้นก็ขออุทิศความดีอันนี้ให้กับเพื่อนที่จากไป ส่วนข้อผิดพลาดขาดตกบกพร่องอันใด มะไฟ ขอน้อมรับไว้แต่ผู้เดียว

สำหรับตัวโปรแกรมภาษา C นั้นต้องแก้ entities ให้ html เขาพิมพ์ออกมาให้ถูกต้องไวยากรณ์ของภาษา C ที่ออกจะวุ่นวายอยู่ ยังไงหากสงสัย หรือ เห็นว่าคลาดเคลื่อนประการใด ถามมาได้ครับ ยินดีตอบเสมอ ข้างล่างนี้ครับ ตัวโปรแกรม

เริ่ม

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static unsigned long kseed=1;
time_t *mtp;

main()
{
int *left, k, r,j, tmp;
int *right,l,m,n;

left = (int *)malloc(10*sizeof(int));
right = (int *)malloc(10*sizeof(int));
for(k=0;k<10;k++) {
*(left+k)=k;
*(right+k)=k;
}

/*
 * I got this code from forums.freebsd.org http://forums.freebsd.org/showthread.php?p=236648#post236648
 */

srand((unsigned int)time(0));
for(k=0;k<10;k++){
r=rand()%10;
tmp = left[k];
left[k] = left[r];
left[r] = tmp;

/*
 * srand() and rand() here make somewhat good result
 */

srand((unsigned int)time(0));
r=rand() % 10;
}
srand((unsigned int)time(mtp));
for(k=0;k<10;k++){
l=rand()%10;
tmp = right[k];
right[k] = right[l];
right[l] = tmp;
}
printf("\n\\par");
for(n=0;n<10;n++)
printf(" %d ",*(left+n));
printf("\n\\par");
for(n=0;n<10;n++)
printf(" %d ",*(right+n));
printf("\n\n\\par Start at\\space\\space\\space:\\space\\space\\space:\\space\\space\\space\\par \n");
printf("\\begin{tabular}{|l|l|l|l|l|l|l|l|l|l|}\n\\hline\n");
for(l=0;l<10;l++) {
for(m=0;m<10;m++)
printf("%d+%d=\\space\\space\\space%c",*(right+l),*(left+m),(m<9)? '&' : ' ');
printf("\\");
printf("\\\n");
}
printf("\n\\hline\n\\end{tabular}");
printf("\n\n\\par Stop at\\space\\space\\space:\\space\\space\\space:\\space\\space\\space\\par \n");
free((int *)left);
free((int *)right);
}

จบเท่านี้ครับสำหรับ code ส่วนที่ว่ามันดูเปรอะไปนั้น ขออภัยจริงๆครับ

ขอบคุณ ที่สละเวลามาอ่าน

Thursday, October 13, 2011

Dennis M. Ritchie: C , unix

 ผู้ที่จับโครงการ multics มานั่ง strip down ให้ทำงานได้อย่างเดียว อยู่คนเดียว จนมีอีกคนมาแซวว่า ที่เขาเขียน มันไม่น่าจะใช่ multics แต่เป็น uniplex มากว่า จึงน่าจะเป็น unics มากกว่า ... ฯลฯ

ในความทรงจำ ก็ออกจะเลอะเลือนแล้วว่า ใครแซวใคร,

ขออภัย เพิ่งไปค้นมา Ken Thompson ครับ ที่นั่งทำ และ Brian W. Kernighan มาแซว และที่สุด เขาทั้งสาม ซึ่งรวม DMR คนนี้ มาช่วยกันเขียน และ เข็ญ ภาษา C ออกมา  , 

แต่ เขานั่นหละ ที่เขียนทั้ง C และ unix ขึ้นมา ได้ข่าวจาก osnews เขาบอกมาอีกที

ขอไว้อาลัยต่อการจากไปของเขา   อโหสิให้หมดแล้ว
สู่สุคติเถิด  DMR

มา แล้วก็กลับ เมื่อถึงเวลา
มะไฟ ฅนยาก
มะฃาม คินเดินดน


Thursday, May 6, 2010

FreeBSD: programming -->getopt



commands

เพื่อนๆ หลายท่านคงเคยใช้งานโปรแกรม แบบที่ต้องกำหนด option ด้วย เช่น
% find -n -x pattern filename
% grep -v R-dep


ซึ่งโปรแกรมลักษณะนี้ อำนวยความสะดวกให้ผู้ใช้มาก ในแง่ที่ว่า สามารถเพิ่มคุณลักษณะวิเศษไปจากเดิมได้ นิดหน่อย โดยไม่ต้องสั่งโปรแกรมเดิมมาทำงานซ้ำ

n, x หรือ v ในตัวอย่างนั้น เรียกว่า option การกำหนด option ให้กับโปรแกรมที่เขียนขึ้น แม้จะทำได้เองโดยง่าย แต่ในโลกของ unix แล้ว การใช้บริการของ system functions นั้นเป็นสิ่งที่ ต้องทำ เพราะอย่างน้อย ก็ ลดภาระ ของผู้พัฒนาโปรแกรม และ ทำให้ ตัดความกังวล เรื่อง ความปลอดภัยของระบบไปได้มาก

ความปลอดภัย เป็นเรื่องที่ล้อเล่นไม่ได้ น่ะ และในยามที่เรามีกฏหมายเกี่ยวกับคอมพิวเตอร์มาใช้งานแล้วเช่นนี้ หากโปรแกรมที่เราเขียนขึ้น มีช่องโหว่ว ก็ลำบากมากอยู่ ถ้าใช้กันผ่าน network

ในโอกาสพิเศษเช่นนี้ จึงใคร่ขอนำเสนอเรื่องสั้นๆ ไม่ยาวนัก แต่พอให้เกิดปัญญา มาตกลงปรองดองกันได้ ระหว่าง การเขียน code ขึ้นมาเอง กับการใช้บริการของ system functions (ผ่าน library)

function ที่ว่านี้ เรียกว่า getopt(3) ซึ่งเมื่อเปิด manual page ใน section ที่ 3 ดูก็ทราบรายละเอียดได้ว่า
  1. ต้อง link กับ standard C library (-lc) ในตอน compile ตัวอย่างคือ
    % cc -o programme programme.c -lc
  2. function นี้กำหนด prototype ไว้แล้วใน unistd.h header files ทำให้เราต้องรวมบรรทัด
    #include <unistd.h>
    เข้าไปด้วย


ตัวอย่าง ที่เขียนขึ้นจริงๆกับ โปรแกรมเรื่องสั้นภาค ๒ ที่เพิ่งส่งไปเมื่อวันอังคารที่ผ่านมานี้ ขอตัดมาให้ดูแต่เพียงบางส่วนเท่านั้น คือ
@ |getopt(3)|, one of many functions from system services
@<Getoption@>=
sflag = 0;
interactive=0;
while ((ch = getopt(argc, argv, "is:d:")) != -1) { <----
  switch (ch) {
   case 'i':@/
      interactive = 1;@/
      break;@/
   case 's':
      if ((fp = fopen(optarg, "r")) == NULL) {
       fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
       status = OPEN_FILE;
      }
      sflag = 1;
      strcpy(filename,optarg); /* for later used */
      break;
   case 'd':
      if ((fp = fopen(optarg, "r")) == NULL) {
       fprintf(stderr,"%s: %s: %s\n",programme, optarg, strerror(errno));
       status = OPEN_FILE;
       }
      strcpy(filename,optarg); /* for later used */
      break;
   case '?':@/
   default:@/
      fprintf(stderr,"usage: %s -[[i]s|[i]d] data-filename\n%s\n", programme,
      strerror(errno));
      status = USAGE;
      break;
   }
  }
โดยที่ตรงบรรทัด while นั่นแหละ พอเดาออกน่ะครับว่า options ที่ใช้คือ i,s,d อันนี้ไม่ได้หมายถึง index for sustainable development ของการพัฒนาอย่างยั่งยืน อะไรหรอกน่ะ แต่มันเผอิญมาตรงกัน เท่านั้นเอง

กล่าวคือ option ของโปรแกรมที่ใช้งานจริงจริง เมื่อเรียกใช้ ก็จะอยู่ในรูป
% programme -i -sfilename | -dfilename
หรือ
% programme -isfilename | -idfilename
หรือ
% programme -sfilename | -dfilename
จาก manual page ทราบว่า เรามีภาระเพียงกำหนด argument ที่ 3 ให้กับ system function นี้ ซึ่ง มีรูปแบบ ที่แน่นอน ไว้ให้แล้ว พร้อมกับเขียน code มาเพื่อรองรับ option ที่กำหนดไว้ ก็เท่านั้นเอง

และในตัวอย่าง มะไฟ ก็เพียงเลือกเอาว่า จะใช้ option i,s,d โดยที่ ๒ อันหลังนั้นต้องมีชื่อแฟ้มตามมาด้วยเสมอ กล่าวคือ ต้องอยู่ในรูป
% programme -sfilename
หรือ
% programme -dfilename
ย่างนี้เป็นต้นเสมอ จะใช้แต่ option ใด option หนึ่งโดดๆ ไม่มีชื่อแฟ้มตามมาด้วย ไม่ได้

ใน manual page นั้น เขาบอกไว้ชัดเจนว่า option ที่มี argument ตามมานั้น ให้ตามหลัง option นั้นด้วย : เสมอ เพื่อแยกจาก option อื่นที่ไม่มี argument ตามมาด้วย ส่วนที่ว่า argument ที่ตามมาด้วยนั้น จะเขียนติดต่อกันไปเลย อย่างในตัวอย่างที่ยกมาให้ดู หรือ จะมี space ตามเพื่อความสวยงาม ก็ได้ ไม่ว่ากัน

ในตัวอย่างที่ยกมานั้น option s และ option d มี : ตามอยู่ด้วย ทำให้ทราบว่า ทั้ง ๒ option นั้นมี argument ตามมาแน่นอน ซึ่งก็คือชื่อของแฟ้มเอกสาร ที่จะเปิดเพื่ออ่านข้อมูลนั่นเอง

ก็หวังว่าคงพอเข้าใจบ้าง

และเมื่อลองเทียบ ความเรียบง่ายนี้ กับ codes ที่ต้องเขียนเองขึ้นมา โดยขอให้ไปดูจากหนังสือ The C Programming Language ในบทที่ ๕ section ที่ 10 Command-line Arguments ท่านก็จะพบว่า ยุ่งเหยิงมากกว่ากันเยอะเลย เอาแค่การตีความ precedence ของ pointers & operator ก็แทบจะพูดได้ว่า

โชคดีแล้ว ที่ไม่ต้องเขียนเอง

การใช้บริการของ system function ผ่าน library ทั้งหลายที่มีให้ จึงนับว่าดีที่สุด

ขอยกคุณงามความดีนี้ ถวายเป็นราชพลี ถวายเป็นปฏิบัติบูชา ในวาระ ฉัตรมงคลสมัย อันประเสริฐยิ่งนี้

อันใดที่บกพร่อง มะไฟ ฅนยาก ขอน้อมรับไว้แต่ผู้เดียว

View My Stats