9
10
2011
17

让中学生学 Visual Basic 简直害人

我国的中学信息学教育,教的编程语言是Visual Basic。我觉得,虽然VB学起来简单,但用VB入门就是坑害小童鞋啊。

其一,VB上来就是GUI编程,掩盖了很多的编程基础知识。学了VB的同学,看到我用C语言写出来的“DOS程序”,还觉得十分落后。恐怕初学者学了VB后,实在是无法接受其他“只能写出DOS程序”的语言了吧。

其二,VB宽松的语法不利于培养编程习惯。VB不用声明变量,又是弱类型,字符串都能和数字相加,给了编程者太多的自由。过度宽松的语法,可能导致各种意想不到的问题。编程习惯的重要性,就不多说了吧……

其三,VB是Windows-only的(虽然有个gambas什么的移植VB到Linux,但可以忽略之)。真正的程序员,不能烂到Windows一辈子吧。学个C/C++、Python什么的,好歹也到处能用。

其四,VB发展前景不好。微软都抛弃VB了,开发另一个貌似也很垃圾的VB.net了,我们却还在学VB。没准儿Windows 8就不支持VB了…… 就算烂到Windows一辈子尚可忍受,也不能烂XP上吧。

其五,Visual Basic编译器(就这么叫吧)是收费软件。虽然这是天朝,百度一下D版到手。但做大项目,用个D版不合适吧。全国学校都装D版VB,更不合适吧。

 

强烈建议使用Python代替VB,作为中学生学习编程的入门语言。Python要简单足够简单,要严格足够严格,要强大足够强大,有免费的跨平台解释器(手机能用,Win能用,Mac能用),很适合作为第一门编程语言学习。

Category: 计算机 | Tags: BASIC 编程 Windows Python
9
10
2011
4

凸包郁闷死我了

郁闷啊郁闷,写了两个凸包的题目,都折戟在一两个NB数据上了。

tyvj上P1462的程序,赤果果的求凸包。自己写的Graham扫描法,极角顺序,从最下最右的点开始:

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

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

typedef struct {
    double x, y, tg;
} coord;

// 算极角
inline double calc_tg (const coord b, const coord n)
{
    double ret = atan2(n.y-b.y, n.x-b.x);
    return ret >= 0 ? ret:ret+2*M_PI;
}

// 判断是否左转
#define tleft(a,b,c) \
        (((b).x-(a).x)*((c).y-(a).y)-((c).x-(a).x)*((b).y-(a).y) <= 0.0)

// 快排之比较
int comp (const void *pa, const void *pb)
{
    const coord *a = (const coord*)pa, *b = (const coord*)pb;
    if (a->tg > b->tg)
        return 1;
    else if (a->tg != b->tg)
        return -1;
    else
        return a->x > b->x ? 1:-1;
}

int main ()
{
    int n, i, stktail;
    coord *p, **stk, minc = {0.0, 1.0E22};

    // 读入数据
    scanf("%d", &n);
    p = malloc(n*sizeof(coord));
    stk = malloc(n*sizeof(coord*));
    for (i=0; i<n; i++)
    {
        scanf("%lf %lf", &(p[i].x), &(p[i].y));
        if ((p[i].y < minc.y) ||
           ((p[i].y == minc.y) && (p[i].x < minc.x)))
            minc = p[i];
    }

    // 求凸包
    for (i=0; i<n; i++)
        p[i].tg = calc_tg(minc, p[i]);

    qsort(p, n, sizeof(coord), comp);

    stk[0] = p;
    stk[1] = p+1;
    stk[2] = p+2;
    stktail = 2;
    for (i=3; i<n; i++)
    {
        while (stktail >= 1)
        {
            coord *base = stk[stktail-1],
                  *last = stk[stktail];
            if (tleft(*base, *last, p[i]))
                stktail--;
            else
                break;
        }

        stk[++stktail] = p+i;
    }

    while (stk[stktail]->tg == stk[stktail-1]->tg)
        stktail--;

    // 按要求的顺序输出
    int st = 0;
    double minx = stk[0]->x;
    for (i=stktail; i>=0; i--)
    {
        if (stk[i]->x < minx)
            minx = stk[i]->x,
            st = i;
        else
            break;
    }

    i = st;
    do
    {
        printf("%.4lf %.4lf\n", stk[i]->x, stk[i]->y);
        if (--i < 0)
            i = stktail;
    } while (i != st);

    return 0;
}

