樹心幽徑

20181128讀取檔名文字檔產生影像陣列,再以column major合併(mtile6e.c)
2018/11/28,20:36

(1a)編譯

$ g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile6e.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall  -export-dynamic -lm -o mtile6e

(1b)輸入檔:fname.txt

$ cat fname.txt
312x2689-4x3-cw1.png
312x2686-4x3-cw2.png
312x2683-4x3-cw3.png
312x2680-4x3-cw4.png
312x2677-4x3-cw5.png
312x2674-4x3-cw6.png

(2) 執行

$ ./mtile6e fname.txt 3 2
fn[0]=312x2689-4x3-cw1.png
fn[1]=312x2686-4x3-cw2.png
fn[2]=312x2683-4x3-cw3.png
fn[3]=312x2680-4x3-cw4.png
fn[4]=312x2677-4x3-cw5.png
fn[5]=312x2674-4x3-cw6.png

 0
 0(0,0) 3(0,1)
 1
 1(1,0) 4(1,1)
 2
 2(2,0) 5(2,1)
輸出六圖合併後的圖檔 mtile6e.jpg 成功!

(3)程式碼 mtile6e.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <Magick++.h>

using namespace Magick;
void xtile(char *fn[],int row,int col){
    Image ima[6];
    for(int i=0;i<6;i++){
        ima[i]=Image(fn[i]);
        printf("fn[%d]=%s\n",i,fn[i]);
        }
    Geometry size =  ima[0].size();
    int w=size.width();
    int h=size.height();
    Image im(Magick::Geometry(w*col,h*row),"white");
    for(int r=0;r<row;r++){
        printf("\n %d\n",r);
        for(int c=0;c<col;c++){
            int p=c*row+r;
            if(p<6){
                im.composite(ima[p], c*w, r*h, OverCompositeOp);
            }
            printf(" %d(%d,%d)",p,r,c);
        }
    }
    printf("\n");
    im.write("mtile6e.jpg");
    printf("輸出六圖合併後的圖檔 mtile6e.jpg 成功!\n");
}


int main(int argc, char *argv[]){
    if (argc!=4) {
        printf("圖磚合併程式的語法 ./mtile6e fname.txt row col\n");
        printf("輸出併圖結果檔為mtile6e.jpg\n");
        exit(-1);
    }
    int row=atoi(argv[2]);
    int col=atoi(argv[3]);

    char *fn[6];
    char st[6][80];

    FILE *fp;
      fp = fopen(argv[1] , "r");  //argv[1] use for img filename
      if(fp == NULL) {
          perror("Error opening file");
          return(-1);
       }
    for(int i=0;i<6;i++){
        fgets(st[i],80,fp);
        st[i][strlen(st[i])-1]=0;
        fn[i]=st[i];
    }
        fclose(fp);
    xtile(fn,row,col);
}



20181127用影像陣列將最多六塊圖磚合併在一起的工具程式(mtile6d.c)
2018/11/27,20:57

(1)編譯

g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile6d.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall  -export-dynamic -lm -o mtile6d

(2)執行

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6d
圖磚合併程式的語法 ./mtile6d 1.png 2.png 3.png 4.png 5.png 6.png col row
輸出併圖結果檔為mtile6d.jpg


treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6d 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 2 1
argv[1]=312x2689-4x3-cw1.png
argv[2]=312x2686-4x3-cw2.png
argv[3]=312x2683-4x3-cw3.png
argv[4]=312x2680-4x3-cw4.png
argv[5]=312x2677-4x3-cw5.png
argv[6]=312x2674-4x3-cw6.png

 0
 0(0,0)
 1
 1(1,0)
輸出六圖合併後的圖檔 xtile6d.jpg 成功!
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ mv xtile6d.jpg xtile6d2x1.jpg

 
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6d 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 2 3
argv[1]=312x2689-4x3-cw1.png
argv[2]=312x2686-4x3-cw2.png
argv[3]=312x2683-4x3-cw3.png
argv[4]=312x2680-4x3-cw4.png
argv[5]=312x2677-4x3-cw5.png
argv[6]=312x2674-4x3-cw6.png

 0
 0(0,0) 2(0,1) 4(0,2)
 1
 1(1,0) 3(1,1) 5(1,2)
輸出六圖合併後的圖檔 xtile6d.jpg 成功!
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ mv xtile6d.jpg xtile6d2x3.jpg


treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6d 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 3 2
argv[1]=312x2689-4x3-cw1.png
argv[2]=312x2686-4x3-cw2.png
argv[3]=312x2683-4x3-cw3.png
argv[4]=312x2680-4x3-cw4.png
argv[5]=312x2677-4x3-cw5.png
argv[6]=312x2674-4x3-cw6.png

 0
 0(0,0) 3(0,1)
 1
 1(1,0) 4(1,1)
 2
 2(2,0) 5(2,1)
輸出六圖合併後的圖檔 xtile6d.jpg 成功!
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ mv xtile6d.jpg xtile6d3x2.jpg

 
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6d 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 6 1
argv[1]=312x2689-4x3-cw1.png
argv[2]=312x2686-4x3-cw2.png
argv[3]=312x2683-4x3-cw3.png
argv[4]=312x2680-4x3-cw4.png
argv[5]=312x2677-4x3-cw5.png
argv[6]=312x2674-4x3-cw6.png

 0
 0(0,0)
 1
 1(1,0)
 2
 2(2,0)
 3
 3(3,0)
 4
 4(4,0)
 5
 5(5,0)
輸出六圖合併後的圖檔 xtile6d.jpg 成功!
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ mv xtile6d.jpg xtile6d6x1.jpg

(3)程式碼:mtile6d.c

http://oldwww.kmvs.km.edu.tw/lf/index.php?op=ViewResource&blogId=70&resource=mtile6d.c


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <Magick++.h>

using namespace Magick;
void xtile(char *argv[],int row,int col){
    Image ima[6];
    for (int i=0;i<6;i++){
        ima[i]=Image(argv[i+1]);
        printf("argv[%d]=%s\n",i+1,argv[i+1]);
    }
    Geometry size =  ima[0].size();
    int w=size.width();
    int h=size.height();
    Image im(Magick::Geometry(w*col,h*row),"white");
    for(int r=0;r<row;r++){
        printf("\n %d\n",r);
        for(int c=0;c<col;c++){
            int p=c*row+r;
            if(p<6){
                im.composite(ima[p], c*w, r*h, OverCompositeOp);
            }
            printf(" %d(%d,%d)",p,r,c);
        }
    }
    printf("\n");
    im.write("xtile6d.jpg");
    printf("輸出六圖合併後的圖檔 xtile6d.jpg 成功!\n");
}

