在编程练习中学会设计和使用测试程序

  这是我和我的学生们C++程序设计课程中的一个练习。程序编写得越来越大了,测试显得越来越重要,如果还是照着以前一直对照练习要求写程序,而不是按照工程要求去写,永远无法和实际工作去接轨。本文给出一个示例,展示在程序设计过程中,怎样做到一边写程序,一边开展测试的过程,这样得到的程序中的各个“部件”可靠性得以保证。

  课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8635385

练习要求

【项目5-玩日期】
定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能(可以在一个main函数中完成,也可以用函数求解,main函数调用即可):
(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
(2)输出该日在本年中是第几天(注意闰年问题);
(3)输出这是这一天中的第几秒;
(4)输出这是这一年中的第几秒;
(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;(你的万天日期靠这个功能了)——插讲一个故事。当年老贺由小孩儿过百日,想到自己的万日在哪天。编程计算,结果刚过了十几天,那个懊恼啊。第二个万日得再等26年多,第三个万日,谁敢说一定能过上?20岁左右的你,要算清楚了。在第(1)问中输入你的生日及时辰,d值取为10000,可以算出你的万日,大概在26岁多。
(6)求你输入的时间s秒后是何日何时,将结果保存在一个结构体变量中输出;

整体的考虑

  最后编好的程序的结构应该如下所示,其中所需要设计,一是存储数据所用的数据结构——结构体,二是整个程序的框架,除了main()函数之外,还要有一系列的其他函数作为支撑。在严格的软件工程中,需要提前将所需要的函数(工程中称之为模块)设计出来,而在学习语法阶段,不妨也便宜行事,需要什么写什么,这样做更快一些。在此基础上,main()函数只要按照题目中的要求,或输入,或调用函数,逐个地写出来即可。
  所以,这个程序最后的结构会是:

#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};

//待设计的一大堆函数,是哪些,暂不考虑

int main()
{
    Time t;
    //(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
    cout<<"请输入一个时间(包括年,月,日,时,分,秒):"<<endl;
    getTime(t);  //输入将不会是很简单的一两条语句,写个函数完成
    outputTime(t);   //马上验证输入,很自地完成

    //(2)输出该日在本年中是第几天(注意闰年问题);
    cout<<"这是这一年中的第"<<dayOfYear(t)<<"天。"<<endl; //设计专门的函数完成

    //(3)输出这是这一天中的第几秒;
    cout<<"这是这一天中的第"<<secondOfDay(t)<<"秒。"<<endl;//设计专门的函数完成

    //(4)输出这是这一年中的第几秒;
    cout<<"这是这一年中的第"<<dayOfYear(t)*24*3600+secondOfDay(t)<<"秒。"<<endl; 

    //(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;
    cin>>d;
    cout<<"这一天后 ”<<d<<” 天是:"
    outputTime(afterDays(t,d));    

    //(6)求你输入的时间s秒后是何日何时,将结果保存在一个结构体变量中输出;
    cin>>d;
    cout<<"这一时的后 ”<<s<<” 秒是:"
    outputTime(afterSeconds(t,s));    

    //到此任务完成
    return 0;
}

  胖子是一口一口吃出来的,程序得一点一点写出来,做一些,就测试一点,保证局部不要出问题。不要妄图全写完了才去测试,医生说食物摄取过量,老百姓讲是吃撑了。

完成第(1)个要求,测试通过键盘输入进行即可

  在这样一种指导思想下,先完成第(1)个要求,主要是写出自定义函数来。将需要多次用到的功能,例如,输入中要保证范围的要求,也“抽象”一下,做成函数getNum()。不少成员的取值范围是确定的,但每月的天数并不都一样有些麻烦,设计一个函数daysOfMonth()实现,将有利于整个程序的简洁。
  参考代码可以如下:

#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};

//输入一个限定范围内的整型数值
int getNum(char *prompt, int min, int max)
{
    int value=-1;
    cout<<"输入"<<prompt<<",范围["<<min<<","<<max<<"]:";
    do
    {
        cin>>value;
    }
    while(value<min || value>max);
    return value;
}

//返回y年m月的天数
//返回y年m月的天数
int daysOfMonth(int m,int y)
{
    int days;
    switch(m)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days=31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days=30;
        break;
    case 2:
        if((y%4==0&&y%100!=0)||y%400==0)
            days=29;
        else
            days=28;
    }
    return days;
}

//输入时间,参数为引用类型,可以影响实参的值
void getTime(Time &t)
{
    t.year=getNum("年",0,3000); //getNum()用于输入一定范围内的数
    t.month=getNum("月",1,12);
    t.day=getNum("日",1,daysOfMonth(t.month, t.year));
    t.hour=getNum("时",0,24);
    t.minute=getNum("分",0,59);
    t.second=getNum("秒",0,59);
}

//输出时间,参数也用作引用是对结构常见的处理办法
void outputTime(Time &t)
{
    cout<<"时间为: "<<t.year<<"年"<<t.month<<"月"<<t.day<<"日"<<t.hour<<"时"<<t.minute<<"分"<<t.second<<"秒"<<endl;
}

int main()
{
    Time t;
    //(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
    cout<<"请输入一个时间(包括年,月,日,时,分,秒):"<<endl;
    getTime(t);
    outputTime(t);
    return 0;
}

  就写作业而言,从做练习的角度,程序就是完成了。要完成测试,关键是保证输入时数据取值范围是否能够得到保证,于是需要多次地启动程序,输入各种不同的时间,看是否能体现设计时的限制。需要考虑到的情形包括:

  • 2013年1月20日3时4分5秒   //中规中矩的输入
  • 2012年3月31日3时4分5秒   //重点考察取日期的“边界值”是否接受,类似地可以用其他月份检查,还可以设计出多种情形
  • ……
  • 2013年2月29日3时4分5秒   //2013不是闰年,这个输入会如何处理
  • 2012年2月29日3时4分5秒   //2012是闰年,这个输入会如何处理
  • 2013年13月45日33时4分5秒 //各种的“捣乱”,这在测试中是必须的

  通过这样的多次运行多次输入查看结果是可行的。但是,如果考虑一次运行程序,可以支持多次输入对不同情形进行测试,那自然是更方便的事了。其实,写一个循环,那也不是难事。事实上,这是工程中更常用的方式。
  在这种思路下,main()函数这样写。

int main()
{
    Time t;
    do
    {
        cout<<"请输入一个时间(包括年,月,日,时,分,秒):"<<endl;
        getTime(t);
        outputTime(t);
    }while(t.year>0); //输入0年某月某日测试即结束,测试过程由人可控
    return 0;
}

  这样,程序运行中的界面如下图,这只是测试所需要的一部分内容。这样测试出的程序,质量信心必涨!好产品得经过严格的测试,放在程序设计中也是这样。

  

完成第(2)个要求,测试通过不能再靠键盘输入

  实现功能角度,增加一个函数dayOfYear()即可。涉及到测试时,要靠着键盘输入,那可就烦恼大了:改一点程序,输入若干数据测试,发现错误,改程序,再运行,输入测试数据。这时,可以采用的方法是,用测试用到的数据直接初始化结构体。再进一步,一组测试数据,一起测试,用结构体数组保存数据,测试过程做一个循环。
  实现了的函数和测试用的main()函数如下所示,实现任务(1)中的函数保留不动,它们是整个任务中的一部分,况且(2)任务可能会用到前面的劳动成果,删除不必要。
  参考程序如下:

#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};

//输入一个限定范围内的整型数值
int getNum(char *prompt, int min, int max)
{
    int value=-1;
    cout<<"输入"<<prompt<<",范围["<<min<<","<<max<<"]:";
    do
    {
        cin>>value;
    }
    while(value<min || value>max);
    return value;
}

//返回y年m月的天数
int daysOfMonth(int m,int y)
{
    int days;
    switch(m)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days=31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days=30;
        break;
    case 2:
        if((y%4==0&&y%100!=0)||y%400==0)
            days=29;
        else
            days=28;
    }
    return days;
}

