2005年07月26日

生病小想

生病确实是件烦人的事,有痛苦,而且破坏了日常生活规律,打乱了计划。但有某人说了,“塞翁失马,焉知非福”。上医院总让我觉得亏,但根据某人的意思,也就是矛盾的两面性啦,我可以从里面获得一些有用的东西,所以随便想想,随便想想啦~

这次生病,让我认识到5点:

一、人不是神,人会有病。此已被我实践证明,无需多言。

二、人的疼痛来自感觉器官,只要欺骗神经,疼痛感就会消失,此治标,不治本。
我不知道他们给我打得是什么针,我不学医,不懂什么原理。但是打针后痛感明显消失,真是邪门。在我认识观看来,我的病并没有在如此神速的情况下好转,因为是结石,石头还在身体里,就没有理由认为自己的病好了。那是什么在作怪,唯一能给自己的解释是药物欺骗了我的感官。这里我用“欺骗”,并没有什么贬义,那只是“善意的谎言”让自己好过些罢了。

三、人是需要帮助的。
我通常拒绝被帮助,是不想欠人太多,而自己又没有能力还。但对好朋友,我从来都不拒绝的,呵呵。
如果我把你当好朋友,我通常情况下不会对你说 “谢谢”,“不好意思”之类的话的。如果我们再陌生些,那我就会说了,越是陌生人,这类话就说得越多。
我一个人的话,半夜三更的要上医院,对身在疼痛中的来说是多么艰难。可是还好,每次发作,我都有同学在身边。不论出于友情还是出于道义,他们都会送我去医院,也是不求回报的。于此,我也乐于接受,其实心里也十分希望有人来关心我的。呵呵。我想如果有什么他们要我帮忙,我也会尽量帮忙的。
生病的时候(通俗的说法是“患难的时候”),最能看到朋友无私的友情了,呵呵。

四、终于知道英美为什么说“不舒服”为“ not quite myself ”。
在医生问诊的时候,总会问你哪里痛,或是哪里不舒服,而你会说哪里哪里不爽。真的很奇怪,在平时,对自己身体的任何部位都是没感觉的,那是“ myself(我自己)”的时候。当有病,或哪里不舒服的时候,自己能明显感觉出来,那就是“not quite myself (不是我自己)”。就好比你手上贴块胶布,那胶布不是你的,贴在那里肯定能感觉出来(不恰当,但有那个意思能说明就行)。这样的感觉效果很好,能让人知道病患在哪里,以便针对医治。(生物真是精妙的构造,想想也不得不佩服造物主的伟大。)

五、强身健体非常重要。
我的石头在身体里4年了,在4年里大痛过3次,每次半夜痛醒,然后送急诊。前2次没怎么去想,生病了就是生病了,只是觉得生病是痛苦的,做健康人真好,很多健康人身在福中不知福。现在是反省自己的时候了。既然我石头在我身上那么多年了,为什么平时不发作,而是在特定状况下发作?为什么上个月没发作?为什么不下个月发作(似乎言之过早了,呵呵)?政治课上说了,实践中归纳可以得出真理。我实践了那么多次,也该是时候总结归纳一下了:
每次生病,都是在连续累了好几天后(我的累是自我作贱),突然发作。我知道,连续劳累会让人虚弱。电视里也常看到“积劳成疾”的诊断。我虽不是“积劳成疾”,但至少说明了一个道理,病魔是一直watching着你的,当你虚弱的时候,他便乘虚而入了。
我的石头算是一个病魔,它在我身上一潜伏,就是4年(或以上啦)。当我身体虚弱的时候,它就出来做恶了。所以,一个强健的身体对病就有较强的抵抗力。既然知道了它的重要性后,该好好锻炼身体了吧。