int main(int argc, char *argv[]){
    if (argc!=9) {
        printf("圖磚合併程式的語法 ./mtile6d 1.png 2.png 3.png 4.png 5.png 6.png row col\n");
        printf("輸出併圖結果檔為mtile6d.jpg\n");
        exit(-1);
    }
    int row=atoi(argv[7]);
    int col=atoi(argv[8]);
    xtile(argv,row,col);
}

(4)輸出圖之一: xtile6d2x1.jpg

alt

xtile6d2x1.jpg

20181126用Linux dd來為資料光碟建立iso檔。
2018/11/26,08:46

dd 為linux 上的disk duplicate 工具程式

$ dd if=/dev/cdrom of=acad.iso
輸入 1061672+0 個紀錄
輸出 1061672+0 個紀錄
543576064 bytes (544 MB, 518 MiB) copied, 329.277 s, 1.7 MB/s

20181124將最多六塊圖磚合併在一起的工具程式(mtile6c.c)
2018/11/24,22:02

(1)編譯:

$ g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile6c.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall  -export-dynamic -lm -o mtile6c

(2)執行:
 (2a)
$ ./mtile6c 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 2 1

 0
 0(0,0)
 1
 1(1,0)
輸出首2圖合併後的圖檔 mtile6c.jpg 成功!
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ mv mtile6c.jpg mtile6c2x1cw1cw2.jpg

 (2b)

$ ./mtile6c 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 3 1

 0
 0(0,0)
 1
 1(1,0)
 2
 2(2,0)
輸出首3圖合併後的圖檔 mtile6c.jpg 成功!
$ mv mtile6c.jpg mtile6c3x1cw1cw2cw3.jpg

 (2c)

$ ./mtile6c 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 2 2

 0
 0(0,0) 1(0,1)
 1
 2(1,0) 3(1,1)
輸出首4圖合併後的圖檔 mtile6c.jpg 成功!
$ mv mtile6c.jpg mtile6c2x2cw1cw2cw3cw4.jpg

 (2d)
$ ./mtile6c 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 2 3

 0
 0(0,0) 1(0,1) 2(0,2)
 1
 3(1,0) 4(1,1) 5(1,2)
輸出首6圖合併後的圖檔 mtile6c.jpg 成功!
$ mv mtile6c.jpg mtile6c2x3.jpg

 (2e)

$ ./mtile6c 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 3 2

 0
 0(0,0) 1(0,1)
 1
 2(1,0) 3(1,1)
 2
 4(2,0) 5(2,1)
輸出首6圖合併後的圖檔 mtile6c.jpg 成功!
$ mv mtile6c.jpg mtile6c3x2.jpg

 (2f)

$ ./mtile6c 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 6 1

 0
 0(0,0)
 1
 1(1,0)
 2
 2(2,0)
 3
 3(3,0)
 4
 4(4,0)
 5
 5(5,0)
輸出首6圖合併後的圖檔 mtile6c.jpg 成功!
$ mv mtile6c.jpg mtile6c6x1.jpg

 

 (2g)

$  ./mtile6c 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 2 1

 0
 0(0,0)
 1
 1(1,0)
輸出首2圖合併後的圖檔 mtile6c.jpg 成功!
$ mv mtile6c.jpg mtile6c2x1cw3cw4.jpg

 (2h)

$ ./mtile6c  312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 2 1

 0
 0(0,0)
 1
 1(1,0)
輸出首2圖合併後的圖檔 mtile6c.jpg 成功!
$ mv mtile6c.jpg mtile6c2x1cw5cw6.jpg

(3)程式碼:

http://oldwww.kmvs.km.edu.tw/lf/index.php?op=ViewResource&blogId=70&resource=mtile6c.c

(4)輸出的圖檔

4-a http://oldwww.kmvs.km.edu.tw/kmvswiki/images/c/c8/Mtile6c2x1cw5cw6.jpg

4-b http://oldwww.kmvs.km.edu.tw/kmvswiki/images/9/91/Mtile6c2x1cw3cw4.jpg

4-c http://oldwww.kmvs.km.edu.tw/kmvswiki/images/c/c8/Mtile6c2x1cw5cw6.jpg

4-e http://oldwww.kmvs.km.edu.tw/kmvswiki/images/b/ba/Mtile6c1x2cw7cw8.jpg

4-f

http://oldwww.kmvs.km.edu.tw/lf/gallery/70/mtile6c2x1s.jpg

alt

20181124將六塊圖磚合併在一起的工具程式(mtile6b.c)
2018/11/24,12:46

(1)編譯:

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile6b.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall  -export-dynamic -lm -o mtile6b

(2)執行:

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6b 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 2 3
左中右六原始圖寬高皆為 width=1266 height=951
合併六圖後的寬高為 width=2532 height=2853
輸出六圖合併後的圖檔 mtile6b.jpg 成功!

 

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6b 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 1 6
左中右六原始圖寬高皆為 width=1266 height=951
合併六圖後的寬高為 width=1266 height=5706
輸出六圖合併後的圖檔 mtile6b.jpg 成功!
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$

 

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6b 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 3 2
左中右六原始圖寬高皆為 width=1266 height=951
合併六圖後的寬高為 width=3798 height=1902
輸出六圖合併後的圖檔 mtile6b.jpg 成功!

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6b 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png 6 1
左中右六原始圖寬高皆為 width=1266 height=951
合併六圖後的寬高為 width=7596 height=951
輸出六圖合併後的圖檔 mtile6b.jpg 成功!

(3)程式碼:

http://oldwww.kmvs.km.edu.tw/lf/index.php?op=ViewResource&blogId=70&resource=1729-mtile6b.c

 

(4)結果圖檔:

http://oldwww.kmvs.km.edu.tw/lf/gallery/70/mtile6b2x3s.jpg

alt

20181120將上中下左右二欄六列計6塊圖磚合併在一起的工具程式(mtile6.c)
2018/11/20,23:37

(1)編譯:

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile6.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic -lm -o mtile6

(2)執行
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile6 312x2689-4x3-cw1.png 312x2686-4x3-cw2.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2677-4x3-cw5.png 312x2674-4x3-cw6.png

使用六個來源圖檔
[1:左上312x2689-4x3-cw1.png][4:右上312x2680-4x3-cw4.png]
[2:左中312x2686-4x3-cw2.png][5:右中312x2677-4x3-cw5.png]
[3:左下312x2683-4x3-cw3.png][6:右下312x2674-4x3-cw6.png]