//输入时间,参数为引用类型,可以影响实参的值
void getTime(Time &t)
{
    t.year=getNum("年",0,3000); //用于输入一定范围内的数
    t.month=getNum("月",1,12);
    t.day=getNum("日",1,daysOfMonth(t.month, t.year));
    t.hour=getNum("时",0,24);
    t.minute=getNum("分",0,59);
    t.second=getNum("秒",0,59);
}

//输出时间,参数也用作引用是对结构常见的处理办法
void outputTime(Time &t)
{
    cout<<"时间为: "<<t.year<<"年"<<t.month<<"月"<<t.day<<"日"<<t.hour<<"时"<<t.minute<<"分"<<t.second<<"秒"<<endl;
}

//这天是这一年的第几天
int dayOfYear(Time &t)
{
    int days=0;
    int m=1;
    while(m<t.month)  //前若干月的天数加起来
    {
        days+=daysOfMonth(m,t.year);  //充分利用已经设计的函数
        ++m;
    }
    days+=t.day; //再加上本月的天数
    return days;
}

int main()
{
    //任务(2)输出该日在本年中是第几天(注意闰年问题);
    Time t[]=   //测试数据放在结构体数组中
    {
        {1971,1,8,14,25,48},  //最简单的一个测试数据,期望输出8
        {2011,2,27,14,25,48}, //2月,天数要加上1月的31天,期望输出31+27
        {2012,3,2,14,25,48},  //这个输入很敏感,看2月究竟算多少天,期望输出31+29+2=62
        {2013,3,2,14,25,48},  //这个期望输出是31+28+2=61
        {2013,4,10,14,25,48}  //期望结果100,这样的测试数据还可以继续列一些,期望结果要列出来,这是测试的依据
    };

    for(int i=0; i<5; ++i)   //测试过程用一个循环完成
    {
        outputTime(t[i]);
        cout<<"这是这一年中的第"<<dayOfYear(t[i])<<"天。"<<endl<<endl;
    }
    return 0;
}

  体会上面测试数据设计和测试程序(main()函数)设计中的用心,看下面运行测试的结果,生产好产品,需要这样做。