关于粗心(写于6.23晚)
我今天考了《计算机网络》,最后一题是计算子网数和主机数目的,它给的子网掩码是255.255.224.0,我当成了255.255.254.0来算,结果8分就扭头走掉了,痛心中。。。。。。
我在《计算机网络》考试计算题第一题算网络负载和吞吐量时,S = G*e^(-G),我差点就忘了 “G*”,后来第二遍看到的时候,才发现错了。
还有,前天考《现代经济管理基础》,算它的需求价格弹性时,把一个乘数2 改成1/2时,结果只把原来结果乘了1/2,后来想想真是冤啊。。。
那人为什么会有粗心?
粗心是什么原因引起的呢?
以下是大家的一些说法:
.
这种错误恐怕只能归结为“粗心”现象,跟学生作业浮躁 、做完不检查的陋习大有关系。
.
一、粗心与动机强度和情堵有关

  心理学的研究表明,中等强度的动机和情绪为认知活动提供最佳背景。强度过高或过低都会对认知活动造成不良影响。缺乏动机,情绪低落,往往造成注意力不集中,神思恍懈。孩子看电视正在兴头上,却被母亲强行关进房间学习。这时,孩子根本无心学习,因此心不在焉,错误百出。很多小学生的四则运算容易出错,把‘3’看成‘8’,把’+’当成’-’。当你给他指出来时,他会毫不在乎地说,有什么了不起,我本来会做的。其原因就是题目太简单,无法激发动机。在这种情况下,应该让孩子知道,我们经常遇到的问题都不会很难,你与别人的区别就在于是否能把简单的事情做好。动机过 于强烈,情绪过于兴奋,则会导致意 识狭窄,思维混乱,甚至头脑一片空白。有些孩子平时谨慎用功,是父母和老师眼中的好学生。可一到考试就发挥不好,平时会做的简单题目也会出错,甚至漏答整张试卷。原因就是他太在乎考试,太想考好了。对这样的孩子,家长不要在考前对孩子耳提面命,也不要表现出过高的期待。让孩子把考试当成学习的一部分,怎样学就怎样考,轻松上阵。

二、粗心是因为缺乏精加工

  迎面走来了张老师。A同学近视眼,说这不是李老师吗?B同学说这明明是张老师。两位老师身材相似而五官相去甚远。A同学只看清轮廓而没有注意细节,因此判断失误。同样道理,学习中的粗心也常常是因为缺乏对认知刺激的精细加工。精加工往往是通过对比和辩别进行的。孩子同妈妈一起去蔬菜市场,见到了韭莱。几天后学校里组织郊游,孩子指着麦苗说这是韭菜,我以前见过。老师拉他来到不远处的蔬菜大棚,说这才是韭菜。孩子说怎么麦子和韭菜这么像。因为在见到麦子之前,他对韭菜只有一个大致的印象。在这之后,他就会为了把二者分开而作出精细加工了。为了防止粗心,有意识地引导孩子进行比较和辨别是重要的。例如,小学生经常分不清’衰’、‘衷”、 ’哀’三个字。老师教他们‘横为衰,竖为衷,中间有口诉悲哀’,学生就能够正确书写和使用了。对刚学拼音的孩子来说,区分’b与‘d’是困难的。教师可以提醒孩子, ’d”与’a’的书写相近。或者让孩子临摹写在卡片上的大一点的字母,也能加深印象。因为大的字母在头脑中形成的表象也较大,事实上是把细节给放大了。

三、粗心是因为概念模糊

  有时,看似简单的粗心背后是概念错误。例如,一个孩子的作业本上是这样写的,’0×6=0′,‘0÷6=0,’’0+6=0′,’0+6=0′。当你指出他的错误时,他的解释是:0就是什么也没有,所以任何一个数与0加减乘除结果都是零。出错的原因是孩子不理解力口减乘除四种运算的含义。再比如,求半圆的周长时,一个孩子只算了圆弧的长度,没有乃口上弦的长度。其实不是他一时疏忽,而是他不理解周长的概念,不知道周长应是一条封闭的曲线。所以,家长和老师还应多多追问孩子犯错误背后的理由,别让粗心的幌子掩盖了问题的真相,错失教育的良机。

四、粗心与个性和生活习惯有关

  有心的老师都会发现,一个班级里的孩子,其个性总是千差万别的。有的粗枝大叶,有的谨小慎微;有的一时兴起,有的有条不紊;有的大喜大悲,有的温和平静。前者比后者更容易犯粗心的毛病。因为非智力因素会对认知活动产生广泛的影响,使认知活动带上个人的特点和风格。一个孩子的房里一团糟,鞋子东一只西一只,他的作业本往往字迹潦草,页面不规整。一个孩子常常丢三落四,做事会凭兴致所至,往往观察没有顺序,思考缺乏条理。因此,从生活做起,从小事做起,培养孩子良好的习惯和个性,能减少学习中的粗心。整理自己的衣橱、抽屉和房间能让孩子,变得仔细,有条理;安排自己的课余时间和复习进度表,能让孩子变得有计划,有顺序;和谐民主的家庭气氛能培养愉悦平和的心境,让孩子做事不骄不躁。这要求家长有足够的耐心,不迁就,不粗暴。这样,你就能够通过改变孩子的行为来改变他的习惯以至于最后改变个性。日积月累,你会发现孩子的粗心渐渐减少。
.
上面的文章是我从网上找的,对粗心问题的探讨算是比较详细的了,看文章之前,我没想到我还有那么深层次的缺陷存在。真是可怜!!算是在不断对自我的认识中完善自己吧。
只要知道不足,对症下药,尽管不保证药到病除,也总有些补助。可怜的俞健伟,看看你自己吧,好好反省一下。
2005年07月10日