左右上中下各三計6個原始圖寬高皆為 width=1266 height=951
合併6圖後的寬高為 width=2532 height=2853
輸出合併後的圖檔 mtile6.jpg 成功!

(3)程式碼 http://oldwww.kmvs.km.edu.tw/lf/index.php?op=ViewResource&blogId=70&resource=mtile6.c

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ cat mtile6.c
//g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile6.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic -lm -o mtile
// https://people.cs.clemson.edu/~dhouse/courses/405/notes/Magick++_tutorial.pdf
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <Magick++.h>

using namespace Magick;
void mtile6(char *fname1,char *fname2,char *fname3,char *fname4,char *fname5, char *fname6){
Image im1(fname1);
Image im2(fname2);
Image im3(fname3);
Image im4(fname4);
Image im5(fname5);
Image im6(fname6);
Geometry size =  im1.size();
double rw=2;
double rh=3;
Image im0(Magick::Geometry(size.width()*rw,size.height()*rh),"white");
//Image blank_image( Geometry(640, 480), Color(MaxRGB, MaxRGB, MaxRGB, 0));
int w=size.width();
int h=size.height();
printf("左右上中下各三計6個原始圖寬高皆為 width=%d height=%d\n",(int)size.width(),(int)size.height());
printf("合併6圖後的寬高為 width=%.0f height=%.0f\n",size.width()*rw,size.height()*rh);
im0.composite(im1, 0, 0, OverCompositeOp);
im0.composite(im2, 0, h-1, OverCompositeOp);
im0.composite(im3, 0, h+h-1, OverCompositeOp);
im0.composite(im4, w-1, 0, OverCompositeOp);
im0.composite(im5, w-1, h-1, OverCompositeOp);
im0.composite(im6, w-1, h+h-1, OverCompositeOp);
im0.write("mtile6.jpg");
printf("輸出合併後的圖檔 mtile6.jpg 成功!\n");
}

int main(int argc, char *argv[])
{
if (argc!=7) {
    printf("2欄3列圖磚合併程式的語法 ./mtile6 1.png 2.png 3.png 4.png 5.png 6.png\n");
    printf("輸出併圖結果檔為mtile6.jpg\n");
    exit(-1);
    }
printf("使用六個來源圖檔\n[1:左上%20s][4:右上%20s]\n[2:左中%20s][5:右中%20s]\n[3:左下%20s][6:右下%20s]",argv[1],argv[4],argv[2],argv[5],argv[3],argv[6]);
mtile6(argv[1],argv[2],argv[3],argv[4],argv[5],argv[6]);
}
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$

 

20181120將上下左右四塊圖磚合併在一起的工具程式(mtile.c)
2018/11/20,22:34

(1)編譯

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic -lm -o mtile

(2)執行

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ ./mtile 312x2689-4x3-cw1.png 312x2683-4x3-cw3.png 312x2680-4x3-cw4.png 312x2686-4x3-cw2.png
使用四個來源圖檔
[1:左上312x2689-4x3-cw1.png][2:右上312x2683-4x3-cw3.png]
[4:左下312x2680-4x3-cw4.png][3:右下312x2686-4x3-cw2.png]
上下左右四原始圖寬高皆為 width=1266 height=951
合併四圖後的寬高為 width=2532 height=1902
輸出四圖合併後的圖檔 mtile.jpg 成功!
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$

(3)程式碼 : mtile.c

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/lake$ cat mtile.c
//g++  `Magick++-config --cxxflags --cppflags` -I/usr/local/include/ImageMagick-7  mtile.c `Magick++-config --ldflags --libs`  -L/usr/local/zlib/lib -lz   -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic -lm -o mtile
// https://people.cs.clemson.edu/~dhouse/courses/405/notes/Magick++_tutorial.pdf
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <Magick++.h>

using namespace Magick;
void mtile(char *fname1,char *fname2,char *fname3,char *fname4){
Image im(fname1);
Image im1(fname1);
Image im2(fname2);
Image im3(fname3);
Image im4(fname4);
Geometry size =  im.size();
double rw=2;
double rh=2;
int w=size.width();
int h=size.height();
im.resize(Magick::Geometry(size.width()*rw,size.height()*rh));
printf("上下左右四原始圖寬高皆為 width=%d height=%d\n",(int)size.width(),(int)size.height());
printf("合併四圖後的寬高為 width=%.0f height=%.0f\n",size.width()*rw,size.height()*rh);
im.composite(im1, 0, 0, OverCompositeOp);
im.composite(im2, w-1, 0, OverCompositeOp);
im.composite(im3, w, h, OverCompositeOp);
im.composite(im4, 0, h-1, OverCompositeOp);
im.write("mtile.jpg");
printf("輸出四圖合併後的圖檔 mtile.jpg 成功!\n");
}

int main(int argc, char *argv[])
{
if (argc!=5) {
    printf("圖磚合併程式的語法 ./mtile 1.png 2.png 3.png 4.png\n");
    printf("輸出併圖結果檔為mtile.jpg\n");
    exit(-1);
    }
printf("使用四個來源圖檔\n[1:左上%20s][2:右上%20s]\n[4:左下%20s][3:右下%20s]\n",argv[1],argv[2],argv[3],argv[4]);
mtile(argv[1],argv[2],argv[3],argv[4]);
}

alt

20181111將貨品資料csv檔轉入ilvssell資料庫的new_goods資料表(程式t19.c)
2018/11/11,22:14

(1)編譯

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ gcc t19.c `mysql_config --cflags --libs` -o t19

(2)goods.csv資料檔

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ cat goods.csv
gdsno,gdsname,cost,unit,stock_qty,fac_no
t101,砂糖桔,140,斤,500,099
t102,香桔士,50,斤,400,077

(3)執行

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ ./t19 goods.csv
new_goods貨品基本資料表轉入程式
0[t001] 1[砂糖桔] 2[140] 3[斤] 4[500] 5[099]
Duplicate entry 't001' for key 'PRIMARY'
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ vi goods.csv
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ ./t19 goods.csvnew_goods貨品基本資料表轉入程式
0[t101] 1[砂糖桔] 2[140] 3[斤] 4[500] 5[099]
SQL指令: [insert into new_goods (gdsno,gdsname,cost,unit,stock_qty,fac_no) values ('t101','砂糖桔',140.00,'斤', 500, '099')] 執行成功!