第(3)和(4)个任务容易实现,测试过程类似进行

  只需要增加一个自定义函数

//这天是这一天的第几秒
int secondOfDay(Time &t)
{
    return t.hour*3600+t.minute*60+t.second;
}

  相应的测试函数定义为:

int main()
{
    Time t[]=
    {
        {1971,1,8,0,0,2},
        {2011,2,27,0,25,10},
        {2012,3,2,10,20,20},
        {2013,3,2,10,20,20},
        {2013,4,10,10,20,20}
    };

    for(int i=0; i<5; ++i)
    {
        outputTime(t[i]);
        //(3)输出这是这一天中的第几秒;
        cout<<"这是这一天中的第"<<secondOfDay(t[i])<<"秒。"<<endl;
        //(4)输出这是这一年中的第几秒;
        cout<<"这是这一年中的第"<<dayOfYear(t[i])*24*3600+secondOfDay(t[i])<<"秒。"<<endl<<endl;
    }
    return 0;
}

  请体会上面的测试数据的设计,也可以设计出更好的来

再来第(5)个要求,测试数据的设计需要更动动脑子

  关于实现功能而言,主体在Time afterDays(Time t,int d)函数,这个求解有些麻烦,但是采用的算法统一从1月0日开始的思路,还是可以将复杂性降下来一些。
  先上程序:

#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};

//输入一个限定范围内的整型数值
int getNum(char *prompt, int min, int max)
{
    int value=-1;
    cout<<"输入"<<prompt<<",范围["<<min<<","<<max<<"]:";
    do
    {
        cin>>value;
    }
    while(value<min || value>max);
    return value;
}

//返回y年m月的天数
int daysOfMonth(int m,int y)
{
    int days;
    switch(m)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days=31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days=30;
        break;
    case 2:
        if((y%4==0&&y%100!=0)||y%400==0)
            days=29;
        else
            days=28;
    }
    return days;
}

//输入时间,参数为引用类型,可以影响实参的值
void getTime(Time &t)
{
    t.year=getNum("年",0,3000); //用于输入一定范围内的数
    t.month=getNum("月",1,12);
    t.day=getNum("日",1,daysOfMonth(t.month, t.year));
    t.hour=getNum("时",0,24);
    t.minute=getNum("分",0,59);
    t.second=getNum("秒",0,59);
}

//输出时间,参数也用作引用是对结构常见的处理办法
void outputTime(Time &t)
{
    cout<<"时间为: "<<t.year<<"年"<<t.month<<"月"<<t.day<<"日"<<t.hour<<"时"<<t.minute<<"分"<<t.second<<"秒"<<endl;
}

//这天是这一年的第几天
int dayOfYear(Time &t)
{
    int days=0;
    int m=1;
    while(m<t.month)  //前若干月的天数加起来
    {
        days+=daysOfMonth(m,t.year);  //充分利用已经设计的函数
        ++m;
    }
    days+=t.day; //再加上本月的天数
    return days;
}

