竖排转换算法,C语言实现

C、C++和Java语言
回复
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28
送出感谢: 0
接收感谢: 0

竖排转换算法,C语言实现

#1

帖子 flyinflash » 2008-07-14 12:38

代码: 全选

/*
 *      row_to_cal :: p1.c
 *     
 *      Copyright 2008 lee <flyinflash@gmail.com>
 *     
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *     
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *     
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */

/*
 * Last Modified: 2008-07-8
 *
 */

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

#include <lee/stdiol.h>


#define DEFAULT_FILE_NAME "src.txt"
#define MAX_CHAR 1024

#define MATRIX_ROW  9 * 3
#define MATRIX_COL  18 * 3


typedef struct block_data
{
    char data[MAX_CHAR - 1];
  struct block_data *next;
} block_data;

double blocks_gl;
long int file_size_gl;


block_data *read_data()
{
  char file_name[128];
  FILE *fp;
  int data_from;
  int i, j, key;


  block_data *src_bd, *now_bd, *new_bd;
  src_bd = malloc(sizeof(block_data));
    if ( NULL == src_bd )
    {
        printf("\n");
        perror("\n malloc");
    }
    src_bd->next = NULL;
    now_bd = src_bd;

   
    printf("\n");
    printf("\n input file name ");
    printf("\n    '1' to use default '%s'; ", DEFAULT_FILE_NAME);
    printf("\n    '2' to specify file name; ");
    /*
    printf("\n");
    printf("\n    '3' to readline; ");
    */
    printf("\n");
    printf("\n    '0' to quit ");
    printf("\n  ");
   
    scanf("%s", file_name);
    flush();
   
  if (strcmp(file_name, "1") == 0)
  {
      strcpy(file_name, DEFAULT_FILE_NAME);
      data_from = 1;
    }
  else if (strcmp(file_name, "2") == 0)
  {
      printf("\n    specify file name ( length < 128 ) : ");
      scanf("%s", file_name);
      flush();
      data_from = 2;
    }
    /*
    else if (strcmp(file_name, "3") == 0)
    {
        printf("\n    readline: ");
        data_from = 3;
    }
    */
   
   
    switch (data_from)
    {
        case 1:
        case 2:
            if ( NULL != (fp = fopen(file_name, "r")) )
            {
                fseek(fp, 0, SEEK_END);
                file_size_gl = ftell(fp);
                //    printf("\n file_size_gl = %ld ", file_size_gl);
                rewind(fp);
               
               
                blocks_gl = file_size_gl * 1.0 / ( MAX_CHAR - 1 );
                //    printf("\n blocks_gl = %.1f ", blocks_gl);


                for (i = 1, j = 0; i <= file_size_gl && ( key = getc(fp) ) != EOF; i++, j++)
              {
                  if ( (i % (MAX_CHAR - 1) ) == 0 )
                  {
                      new_bd = (block_data *)malloc(sizeof(block_data));
                      new_bd->next = NULL;
                      now_bd->next = new_bd;
                      now_bd = new_bd;
                      j = 0;
                    }
                    now_bd->data[j] = key;
                }


                fclose(fp);
               
                printf("\n");
                //    printf("\n    read SUCCESSFULLY ");
               
                return src_bd;
            }
            else
            {
                system("clear");
               
                printf("\n");
                perror("\n    read FAILED ");
               
                return NULL;
            }
        /*case 3:
            printf("\n unsupport now ");
            break;
        */
    case 0:
        goto QUIT_FLAG;
  }
  QUIT_FLAG:
  return NULL;
}


void print_data(block_data *src_db)
{
    block_data *tmp;
    int i;
   
   
    tmp = src_db;

    printf("\n");
    printf("\n blocks_gl = %.f ", ceil(blocks_gl));
    printf("\n");
   
    i = 1;
   
    while (NULL != tmp)
    {
        //    printf("\n [ debug ] blocks_gl = %d ", i);
        printf("%s", tmp->data);
        i++;
        tmp = tmp->next;
    }
}


int main()
{
    block_data *src_db;
   
    src_db = read_data();
   
    if (NULL != src_db)
        print_data(src_db);

    printf("\n");
  return 0;
}




//

代码: 全选

/*
 *      row_to_cal :: p2.c
 *     
 *      Copyright 2008 lee <flyinflash@gmail.com>
 *     
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 *     
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *     
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */

/*
 * Last Modified: 2008-07-12
 *
 */

#include <stdio.h>
#include <string.h>

#define ROWS 9
#define COLS 9 * 3