0[t102] 1[香桔士] 2[50] 3[斤] 4[400] 5[077]
SQL指令: [insert into new_goods (gdsno,gdsname,cost,unit,stock_qty,fac_no) values ('t102','香桔士',50.00,'斤', 400, '077')] 執行成功!

(4)t19.c程式碼
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ cat t19.c
#include <my_global.h>
#include <mysql.h>
#define HOST "localhost"
#define USER "treehrt"
#define PWD "abc123abc123"
#define DB "ilvssell"
typedef struct GOODSREC
{
  char gdsno[20];
  char gdsname[30];
//  char spec[10];
  double cost;
//  double price_in;
//  double price_special;
//  double price_sell;
  char unit[4];
  int stock_qty;
  char fac_no[20];
//  char mem[80];
} goodsRec ;

void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);       
}
char tokens[100][60];  //最多100個存放token
int tokensc;           //tokens計數
void insert_new_goods_rec(goodsRec gR){
//        printf("待寫入的資料:gR.gdsno=%s,gR.gdsname=%s gR.unit=%s gR.cost=%.2f gR.stcok_qty=%d gR.fac_no=%s\n",gR.gdsno,gR.gdsname,gR.unit,gR.cost,gR.stock_qty,gR.fac_no);
        char st[500];
        sprintf(st,"insert into new_goods (gdsno,gdsname,cost,unit,stock_qty,fac_no) values ('%s','%s',%.2f,'%s', %d, '%s')",gR.gdsno,gR.gdsname,gR.cost,gR.unit,gR.stock_qty,gR.fac_no) ;
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
}


void parsecsvline(char *st ,char deli){
  char tk[80];
  tokensc=0;
  strcpy(tk,"");
  for (int i=0;i<strlen(st);i++) {
    if((st[i]==deli) || (st[i]==0x0a)) {
        strcpy(tokens[tokensc],tk);
        tokensc++;
          strcpy(tk,"");
    }
    else    sprintf(tk,"%s%c",tk,st[i]);
    }
  for (int i=0;i<tokensc;i++) {
    printf("%d[%s] ",i,tokens[i]);
    }
  printf("\n");
}

int main(int argc, char **argv)
{
  char st[100];
  FILE *fp;
  goodsRec gR;
  printf("new_goods貨品基本資料表轉入程式\n");
  fp = fopen(argv[1] , "r");  //argv[1] use for csv filename ,ex cust.csv.
  if(fp == NULL) {
      perror("Error opening file");
      return(-1);
   }
  fgets(st,100,fp);
  while (1){
      if( fgets(st, 100, fp)!=NULL ) {
          parsecsvline(st,',');
        strcpy(gR.gdsno,tokens[0]);
        strcpy(gR.gdsname,tokens[1]);
        gR.cost=atof(tokens[2]);
        strcpy(gR.unit,tokens[3]);
        gR.stock_qty=atoi(tokens[4]);
        strcpy(gR.fac_no,tokens[5]);
        insert_new_goods_rec(gR);
      }
     else break;
    }
  fclose(fp);

  exit(0);
}

 

20181110new_goods貨品基本資料編修程式(t18.c)
2018/11/10,21:39

(1)編譯:

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ gcc t18.c `mysql_config --cflags --libs` -o t18

(2)執行:

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ ./t18

貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=1
1:貨品基本資料新增程式
請輸入貨品編號=a001
SQL: [ select gdsno,gdsname,unit,cost,stock_qty,fac_no from new_goods where gdsno='a001' ] Execute ok!

找不到gdsno: a001!!

很好,編號(a001)沒有被使用過
請輸入名稱=蕃茄
請輸入貨品單價=50
請輸入貨品單位=斤
初始貨品數量為0
請輸入貨品供應商代號=088
SQL指令: [insert into new_goods (gdsno,gdsname,cost,unit,stock_qty,fac_no) values ('a001','蕃茄',50.00,'斤', 0, '088')] 執行成功!


貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=1
1:貨品基本資料新增程式
請輸入貨品編號=a001
SQL: [ select gdsno,gdsname,unit,cost,stock_qty,fac_no from new_goods where gdsno='a001' ] Execute ok!

match : a001 蕃茄 斤 50 0 088

 a001已為[蕃茄]使用!

貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=4
4:貨品基本資料列表
SQL: [ select gdsno, gdsname, unit, cost, stock_qty, fac_no from new_goods ] Execute ok!

gdsno, gdsname, unit, cost, stock_qty, fac_no,
a001, 蕃茄, 斤, 50, 0, 088,
a002, 青椒, 斤, 45, -14, 099,
a009, 咖啡, 杯, 50, 0, 099,
a089, 楊桃, 斤, 50, 0, 099,
b004, 黃瓜, 斤, 50, 2234, 099,
b006, 蜂密, 斤, 1000, 0, 099,
計6筆資料

貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=2
2:進貨程式
請輸入貨品編號=a001
SQL: [ select gdsno,gdsname,unit,cost,stock_qty,fac_no from new_goods where gdsno='a001' ] Execute ok!

match : a001 蕃茄 斤 50 0 088
請輸入進貨數量=2500
SQL指令: [update new_goods set stock_qty=stock_qty+(2500) where gdsno='a001'] 執行成功!


貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=4
4:貨品基本資料列表
SQL: [ select gdsno, gdsname, unit, cost, stock_qty, fac_no from new_goods ] Execute ok!

gdsno, gdsname, unit, cost, stock_qty, fac_no,
a001, 蕃茄, 斤, 50, 2500, 088,
a002, 青椒, 斤, 45, -14, 099,
a009, 咖啡, 杯, 50, 0, 099,
a089, 楊桃, 斤, 50, 0, 099,
b004, 黃瓜, 斤, 50, 2234, 099,
b006, 蜂密, 斤, 1000, 0, 099,
計6筆資料

貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=3
3:貨品基本資料刪除程式
請輸入貨品編號=b009
SQL: [ select gdsno,gdsname,unit,cost,stock_qty,fac_no from new_goods where gdsno='b009' ] Execute ok!

找不到gdsno: b009!!
察無b009的資料

貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=3
3:貨品基本資料刪除程式
請輸入貨品編號=b006
SQL: [ select gdsno,gdsname,unit,cost,stock_qty,fac_no from new_goods where gdsno='b006' ] Execute ok!

match : b006 蜂密 斤 1000 0 099
SQL指令: [delete from  new_goods where gdsno='b006'] 執行成功!


貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=4
4:貨品基本資料列表
SQL: [ select gdsno, gdsname, unit, cost, stock_qty, fac_no from new_goods ] Execute ok!