运行结果:

#01: Accepted (0ms, 196KB)
#02: Accepted (0ms, 196KB)
#03: Accepted (0ms, 200KB)
#04: Accepted (0ms, 196KB)
#05: Accepted (0ms, 200KB)
#06: Accepted (0ms, 332KB)
#07: Accepted (293ms, 2936KB)
#08: Wrong Answer (637ms, 2936KB)
#09: Accepted (0ms, 224KB)
#10: Accepted (0ms, 304KB)
#11: Time Limit Exceeded (?, 2388KB)

错的那个可能是精度问题(但我尝试了,long double也过不去,所以也可能是写错了)。

最后一个超时。我已经各种优化了:把C++程序改成C,动态申请内存(不清0了),手动define内联函数,使用double而非long double…… 但还是超时。难道是qsort太慢了?

郁闷啊。可能我的实现比较烂,求神牛指导实现细节。

Category: 计算机 | Tags: 算法 凸包 C/C++ 编程 OI
9
10
2011
7

e4rat:大幅提升Linux开机速度

警告:此软件仅限原生ext4文件系统使用。其他文件系统以及从低版本升级的ext4文件系统用户不要使用,否则将导致灾难性后果。 本着负责的态度,先Warning。 

e4rat是个好东西。其原理大致是(我猜的):通过磁盘整理有序化开机要加载的文件,并在系统启动阶段把数据预读到内存,充分使用内存和IO资源。

AUR上大家的溢美之词:

snack 发表于 Mon, 20 Jun 2011 23:03:28 +0000

Just one word: amazing! Can't believe such an improvement can be obtained so simply. Definitely one of the most notable utilities I've ever tried.

bwat47 发表于 Sat, 11 Jun 2011 00:55:03 +0000

Very impressive stuff! I have a laptop with a 5400rpm drive. This made like halved my boot time (gdm starts way faster, login is faster) all my apps like chrome/banshee/empathy start as fast as if they were cached in memory already :)

drexya 发表于 Sat, 04 Jun 2011 02:52:06 +0000

Wow, impressive results Oo.

可以看看官方给的效果图Amazing诶!

使用前

使用后

 

本文针对Arch系统,介绍一下使用方法。

1. 系统要求:

根文件系统是原生ext4,即一开始就格式化成ext4了,不是从ext2、ext3升级的。

内核支持audit。repo中的内核都支持,手动编译内核的需要注意一下。

2. 安装:

yaourt -S e4rat

或者自己从AUR下载脚本编译。

3. 收集信息:

grub中Linux启动项最后加上参数:

init=/sbin/e4rat-collect

启动后e4rat会记录120秒内系统打开的文件。可以在 /etc/e4rat.conf 修改等待时间(timeout)。

PS:据我观察,收集信息时系统启动会变得格外的慢,可能要一分钟以上。

4. 整理磁盘:

收集信息后,会生成 /var/lib/e4rat/startup.log 文件,里面记录的就是启动时打开的所有文件。然后要整理磁盘,该操作需要在单用户模式下执行:

sudo init 1

然后:

e4rat-realloc  /var/lib/e4rat/startup.log

5. 大功告成:

修改grub菜单文件,Linux启动项参数加入:

init=/sbin/e4rat-preload

重启后e4rat就开始工作了。

6. 其他:

a. 不要让e4rat预读太多东西,启动到桌面就足够了。如果预读太多东西(比如浏览器、文本编辑软件),反而会拖慢开机速度。

b. 以上都是针对Arch默认的init程序。如果你使用其他init机制,比如systemd,需要修改 /etc/e4rat.conf ,设置init参数:

init /bin/systemd

c. 该软件对SSD固态硬盘没什么作用。

| Theme: Aeros 2.0 by TheBuckmaker.com