int main(int argc, char** argv)
{
    char *src = "旒璃花                  钟灵毓秀宝货琦略,遥遥笙歌琴瑟相乐,苗条淑女君子好色,桃花流水堪比太虚";
   
    int max_cols = strlen(src) / ROWS + 1;
   
    char m[ROWS][max_cols];
   
    int i, j;
    int k, l;
   
   
    printf("\n src = %s ", src);
    printf("\n");
    printf("\n strlen(src) = %d ", strlen(src));
    printf("\n rows = %d, cols = %d ", ROWS, max_cols);
    printf("\n cols[zh_cn] = %d ", max_cols / 3);


    printf("\n----------------------\n");
   
    k = max_cols;
    l = 0;
    while ( (l + 1) < strlen(src) )
    {
        for (i = 0; i < ROWS; i++)
        {
            for (j = k - 3; j < k; j++)
            {
                m[i][j] = src[l];
                // printf("%02d ", i * 10 + j);
                l++;
            }
            //    printf("\n");
        }
        k -= 3;
    }
   
    printf("\n +");
    for (i = 0; i < max_cols - 1; i++)
        printf("-");
    printf("+\n ");
   
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < max_cols; j++)
        {
            if (j % 3 == 0)
                printf("|");
            if (m[i][j - 2] != m[i][j])
                printf("%c", m[i][j]);
            //    printf("%02d ", i * 10 + j);
        }
        printf("|");
        printf("\n ");
    }
   
    printf("+");
    for (i = 0; i < max_cols - 1; i++)
        printf("-");
    printf("+\n ");
   
    printf("\n----------------------\n");


    return 0;
}




// Makefile

代码: 全选

$(CC) = gcc
All:
    $(CC) -o p1 p1.c -lm
    $(CC) -o p2 p2.c




//
Algorithm
===========

input
from local file or readline
custom matrix size
process
translate
get block_data length
cp & set data right to left, up to down
output
save as local file


INPUT
钟灵毓秀琦略宝货,遥遥笙歌琴瑟相乐

PROCESS
...

OUTPUT
+-----------+
|君|苗|琦|钟|
+-----------+
|子|条|略|灵|
+-----------+
|好|淑|宝|毓|
+-----------+
|逑|女|货|秀|
+-----------+



Input Stream
==============

local file
default file name ( source.txt )
specify name ( length < 128 )

keyboard



The Column of Matrix
======================

NOTE: strlen("蠡") = 3

--

--

w * 2

+--+
|钟|
+--+

w * 2 + ( w + 1 ) = w * 3 + 1

+-----+
|钟|灵 |
+-----+

2 * 3 + 1 = 7



Bug
=====

1. BackSpace doesn't work if input stream is from keyboard
SOLUTOIN: listen BS, process it by handle

2. Unknow char is showed sometimes
SOLUTION: pre-process input stream, make sure there are three chars between every tow Chinese words



// src.txt
[[1]]

钟灵毓秀琦略宝货,遥遥笙歌琴瑟相乐,苗条淑女君子好逑,桃花流水堪比太虚

卡农Canon——复调音乐的一种,原意为“规律”。一个声部的曲调自始至终追逐着另一声部,直到最后……最后的一个小结,最后的一个和弦,它们会融合在一起,永不分离。缠绵极至的音乐,就像两个人生死追随。

卡农Canon是一种曲式的名称,这种曲式的特征是间隔数音节不停重复同一段乐曲。一般的演奏法是以大提琴启奏,三把小提琴间隔八拍先後加入,小提琴全部拉奏完全相同旋律,前後也只有三段不同的旋律,每段更是仅有两小节的旋律供重复拉奏;大提琴的调子从头到尾只有两小节,重复达廿八次之多,可是听者却陶醉在这旋律之中,丝毫不会感到单调。能御简如繁,作者可说已臻化境。作者是德国人 Johann Pachelbel (1653 ~ 1706),曾是巴哈的老师。不过有人说是当时某位不知名的作曲家,为了售出此曲而冒称是当时享有盛名的帕卡贝尔的作品。

最出名的卡农是十七世纪德国作曲家Johann Pachelbel (帕海贝尔, 1653-1706)的卡农,全名是《Canon and Gigue in D》(D大调卡农)。因为有一部被提名为奥斯卡最佳影片奖的电影《凡夫俗子》采用它作为电影配乐,这首曲子便广为人知,《我的野蛮女友》同样也在场景中运用了这首作品。

这是个德国作曲家,但德国实在很难让他产生如此美丽的灵感。这是作者在意大利威尼斯时写的音乐,用了回旋曲曲式,有无穷动音乐的元素在里面。而这个音乐之所以在所有卡侬里面特别有名,因为它带着一丝意大利式的忧伤,甜蜜宁静的忧伤。


[[2]]

钟灵毓秀琦略宝货,遥遥笙歌琴瑟相乐,苗条淑女君子好逑,桃花流水堪比太虚

卡农Canon——复调音乐的一种,原意为“规律”。一个声部的曲调自始至终追逐着另一声部,直到最后……最后的一个小结,最后的一个和弦,它们会融合在一起,永不分离。缠绵极至的音乐,就像两个人生死追随。

卡农Canon是一种曲式的名称,这种曲式的特征是间隔数音节不停重复同一段乐曲。一般的演奏法是以大提琴启奏,三把小提琴间隔八拍先後加入,小提琴全部拉奏完全相同旋律,前後也只有三段不同的旋律,每段更是仅有两小节的旋律供重复拉奏;大提琴的调子从头到尾只有两小节,重复达廿八次之多,可是听者却陶醉在这旋律之中,丝毫不会感到单调。能御简如繁,作者可说已臻化境。作者是德国人 Johann Pachelbel (1653 ~ 1706),曾是巴哈的老师。不过有人说是当时某位不知名的作曲家,为了售出此曲而冒称是当时享有盛名的帕卡贝尔的作品。