gdsno, gdsname, unit, cost, stock_qty, fac_no,
a001, 蕃茄, 斤, 50, 2500, 088,
a002, 青椒, 斤, 45, -14, 099,
a009, 咖啡, 杯, 50, 0, 099,
a089, 楊桃, 斤, 50, 0, 099,
b004, 黃瓜, 斤, 50, 2234, 099,
計5筆資料

貨品基本資料編修
請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=0

謝謝使用本編修程式
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$

(3)程式碼t18.c

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ cat t18.c
#include <my_global.h>
#include <mysql.h>
#define HOST "localhost"
#define USER "treehrt"
#define PWD "abc123abc123"
#define DB "ilvssell"
typedef struct GOODSREC
{
  char gdsno[20];
  char gdsname[30];
//  char spec[10];
  double cost;
//  double price_in;
//  double price_special;
//  double price_sell;
  char unit[4];
  int stock_qty;
  char fac_no[20];
//  char mem[80];
} goodsRec ;

void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);       
}
int  GetGoodsRecByNo(char *gdsno, goodsRec *pv)
{
  char st[280];
  sprintf(st,"select gdsno,gdsname,unit,cost,stock_qty,fac_no from new_goods where gdsno='%s'",gdsno);
  MYSQL *con = mysql_init(NULL);
  if (con == NULL) finish_with_error(con);

  if (mysql_real_connect(con, HOST, USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
  mysql_query(con, "set names utf8");
  if (mysql_query(con, st)) finish_with_error(con);
  printf("SQL: [ %s ] Execute ok! \n\n", st);
  MYSQL_RES *result = mysql_store_result(con);
  if (result == NULL) finish_with_error(con);

  MYSQL_ROW row;
  row = mysql_fetch_row(result);
  if (row){
    strcpy(pv->gdsno,row[0]);
    strcpy(pv->gdsname,row[1]);
    strcpy(pv->unit,row[2]);
    pv->cost=atof(row[3]);
    pv->stock_qty=atoi(row[4]);
    strcpy(pv->fac_no,row[5]);
    printf("match : %s %s %s %s %s %s\n",row[0],row[1],row[2],row[3],row[4],row[5]);
    mysql_free_result(result);
    return 1;
  }
  else {
    printf("找不到gdsno: %s!!\n",gdsno);
    mysql_free_result(result);
    return 0;
    }
}

void  add_goods_qty(char *gdsno, int qty)
{
    char st[500];
        sprintf(st,"update new_goods set stock_qty=stock_qty+(%d) where gdsno='%s'",qty,gdsno);
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
      mysql_close(con);
}

void  list_new_goods()
{
    char st[500];
        sprintf(st,"select gdsno, gdsname, unit, cost, stock_qty, fac_no from new_goods");
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
    printf("SQL: [ %s ] Execute ok! \n\n", st);

    MYSQL_RES *result = mysql_store_result(con);
    if (result == NULL)  finish_with_error(con);

    int num_fields = mysql_num_fields(result);

      MYSQL_FIELD *field;
    char *headers[num_fields];
    for(int k = 0; (field = mysql_fetch_field(result)); k++) {
         headers[k] = field->name;
         printf("%s, ",headers[k]);
         }
    printf("\n");
      MYSQL_ROW row;
    int c=0;
    while ((row = mysql_fetch_row(result))) {
          for(int i = 0; i < num_fields; i++)  printf("%s, ", row[i] ? row[i] : "NULL"); 
          c++;
          printf("\n");
      }
    mysql_free_result(result);
    mysql_close(con);
    printf("計%d筆資料\n",c);
}

void insert_new_goods_rec(goodsRec gR){
//        printf("待寫入的資料:gR.gdsno=%s,gR.gdsname=%s gR.unit=%s gR.cost=%.2f gR.stcok_qty=%d gR.fac_no=%s\n",gR.gdsno,gR.gdsname,gR.unit,gR.cost,gR.stock_qty,gR.fac_no);
        char st[500];
        sprintf(st,"insert into new_goods (gdsno,gdsname,cost,unit,stock_qty,fac_no) values ('%s','%s',%.2f,'%s', %d, '%s')",gR.gdsno,gR.gdsname,gR.cost,gR.unit,gR.stock_qty,gR.fac_no) ;
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
}
void del_new_goods_rec(char * gdsno){
        char st[500];
        sprintf(st,"delete from  new_goods where gdsno='%s'",gdsno) ;
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
      mysql_close(con);
}

int main(int argc, char **argv)
{
  char gdsno[20];
  int sel=0;
  goodsRec gR;
  while(1){
    printf("\n貨品基本資料編修\n");
      printf("請輸入選擇(1新增 2進貨 3刪除 4列出 0結束) sel=");
      scanf("%d",&sel);
    if (sel==0) {
          printf("\n謝謝使用本編修程式\n");
        exit(1);
        }
    if (sel==1){
          printf("1:貨品基本資料新增程式\n請輸入貨品編號=");
        scanf("%s",gdsno);
          if(GetGoodsRecByNo(gdsno, &gR)==1){
              printf("\n %s已為[%s]使用!\n",gdsno,gR.gdsname);
            }
        else{
            strcpy(gR.gdsno,gdsno);
            printf("\n很好,編號(%s)沒有被使用過\n請輸入名稱=",gdsno);
            scanf("%s",gR.gdsname);
            printf("請輸入貨品單價=");
            scanf("%lf",&gR.cost);
            printf("請輸入貨品單位=");
            scanf("%s",gR.unit);
            gR.stock_qty=0;
            printf("初始貨品數量為%d\n",gR.stock_qty);
            printf("請輸入貨品供應商代號=");
            scanf("%s",gR.fac_no);
            insert_new_goods_rec(gR);
            }
        }
    if (sel==2){
          printf("2:進貨程式\n請輸入貨品編號=");
        scanf("%s",gdsno);
          if(GetGoodsRecByNo(gdsno, &gR)==1){
            int qty=0;
            printf("請輸入進貨數量=");
            scanf("%d",&qty);
            add_goods_qty(gdsno, qty);
            }
        else printf("察無%s的資料\n",gdsno);
       
        }
    if (sel==3){
          printf("3:貨品基本資料刪除程式\n請輸入貨品編號=");
        scanf("%s",gdsno);
          if(GetGoodsRecByNo(gdsno, &gR)==1){
            del_new_goods_rec(gdsno);
        }
        else printf("察無%s的資料\n",gdsno);
        }
    if (sel==4){
          printf("4:貨品基本資料列表\n");
        list_new_goods();
        }
    }
  exit(0);
}

20181109顧客csv資料轉入new_cust程式t17.c
2018/11/09,21:05

 

(1)編譯

 treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ gcc t17.c `mysql_config --cflags --libs` -o t17

 

(2)轉入用資料檔cust.csv:

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ cat cust.csv
cardid,uname,remain
922001,鼠,6000
922002,牛,5000
922003,虎,4000
922004,兔,3000
922005,龍,2000
922006,蛇,1000

 

(3)執行

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ ./t17 cust.csv
0[922001] 1[鼠] 2[6000]
SQL指令: [insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'922001','鼠' ,'xxxx',6000.00)] 執行成功!

0[922002] 1[牛] 2[5000]
SQL指令: [insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'922002','牛' ,'xxxx',5000.00)] 執行成功!