今天短学期结束

       关于这次短学期,我有些想不通,我们是软件工程专业的,短学期名为“软件实习”,怎么就是做个人网站呢?本来也许我不会去学网站制作方面的东西的,虽然我知道,网络是将来生活的很大一部分。我觉得,正因为网络太普及,什么鸟都有,加你一个不多,少你一个不少。在我看来,我在这方面发展前途不乐观,所以我舍弃了它。结果,我还是在这个短学期碰到了。
        可能小型网站开发过程可以是软件开发过程的一个缩影吧。老师选这个角度,一来叫我们了解网站设计,二来,也是对项目过程的一次实习。可能于此来说,"软件实习"之名还是可冠的。

        我做的网站是《Gundam SEED》主题的站点。有空整理一下,把有用的东西发上来。

        先看看我的页面吧:

头页

        首页:

首页

2005年07月02日

今天晚上说6:30寝室楼要停电,大家都把电脑关了,出来打红五的打红五,打双扣的打双扣。当然也有挤不上去打的,所以有人提议去踢球。于是,大家去踢球了。说是踢球,只有5个人,只是玩球而已。后来来了朱元,才配成3v3踢,3个人脱上衣,当3个门柱,还一个门柱借用了球门的真门柱,划定了一个小场地踢。

晚上6:30天还亮,不过踢一会儿就黑了,学校球场的灯又不开,球都看不见了。看不见球照样踢,呵呵。踢到8点的样子。不怎么尽兴。

2005年07月01日

今天网上可以查 软件设计师考试 分数。http://www.zjrjks.org

前几天打声讯可以查到,但很多时候都输入准考证号就断了,分明是诈钱。

周海波声讯查到的分数上午只有4分,晕死。今天我帮他上网查了一下,上午:54,下午:65。还好。
子龙兄查出来上午56,下午70,高出我一分啊!我上午54,下午71。确实上午考得不好,不过我考下来估计的时候,觉得上午不会太差,看来我是高估我自己了。可能英语部分我这次错很多,好久没碰英语,单词都不认识,考前做的题运气好对一半,哈哈。

c语言实现wc命令简单功能
 
程序功能简述

c语言实现了linux环境下的wc命令的功能

用法:mywc [选项]…[文件]…

打印出每个文件的字节数,词数,行数,如果文件数超过1个,还会打印出一行总计。当[文件] 缺省时,wc从标准输入设备(终端)读取,此时,[Esc] 键停止输入。

选项:

-c, –bytes 打印字节个数

-m, –chars 打印字母个数

-l, –lines 打印行数

-L, –max-line-length 打印最长行的字节数

-w, –words 打印词数

    –help 打印帮助信息并退出

    –version 打印版本信息并退出

 

编程要点

       1.对参数的出现与否设置标志量(flags)。

       2.在数的时候,明白何时字节数增1,何时字符数增1,何时行数增1,何时词数增1,最长行如何统计,在文件数大于1时,如何统计总合。

       3.需要先读取所有参数,然后再对参数种出现的文件进行统计,如果没有提供文件,则从终端读取并统计。

       4.有良好的用户帮助

 

实现结果:(mywc与系统wc对比)

 

 

[gary@localhost gary]$ ./mywc test

        6       7       23      test

 

[gary@localhost gary]$ ./mywc a b

        154     328     4224    a

        56      55      156     b

        210     383     4380    general

 

[gary@localhost gary]$ ./mywc -w b

        55      b

 

[gary@localhost gary]$ ./mywc -w b -c

        55      156     b

 

[gary@localhost gary]$ ./mywc -w b c -c

        55      156     b

        32      87      c

        87      243     general

 

[gary@localhost gary]$ ./mywc –help

usage: mywc [option]…[FILE]…

Print byte,word,and newline counts for each FILE,and a total line if more than one FILE is specified. With on File,read standard input, press key [Esc] to end inputting

        -c, –bytes     Print the byte counts.

        -m, –chars     Print the character counts.

        -l, –lines     Print the newline counts.

        -L, –max-line-length   Print the length of the longest line.

        -w, –words     Print the word counts.

            –help      Print this usage message and then exit

            –version   Print version information and then exit.

 

Report bugs to <gary@mail.hdss.org>.

 

[gary@localhost gary]$ ./mywc -L b -w

        55      2       b

 

[gary@localhost gary]$ ./mywc c -c –words

        32      87      c

 

[gary@localhost gary]$ ./mywc c -L -c –words

        32      87      2       c

 

[gary@localhost gary]$ ./mywc test -L -c –words

        7       23      6       test

 

[gary@localhost gary]$ ./mywc test b c -L -c –words

        7       23      6       test

        55      156     2       b

        32      87      2       c

        94      266     6       general

 

[gary@localhost gary]$ ./mywc