最出名的卡农是十七世纪德国作曲家Johann Pachelbel (帕海贝尔, 1653-1706)的卡农,全名是《Canon and Gigue in D》(D大调卡农)。因为有一部被提名为奥斯卡最佳影片奖的电影《凡夫俗子》采用它作为电影配乐,这首曲子便广为人知,《我的野蛮女友》同样也在场景中运用了这首作品。

这是个德国作曲家,但德国实在很难让他产生如此美丽的灵感。这是作者在意大利威尼斯时写的音乐,用了回旋曲曲式,有无穷动音乐的元素在里面。而这个音乐之所以在所有卡侬里面特别有名,因为它带着一丝意大利式的忧伤,甜蜜宁静的忧伤。



代码: 全选

 strlen(src) = 105
 rows = 9, cols = 12
----------------------
// 假设矩阵标识如下

00 01 02 03 04 05 06 07 08 09 10 11
10 11 12 13 14 15 16 17 18 19 20 21
20 21 22 23 24 25 26 27 28 29 30 31
30 31 32 33 34 35 36 37 38 39 40 41
40 41 42 43 44 45 46 47 48 49 50 51
50 51 52 53 54 55 56 57 58 59 60 61
60 61 62 63 64 65 66 67 68 69 70 71
70 71 72 73 74 75 76 77 78 79 80 81
80 81 82 83 84 85 86 87 88 89 90 91


// 字符复制顺序
 
09 10 11
19 20 21
29 30 31
39 40 41
49 50 51
59 60 61
69 70 71
79 80 81
89 90 91

06 07 08
16 17 18
26 27 28
36 37 38
46 47 48
56 57 58
66 67 68
76 77 78
86 87 88

03 04 05
13 14 15
23 24 25
33 34 35
43 44 45
53 54 55
63 64 65
73 74 75
83 84 85

00 01 02
10 11 12
20 21 22
30 31 32
40 41 42
50 51 52
60 61 62
70 71 72
80 81 82

----------------------
附件
row_to_col.tar.bz2
(40 KiB) 下载 13 次
头像
lovewine
帖子: 1233
注册时间: 2006-03-25 10:36
送出感谢: 0
接收感谢: 0
联系:

#2

帖子 lovewine » 2008-07-14 16:42

很牛,佩服你
让自由的声音传传传传传传传传天下。。。
Spread the words of freedom.
头像
HuntXu
论坛版主
帖子: 5778
注册时间: 2007-09-29 3:09
送出感谢: 0
接收感谢: 6 次

#3

帖子 HuntXu » 2008-07-14 17:06

:shock:
HUNT Unfortunately No Talent...
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 solcomo » 2008-07-14 17:07

:shock:
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28
送出感谢: 0
接收感谢: 0

#5

帖子 flyinflash » 2008-07-14 17:39

其它没有多少技术含量,估计你没有详细看里面的developing.txt文件,里面有一堆已知的BUG,事实我给的不能算是一个完整的工具

我做它,是为了好玩,我个人已经了解了基本转换原理,所以没有计划再做把更复杂化

完整的,可以看看这里
http://www.wocao.net/guwen.html
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11
送出感谢: 0
接收感谢: 0

#6

帖子 yjcong » 2008-07-14 18:39

个人觉得, 如果是换成斜的, 效果会更好, 更不容易被河蟹

(从左上向右下斜着看)

\个\果\,\的\被\
-\人\是\效\,\河\
--\觉\换\果\更\蟹\
---\得\成\会\不\
----\,\斜\更\容\
-----\如\的\好\易\
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28
送出感谢: 0
接收感谢: 0

#7

帖子 flyinflash » 2008-07-14 18:46

你知道为什么零和一可以构建世界吗?

因为世界是平衡的,你有办法加密,我就有办法解。目前比较理想的方案是图片代替文字

为反河蟹而去做这个没有意义,玩玩好了
头像
yjcong
帖子: 2470
注册时间: 2006-02-28 3:11
送出感谢: 0
接收感谢: 0

#8

帖子 yjcong » 2008-07-14 18:50

flyinflash 写了:你知道为什么零和一可以构建世界吗?

因为世界是平衡的,你有办法加密,我就有办法解。目前比较理想的方案是图片代替文字

为反河蟹而去做这个没有意义,玩玩好了


可以混杂不同颜色的字, 要传达的用一个颜色, 其他的随机。
一梦三年,
松风依旧,
萝月何曾老.


灵幽听微, 谁观玉颜?
灼灼春华, 绿叶含丹.
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28
送出感谢: 0
接收感谢: 0

#9

帖子 flyinflash » 2008-07-14 18:52

1998年始,MIT有个项目就是从实现图片-文字双向转换的,具说已经投入军用
回复

回到 “C/C++/Java”