0[922003] 1[虎] 2[4000]
SQL指令: [insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'922003','虎' ,'xxxx',4000.00)] 執行成功!

0[922004] 1[兔] 2[3000]
SQL指令: [insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'922004','兔' ,'xxxx',3000.00)] 執行成功!

0[922005] 1[龍] 2[2000]
SQL指令: [insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'922005','龍' ,'xxxx',2000.00)] 執行成功!

0[922006] 1[蛇] 2[1000]
SQL指令: [insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'922006','蛇' ,'xxxx',1000.00)] 執行成功!
(4)程式碼

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ cat t17.c
#include <my_global.h>
#include <mysql.h>
#define HOST "localhost"
#define USER "treehrt"
#define PWD "abc123abc123"
#define DB "ilvssell"

typedef struct CUSTREC
{
  //char uid[10];
  double remain;
  //char inyear[5];
  //char dept[10];
  //char grade[10];
  //char class[10];
  char cardid[10];
  char uname[10];
  //char pid[10];
  //char addr[80];
  //char tel[15];
  //char oldclass[10];
  //char sno[2];
  //int lostc;
  //char gen_code;
  //char in_use;
  //char cid[4];

} custRec ;
void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);       
}
char tokens[100][60];  //最多100個存放token
int tokensc;           //tokens計數

void insert_new_cust_rec(custRec cR){
//        printf("待寫入的資料:cR.cardid=%s,cR.uname=%s cR.remain=%.2f\n",cR.cardid,cR.uname,cR.remain);
        char st[500];
        sprintf(st,"insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'%s','%s' ,'xxxx',%.2f)",cR.cardid,cR.uname,cR.remain) ;
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
}


void parsecsvline(char *st ,char deli){
  char tk[80];
  tokensc=0;
  strcpy(tk,"");
  for (int i=0;i<strlen(st);i++) {
    if((st[i]==deli) || (st[i]==0x0a)) {
        strcpy(tokens[tokensc],tk);
        tokensc++;
          strcpy(tk,"");
    }
    else    sprintf(tk,"%s%c",tk,st[i]);
    }
  for (int i=0;i<tokensc;i++) {
    printf("%d[%s] ",i,tokens[i]);
    }
  printf("\n");
}

int main(int argc, char **argv)
{
  char st[100];
  FILE *fp;
  custRec cR;

  fp = fopen(argv[1] , "r");  //argv[1] use for csv filename ,ex cust.csv.
  if(fp == NULL) {
      perror("Error opening file");
      return(-1);
   }
  fgets(st,100,fp);
  while (1){
      if( fgets(st, 100, fp)!=NULL ) {
          parsecsvline(st,',');
        strcpy(cR.cardid,tokens[0]);
        strcpy(cR.uname,tokens[1]);
        cR.remain=atof(tokens[2]);
        insert_new_cust_rec(cR);
      }
     else break;
    }
  fclose(fp);

  exit(0);
}

20181107new_cust顧客基本資料編修程式(t16.c)
2018/11/08,21:43

(1)編譯

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ gcc t16.c `mysql_config --cflags --libs` -o t16

(2)執行

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ ./t16

顧客基本資料編修
請輸入選擇(1新增 2儲值 3刪除 4列出 0結束) sel=1
1:顧客基本資料新增程式
請輸入顧客編號=201801
can not found cardid: 201801!!

很好,顧客編號(201801)沒有被使用過
請輸入顧客名稱=小新
待寫入的資料:cR.cardid=201801,cR.uname=小新 cR.remain=0.00
SQL指令: [insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'201801','小新' ,'xxxx',0.00)] 執行成功!


顧客基本資料編修
請輸入選擇(1新增 2儲值 3刪除 4列出 0結束) sel=2
2:顧客儲值程式
請輸入顧客編號=201801
輸入要儲值的金額 moneyadd=5000
SQL指令: [update new_cust set remain=remain+(5000.00) where cardid='201801'] 執行成功!


顧客基本資料編修
請輸入選擇(1新增 2儲值 3刪除 4列出 0結束) sel=4
4:顧客基本資料列表
SQL: [ select cardid,uname,remain from new_cust ] Execute ok!

100001, 王小虎, -70,
121212, 楊小安, 5666,
201801, 小新, 5000,
712003, 王一志, 1770,

顧客基本資料編修
請輸入選擇(1新增 2儲值 3刪除 4列出 0結束) sel=3
3:顧客基本資料刪除程式
請輸入顧客編號=100001
SQL指令: [delete from  new_cust where cardid='100001'] 執行成功!


顧客基本資料編修
請輸入選擇(1新增 2儲值 3刪除 4列出 0結束) sel=4
4:顧客基本資料列表
SQL: [ select cardid,uname,remain from new_cust ] Execute ok!

121212, 楊小安, 5666,
201801, 小新, 5000,
712003, 王一志, 1770,

顧客基本資料編修
請輸入選擇(1新增 2儲值 3刪除 4列出 0結束) sel=0

謝謝使用本編修程式
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$

(3)程式碼

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ cat t16.c
//gcc t16.c `mysql_config --cflags --libs`
#include <my_global.h>
#include <mysql.h>
#define HOST "localhost"
#define USER "treehrt"
#define PWD "abc123abc123"
#define DB "ilvssell"

typedef struct CUSTREC
{
  //char uid[10];
  double remain;
  //char inyear[5];
  //char dept[10];
  //char grade[10];
  //char class[10];
  char cardid[10];
  char uname[10];
  //char pid[10];
  //char addr[80];
  //char tel[15];
  //char oldclass[10];
  //char sno[2];
  //int lostc;
  //char gen_code;
  //char in_use;
  //char cid[4];

} custRec ;
void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);       
}