//这天是这一天的第几秒
int secondOfDay(Time &t)
{
    return t.hour*3600+t.minute*60+t.second;
}

//返回一年有多少天(365或366天)
int daysOfYear(int y)
{
    return ((y%4==0&&y%100!=0)||y%400==0)?366:365;
}

//求你输入的时间d天后是哪年哪月哪日
Time afterDays(Time t,int d)
{
    Time t1=t;
    int d1=d+dayOfYear(t); //dayOfYear(t)求出t是当年第几天
    t1.month=1;
    t1.day=0;  //这样,将问题转换为在当年1月0日基础上加d1天(这个0有意思),避免以后老为2月操心,以及剩余天数一加以后持续进位
//    cout<<"转换为";
//    outputTime(t1);
//    cout<<"这一天后"<<d1<<"天。";
    while(d1>daysOfYear(t1.year))  //天数还够一个整年
    {
            d1-=daysOfYear(t1.year);
            ++t1.year;
    }
    //天数不够一整年后,再考虑月,因为从1月1日开始,不用担心Nt.year再加1年
    while(d1>daysOfMonth(t1.month,t1.year))  //天数还够一个整月
    {
            d1-=daysOfMonth(t1.month,t1.year);
            ++t1.month;
    }
    //剩全天数加到日上
    t1.day+=d1;
    return t1;
}

int main()
{
    int d[]={68,365,366,798} ; //分别在一年内、恰1年(闰或不闰)、798(365+365+68)天时要复杂也最有说服力,考虑跨年、跨月,尤其有闰年时
    Time nt,t[]=
    {
        {2001,1,8,0,0,0},   //没有时分秒的事,都0
        {2012,2,20,0,0,0},   //2月是个敏感的月份
        {2014,2,20,0,0,0},   //直接遇到闰年
        {2013,4,20,0,0,0},   //过了2月
        {2013,4,20,0,0,0},   //过了2月
        {2013,12,10,0,0,0},   //近年关,稍加一点就下一年了,也测试下
    };

    //(5)求你输入的时间d天后是哪年哪月哪日
    for(int i=0; i<7; ++i)
    for(int j=0;j<4;++j)
    {
        nt=afterDays(t[i],d[j]);
        outputTime(t[i]);
        cout<<"这是这一年中的第"<<dayOfYear(t[i])<<"天。";
        cout<<"这一天后"<<d[j]<<"天是:";
        outputTime(nt);
        cout<<"这是这一年中的第"<<dayOfYear(nt)<<"天。";
        cout<<endl<<endl;
    }
    return 0;
}

  接着看测试程序,将时间与要经过的天数进行组合,从输出中可以发现问题。当需要很多的测试数据时,期望结果实际上不能再由人手工计算,可以用一些辅助工具去完成。在一些数据库系统中,有类似的现成的函数(在写这个程序时企图用Wps 表格的公式,但不支持,记得Excel里有),还可以用系统函数计算的结果作对比,本文中,对用前面已经测试正确的函数dayOfYear(),通过输出日期是该年的第几天帮助找到线索。
  另外,在上面的程序中,第114 - 116行加了注释的部分,体现出的也是一种调试的手段:运行过程中适当输出中间结果,进而判断计算过程是否达到预期。这种方法与单步执行相比,信息会来得快一些,不足之处是,信息有时有些太多,适宜于对程序内在执行机制很清楚的程序员,需要有志做这些工作的同学追求。有些编程环境中,缺乏调试工具的支持,这样的措施更显得必要了。用这种方式,最后应将这些输出信息加上注释,不要成为代码中的一部分,或者干脆删除了事。
  第(6)个任务和测试不再写,作为选做吧。

最后,给出任务的最后解答

  有了经过测试的实现各功能的函数,只是将main()函数按要求写出即可,这样不管有什么样的输入,都不怕它耍着小脾气,输出错结果了。
  贴程序:

#include <iostream>
using namespace std;
struct Time
{
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
};

//输入一个限定范围内的整型数值
int getNum(char *prompt, int min, int max)
{
    int value=-1;
    cout<<"输入"<<prompt<<",范围["<<min<<","<<max<<"]:";
    do
    {
        cin>>value;
    }
    while(value<min || value>max);
    return value;
}

