作业班子 作业班子
关注数: 2 粉丝数: 8 发帖数: 862 关注贴吧数: 1
曾经走过的路 来公司已经两个月了,在这里做的主要是web开发,用javascirpt,html,php,mssql,相对于c来说,javascript算比较简单的。在c里面很多需要用复杂的语句实现的功能已经写成了现成的库函数,比如你不需要专门写一个算法来计算两个字符串的匹配。可以直接用正则表达式对象,你不需要专门分开写几个链表和数组来存储不同的字符和纯数字混合的变量。可以直接用array对象。当然,类似还有很多。但是,c是基础。学好c,学好数据结构和算法,当你在使用高级语言的时候。你可以写出比一般的人更加高效,更加简练的程序。你可以想到人家想不到的思路和方法。可以少走很多弯路。当我现在回头在看当时在家里自学走过的几个月艰难的道路的时候,心里会有阵阵的窃喜,确实是当时学得还算不错的基础,帮住我来这里站住了脚跟。因为基础语句掌握的很牢固,所以我来公司开始后期的学习,没有遇到多大的困难(当然困难还是有的)。当时的想法很简单:考过二级,对计算机的了解深入一点,好找工作,其实我丝毫没有想到今天我会走上程序员的道路。那个时候在家里,每天对着屏幕,一题题的做书上的习题。找一些有意思的东西,写简单的程序和算法。一天天过去了,当我看完了三四本基础的书以后,当我从c看到数据结构,当我看到太难的地方实在学不过去的时候。我发现,写程序已经变成了我的一种兴趣和爱好。或者说,它已经融入我的生活。哥跟我说:你要是想做软件,去贵州吧,我有个朋友在哪里,去学技术。.....我记得来公司的第一天,老总跟我说一句让我印象深刻的话:"...来了,你要有压力,我不希望到时候看到你做不好,我叫你哥把你领回去."当时我有一个理想,即使没有学过一天的计算机的课程,我也要做中国最优秀的程序员。学习期限是两个月。开始的三四周(第一周是学习其他的东西),每天从早到晚,拿着javascript,php和mssql的基础书籍,狂啃。对这屏幕,代码,代码。不停的敲。当我有一天发现,我居然在如此短的时间里面,把这些基础都掌握了的时候,我知道,迟早有一天,我会实现自己的理想。项目组长分给我第三周的任务。熟悉公司已有的系统,修改。一个最简单的模块,7个文件,近四五千行代码,一下字塞在我面前。晕天转地,我从来没有接触过这么多的代码,前后台的控制,相当复杂。好多不懂的东西,我想起项目经理跟我说过的一句话:“基础是关键”。当时我就想,自己选择的道路,一定要走下去。耐着性子,一点点的看,一条语句,一条代码的看,看到我忍耐不了,心绪紊乱的时候。还在跟自己说,坚持,坚持。总会过去的。当我把第四周任务提交的时候,组长跟我说,行了,你入组了。。我能和那些学计算机专业的同志一样做得好工作。不要说c难学,难是因为你不喜欢,你不爱好,你不是真正把它当你的朋友。同事跟我说编程是一门艺术。我笑笑。小的时候我就很羡慕那些会写程序的人,羡慕黑客,他们牛啊,能写出一些常人看不懂的奇怪符号,然后把电脑玩转,如掌中物。直到今天,我依然觉得写程序是让人羡慕的事情。你可以写人家看不懂的东西,然后别人会说,牛x。需要做的,只是静下心来克服你所遇到的困难。看到你的目标,然后前进。
Astar2007百度之星程序设计大赛网络资格赛 第一场1.水果开会时段每个百度工程师团队都有一笔还算丰裕的食品经费,足够每天购置多种水果。水果往往下午送达公司前台。前台的姐姐们只要看到同时出现五种或以上的水果,就称之为“水果开会”。从搜索引擎切词的语法角度,只要两种水果的名字中有一个字相同就属于同样的类别。例如“小雪梨”和“大雪梨”是同一种水果,而“核桃”和“水蜜桃”也被认为是同一种水果。尤其要指出的是,如果有三种水果x, y, z同时在前台出现,且x和y是同一种水果,y和z也是同一种水果的时候,x和z在此时也被认为是同一种水果(即使x和z并不包含相同的字)。现在前台的姐姐们想知道,今天是否有“水果开会”——五种或更多的水果同时在前台出现。输入格式输入的第一行只有一个整数n,表示购置水果的组数。接下来的n行表示水果的到达时间、取走时间(时间用1200到1900之间的正整数表示,保证取走时间大于到达时间)。剩下的字符串以空格分割每一种水果。如“1400 1600 雪梨 水蜜桃”,表示下午两点到四点(包含两点和四点这两个时间点),雪梨和水蜜桃会在前台等待开会。每种水果名称由不超过十个汉字组成。输出格式输出仅一行,包含一个字符串Yes或No,分别表示今天水果开会与否。 输入样例1 例31200 1400 雪梨 柠檬1300 1400 西瓜 苹果1400 1800 花生 水蜜桃 输出样例1 例Yes输入样例2 例31200 1400 雪梨 柠檬1400 1500 哦 大梨 呀1500 1800 咦 大梨输出样例2 例No 样例解释在样例1中,时刻1400有六种水果在前台;在样例2中,由于雪梨和大梨在任何时刻都是同一种水果,最多只有四种水果同时在前台。 评分规则1程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过1秒,否则该用例不得分;2要求程序能按照输入样例的格式读取数据,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;3该题共有10个测试数据集,每组数据均满足n<=10,每个时段最多有10个水果,一共不超过50个水果;4该题目20分。
哈夫曼编码生成程序 #include #include #define MaxSize 50typedef struct{ char c; //代码; int w; //代码权值; char code[MaxSize]; //代码的Huffman编码; }HuffCode[MaxSize];typedef struct{ int Weight; //权值; int LChild,RChild,Parent; }HTNode,HuffTree[MaxSize];//================================================================================void HuffmanTree(HuffTree HT,int length,HuffCode hc); //生成Huffman树;void SelectHTNode(HuffTree HT,int n,int *min1,int *min2); //查找最小和次小序号;void HuffmanCode(HuffTree HT,int len,HuffCode hc); //生成Huffman编码;//================================================================================int main(void){ HuffTree HT; //Huffman树; HuffCode HC; //Huffman编码; int i,len; printf("<<<< Huffman编码生成程序 >>>>\t\tby Haroldi.\n\n 请帮助评价一下思路及改善意见!\t多谢了:-)...\n\n\n\n"); printf("\n输入代码数量:"); scanf("%d",&len); system("cls");printf("代码数量:%2d\n\n",len); printf("输入代码及权值(e.g.: \"a16[回车]\" ):\n"); for(i=1;i <= len;i++) { while(getchar() != '\n') NULL; printf("No.%2d: ",i); HC[i].c = getchar(); scanf("%d",&HC[i].w); } HuffmanTree(HT,len,HC); HuffmanCode(HT,len,HC); printf("\n输出Huffman编码:\n"); for(i = 1;i<=len;i++) { printf("\n %c :",HC[i].c); puts(HC[i].code); }//测试Huffman树结构; printf("\n\n输出Huffman树结构:");system("pause"); printf("\nHT[i]:\t权值\t双亲\t左孩子\t右孩子\n"); for(i = 1;i<2*len;i++) { if(i <= len) printf("(%c)",HC[i].c); printf("%2d:\t %2d;\t%2d,\t %2d,\t %2d.\n",\ i,HT[i].Weight,HT[i].Parent,HT[i].LChild,HT[i].RChild); } return 0;}//================================================================================void HuffmanTree(HuffTree HT,int length,HuffCode hc) //Huffman树初始化;{ int i,min1,min2; HT[0].Weight = 65535; for(i = 1;i <= length;i++) { HT[i].Weight = hc[i].w; HT[i].LChild = HT[i].RChild = HT[i].Parent = -1; } for(;i < 2*length;i++) //i初值 = length+1; { HT[i].LChild = HT[i].RChild = HT[i].Parent = -1; } for(i = length+1;i < 2*length;i++) { SelectHTNode(HT,i,&min1,&min2); HT[min1].Parent = i; HT[min2].Parent = i; HT[i].LChild = min1; HT[i].RChild = min2; HT[i].Weight = HT[min1].Weight + HT[min2].Weight; }}//================================================================================void SelectHTNode(HuffTree HT,int n,int *min1,int *min2) //查找最小和次小序号;{ int i; *min1 = *min2 = 0; for(i = 1;i < n;i++) { if(HT[i].Parent == -1) { if(HT[*min1].Weight >= HT[i].Weight) { *min2 = *min1; *min1 = i; } else if(HT[*min2].Weight > HT[i].Weight) *min2 = i; } }}//================================================================================void HuffmanCode(HuffTree HT,int len,HuffCode hc) //生成Huffman编码;{ int i,j,tc,Stack[MaxSize],top = -1; char flag[MaxSize]; HTNode th; for(i = 1;i <= len;i++) { top = -1; //栈初始化; j = 0; //hc[i].code串首位置偏移; th = HT[i]; //当前结点th; tc = i; //当前结点标记tc; while(th.Parent != -1) { //当前结点th双亲P入栈,由P的孩子是th,确定flag;确定下次结点标记tc; Stack[++top] = th.Parent; if(HT[th.Parent].LChild == tc) {flag[top] = 'L'; tc = th.Parent;} if(HT[th.Parent].RChild == tc) {flag[top] = 'R'; tc = th.Parent;} th = HT[Stack[top]]; //下一结点; } while(top != -1) { if(flag[top] == 'L') hc[i].code[j++] ='0'; else hc[i].code[j++] ='1'; Stack[top--]; //出栈; } hc[i].code[j] ='\0'; //当前串结束; } }//================================================================================
二叉树遍历 #include "stdlib.h"#include "stdio.h"#include "iostream"using namespace std;template struct BTnode{ T d; struct BTnode *left; //左指针域 struct BTnode *right;//右指针域 };template class Binary_Tree{ public: Binary_Tree(){ head = NULL; } //构造函数,初始化二叉树链表为空 void create_Binary_Tree(); //建立二叉树链表 void pre_trav_Binary_Tree(); //前序遍历 void in_trav_Binary_Tree(); //中序遍历 void pos_trav_Binary_Tree(); //后序遍历 private: struct BTnode *head; //头指针 };template void Binary_Tree ::create_Binary_Tree(T end){ T x; cin >> x; //输入第一个结点值 if(x == end) return; //第一个结点值为结束符号 p = new struct BTnode ; //申请空间存储二叉树结点 p->d = x;p->left = NULL; p->right = NULL; head = p; //二叉树根结点 create(p,1,end); //输入左结点值 create(p,2,end); //输入右结点值 }template static create(struct BTnode *p,int k,T end){ BTnode *p; //二叉数结点 T x; if(x != end) { q = new BTnode ; //申请新结点 q->d = x; q->right = NULL; q->left = NULL; if(k == 1) p->left = q; //连接到左子树 if(k == 2) p->right = q;//连接到右子树 create(q,1,end); //输入左子树结点值 create(q,2,end); //输入右子树结点值 } return 0; }//前序遍历 template void Binary_Tree ::pre_trav_Binary_Tree(){ BTnode *p; p = head; pre_trav(p); cout << endl; return;}template static pre_trav(BTnode *p){ if(p != NULL) { cout << p->d << endl; //输出根结点值 pre_trav(p->left); //遍历左子树 pre_trav(p->right); //遍历右子树 } return 0; }//中序遍历 template void Binary_Tree ::in_trav_Binary_Tree(){ BTnode *p; p = head; in_trav(p); cout << endl; return;}template static in_trav(BTnode *p){ if(p != NULL) { in_trav(p->left); cout << p->d << endl; in_trav(p->right); } return 0; }//后序遍历 template void Binary_Tree ::pos_trav_Binary_Tree(){ BTnode *p; p = head; pos_trav(p); cout << endl; return;}template static pos_trav(BTnode *p){ if(p != NULL) { pos_trav(p->left); cout << p->d << endl; pos_trav(p->right); } return 0; }没有写主函数.
学习方法和学习效率 老是看到吧里有些朋友发帖子:感觉对于学习c语言无从下手,特别是刚入门的朋友.看到那些奇怪的,不合常理的符号,感觉完全是摸不着路一样.然后写这篇帖子,谈一下个人的学习方法和学习效率,希望对大家有帮助,特别是新手,书的选择首先选择一本或者两本,开始学习的时候,书不要过多,多了自己看不完,而且每一本书,作者都有自己的思路和写法习惯,然后现在市面上的书很多编写都不是很好,纰漏百出.看的多了反而感觉思维太混.一些印刷的错误或者其作者本来就写的不正确的程序,对于初学者或者是不懂的朋友,要花许多的时间把错误找出来.很是麻烦.我以前发的教材是北邮出版的,c语言程序设计.基本上教材上面的例子,就算照抄的话,3个就有2个要出现错误.上机课的时候,大家都不怎么会,就把例子抄下来.出了错,不能够通过编译,就不停的问老师.白白浪费了许多时间.我感觉现在编写书的许多作者,在编写的时候,遇到些简单的程序,随手一写,然后就印刷上了书,也没经过调试得到正确的结果.最后出现了些许错误.也不管三七二十一,只要书能卖的好,就行了.这是相当不负责任的.误导读者.开始学习,可以看看潭浩强的c程序设计,老潭的书卖得好,还是有他的理由的,错误比较少,然后讲的也比较通俗易懂,清华出的书我感觉都还可以.习惯和方法贵在坚持,每天看.一天不要搞懂很多的问题,但求把看过的一部分的每一个环节搞清楚,实在搞不清楚的,先跳过去,学习逐渐深入,看了后面在看前面,前后的知识是相通相连的.我一般都会把书上的例子一个一个的敲到计算机上面,然后调试,运行.不要看过了就以为自己懂了,那是不好的,就算让你看100编,你输入到机器里面,还是可能会出错,一个简单的main(){ printf("hello world.") }你就算这样背了下来,还是出错,因为你没有注意到语句少了分号,为什么这里有一个分号.只有自己把代码输入,机器编译通顺了,你才明白自己错在那里.当敲的代码越来越多,熟练度越高,编译再次出现错误,就知道错在那里.如何更正.还有一个好处就是可以发现一些错误,这些错误涉及到当前没有学习过的知识.然后通过逐渐深入的学习,在回想以前出错的,就知道当时为什么会出错.把这里改成main(){ print("hello world");}编译系统会报出不同的错误结果比如这个函数没有写头文件,在某写c++的编译器中也不能通过,当你学习过c++的一些相关知识以后,你就会逐渐明白其中的道理.为什么要使用头文件等等.错误是相当重要的,书上只会告诉你怎么写一个对的程序,程序的格式,程序怎么写.不会告诉你出了错误怎么修正,如何处理,靠自己不断的摸索,才会有新的心得和体会.把课后的习题做完,做好,基本上都弄懂,习题是检验你这一章学习怎么样的一个标准.自己想,自己做,写出简单的算法,不懂的,上论坛,上c吧,发帖子,会有人告诉你的,不要拿着书上的练习跑到论坛来求代码,这是不好的,也没有人愿意告诉你.谁都愿意帮助那些自己思考的朋友,不愿意帮助像乞丐一样不劳动就指望人家给你代码写好了把作业交差了事或者是只为了应付考试蒙混过关的人.那样的人不是真正的喜欢编程,不指望提高自己的水平,也不需要我们帮助.学习后面的知识的时候,如果遇到以前的问题,再把掌握的代码敲一遍,敲两遍,敲n遍提高熟练度,更加可以发现新的问题.mian(){int a = 5;printf("%d",a);}谁都知道输出5,把程序改从一小处mian(){int a = 5;printf("%d");}程序是通不过编译呢,还是输出奇怪的字符或者地址.相信有部分朋友不知道.(我也不知道)3不断深入有如许多朋友发帖子说的,经常把一些时髦的语言挂到嘴边,比如说我要学c#好,还是,java好,不如把基础的东西弄懂弄通.在我看来,在没有学习好c 之前最好不要学习其他任何的语言,不要想到c#,java里面没有指针,没有复杂的东西,可以避难就易,基础的东西不学好,就像做的很华丽的豆腐渣工程,再漂亮,也是会倒的.学完了c ,学习数据结构,学完了,学习计算机编译原理,当你把这三门课都掌握的时候,再开始学习c++,c#,或者是java就很容易,也快得多,把平时用的多的算法写下来,记住,把基础的学好以后,不断往后的学习,你会发现,知道的东西越多,不知道的东西越多,软件行业的博大精深,任何一个小的领域,比如c ,也许穷尽我门毕生的精力才发现自己错学只不过是边陲一角.因为我自己的学习也在初学阶段徘徊,所以也不知道应该更加深入的学习的方法,但是相信知识积累到一定的程度.你自然就知道自己往哪方面发展.写了好多也累了,总之希望对大家有所帮助.如果有讲的不好的也请大家不要骂.还有祝c吧万年红火
线性表的建立,插入和删除 #include "stdlib.h"#include "stdio.h"#include "string"#include "iostream"using namespace std;template class sq_List{ public: sq_List(int c,int l){cap = c;len = l;} //构造函数,初始化表长度和空间容量 void creat_List(); //创建空的顺序表 T check_List(); //检测顺序表的状态 void input_List(); //输入顺序表的元素 T *insert_List(int pos,int num); //插入元素 T *delete_List(int pos);//删除元素 void show_List(); //输出新表 void free_List(); //释放空间 private: int cap; //存储空间容量 int len; //顺序表的长度 T *p; //模板类型指针 };//建立空的顺序表 template void sq_List ::creat_List(){ p = new T[cap]; //指向动态开辟的一维数组空间的首地址 }//检测顺序表 template T sq_List ::check_List(){ if(cap == len) return -1; else if(len == 0) return 0; else return 1; }//输入顺序表的元素,输出 template void sq_List ::input_List(){ int i; for(i = 0;i > *(p+i); for(i = 0;i T *sq_List ::insert_List(int pos_in,int num){ int i; if(cap == len) cout << "上溢错误" << endl;//顺序表已满的情况 if(pos_in>len) pos_in = len+1; //插入位置在表的最后一个元素之后,表中元素不需要移动 if(pos_in<1) pos_in = 1; //插入元素在表的第一个元素之前,需要移动 表的所有元素 for(i = len;i>=pos_in;i--) p[i] = p[i-1]; p[pos_in-1] = num; //插入新元素 len++; //表长度加一 return p; //返回首地址 }//删除元素 template T *sq_List ::delete_List(int pos_de){ int i; if(len == 0) cout << "下溢错误" << endl; //顺序表为空表,表中没有元素 if(pos_de<1||pos_de>=len) cout << "没有这个元素" << endl;//表中没有待删除的元素 for(i = pos_de;i void sq_List ::show_List(){ int i; for(i = 0;i void sq_List ::free_List(){ delete []p; }int main(){ sq_List list(10,7); list.creat_List(); list.input_List(); list.check_List(); list.insert_List(5,26); list.delete_List(8); list.show_List(); list.free_List(); system("pause"); return 0; }
帮改,输入今天计算明天的程序 #include "stdio.h"getday(Date today); /*声明不正确*/int judge_year();struct date{ int year; int month; int day;};main(){ typedef struct date Date; Date today,tomorrow; printf("Please input year:\n"); scanf("%d",&today.year); printf("Please input month:\n"); scanf("%d",&today.month); printf("Please input day:\n"); scanf("%d",&today.day); printf("Today is %d.%d.%d",today.year,today.month,today.day); getday(today); printf("Tomorrow is %d.%d.%d",tomorrow.year,tomorrow.month,tomorrow.day); /*在tomorrow赋值前使用了*/ getch();}judge_year(Date today) /*判断闰年*/{ if(today.year%4 == 0 && today.year%100 != 0) return 1; else if(today.year%100 == 0 && today.year%400 != 0) return 1; else return 0;}getday(Date today) /* 计算明天的日期*/{ switch(today.month) { case 1: case 3: case 5: case 7: case 8: case 10: /*有31天的月份*/ { if(today.day<31 && today.day>0) tomorrow.day = today.day+1; else if(today.day == 31) { tomorrow.month = today.month+1; tomorrow.day = 1; } else printf("Date error!"); }break; case 4: case 6: case 9: case 11: /*有30天的月份*/ { if(today.day<30 && today.day>0) tomorrow.day = today.day+1; else if(today.day == 30) { tomorrow.month = today.month+1; tomorrow.day = 1; } else printf("Date error!"); }break; case 2: /*2月份*/ { if(judge_year(today)) /*当月份为2月时,首先判断是否为闰年*/ { if(today.day<29 && today.day>0) /*闰年情况*/ tomorrow.day = today.day+1; else if(today.day == 29) { tomorrow.month = today.month+1; tomorrow.day = 1; } else printf("Date error!"); } else /*非闰年情况*/ { if(today.day<28 && today.day>0) tomorrow.day = today.day+1; else if(today.day == 28) { tomorrow.month = today.month+1; tomorrow.day = 1; } else printf("Date error!"); } }break; case 12: /*12月*/ { if(today.day<31 && today.day>0) tomorrow.day = today.day+1; else if(today.day == 31) { tomorrow.year = today.year+1; tomorrow.day = 1; } else printf("Date error!"); }break; } default :printf("Date error"); return tomorrow;}
1 下一页