int  GetCustRecByNo(char *custno, custRec *pv)
{
  char st[280];
  sprintf(st,"select cardid,UName,remain from new_cust where cardid='%s'",custno);

  MYSQL *con = mysql_init(NULL);
  if (con == NULL) finish_with_error(con);

  if (mysql_real_connect(con, HOST, USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
  mysql_query(con, "set names utf8");

  if (mysql_query(con, st)) finish_with_error(con);
//  printf("SQL: [ %s ] Execute ok! \n\n", st);

  MYSQL_RES *result = mysql_store_result(con);
  if (result == NULL) finish_with_error(con);

  MYSQL_ROW row;
  row = mysql_fetch_row(result);
  if (row){
    strcpy(pv->cardid,row[0]);
    strcpy(pv->uname,row[1]);
    pv->remain=atof(row[2]);
    mysql_free_result(result);
    return 1;
  }
  else {
    printf("can not found cardid: %s!!\n",custno);
    mysql_free_result(result);
    return 0;
    }
}

void  add_custs_remain(char *custno, double moneyadd)
{
    char st[500];
        sprintf(st,"update new_cust set remain=remain+(%.2f) where cardid='%s'",moneyadd,custno);
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
      mysql_close(con);
}

void  list_new_cust()
{
    char st[500];
        sprintf(st,"select cardid,uname,remain from new_cust");
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
    printf("SQL: [ %s ] Execute ok! \n\n", st);

    MYSQL_RES *result = mysql_store_result(con);
    if (result == NULL)  finish_with_error(con);

    int num_fields = mysql_num_fields(result);

      MYSQL_ROW row;
    while ((row = mysql_fetch_row(result))) {
          for(int i = 0; i < num_fields; i++)  printf("%s, ", row[i] ? row[i] : "NULL"); 
          printf("\n");
      }
    mysql_free_result(result);
    mysql_close(con);
}


//   char st[]="insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,712003,'王一志' ,'B301',1000)" ;

void insert_new_cust_rec(custRec cR){
        printf("待寫入的資料:cR.cardid=%s,cR.uname=%s cR.remain=%.2f\n",cR.cardid,cR.uname,cR.remain);
        char st[500];
        sprintf(st,"insert into new_cust (inyear,cardid,uname,cid4,remain) values (107,'%s','%s' ,'xxxx',%.2f)",cR.cardid,cR.uname,cR.remain) ;
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
}
void del_new_cust_rec(char * custno){
        char st[500];
        sprintf(st,"delete from  new_cust where cardid='%s'",custno) ;
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
      mysql_close(con);
}

int main(int argc, char **argv)
{
  char custno[20];
  int sel=0;
  custRec cR;
  while(1){
    printf("\n顧客基本資料編修\n");
      printf("請輸入選擇(1新增 2儲值 3刪除 4列出 0結束) sel=");
      scanf("%d",&sel);
    if (sel==0) {
          printf("\n謝謝使用本編修程式\n");
        exit(1);
        }
    if (sel==1){
          printf("1:顧客基本資料新增程式\n請輸入顧客編號=");
        scanf("%s",custno);
          if(GetCustRecByNo(custno, &cR)!=0){
              printf("\n %s已為[%s]帳戶使用!\n",custno,cR.uname);
            }
        else{
            strcpy(cR.cardid,custno);
            printf("\n很好,顧客編號(%s)沒有被使用過\n請輸入顧客名稱=",custno);
            scanf("%s",cR.uname);
            cR.remain=0;
            insert_new_cust_rec(cR);
            }
        }
    if (sel==2){
          printf("2:顧客儲值程式\n請輸入顧客編號=");
        scanf("%s",custno);
        double moneyadd=0;
        printf("輸入要儲值的金額 moneyadd=");
        scanf("%lf",&moneyadd);
        add_custs_remain(custno, moneyadd);
        }
    if (sel==3){
          printf("3:顧客基本資料刪除程式\n請輸入顧客編號=");
        scanf("%s",custno);
        del_new_cust_rec(custno);
        }
    if (sel==4){
          printf("4:顧客基本資料列表\n");
        list_new_cust();
        }

    }
  exit(0);
}

20181105調減new_goods資料表中指定貨品編號(gdsno)的貨品庫存量(stock_qty) t15.c
2018/11/06,20:53

(1)t15.c程式碼:

#include <my_global.h>
#include <mysql.h>
#define HOST "localhost"
#define USER "treehrt"
#define PWD "abc123abc123"
#define DB "ilvssell"
void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);       
}
typedef struct GOODSREC
{
  char gdsno[20];
  char gdsname[30];
  char spec[10];
  double cost;
  double price_in;
  double price_special;
  double price_sell;
  char unit[4];
  int stock_qty;
  char fac_no[20];
//  char mem[80];
} goodsRec ;


int  GetGoodsRecByNo(char *gdsno, goodsRec *pv)
{
  char st[280];
  sprintf(st,"select gdsno,gdsname,cost,price_in,price_special,price_sell,unit,stock_qty,fac_no from new_goods where gdsno='%s'",gdsno);
  MYSQL *con = mysql_init(NULL);
  if (con == NULL) {
      fprintf(stderr, "%s\n", mysql_error(con));
      exit(1);
  }
  if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
  mysql_query(con, "set names utf8");
  if (mysql_query(con, st)) finish_with_error(con);
  printf("SQL指令: [%s] 執行成功! \n\n", st);
  MYSQL_RES *result = mysql_store_result(con);
  if (result == NULL)  finish_with_error(con);
  MYSQL_ROW row;
  row = mysql_fetch_row(result);
  if (row){
    strcpy(pv->gdsno,row[0]);
    strcpy(pv->gdsname,row[1]);
    pv->cost=atof(row[2]);
    pv->price_in=atof(row[3]);
    pv->price_special=atof(row[4]);
    pv->price_sell=atof(row[5]);
    strcpy(pv->unit,row[6]);
    pv->stock_qty=atoi(row[7]);
    strcpy(pv->fac_no,row[8]);
  }
  else {
    printf("can not found gdsno: %s!!\n",gdsno);
    }
  mysql_free_result(result);
  mysql_close(con);
  return 0;
}