asdf

 g g

 

aaabc

^[

        4       4       17

 

[gary@localhost gary]$ ./mywc -L -wl

asdf

 g g

the longest line

^[

        3       6       16

 

[gary@localhost gary]$ ./mywc -w -

asdf sdf

sdf dsf

^[

        4

 

[gary@localhost gary]$ ./mywc -b b

mywc: wrong option -"b"

try "mywc –help" to get more infomations

 

[gary@localhost gary]$ ./mywc –hhelp

mywc: can’t identify option "–hhelp"

try "mywc –help" to get more infomations

 

[gary@localhost gary]$ cat >noC

[gary@localhost gary]$ ./mywc noC

        0       0       0       noC

 

 

[gary@localhost gary]$ wc test

      6       7      23 test

 

[gary@localhost gary]$ wc a b

    154     328    4224 a

     56      55     156 b

210     383    4380 总用量

 

[gary@localhost gary]$ wc -w b

     55 b

 

[gary@localhost gary]$ wc -w b -c

55               156 b

 

[gary@localhost gary]$ wc -w b c -c

     55     156 b

     32      87 c

     87     243 总用量

 

[gary@localhost gary]$ wc –help

用法:wc [选项]… [文件]…

Print byte, word, and newline counts for each FILE, and a total line if

more than one FILE is specified.  With no FILE, or when FILE is -,

read standard input.

  -c, –bytes            print the byte counts

  -m, –chars            print the character counts

  -l, –lines            print the newline counts

  -L, –max-line-length  print the length of the longest line

  -w, –words            print the word counts

      –help     显示此帮助信息并离开

      –version  显示版本信息并离开

 

Report bugs to <bug-coreutils@gnu.org>.

 

 

[gary@localhost gary]$ wc -L b -w

55                     2 b

 

[gary@localhost gary]$ wc c -c –words

32                  87 c

 

[gary@localhost gary]$ wc c -L -c –words

     32      87       2 c

 

[gary@localhost gary]$ wc test -L -c –words

      7      23       6 test

 

[gary@localhost gary]$ wc test b c -L -c –words

      7      23       6 test

     55     156       2 b

     32      87       2 c

     94     266       6 总用量

 

[gary@localhost gary]$ wc

asdf

 g g

 

aaabc

      4       4      17

 

 

[gary@localhost gary]$ wc -L -wl

asdf

 g g

the longest line

      3       6      16

 

 

[gary@localhost gary]$ wc -w -

asdf sdf

sdf dsf

      4 –

 

 

[gary@localhost gary]$ wc -b b

wc:无效选项 — b

请尝试执行‘wc –help’来获取更多信息。

 

[gary@localhost gary]$ wc –hhelp

wc:无法识别的选项“–hhelp

请尝试执行‘wc –help’来获取更多信息。

 

[gary@localhost gary]$ cat >noC

[gary@localhost gary]$ wc noC

      0       0       0 noC

 

 

[gary@localhost gary]$ ./mywc test

        6       7       23      test

 

[gary@localhost gary]$ ./mywc a b

        154     328     4224    a

        56      55      156     b

        210     383     4380    general

 

[gary@localhost gary]$ ./mywc -w b

        55      b

 

[gary@localhost gary]$ ./mywc -w b -c

        55      156     b

 

[gary@localhost gary]$ ./mywc -w b c -c

        55      156     b

        32      87      c

        87      243     general

 

[gary@localhost gary]$ ./mywc –help

usage: mywc [option]…[FILE]…

Print byte,word,and newline counts for each FILE,and a total line if more than one FILE is specified. With on File,read standard input, press key [Esc] to end inputting

        -c, –bytes     Print the byte counts.

        -m, –chars     Print the character counts.

        -l, –lines     Print the newline counts.

        -L, –max-line-length   Print the length of the longest line.

        -w, –words     Print the word counts.

            –help      Print this usage message and then exit

            –version   Print version information and then exit.

 

Report bugs to <gary@mail.hdss.org>.

 

[gary@localhost gary]$ ./mywc -L b -w

        55      2       b

 

[gary@localhost gary]$ ./mywc c -c –words

        32      87      c

 

[gary@localhost gary]$ ./mywc c -L -c –words

        32      87      2       c

 

[gary@localhost gary]$ ./mywc test -L -c –words

        7       23      6       test

 

[gary@localhost gary]$ ./mywc test b c -L -c –words

        7       23      6       test

        55      156     2       b

        32      87      2       c

        94      266     6       general

 

[gary@localhost gary]$ ./mywc

asdf

 g g

 

aaabc

^[

        4       4       17

 

[gary@localhost gary]$ ./mywc -L -wl

asdf

 g g

the longest line

^[

        3       6       16

 

[gary@localhost gary]$ ./mywc -w -

asdf sdf

sdf dsf

^[

        4

 

[gary@localhost gary]$ ./mywc -b b

mywc: wrong option -"b"

try "mywc –help" to get more infomations

 

[gary@localhost gary]$ ./mywc –hhelp

mywc: can’t identify option "–hhelp"

try "mywc –help" to get more infomations

 

[gary@localhost gary]$ cat >noC

[gary@localhost gary]$ ./mywc noC

        0       0       0       noC

 

 

[gary@localhost gary]$ wc test

      6       7      23 test

 

[gary@localhost gary]$ wc a b

    154     328    4224 a

     56      55     156 b

210     383    4380 总用量

 

[gary@localhost gary]$ wc -w b

     55 b

 

[gary@localhost gary]$ wc -w b -c

55               156 b

 

[gary@localhost gary]$ wc -w b c -c

     55     156 b

     32      87 c

     87     243 总用量

 

[gary@localhost gary]$ wc –help

用法:wc [选项]… [文件]…

Print byte, word, and newline counts for each FILE, and a total line if

more than one FILE is specified.  With no FILE, or when FILE is -,

read standard input.

  -c, –bytes            print the byte counts

  -m, –chars            print the character counts

  -l, –lines            print the newline counts

  -L, –max-line-length  print the length of the longest line

  -w, –words            print the word counts

      –help     显示此帮助信息并离开

      –version  显示版本信息并离开

 

Report bugs to <bug-coreutils@gnu.org>.

 

 

[gary@localhost gary]$ wc -L b -w

55                     2 b

 

[gary@localhost gary]$ wc c -c –words

32                  87 c

 

[gary@localhost gary]$ wc c -L -c –words

     32      87       2 c

 

[gary@localhost gary]$ wc test -L -c –words

      7      23       6 test

 

[gary@localhost gary]$ wc test b c -L -c –words

      7      23       6 test

     55     156       2 b

     32      87       2 c

     94     266       6 总用量

 

[gary@localhost gary]$ wc

asdf

 g g

 

aaabc

      4       4      17

 

 

[gary@localhost gary]$ wc -L -wl

asdf

 g g

the longest line

      3       6      16

 

 

[gary@localhost gary]$ wc -w -

asdf sdf

sdf dsf

      4 –

 

 

[gary@localhost gary]$ wc -b b

wc:无效选项 — b

请尝试执行‘wc –help’来获取更多信息。

 

[gary@localhost gary]$ wc –hhelp

wc:无法识别的选项“–hhelp

请尝试执行‘wc –help’来获取更多信息。

 

[gary@localhost gary]$ cat >noC

[gary@localhost gary]$ wc noC

      0       0       0 noC

 

程序流程图:


下面是对中间“读入参数设置flags”和“统计输出”分别细化的流程图:

.

.

.

.

(附)程序代码


///////////////////////////

//wc 命令功能c语言程序实现

//02101231 俞健伟

//

#include <ctype.h>

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

void showhelp(void); //显示帮助

void showversion(void); //显示版本

void showerr_s(char * s); //–string选项错误

void showerr_c(char c); //-char选项错误

int main(int argc, char * argv[])

{

     FILE *fp;

     int  nOver = 1;//屏幕输入状态

     int cflag = 0, mflag = 0, lflag = 0, Lflag = 0, wflag = 0;//统计对象标志

     int i = 0, j = 0, k = 0;

     char curChar,preChar;

     long noLines = 0,noWords = 0,noCharacters = 0,noBytes = 0,nomaxlen = 0;

     long tnoLines = 0,tnoWords = 0,tnoCharacters = 0,tnoBytes = 0,tnomaxlen = 0;//全局用量

     long lentemp = 0;

     char * filename[30];//mywc带的文件名

 

     for(i = 1; i<argc; i++)//读入所有参数,if argc == 1,not go into for{}

     {

         if(argv[i][0] == ‘-’)//is options

         {

              if(argv[i][1] == ‘-’)

              {

                   if(strcmp(argv[i],"–help")==0)

                   {

                       showhelp();

                       exit(0);

                   }

                   else if(strcmp(argv[i],"–version")==0)

                   {

                       showversion();

                       exit(0);

                   }

                   else if(strcmp(argv[i],"–bytes")==0)

                       cflag = 1;

                   else if(strcmp(argv[i],"–chars")==0)

                       mflag = 1;

                   else if(strcmp(argv[i],"–lines")==0)

                       lflag = 1;

                   else if(strcmp(argv[i],"–words")==0)

                       wflag = 1;

                   else if(strcmp(argv[i],"–max-line-length")==0)

                       Lflag = 1;

                   else

                   {

                       showerr_s(argv[i]);

                       exit(1);

                   }

              }

              else//short options

              {

                   for(j = 1; j<strlen(argv[i]); j++)

                   {

                       switch(argv[i][j])

                       {

                       case ‘c’:

                            cflag = 1;

                            break;

                       case ‘m’:

                            mflag = 1;

                            break;

                       case ‘l’:

                            lflag = 1;

                            break;

                       case ‘L’:

                            Lflag = 1;

                            break;

                       case ‘w’:

                            wflag = 1;

                            break;

                       default:

                            {

                                 showerr_c(argv[i][j]);

                                 exit(1);

                            }

                       }

                   }

              }

         }

         else//不是选项

         {//文件名处理

              filename[k] = argv[i];

              k++;

         }

     }//读完mywc所带所有参数

 

     if(k == 0)//不带文件名参数,统计屏幕输入

     {

         preChar = 0;

         curChar = getchar();

         noLines = 0;

         while(nOver)

         {

              switch(curChar)

              {

              case ‘\t’:

              case ‘ ‘:

                   if(preChar!=’ ‘&&preChar!=’\t’&&preChar!=’\n’&&preChar!=0)

                       noWords++;

                   noBytes++;

                   lentemp++;

                   break;

              case ‘\n’:

                   if(preChar!=’ ‘&&preChar!=’\t’&&preChar!=’\n’&&preChar!=0)

                       noWords++;

                   noLines++;

                   noBytes++;

                   if(lentemp>nomaxlen)

                       nomaxlen = lentemp;

                   lentemp = 0;

                   break;

              case 4:            //Ctrl+d, end of input

              case 0:            //Can’t be catched??? 

              case 27:      //Esc, end of input

                   nOver = 0;

                   if(preChar!=’ ‘&&preChar!=’\t’&&preChar!=’\n’&&preChar!=0)

                       noWords++;

                   break;

              default:

                   noBytes++;

                   lentemp++;

                   if(isalpha(curChar))

                       noCharacters++;

              }

              preChar = curChar;

              curChar = getchar();

         }

         //根据flags输出

         if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)

              printf("\t%d\t%d\t%d\n",noLines,noWords,noBytes);

         else

         {

              if(lflag == 1)

                   printf("\t%d",noLines);

              if(wflag == 1)

                   printf("\t%d",noWords);

              if(cflag == 1)

                   printf("\t%d",noBytes);

              if(mflag == 1)

                   printf("\t%d",noCharacters);

              if(Lflag == 1)

                   printf("\t%d",nomaxlen);

              printf("\n");

         }

     }

     else//分别对每个文件进行统计,如果2个以上文件,计算全局用量general

     {

         for(j = 0; j<k; j++)

         {

              noLines = 0;

              noWords = 0;

              noCharacters = 0;

              noBytes = 0;

              if( (fp = fopen(filename[j],"r"))==NULL )

              {

                   printf("mywc: %s: not exists or other errors occur\n",filename[j]);

                   continue;

              }

              preChar = 0;

              while((curChar = fgetc(fp))!=EOF)

              {

                   switch(curChar)

                   {

                   case ‘\t’:

                   case ‘ ‘:

                       if(preChar!=’ ‘&&preChar!=’\t’&&preChar!=’\n’&&preChar!=0)

                            noWords++;

                       noBytes++;

                       lentemp++;

                       break;

                   case ‘\n’:

                       if(preChar!=’ ‘&&preChar!=’\t’&&preChar!=’\n’&&preChar!=0)

                            noWords++;

                       noLines++;

                       noBytes++;

 

                       if(lentemp>nomaxlen)

                       {

                            nomaxlen = lentemp;

                            if(nomaxlen>tnomaxlen)

                                 tnomaxlen = nomaxlen;

                       }

                       lentemp = 0;

                       break;

                   default:

                       noBytes++;

                       lentemp++;

                       if(isalpha(curChar))

                            noCharacters++;

                   }

                   preChar = curChar;

              }

         //读到EOF出循环后,判断

              if(preChar!=’ ‘&&preChar!=’\t’&&preChar!=’\n’&&preChar!=0)

              {

                   noWords++;

                   if(lentemp>nomaxlen)

                   {

                       nomaxlen = lentemp;

                       if(nomaxlen>tnomaxlen)

                            tnomaxlen = nomaxlen;

                   }

              }

              fclose(fp);

              //根据标志输出

              if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)

                   printf("\t%d\t%d\t%d\t%s\n",noLines,noWords,noBytes,filename[j]);

              else

              {

                   if(lflag == 1)

                       printf("\t%d",noLines);

                   if(wflag == 1)

                       printf("\t%d",noWords);

                   if(cflag == 1)

                       printf("\t%d",noBytes);

                   if(mflag == 1)

                       printf("\t%d",noCharacters);

                   if(Lflag == 1)

                       printf("\t%d",nomaxlen);

                   printf("\t%s\n",filename[j]);

              }

         tnoLines += noLines;

         tnoWords += noWords;

         tnoCharacters += noCharacters;

         tnoBytes += noBytes;

         nomaxlen = 0;

         }

     }

     if(k>1)//文件数大于1

     {

         if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)//use these as well

              printf("\t%d\t%d\t%d\tgeneral\n",tnoLines,tnoWords,tnoBytes);

         else

         {

              if(lflag == 1)

                   printf("\t%d",tnoLines);

              if(wflag == 1)

                   printf("\t%d",tnoWords);

              if(cflag == 1)

                   printf("\t%d",tnoBytes);

              if(mflag == 1)

                   printf("\t%d",tnoCharacters);

              if(Lflag == 1)

                   printf("\t%d",tnomaxlen);

              printf("\tgeneral\n");

         }

     }

     return 0;

}

 

/////////////////////

//showhelp

//

void showhelp(void)

{

     printf("usage: mywc [option]…[FILE]…\n");

     printf("Print byte,word,and newline counts for each FILE,and a total line if more than one FILE is specified. With on File,read standard input, press key [Esc] to end inputting\n");

     printf("\t-c, –bytes\tPrint the byte counts.\n");

     printf("\t-m, –chars\tPrint the character counts.\n");

     printf("\t-l, –lines\tPrint the newline counts.\n");

     printf("\t-L, –max-line-length\tPrint the length of the longest line.\n");

     printf("\t-w, –words\tPrint the word counts.\n");

     printf("\t    –help\tPrint this usage message and then exit\n");

     printf("\t    –version\tPrint version information and then exit.\n");

     printf("\nReport bugs to <gary@mail.hdss.org>.\n");

}

 

/////////////////////

//showversion

//

void showversion(void)

{

     printf("mywc by imitating wc in Redhat 9.0\n");

     printf("Written by Gary(02101231).\n");

     printf("This version is free.\n");

}

 

/////////////////////

//showerr_s

//

void showerr_s(char * s)

{

     printf("mywc: can’t identify option \"%s\"\n",s);

     printf("try \"mywc –help\" to get more infomations\n");

}

 

/////////////////////

//showerr_c

//

void showerr_c(char c)

{

     printf("mywc: wrong option -\"%c\"\n",c);

     printf("try \"mywc –help\" to get more infomations\n");

}

 

c语言实现more命令简单功能
 
程序功能简述
        利用linux下的curses库,用c语言实现了linux环境下的more命令的功能子集,能够在24*80的终端(窗口)屏幕全屏翻屏。
        键入mmore filename 后(mMore.c源文件编译成可执行文件mmore),mmore先初始化自己的窗口,然后分屏显示文件内容。
        键盘按键:
                n/N往下翻屏(无需回车,直接接收,屏幕不显示所按键对应字符)
                b/B 往回翻屏(无需回车,直接接收,屏幕不显示所按键对应字符)
                q/Q 退出more并关闭窗口,回到终端。(无需回车,直接接收,屏幕不显示所按键对应字符)
 
编程要点
       1.需要知道curses库中常用函数,会使用这些函数。
       2.文件需要读到缓冲(buffer)中,以方便频繁换屏显示时读取所需内容。
       3.建立数据结构,存储每屏显示开始点在buffer中的确切位置,当需显示该屏内容时,及时找到起始点读取并显示。
       4.处理长于80byie的行恰好位于前后两屏显示的中间时的情况。(比如一行有90字节,则前80字节在一屏结束行显示,后10字节在接下去一屏的开始行显示。)
       5.编译时不要忘记连接ncurses库。(我用:gcc mMore.c –o mmore –l ncurses)
 
实现结果
程序流程图

(附)程序代码


///////////////////////////////

///more 功能的c语言实现

///02101231 Gary

///

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <curses.h>

 

#define SCREEN_LINES 22     //show (0->SCREEN_LINES)SCREEN_LINES+1 lines

int getoneline(char * a);   //得到一行的长度

 

int main(int argc, char * argv[])

{

     FILE *fp;

     char filename[20];

     long filelength, pointer;

     char *buffer;          //文件缓冲

     char CLine[512], key;

     int linenum, curline;

     int i,len, *points,p;

     int curX,curY, preY;        //光标在屏幕中的坐标(Y为行,X为列)

 

     if(argc < 2)

     {

         fprintf(stderr, "usage: %s filename\n",argv[0]);

         exit(1);

     }

 

     strcpy(filename, argv[1]);

 

     if((fp = fopen(filename, "r")) == NULL)   //打开文件

     {

         fprintf(stderr,"file %s can not be opened!\n", filename);

         exit(2);

     }

 

     filelength = 0L;

     fseek(fp, 0L, SEEK_END);

     filelength = ftell(fp);              //得到文件长度

 

     if((buffer = (char*)malloc(filelength+1)) == NULL)

     {

         fprintf(stderr,"not enough memery for store the file!\n");

         exit(3);

     }

 

     memset(buffer,0×00,filelength+1);

 

     fseek(fp, 0l, SEEK_SET);

 

     linenum = 0;

     pointer = 0L;

 

     while(!feof(fp))   //文件进缓冲

     {

         memset(CLine,0×00,512);

         fgets(CLine,512,fp);        //Cline 可能越界,不过前面memset0了,因该可以。

         len = strlen(CLine);

         strncat(buffer + pointer, CLine, strlen(CLine));

         pointer += strlen(CLine);

         if( len/80>0 && len%80>0 )

              linenum += len/80+1;

         else if(len>80 && len%80==0)

              linenum += len/80;

         else

              linenum++;

     }

 

     for(i = 0; i<filelength+1; i++)      //有些文件的行末不光一个‘\n’,而以"\r\n"结束,去‘\r’

     {                                    //否则addstr(str),或printw(format,str)对它不能正常显示

         if(*(buffer+i)==’\r’&&*(buffer+i+1)==’\n’)

              *(buffer+i)=’ ‘;

     }

 

     if( (points = (int *)malloc((linenum/SCREEN_LINES +1)*sizeof(int))) == NULL )//每屏始点记录数组

     {

         fprintf(stderr,"not enough memery!");

         exit(3);

     }

 

     pointer = 0l;

     curline = 0;

     p = -1;

 

     curX = curY = preY = 0;

     initscr();         //初始化窗口

     cbreak();     //除了 DELETE CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取

     noecho();     //屏幕上不显示在终端上

     intrflush(stdscr,FALSE);    //??不是很清楚。。。

     keypad(stdscr,TRUE);        //可以使用键盘上的一些特殊字元, 如上下左右等方向键

     refresh();         //首次使用,清屏

     while(1)

     {

         move(curY,curX);

         if(curline == 0)

         {

              //record the point that may return;

              points[++p] = pointer;

         }

         len = getoneline(buffer + pointer);

         memset(CLine,0×00,512);

         strncpy(CLine,buffer + pointer, len);

         printw("%s",CLine);         //在窗口屏幕中输出CLine

         preY = curY;

         getyx(stdscr,curY,curX);//得到当前的光标坐标

         if(curY>SCREEN_LINES)  //长行跨屏显示时,pointer记录下一屏的起始点的正确地点

         {

              if(len<=(SCREEN_LINES+1-preY)*80)

                   pointer += len;

              else

                   pointer += (SCREEN_LINES+1 – preY )*80;

         }

         else                   //一般情况下的pointer

              pointer += len;

         curline = curY;

         if(curY>SCREEN_LINES || p*(SCREEN_LINES+1)+curY+1>=linenum )//屏幕显示满,或文件终结

         {

              mvprintw(SCREEN_LINES+1,0,"                                                                                ");

              attron(A_REVERSE);

              mvprintw(SCREEN_LINES+1,0,"  —This is Gary(02101231)’s mmore!—  [ b/B: back, n/N: next, q/Q: quit ]   ");

              attroff(A_REVERSE);

              move(SCREEN_LINES+1,79);

              refresh();         //显示屏幕给用户看

wait:

              key = getch();     //得到按键命令[ b/B: back, n/N: next, q/Q: quit ]

              switch(key)

              {

              case ‘b’:

              case ‘B’:

                   if(p>0)       //得到需要的起始点,points数组中已存

                   {

                       pointer = points[--p];//point at SCREEN_LINES or n lines before

                       p–;

                   }

                   else

                   {

                       pointer = 0;

                       p–;

                   }

                   curY=curX=0;

                   curline = 0;

                   clear();      //清屏

                   break;

              case ‘n’:

              case ‘N’:

                   if(p*(SCREEN_LINES+1)+curY+1 >= linenum)//文件终结,不能下翻页

                   {

                       goto wait;

                   }

                   curY=curX=0;

                   curline = 0;

                   clear();      //清屏

                   break;

              case ‘q’:

              case ‘Q’:

                   endwin();     //结束,关闭窗口,回到终端。

                   exit(0);

                   break;

              default :

                   goto wait;

                   break;

              }

         }

     }

 

     endwin();

     fclose(fp);

     free(points);

 

     return 0;

}

 

////////////////////////////

///getoneline

///

int getoneline(char * a)

{

     int lenofline = 0;

     while(*a != ‘\n’ && *a != ‘\0′)

     {

         lenofline++;

         a++;

     }

     if(*a == ‘\n’)

         lenofline++;

     return lenofline;

}