免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Send_linux
打印 上一主题 下一主题

ChinaUnix“C语言代码”开发大赛!获奖名单公布!(奖品积分已经添加,请大家查收!) [复制链接]

论坛徽章:
0
181 [报告]
发表于 2009-03-25 14:09 |只看该作者
优秀奖  

论坛徽章:
0
182 [报告]
发表于 2009-03-26 09:14 |只看该作者
什么时候寄奖品呢

论坛徽章:
0
183 [报告]
发表于 2009-03-27 23:34 |只看该作者
收到图书,谢谢!

论坛徽章:
0
184 [报告]
发表于 2009-03-28 10:06 |只看该作者
什么时候发积分

论坛徽章:
0
185 [报告]
发表于 2009-03-30 10:22 |只看该作者

很期待!

等待的感觉挺特别的。
但我还是想知道什么时候寄图书呢?

论坛徽章:
0
186 [报告]
发表于 2009-03-30 10:51 |只看该作者
我在北京,已经拿到书了
呵呵,路远的同学可能要多等几天,耐心点啦
aquei 该用户已被删除
187 [报告]
发表于 2009-03-30 21:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
188 [报告]
发表于 2009-03-31 08:54 |只看该作者
没想到 CU 上的文档也用 Word 格式

论坛徽章:
0
189 [报告]
发表于 2009-03-31 16:03 |只看该作者

挺好的,今天中午收到图书!

见到北京和上海的获奖者都收到了图书,挺羡慕的。
没想到,今天中午也收到了。
感觉特好。
Thank you !

论坛徽章:
0
190 [报告]
发表于 2009-04-03 09:44 |只看该作者
第3题的代码,感觉如果不帖出来自己的劳动就浪费了:
maxlen_hash.c:

/*
 * maxlen_hash.c:find  10  largest length string, hash method
 *
 *  Created on: 2009-3-4
 *      Author: ly
 */


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

#define LEN_MAX 2048
#define BUF_MAX (LEN_MAX*2)
#define ONUM 10

#define RET_OK 0
#define RET_FAIL -1
#define RET_WARN_OVER_FLOW 0x2
#define RET_WARN_EXISTS 0x4

typedef struct line_info {
&nbsp;&nbsp;&nbsp;&nbsp;const char *s; /*string */
&nbsp;&nbsp;&nbsp;&nbsp;size_t line_no; /*line number of string*/
} line_info_t;


/* store the string to array[length]
&nbsp;* hash algorithm : string length is the key
&nbsp;* return value : RET_OK : string is accepted
&nbsp;*                RET_FAIL: string can not be unacceptable(too large)
&nbsp;*                RET_WARN_OVER_FLOW: string length is larger than  LEN_MAX  but accepted
&nbsp;*                RET_WARN_EXISTS: some string in this length number had hold the hash position
&nbsp;* */

int mark_line(line_info_t *line, const char *s, size_t len , size_t lno) {


&nbsp;&nbsp;&nbsp;&nbsp;if (len > BUF_MAX - 2) {/* the last element used for error detecting */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return RET_FAIL;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;int ret = 0;
&nbsp;&nbsp;&nbsp;&nbsp;if (len > LEN_MAX) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret |= RET_WARN_OVER_FLOW;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;if (line[len].s) {/* some line already hold the position   */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* just return a warinig*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret |= RET_WARN_EXISTS;

&nbsp;&nbsp;&nbsp;&nbsp;} else {/* a new length for this length number*/

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line[len ].s = s;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line[len ].line_no = lno;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return ret;

}

int main(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;line_info_t li[BUF_MAX]  = {0};
&nbsp;&nbsp;&nbsp;&nbsp;char *s = (char *)malloc(BUF_MAX*BUF_MAX * sizeof(char) );
&nbsp;&nbsp;&nbsp;&nbsp;if(!s ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, "No enough memory , I'm exiting\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;size_t p = 0;



&nbsp;&nbsp;&nbsp;&nbsp;size_t lc = 0;
&nbsp;&nbsp;&nbsp;&nbsp;/*first, the result data area used as a temporary buffer */
&nbsp;&nbsp;&nbsp;&nbsp;while(fgets(s + p, BUF_MAX, stdin)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*trim '\n' of line */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t len = strlen(s+p);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(s[ p + len -1 ] == '\n'){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[p + len - 1] = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--len;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++lc;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ret = mark_line(li, s +p, len, lc);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* second, the temporary buffer will be stored if it's valid */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( (ret == RET_OK )|| (! (RET_WARN_EXISTS&ret))){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*input should be store*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p += len +1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(p + BUF_MAX >  (BUF_MAX*BUF_MAX * sizeof(char)) ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, "invalid input , exceed  MAX buffer length,line:%u\n", lc);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ret == RET_FAIL){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr, "invalid input , exceed  MAX buffer length,line:%u\n", lc);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}



&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;int n =0;
&nbsp;&nbsp;&nbsp;&nbsp;for (i =BUF_MAX-2  ; i >= 0; --i ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(li[i].s){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d:%u:%s\n", i, li[i].line_no , li[i].s);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++n;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n >= ONUM){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return 0;

}

Makefile:




#source file section
SRC= maxlen_hash.c randch.c maxlen_seq.c

DEP=$(SRC:%.c=%.d)
LIB_A = $(SRC:%.c=lib%.a)
BIN=$(SRC:%.c=%)

all(BIN)
#complier configruation
CC=gcc
$(AR) = ar

#
CFLAGS +=
ARFLAGS = rsv


lib%.a:%.o
        $(AR)        $(ARFLAGS) $@ $<

#dependences
%.d:%.c
        $(CC) -MM  $(CFLAGS) $^ \
        | sed s'/:/ $@:/' > $@

ifneq ($(MAKECMDGOALS),clean)
-include $(DEP)
endif

.PHONY:clean test

clean:
        rm -f $(BIN) *.o *.a *.d
test:all
        sh test.sh






测试脚本:
  1. #!/bin/sh
  2. #A test script for maxlen
  3. #
  4. function top10()
  5. {
  6.         #print  10  largest length  strings
  7.         #in reverse length order
  8.         #if two lines are the same in length then print first line of input
  9.         #output format :
  10.         #length:line_number:content
  11.         awk '{print length()":"NR":"$0 }'|sort  -r  -n -u -t : -k 1,1 | head -10

  12. }

  13. BIN=./maxlen_hash
  14. OF=./test/maxlen_hash.of
  15. TF=./test/maxlen_hash.ok
  16. IF=./test/in
  17. RBIN=./randch

  18. #generate a random file
  19. # and split the line larger than 2048 bytes
  20. $RBIN| sed 's/^\(.\{2048\}\).*$/\1\n/g' > $IF

  21. cat $IF|top10 > $TF
  22. $BIN <$IF>$OF

  23. [ -f $OF ] && diff $OF $TF >/dev/null 2>&1
  24. [ $?  -eq 0 ] && echo test PASSED || echo test FAIL
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP