Giter Club home page Giter Club logo

codebase's Issues

Assignment1 TA's solution

今天上机课上提到头文件错误,应该在题目发布前处理。以后争取再发布作业之前先找人做一遍。

  1. 现在因为已经有同学拷贝到自己的目录去了。我没有办法push过去。
  2. 同学们知道有这么一个错,自己思考一下,为什么那样的头文件不好。自己进行修改
  3. 改好后看一下TA的参考代码。

以下是TA的参考代码
在TA/assignment1/ArrayListBase & ArrayListWithIterator下。
(建议同学们写好自己的代码之后再查看):
#65 这边有一些comment最好扫一遍。

因为代码上不能直接评论,所以评论移步pull request上。
https://github.com/ds-sww/codebase/pull/65/files

欢迎指出错误~>_<

关于BM算法的一点问题

BM算法在开始时要进行预处理,即要对字母表中的每一个字符计算“坏字符”的移动距离,那在处理ASCII的时候还好说,可是GB2312或者Unicode的情形怎么办?

Rule of Three.

如果类需要析构函数,则它也需要赋值操作符号,和复制构造函数

合成的赋值构造和复制构造函数都是 逐个成员赋值 当是指针的时候会有错误。

这个是TA在看书的时候发现的, TA的实现也是错误的

#include<iostream>
#include<cstdio>

using namespace std;

class Array {
    private :
        int * data;

    public :
        Array() {
            cout << "In Array()" << endl;
            data = new int[10];
        }

        ~Array() {
            cout << "In ~Array()" << endl;
            delete [] data;
        }
};

int main() {
    Array array;
    Array array2 = array;
    return 0;
}

输出:

In Array()
In ~Array()
In ~Array()
Main(26559,0x7fff7d5f1310) malloc: *** error for object 0x7fc23b403960: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
make: *** [run] Abort trap: 6

原因就是,array2=array 这里用了合成的默认的赋值构造函数。
指针被复制过去,但是内容并没有被复制,两个类共享了一块空间。但是被析构了两次。

Assignment 1 issue

所有调用均是返回值而不是引用,传入全部使用pass by value而不是pass by ref.

能不能不要把C++写成java……

然后显式释放iter是啥意思没有看懂……只能同时获得一个iter?
然后我把Iterator的hasNext实现为return false就能通过全部的测试? 好像很厉害!

UPDATE1: 为啥Iterable的实现是返回一个iterator的指针?

Assignment4 值得关注的提交

TA说(抛砖引玉)

TA希望构建一个这样的氛围
0. 玩得开心

  1. 分享
  2. 交流
  3. 互助

这需要同学们

  1. 积极Review其他同学代码,给高质量的评论
  2. 持续 改进自己代码,几乎写不出没有问题的代码, 这么说吧,大家看看自己去年写的代码,什么感觉?
  3. 提问题和解答。在Issues中提出经过自己的思考的问题。给出经过思考的回答。
  4. 贡献自己的能力,为我们的课程项目做贡献

有一点我想指出来: 我们在创造
不知道你们体会我的心情么,不知道你们曾有过,或者将来可能有我这样的想法。
之前某天的某门课,当我在用MIT或其他学校的其他人设计的实验or Assignment。我曾想过“复旦人自己设计得出来么?”
所以想想我们即将要做的事情, TA的兴奋之情你们体会到了么?

对于我本人来说,我希望在课程结束后,我可以拍拍自己胸脯说自己创造了一些价值。

对于你们来说

  1. 大家玩得开心,大家能喜欢计算机这个专业。这是个很艰巨的任务,但是我想至少要能给大家正面的影响。
  2. 这是一门数据结构课程, 我会尽力最好Assignment的设计,帮助大家提高专业能力。
  3. 我希望大家能感受到和我一样的兴奋之情!这是很赞的。

TA就是喜欢bibi。扯一堆dan。
Anyway, Have fun and good luck, everybody!

不用自己释放指针,是不是可以这样?

不用自己释放指针,是不是可以这样?
新增一个类来存放一个迭代器的数组,然后外面每次申请迭代器的时候就将其中第一个闲置的迭代器初始化一下然后传个指针出去,不需要的时候收回来。感觉就和程序设计课里,自己预先申请一个数组,然后从这个数组里alloc和free的那种想法差不多。
至于怎么判定“不需要”一个迭代器,则可以在新增的这个类里设计引用计数来实现,追踪每一个迭代器的引用计数,到零时就收回,省去了手动释放的过程。但为了配合引用计数,可能需要重载一些符号(比如 =)。
大家觉得这样可行吗?

为什么需要测试

现状

到目前为止,很少有同学在提交的Assignment加了自己的测试

我想有几个原因:

  1. 一方面因为Assignment1的确没有想到很多边角和情况需要考虑(我坚信我们这么多人的代码肯定有没测试出来的bug)。 之后的assignment会越来越多的需要测试。
  2. Assignment1代码量很小,不需要很严肃的测试。
  3. 另一方面大家可能还没意识到测试的重要性。针对这点我写了这个Issue

我们都是懒人

代码质量,可读性和写测试。我也是到了公司之后才逐渐训练出这样的意识。 反过来,我希望我在大二的时候有人告诉我应该这样写代码。所以和同学们分享。

When confronted with the choice of being good or doing the easy thing, we often choose the easy thing because, well, it’s easier.

写代码的步骤

现在的我看来, 写一个程序的时间分成三部分。顺序上也大致如此,当然可能一边写测试还回过头来修改设计, 写代码的时候,回头来修改测试。

  • 30% 设计代码
  • 50% 写测试
  • 20% 写代码

诚然在我们的课程里最强调的是设计代码和写代码。
更甚,有人说写代码的能力(这里指用C++的能力)应该在大一程设学习。我们的数据结构课程应该只关心设计代码。 写测试是不着边际的东西

我觉得这个说法有一些道理

我更觉得习惯是慢慢养成的,CS和数学不同,是理论和实践结合更紧密的学科。这几个部分互相促进。写出良好的实现有助于对算法的理解。自己去思考的数据fail掉自己或其他人的代码,是从非设计的角度来理解数据结构。

写测试的好处

Programming is a craft more than it is a science. To write clean code, you must first write dirty code and then clean it

测试在这个 持续维护代码 过程中起的作用:

  1. 帮助你思考, 测试从使用的角度来观察设计的数据结构
  2. 让你放心修改代码,比如, 你觉得某一段可以写得更简洁或者更有效率,有测试在,你会有信心自己改对了。 当代码超过200行。 没有自动化的测试,很容易瞻前顾后,不敢对旧的代码进行改动。
  3. 测试代码有文档的作用。 我甚至觉得其实我布置Assignment把,头文件和测试文件给大家。大家就基本上知道要做什么了。

设想一下,如果是你在开发STL,那么对于vector这么重要的组件,写上百个测试都不为过,时间+空间等等都应该涵盖。(当然我不是说我们应该这么做)

最后

不会强制要求大家做这样一件事,只是因为TA觉得它是有益的,所以提倡大家这么做。
不同的情形下对测试的要求不同。有一点很显然的是写测试非常花时间
作为课程作业来讲,一般情况是不会有人重用你的代码的(除了你),也不是一个要维护好几年的工程。所以测试的意义没那么大。
但是我觉得写测试是程序员的基本素养。 设想你建了一座桥,而没有做压力测试就交工了是对的事情么?
比方现在的我们是在学建桥, 如果我们这个时候不养成这个习惯,到了那个上阵自然就会了么?

pull request 被close掉同学注意。Git Branch 的使用[重要]

在Review的过程中,发现不用branch是不行的。
如果TA事先想到了,不会有这次问题。

不过希望同学们把这次麻烦, 当作一次实践git的机会吧。

遇到的问题

  1. assignment0 的还没有被Merge, 你在master 做修改,比如做了assignment1 ,这个时候,做的修改会被体现到之前pull request. Review 起来非常麻烦。
  2. 同学们把TA的代码和你的代码混在一起,难以Review
  3. 提交了非你的目录下的代码

Solution

正确的姿势发 pull request

现在建议同学们:
在做一个新的assignmentX 的时候

  1. 创建分支 git branch assignmentX
  2. 切换分支 git checkout assignmentX
  3. 在新分支下做assignmentX的相关内容。
  4. 把分支push 到你的远程仓库 git push origin assignmentX
  5. 用这个分支create pull request.

Git 想关概念和用法,请自行脑补。

重建仓库

把TA的代码一起提交的同学
提交了错误的文件(比如gitignore)
现在已经几个Assignment,并且混在一起的同学注意

  1. TA会close你的pull request
  2. 备份你的本地数据
  3. 删除 你的远程仓库,(again 备份好你本地的)。
  4. 重新从课程仓库fork。
  5. 按照上面的步骤为每个assignemnt建单独的branch。发单独的pull request。
  6. cheers~

关于提交代码:

分两次提交pull request

  1. 请提交TA提供的文件。 请在pull request 注明 [Initial Commit],TA会尽快merge你的代码。
  2. 然后再提交你的solution。
    这样子review的时候才能看出哪些是你做的修改

格式

另: Pull request
标题格式 学号_姓名_assignment
example 11300240057_CHENWEIDONG_assignment0

文件目录按照src/ testcase/划分
src/为你们源代码的根目录。

请同学们该完代码之后修改一下文件头部的署名啊。亲.
尊重自己的劳动成果

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.