//返回y年m月的天数
int daysOfMonth(int m,int y)
{
    int days;
    switch(m)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days=31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days=30;
        break;
    case 2:
        if((y%4==0&&y%100!=0)||y%400==0)
            days=29;
        else
            days=28;
    }
    return days;
}

//输入时间,参数为引用类型,可以影响实参的值
void getTime(Time &t)
{
    t.year=getNum("年",0,3000); //用于输入一定范围内的数
    t.month=getNum("月",1,12);
    t.day=getNum("日",1,daysOfMonth(t.month, t.year));
    t.hour=getNum("时",0,24);
    t.minute=getNum("分",0,59);
    t.second=getNum("秒",0,59);
}

//输出时间,参数也用作引用是对结构常见的处理办法
void outputTime(Time &t)
{
    cout<<"时间为: "<<t.year<<"年"<<t.month<<"月"<<t.day<<"日"<<t.hour<<"时"<<t.minute<<"分"<<t.second<<"秒"<<endl;
}

//这天是这一年的第几天
int dayOfYear(Time &t)
{
    int days=0;
    int m=1;
    while(m<t.month)  //前若干月的天数加起来
    {
        days+=daysOfMonth(m,t.year);  //充分利用已经设计的函数
        ++m;
    }
    days+=t.day; //再加上本月的天数
    return days;
}

//这天是这一天的第几秒
int secondOfDay(Time &t)
{
    return t.hour*3600+t.minute*60+t.second;
}

//返回一年有多少天(365或366天)
int daysOfYear(int y)
{
    return ((y%4==0&&y%100!=0)||y%400==0)?366:365;
}

//求你输入的时间d天后是哪年哪月哪日
Time afterDays(Time t,int d)
{
    Time t1=t;
    int d1=d+dayOfYear(t); //dayOfYear(t)求出t是当年第几天
    t1.month=1;
    t1.day=0;  //这样,将问题转换为在当年1月0日基础上加d1天(这个0有意思),避免以后老为2月操心,以及剩余天数一加以后持续进位
//    cout<<"转换为";
//    outputTime(t1);
//    cout<<"这一天后"<<d1<<"天。";
    while(d1>daysOfYear(t1.year))  //天数还够一个整年
    {
        d1-=daysOfYear(t1.year);
        ++t1.year;
    }
    //天数不够一整年后,再考虑月,因为从1月1日开始,不用担心Nt.year再加1年
    while(d1>daysOfMonth(t1.month,t1.year))  //天数还够一个整月
    {
        d1-=daysOfMonth(t1.month,t1.year);
        ++t1.month;
    }
    //剩全天数加到日上
    t1.day+=d1;
    return t1;
}

int main()
{
    Time t,nt;
    //(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;
    cout<<"请输入一个时间(包括年,月,日,时,分,秒):"<<endl;
    getTime(t);
    outputTime(t);
    //(2)输出该日在本年中是第几天(注意闰年问题);
    cout<<"这是这一年中的第"<<dayOfYear(t)<<"天。"<<endl;
    //(3)输出这是这一天中的第几秒;
    cout<<"这是这一天中的第"<<secondOfDay(t)<<"秒。"<<endl;
    //(4)输出这是这一年中的第几秒;
    cout<<"这是这一年中的第"<<dayOfYear(t)*24*3600+secondOfDay(t)<<"秒。"<<endl;
    //(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;
    int d;
    cout<<"请输入一个天数";
    cin>>d;
    nt=afterDays(t,d);
    cout<<"这一天后d(如10000)天后是:";
    outputTime(nt);
    //(6)求你输入的时间s秒后是何日何时,将结果保存在一个结构体变量中输出;

    return 0;
}

  看下面的运行结果,老贺自己错过了1万天的庆祝,弟子们要记着老贺过2万天请客的时候,都来随个份子。
  