void  minus_goods_qty(char *gdsno, int qty)
{
    char st[500];
        sprintf(st,"update new_goods set stock_qty=stock_qty-(%d) where gdsno='%s'",qty,gdsno);
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
}
int main(int argc, char **argv)
{
  char gdsno[20];
  printf("貨品存量調減程式\n輸入貨品編號gdsno=");
  goodsRec gdR;
  scanf("%s",gdsno);
  GetGoodsRecByNo(gdsno, &gdR);
  printf("修改前 %s[%s]庫存量=%d\n",gdsno,gdR.gdsname,gdR.stock_qty);
  int qty;
  printf("輸入要調減的貨品數量qty=");
  scanf("%d",&qty);
  minus_goods_qty(gdsno, qty);
  GetGoodsRecByNo(gdsno, &gdR);
  printf("修改後 %s[%s]庫存量=%d\n",gdsno,gdR.gdsname,gdR.stock_qty);
  exit(0);
}

 

(2)編譯並執行

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ gcc t15.c `mysql_config --cflags --libs`

treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$ ./a.out
貨品存量調減程式
輸入貨品編號gdsno=a001
SQL指令: [select gdsno,gdsname,cost,price_in,price_special,price_sell,unit,stock_qty,fac_no from new_goods where gdsno='a001'] 執行成功!

修改前 a001[蕃茄]庫存量=300
輸入要調減的貨品數量qty=300
SQL指令: [update new_goods set stock_qty=stock_qty-(300) where gdsno='a001'] 執行成功!

SQL指令: [select gdsno,gdsname,cost,price_in,price_special,price_sell,unit,stock_qty,fac_no from new_goods where gdsno='a001'] 執行成功!

修改後 a001[蕃茄]庫存量=0
treehrt@treehrt-BM6AE-BM1AE-BP1AE:~/mysqlc$

 

20181104修改new_cust資料表中某一客戶(custno)的儲值金額(remain) t14.c
2018/11/04,09:03

(1) code : t14.c

treehrt@hrt:~/mysqlc$ cat t14.c
//gcc t14.c `mysql_config --cflags --libs`
#include <my_global.h>
#include <mysql.h>
#define HOST "localhost"
#define USER "treehrt"
#define PWD "abc123abc123"
#define DB "ilvssell"

typedef struct CUSTREC
{
  //char uid[10];
  double remain;
  //char inyear[5];
  //char dept[10];
  //char grade[10];
  //char class[10];
  char cardid[10];
  char uname[10];
  //char pid[10];
  //char addr[80];
  //char tel[15];
  //char oldclass[10];
  //char sno[2];
  //int lostc;
  //char gen_code;
  //char in_use;
  //char cid[4];

} custRec ;
void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);       
}

int  GetCustRecByNo(char *custno, custRec *pv)
{
  char st[280];
  sprintf(st,"select cardid,UName,remain from new_cust where cardid='%s'",custno);

  MYSQL *con = mysql_init(NULL);
  if (con == NULL) finish_with_error(con);

  if (mysql_real_connect(con, HOST, USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
  mysql_query(con, "set names utf8");

  if (mysql_query(con, st)) finish_with_error(con);
//  printf("SQL: [ %s ] Execute ok! \n\n", st);

  MYSQL_RES *result = mysql_store_result(con);
  if (result == NULL) finish_with_error(con);

  MYSQL_ROW row;
  row = mysql_fetch_row(result);
  if (row){
    strcpy(pv->cardid,row[0]);
    strcpy(pv->uname,row[1]);
    pv->remain=atof(row[2]);
    mysql_free_result(result);
    return 1;
  }
  else {
    printf("can not found cardid: %s!!\n",custno);
    mysql_free_result(result);
    return 0;
    }
}

void  add_custs_remain(char *custno, double moneyadd)
{
    char st[500];
        sprintf(st,"update new_cust set remain=remain+(%.2f) where cardid='%s'",moneyadd,custno);
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
      printf("SQL指令: [%s] 執行成功! \n\n", st);
}
void  update_custs_remain(char *custno, double remain)
{
    char st[500];
        sprintf(st,"update new_cust set remain=%.2f where cardid='%s'",remain,custno);
    MYSQL *con = mysql_init(NULL);
    if (con == NULL)  finish_with_error(con);
    if (mysql_real_connect(con, HOST , USER, PWD, DB, 0, NULL, 0) == NULL) finish_with_error(con);
    mysql_query(con, "set names utf8");
    if (mysql_query(con, st)) finish_with_error(con);
    printf("SQL: [ %s ] Execute ok! \n\n", st);
}
int main(int argc, char **argv)
{
  char custno[20];
  printf("顧客儲值程式\n輸入顧客編號gdsno=");
  scanf("%s",custno);

  custRec cR;
  GetCustRecByNo(custno, &cR);
  printf("儲值前 %s[%s] 帳戶餘額=%.2f\n",custno,cR.uname,cR.remain);

  double moneyadd=0;
  printf("輸入要儲值的金額 moneyadd=");
  scanf("%lf",&moneyadd);
  add_custs_remain(custno, moneyadd);


  GetCustRecByNo(custno, &cR);
  printf("儲值後 %s[%s] 帳戶餘額=%.2f\n",custno,cR.uname,cR.remain);
  exit(0);
}

 

(2)編譯

treehrt@treehrt-fire:~/mysqlc$ gcc t14.c `mysql_config --cflags --libs`

(3)執行結果

treehrt@hrt:~/mysqlc$ ./a.out
顧客儲值程式
輸入顧客編號gdsno=812001
儲值前 812001[王一志] 帳戶餘額=6956.00
輸入要儲值的金額 moneyadd=-4000
SQL指令: [update new_cust set remain=remain+(-4000.00) where cardid='812001'] 執行成功!

儲值後 812001[王一志] 帳戶餘額=2956.00
treehrt@hrt:~/mysqlc$

 

20181101在伺服端建立mysql連線用戶並在用戶端用C程式碼連線
2018/11/01,09:23

(一)伺服端(insecta.idv.tw)

mysql>  GRANT ALL ON ilvssell.* to treehrt@tree.kmvs.km.edu.tw;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON  *.* to 'treehrt'@'%' IDENTIFIED by "?" WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql>  FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> use mysql;
Database changed
mysql> UPDATE user SET Password=PASSWORD('?') where USER='treehrt';
Query OK, 1 row affected (0.00 sec)
Rows matched: 4  Changed: 1  Warnings: 0

mysql>  FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

 

(二)用戶端程式碼(tree.kmvs.km.edu.tw)

if (mysql_real_connect(con, "insecta.idv.tw", "treehrt", "?",
          NULL, 0, NULL, 0) == NULL)
  {
      fprintf(stderr, "%s\n", mysql_error(con));
      mysql_close(con);
      exit(1);
  } 

 
Accessible and Valid XHTML 1.0 Strict and CSS Powered by LifeType