【项目5扩展(选做】用结构体变量给定两个时间,求(1)相差多少天?(2)相差多少秒?(略)

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8635385

时间: 2024-11-05 06:33:38

在编程练习中学会设计和使用测试程序的相关文章

深入理解并行编程-分割和同步设计(二)

双端队列是一种元素可以从两端插入或删除的数据结构[Knu73].据说实现一种基于锁的允许在双端队列的两端进行并发操作的方法非常困难[Gro07].本节将展示一种分割设计策略,能实现合理且简单的解决方案,请看下面的小节中的三种通用方法. 1.1. 右手锁和左手锁 图1.1:带有左手锁和右手锁的双端队列 右手锁和左手锁是一种看起来很直接的办法,为左手端的入列操作加一个左手锁,为右手端的出列操 作加一个右手锁,如图1.1所示.但是,这种办法的问题是当队列中的元素不足四个时,两个锁的范围会发生重叠.这种

深入理解并行编程-分割和同步设计(三)

设计准则 上面的章节中给出了三个并行编程的目标:性能.生产率和通用性.但是还需要更详细的设计准则来真正的指导真实世界中的设计,这就是本节将解决的任务.在真实世界中,这些准则经常在某种程度上冲突,这需要设计者小心的权衡得失. 这些准则可以被认为是设计中的阻力,对这些阻力进行恰当权衡,这就称为"设计模式"[Ale79],[GHJV95]. 基于三个并行编程目标的设计准则是加速.竞争.开销.读写比率和复杂性. 加速:性能增加是花费如此多时间和精力进行并行化的主要原因.加速的定义是运行程序的顺

WP7应用开发中交互设计和UI设计的几点建议

文章描述:WP7交互特性浅析及APP设计探究. Windows phone7是无线领域的新生力量,但是迟迟没有进入中国市场.Mango(注意WP7和mango不是一个概念)的发布带来了中文的操作系统,也让人们看到了该系统的无限可能.在此,我结合自己在进行相关应用设计的经验以及自己对WP7系统认识和理解,浅谈一下这一特别系统的交互特性. 本文索引: 涅磐重生的WP7(以及它的历史简介) WP7对比iOS和Android WP7设计风格 WP7内容和结构框架及特有名词解释 WP7交互特质分析 WP7

Java 编程技术中汉字问题的分析及解决(转)

编程|汉字|解决|问题 Java 编程技术中汉字问题的分析及解决 段明辉自由撰稿人2000 年 11月 8日内容: 汉字编码的常识 Java 中文问题的初步认识 Java 中文问题的表层分析及处理 Java 中文问题的根源分析及解决 Java Servlet 中文问题的根源 修改 Servlet.jar 中文乱码的处理函数 参考资料 作者简介在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Jav

Java 编程技术中汉字问题的分析及解决,文件操作

编程|汉字|解决|问题 在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的 乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java 语言 默认的编码方式是UNICODE ,而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编 码呢?本文将从汉字编码的常识入手,结合 Java 编程实例,分析以上两个问题并提出 解决它们的方案. 现在 Java 编程语言已经广

Java 编程技术中汉字问题的分析及解决(转自IBM)

编程|汉字|解决|问题 Java 编程技术中汉字问题的分析及解决 段明辉自由撰稿人2000 年 11月 8日 在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java 语言默认的编码方式是UNICODE ,而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编码的常识入手,结合 Java 编

用户交互设计:再谈人机交互中的设计隐喻

文章描述:再谈人机交互中的设计隐喻. 上篇文章<人机交互中的设计隐喻-由Mac的文件替换引出来的话题>发出来以后收到了各种各样的反馈,我索性再写一篇续文,算是集中答复吧. 用户习惯 在所有的反馈中,"用户觉得Windows的做法更好用,所以理应这样设计"的说法可谓最多.那么我们就来看一下,为什么有人会觉得Windows的做法更"好用". 我们来看两个例子. 银行里面用的系统-就是柜台后面业务人员用的那个-基本上还是字符界面,没有漂亮的图标和窗口,甚至可能

Java 编程技术中汉字问题的分析及解决

编程|汉字|解决|问题 在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java 语言默认的编码方式是UNICODE ,而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编码的常识入手,结合 Java 编程实例,分析以上两个问题并提出解决它们的方案. 现在 Java 编程语言已经广泛应用于

小结:PHP编程过程中应当注意的各种注意事项

最近一段时间,PHP凭借其功能强大,简单易用的特点被越来越多的人们所喜爱和接受,成为目前最为流行的脚本编程语言之一.本文将结合用户在使用PHP过程中经常容易出现的问题,包括语法错误,程序运行错误以及逻辑错误等展开详细的介绍,希望能够对那些目前正在学习PHP语言的用户有所帮助.此外,本文还将会在文章的结束部分对PHP编程过程中应当注意的各种事项加以汇总,供读者参考. PHP脚本语言所具有一个显著的特点就是能够自动生成变量实例,不要求用户对所需要使用的变量进行声明.该特点既有值得推崇之处,但是同时也