开始找工作了!!
简历还在逐渐完善更新中,请各位同学朋友多多关照!!…… [lol] [shame]
简历:http://fanhaijun.com/resume/
大学
各设计题目要求使用二进制文件方式存储数据,系统以菜单方式工作。
1. 职工信息管理系统设计
职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。试设计一职工信息管理系统,使之能提供以下功能:
(1) 系统以菜单方式工作
(2) 职工信息录入功能(职工信息用文件保存)--输入
(3) 职工信息浏览功能--输出
(4) 职工信息查询功能--算法
查询方式
按学历查询等
按职工号查询等
(5) 职工信息删除、修改功能(可选项)
2. 图书信息管理系统设计
图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。试设计一图书信息管理系统,使之能提供以下功能:
(1) 系统以菜单方式工作
(2) 图书信息录入功能(图书信息用文件保存)--输入
(3) 图书信息浏览功能--输出
(4) 图书信息查询功能--算法
查询方式
按书名查询
按作者名查询
(5) 图书信息的删除与修改(可选项)
3. 图书管理系统设计
图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等,试设计一图书管理系统,使之能提供以下功能:
(1) 新进图书基本信息的输入
(2) 图书基本信息的查询
(3) 对撤消图书信息的删除
(4) 为借书人办理注册
(5) 办理借书手续
(6) 办理还书手续
4. 实验设备管理系统设计
实验设备信息包括:设备编号,设备种类(如:微机、打印机、扫描仪等等),设备名称,设备价格,设备购入日期,是否报废,报废日期等。试设计一实验设备信息管理系统,使之能提供以下功能:
(1) 能够完成对设备的录入和修改
(2) 对设备进行分类统计
(3) 设备的破损耗费和遗损处理
(4) 设备的查询
5. 西文下拉菜单的设计
主要功能:
(1) 完成一个类似TC集成系统菜单的西文下拉菜单的设计
(2) 不要求实现各子菜单的功能
要求:可以通过光标键的移动来选择不同的菜单项,被选择的菜单项反相显示,当选定某个菜单项后,按回车键可以实现一个简单的动作。
6. 学生成绩管理系统设计
现有学生成绩信息,内容如下
姓名 学号 语文 数学 英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
… … … … …
请用C/C++编写一系统,实现学生信息管理,软件的入口界面应包括如下几个方面:
功能要求:
(1)信息维护:
要求:学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息
(2)信息查询:
要求:查询时可实现按姓名查询、按学号查询
(3)成绩统计:
要求:A输入任意的一个课程名(如数学)和一个分数段(如60–70),统计出在此分数段的学生情况。
其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块(视情况可另外加分)
(4)写出课程设计报告,具体要求见相关说明文档
7. 手机通信录管理系统设计
用C/C++设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。
功能要求:
(1)查看功能:选择此功能时,列出下列三类选择。
A 办公类
B 个人类
C 商务类
当选中某类时,显示出此类所有数据中的姓名和电话号码
(2)增加功能:能录入新数据
一个结点包括:姓名、电话号码、分类(办公类、个人类、商务类)、电子邮件。
例如:杨春 13589664454 商务类 chuny@126.com
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(3)拔号功能:能显示出通信录中所有人的姓名,当选中某个姓名时,屏幕上模拟打字机的效果依次显示出此人的电话号码中的各个数字,并伴随相应的拔号声音。
(4)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改
(5)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)建议使用结构和链表等数据结构
(4)学生可自动增加新功能模块
(5)写出课程设计报告,具体要求见相关说明文档
8. 学生学籍信息管理系统设计
使用下面的数据,用C/C++设计一个简单的学籍管理系统,实现出最基本的功能。
学生基本信息文件(A.TXT)及其内容:A.TXT文件不需要编程录入数据,可用文本编辑工具直接生成
学号 姓名 性别 宿舍号码 电话号码
01 张成成 男 501 87732111
02 李成华 女 101 87723112
03 王成凤 女 101 87723112
04 张明明 男 502 87734333
05 陈东 男 501 87732111
06 李果 男 502 87734333
07 张园园 女 102 87756122
… … … … 
; … …
学生成绩基本信息文件(B.TXT)及其内容:
学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分
01 A01 大学物理 3 66 78 82
02 B03 高等数学 4 78 -1 90
01 B03 高等数学 4 45 -1 88
02 C01 VF 3 65 76 66
… … … … … … … … …
功能要求及说明:
(1)数据录入功能:对B.TXT进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据。综合成绩、学分由程序根据条件自动运算。
综合成绩的计算:如果本课程的实验成绩为-1,则表示无实验,综合成绩=平时成绩×30%+卷面成绩×70%; 如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩×15%+实验成绩×15%+卷面成绩×70%。
实得学分的计算:采用等级学分制。
综合成绩在90-100之间 ,应得学分=学分×100% 综合成绩在80-90之间 ,应得学分=学分×80%
综合成绩在70-80之间 ,应得学分=学分×75% 综合成绩在60-70之间 ,应得学分=学分×60%
综合成绩在60以下 ,应得学分=学分×0%
(2)查询功能:分为学生基本情况查询和成绩查询两种
A:学生基本情况查询:
A1—-输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
A2—输入一个宿舍号码,可查询出本室所有的学生的基本信息并显示输出。
B:成绩查询:
B1:输入一个学号时,查询出此生的所有课程情况,格式如下:
学 号:xx 姓 名:xxxxx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
… … … … … … … … …
共修:xx科,实得总学分为: xxx
(3)删除功能:当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。
(4)排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据。
其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块(视情况可另外加分)
(4)写出课程设计报告,具体要求见相关说明文档
9. 单项选择题标准化考试系统设计
功能要求:
(1) 用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)
(2) 试题录入:可随时增加试题到试题库中
(3) 试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)
(4) 答题:用户可实现输入自己的答案
(5) 自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
其它要求:
(1) 只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2) 至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3) 学生可自动增加新功能模块(视情况可另外加分)
(4) 写出课程设计报告,具体要求见相关说明文档
10.设计一个简单计算器
要求:在功能上功能尽量模拟windows操作系统中的计算器,系统界面不做强制要求。
《数据结构》实验指导书:点击下载
空白实验报告:点击下载
一至五章作业:点击下载
第二章作业完成:点击下载
第三章作业完成:点击下载
第五章作业完成:点击下载
—————————
第六章作业:点击下载
第六章作业完成:点击下载
=================================
实验一:单链表的插入和删除:
点击下载
实验报告:点击下载
源文件:点击下载
结果:点击下载
==================================
实验二:利用三元组表实现矩阵相加
点击下载
实验报告:点击下载
源文件:点击下载
结果:点击下载
==================================
实验三:树和二叉树
点击下载
参考:二叉树实现源代码
实验报告:点击下载
源文件:点击下载
结果:点击下载
==================================
实验四:图
点击下载
实验报告:点击下载
源文件:点击下载
结果:点击下载
点击下载
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "windows.h"
#include "iostream.h"
typedef struct node
{
char name[10]; /*进程标识符*/
int prio; /*进程优先数*/
int round; /*进程时间轮转时间片*/
int cputime; /*进程占用CPU时间*/
int needtime; /*进程到完成还要的时间*/
int count; /*计数器*/
char state; /*进程的状态*/
struct node *next; /*链指针*/
}PCB;
PCB *finish,*ready,*tail,*run; /*队列指针*/
int N; /*进程数*/
/*将就绪队列中的第一个进程投入运行*/
void firstin()
{
run=ready; /*就绪队列头指针赋值给运行头指针*/
run->state='R'; /*进程状态变为运行态*/
ready=ready->next; /*就绪队列头指针后移到下一进程*/
}
/*标题输出函数*/
void prt1(char a)
{
if(toupper(a)=='P') /*优先数法*/
printf(" name cputime needtime priority state\n");
else/*简单时间片轮转法*/
printf(" name cputime needtime count round state\n");
}
/*进程PCB输出*/
void prt2(char a,PCB *q)
{
if(toupper(a)=='P') /*优先数法的输出*/
printf(" %-10s%-10d%-10d%-10d %c\n",q->name,
q->cputime,q->needtime,q->prio,q->state);
else/*轮转法的输出*/
printf(" %-10s%-10d%-10d%-10d%-10d %-c\n",q->name,
q->cputime,q->needtime,q->count,q->round,q->state);
}
/*输出函数*/
void prt(char algo)
{
PCB *p;
prt1(algo); /*输出标题*/
if(run!=NULL) /*如果运行指针不空*/
prt2(algo,run); /*输出当前正在运行的PCB*/
p=ready; /*B*/
while(p!=NULL)//输出就绪队列PCB
{
prt2(algo,p);
p=p->next;
}
p=finish; /*输出完成队列的PCB*/
while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
cin.get(); /*压任意键继续*/
}
/*优先数的插入算法*/
void insert1(PCB *q)
{
PCB *p1,*s,*r;
int b;
s=q; /*待插入的PCB指针*/
p1=ready; /*就绪队列头指针*/
r=p1; /*r做p1的前驱指针*/
b=1;
while((p1!=NULL)&&b) /*根据优先数确定插入位置*/
if(p1->prio>=s->prio)
{
r=p1;
p1=p1->next;
}
else
b=0;
if(r!=p1) /*如果条件成立说明插入在r与p1之间*/
{
r->next=s;
s->next=p1;
}
else
{
s->next=p1; /*否则插入在就绪队列的头*/
ready=s;
}
}
/*轮转法插入函数*/
void insert2(PCB *p2)
{
tail->next=p2; /*将新的PCB插入在当前就绪队列的尾*/
tail=p2;
p2->next=NULL;
}
/*优先数创建初始PCB信息*/
void create1(char alg)
{
PCB *p;
int i,time;
char na[10];
ready=NULL; /*就绪队列头指针*/
finish=NULL; /*完成队列头指针*/
run=NULL; /*运行队列指针*/
printf("Enter name and time of process\n"); /*输入进程标识和所需时间创建PCB*/
for(i=1;i<=N;i++)
{p=(struct node *)malloc(sizeof(node));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='w';
p->prio=50-time;
if(ready!=NULL) /*就绪队列不空调用插入函数插入*/
insert1(p);
else
{
p->next=ready; /*创建就绪队列的第一个PCB*/
ready=p;
}
}
system("cls");
printf(" output of priority:\n");
printf("************************************************\n");
prt(alg); /*输出进程PCB信息*/
run=ready; /*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
/*轮转法创建进程PCB*/
void create2(char alg)
{
PCB *p;
int i,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("Enter name and time of round process\n");
for(i=1;i<=N;i++)
{
p=(struct node *)malloc(sizeof(node));
scanf("%s",na);
scanf("%d",&time);
strcpy(p->name,na);
p->cputi
me=0;
p->needtime=time;
p->count=0; /*计数器*/
p->state='w';
p->round=2; /*时间片*/
if(ready!=NULL)
insert2(p);
else
{
p->next=ready;
ready=p;
tail=p;
}
}
system("cls");// clrscr();
printf(" output of round\n");
printf("************************************************\n");
prt(alg); /*输出进程PCB信息*/
run=ready; /*将就绪队列的第一个进程投入运行*/
ready=ready->next;
run->state='R';
}
/*优先数调度算法*/
void priority(char alg)
{
while(run!=NULL) /*当运行队列不空时,有进程正在运行*/
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/
if(run->needtime==0) /*如所需时间为0将其插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F'; /*置状态为完成态*/
run=NULL; /*运行队列头指针为空*/
if(ready!=NULL) /*如就绪队列不空*/
firstin(); /*将就绪对列的第一个进程投入运行*/
}
else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/
if((ready!=NULL)&&(run->prio<ready->prio))
{
run->state='W';
insert1(run);
firstin(); /*将就绪队列的第一个进程投入运行*/
}
prt(alg); /*输出进程PCB信息*/
}
}
/*时间片轮转法*/
void roundrun(char alg)
{
while(run!=NULL)
{
run->cputime=run->cputime+1;
run->needtime=run->needtime-1;
run->count=run->count+1;
if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/
{
run->next=finish;
finish=run;
run->state='F';
run=NULL;
if(ready!=NULL)
firstin(); /*就绪对列不空,将第一个进程投入运行*/
}
else
if(run->count==run->round) /*如果时间片到*/
{
run->count=0; /*计数器置0*/
if(ready!=NULL) /*如就绪队列不空*/
{
run->state='W'; /*将进程插入到就绪队列中等待轮转*/
insert2(run);
firstin(); /*将就绪对列的第一个进程投入运行*/
}
}
prt(alg); /*输出进程信息*/
}
}
/*主函数*/
void main()
{
char algo; /*算法标记*/
system("cls");// clrscr();
printf("type the algorithm:P/R(priority/roundrobin)\n");
scanf("%c",&algo); /*输入字符确定算法*/
printf("Enter process number\n");
scanf("%d",&N); /*输入进程数*/
if(algo=='P'||algo=='p')
{
create1(algo); /*优先数法*/
priority(algo);
}
else
if(algo=='R'||algo=='r')
{
create2(algo); /*轮转法*/
roundrun(algo);
}
}
J2ME编程是Java在智能家电领域的应用,主要包含以下技术:
1、 高级用户界面
高级用户界面是指J2ME编程中用到的Form(窗体)、TextBox(文本框)、List(列表框)和Alert(提示信息框)等的使用,以及其中的一些控件的使用,当然也包括相应的事件处理。应用在一般的如登陆窗体、关于窗体和提示等。
2、 低级用户界面
低级用户界面指Canvas类和Graphics类等的使用,以及相应的事件处理,应用与游戏编程以及特殊界面的绘制等。
3、 记录存储系统
记录存储系统是手机中支持的用于数据永久保存的技术。因为手机中没有数据文件的概念,所以一般需要保存的数据只能以记录的形式保存。
4、 声音处理系统
MIDP1.0不支持声音处理,但是很多手机厂商如Nokia、Siemens等都支持,所以播放声音也是一项需要掌握的技术。该技术使用的API多和手机厂商相关。但是MIDP2.0就提供了通用的支持。
5、 网络编程
网络编程指在手机中通过GPRS或者CDMA网络以HTTP协议或者SOCKET的形式连接网络。现在的手机支持HTTP网络编程的占大多数,支持SOCKET的相对很少。所以网络编程暂时也就是使用HTTP协议进行编程。
6、 多线程
多线程是J2ME应用中比较核心的技术之一,因为进行网络编程和低级用户界面编程是为了响应迅速,都需要处理成多线程。所以也必须熟练掌握。
7、 短信息编程
很多手机都提供了用于发送短信息的API,如NOKIA、SIEMENS、SAMSUNG等,所以在J2ME中发送短信息也是一个比较常用的技术。
8、 其他
当然根据厂商的不同还提供了其他的一些技术,如Siemens的API中支持文件,Nokia的API支持读取系统通讯录等等。
一、J2ME中需要的Java基础知识
现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。
J2ME中使用到的Java基础知识:
1、Java语法基础:包括基本数据类型、关键字、运算符等等
2、面向对象的思想:类和对象的概念,继承和多态等等。
3、异常处理
4、多线程
J2ME中没有用到的Java基础知识:
1、JDK中javac和java命令的使用
2、Java基础中的很多类在J2ME中没有,或者类中的方法做了大量的精简。所以建议在J2ME中熟悉类库。
3、Applet、AWT、Swing这些知识在J2ME中根本使用不到。
简单说这么多,希望学J2ME的朋友们能少走一些弯路,不足之处希望大家积极指正和补充。
二、J2ME中暂时无法完成的功能
列一些J2ME中暂时无法完成的功能,希望大家能积极补充:
1、在手机中不更改代码实现移植,主要指游戏。
2、动态修改按钮文字。
3、在Canvas上接受中文输入。
4、操作本地资源、例如地址本、已收短信息等。
5、制作破坏性的手机病毒。
6、其他等待大家来补充。
三、J2ME的跨平台性
J2ME技术源于Java,所以也具有JVM的优势,可以在支持Java的平台上进行移植,但是现在的J2ME技术在跨平台上却做的很糟糕,我们来简单看一下原因:
1、手机的屏幕尺寸不一:
这个主要在界面制作上。如果你使用的是高级用户界面,比如你做的是应用开发或者用户登陆、用户注册这样的通用功能时,一般没有什么问题。
如果你使用的是低级用户界面,比如你做的是游戏,那么你就需要考虑这个问题了。
2、厂商的扩展API不统一:
例如Nokia的扩展API类库UI系列,在别的手机上或者没有实现,或者包名不同等等。
3、手机平台上实现的bug:
例如Nokia的7650在实现双缓冲上有bug,那么在这种机型上运行的软件就不能使用双缓冲。其他NOKIA上的一些bug,可以参看:http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx
4、手机性能问题。
不同手机的可用内存、最大jar文件都有要求,例如Nokia S40的大部分手机支持的最大jar文件为64K,最大可用内容为210K。
所以现在的手机软件,特别是游戏都提供支持的机型列表,也才有了手机游戏移植人员的存在。
四、学习J2ME可以从事的工作种类
现在J2ME技术可以说相当的火暴,这里介绍一些学好了J2ME之后可以从事的工作的种类:
1、J2ME游戏开发人员
根据游戏策划或者文档要求,在某种特定的机型(以Nokia S40或S60居多)开发游戏程序。这是现在大部分J2ME程序员从事的工作。
需要熟练掌握:高级用户界面、低级用户界面、线程,如果是网络游戏,还需要熟练网络编程。
2、J2ME应用开发人员
现在的移动应用还不是很多,但是还是出现了一些,特别是移动定位以及移动商务相关的内容。需要熟练掌握:高级用户界面、线程和网络编程。
3、J2ME游戏移植人员
参照源代码,将可以在一个平台上可以运行的游戏移植到其他平台上去。例如将Nokia S40的游戏移植到S60上,或者索爱的T618等等。主要是控制屏幕坐标,有些可能需要替换一些API。
需要熟悉各平台之间的差异以及相关的技术参数,比如屏幕大小、最大jar文件尺寸等等。
五、J2ME程序设计的几个原则
1、使用面向对象编程。
虽然使用面向过程编程可以减小文件的尺寸,但是为了以后维护的方便和利于扩展,还是要使用面向对象编程。
2、使用MVC模式
将模型、界面和控制分离。现在很多的程序将三者合一,但是如果你做的程序比较大的话,还是建议你进行分离。
3、自动存储用户设定
使用RMS来存储用户的信息,例如存储用户上次输入的用户名、密码、用户对于系统的设定等,这样不仅可以减少用户的输入,而且对用户友好。很多程序甚至做了自动登陆等。
4、一些系统设置允许用户关闭。如背景音乐、背景灯显示等。
5、将低级用户界面的绘制动作放在一个独立的线程里面去。
6、在需要大量时间才能完成的工作时,给用户一个等待界面。
六、从模拟器到真机测试
对于J2ME开发者来说,模拟器给我们带来了很多方便,比如可以在模拟器中调试程序以及很方便的察看程序的效果,但是模拟器也给我们带来了一些问题,比如模拟器实现的bug等等,所以进行真机测试是必须的。
1、为什么要进行真机测试?
因为模拟器程序可能存在bug,以及真机的性能有限,所以必须进行真机测试。
2、如何将程序传输到机器中?
将程序传输到机器中有如下方式:
a) OTA下载
b) 使用数据线传输
c) 红外传输
d) 蓝牙
你可以根据条件,选择合适的方式。
3、 真机测试主要测什么?
真机测试的内容很多,主要测试以下几个方面:
a) 程序的功能
b) 程序的操作性,是否易操作
c) 程序的大小,比如Nokia S40系列的手机大部分接受的最大文件尺寸为64K
d) 程序运行速度,速度是否可以忍受。
七、从WTK到厂商SDK
对于J2ME爱好者来说,基本上大家都是从SUN的WTK(J2ME Wireless Toolkit)开始的,但是对于实际应用来说,仅仅使用WTK是远远不够的,所以在学习过程中,必须完成从WTK到SDK的跨越。
1、厂商SDK的下载地址?
·Nokia
Nokia不愧为手机行业的老大,对于j2me的支持也是一流的,有专门的网站提供SDK和各种文档说明。
网址是:http://forum.nokia.com.cn/sch/index.html
·Siemens
Siemens对于J2ME的支持也不错,它提供了SDK,模拟器需要独立安装。下载地址如下:
https://communication-market.siemens.de/portal/main.aspx?LangID=0&MainMenuID=2&LeftID=2&pid=1&cid=0&tid=3000&xid=0
·SonyEricsson
SonyEricsson SDK以及自己的模拟器,下载地址为:
http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp
http://mobilityworld.ericsson.com.cn/development/download_hit.asp
·Motorola
Motorola提供了专门的SDK
1.具备良好的java语言基础,不要还没有学习java语言就拿起一本J2ME的书来看。这样效果并不好,相反如果你有良好的java语言基础的话,J2ME就显得比较容易掌握!
2.如果你决定开始学习J2ME了,那么首先你应该清楚J2ME的体系结构是什么样的。当你真正清楚了Configuration和Profile的关系、了解了CDC和CLDC的区别后,那么你可以开始编写自己的H elloWorldMIDlet了
3.选择优秀的开发环境,J2ME的开发环境比较灵活。我推荐使用Eclipse和EclipseME插件。因为Eclipse的插件非常丰富且灵活,当你开发联网应用程序的时候安装Lomboz就可以了。当然你也可以选择Jbuilder等IDE,但是不推荐记事本!
4.在编写代码之前,应该多读一下好的代码。毕竟MIDlet的写法和一般的java Application不是很一样。推荐WTK中的Demo程序。
5.MIDP的API doc比较少,每个类的方法也很少。如果有时间的话,每天看个4-5个。这会对你帮助很大。毕竟它的API和J2SE的并不一样,只是它的子集,不应该想当然的使用。
6.清楚MIDP中高级UI和低级UI类的使用和区别,在你做用户界面的之前,思考好什么符合你的要求,推荐使用高级UI,这样更简单、可移植性更好。但是需要使用Canvas的时候不要犹豫,大胆使用!清楚高级事件和低级事件处理的机制。
7.在开发应用程序的时候尽量使用MVC模式,这样扩展性出色。彻底掌握Record Management System,这是MIDP的一个重要子集。实现数据持久性存储不可缺少的系统。善于使用RecordFilter和RecordEnumeration来简化RMS的操作,在我的blog里面有一系列的关于RMS的文章,有时间就看看吧!
8.重视线程,如果你还不真正清楚线程的时候的话,那么赶快找资料看看吧。在J2ME的开发中,这非常的重要。具备了联网的能力则给你的应用程序插上了翅膀,而联网的时候为了避免堵塞一定要使用多线程技术。
9.时刻关注最新的技术,比如PIM,BlueTooth等都在慢慢的得到支持。你可以使用WTK2.2开发相关的程序了。
10.掌握Java中文问题,在J2ME中这个问题更加突出。你应该把你的应用程序放到手机上去测试这个问题而不是在模拟器上。
11.IO不用我说你也必须清楚,在J2ME中提供的IO包中,类比较少你更应该注意。
12.不要因为听说手机资源受限,在写程序的时候就顾虑重重,不要牺牲代码的可读性和可维护性,但是也不能乱用。这个时候你的java语言的基础起到了重要的作用!
13.如果想开发游戏,那么你应该多读相关的书籍。
14.如果有些问题想了很久都没有明白的话,可以到论坛上去问问,但是不要一有问题就问,自己思考后得到正确答案效果更好。或者把问题放下几天,也许自然而然就明白了!不是胡说。
15.多写代码!多多总结!简单的八个字,非常重要:)
本文描述了在J2me中开发主要使用的网络连接方法,分别详细介绍了使用http和socket两种方法。
HttpConnection
首先我们先来看一个简单的例子吧:
主要用到的java包:
javax.microedition.io.*;
public String requestGET(String URLString,String URL) throws IOException{
// =====================================
// URLString是HTTP地址,URL为后面的参数
// 这里的例子是发送用的用户名和密码到服务器端进行用户验证
// 比如 String URLString = "http://192.168.0.1:8080/login.jsp";
// String URL = "?Name="+this.txtName+"&Pass="+this.txtPass
// =====================================
HttpConnection hpc = null;
DataInputStream dis = null;
boolean newline = false;
String content = "";
try{
// =====================================
// 建立连接
// =====================================
hpc = (HttpConnection)Connector.open(URLString+URL);
hpc.setRequestMethod(HttpConnection.GET);
dis = new DataInputStream(hpc.openInputStream());
int character;
// =====================================
// 读取返回的HTTP内容
// ====================================
while((character = dis.read()) != -1){
if((char)character == '\\'){
newline = true;
continue;
}
else{
if((char)character =='n'&& newline){
content +="\n";
newline = false;
}
else if(newline){
content +="\\" +(char)character;
newline = false;
}
else{
content +=(char)character;
newline = false;
}
}
}
}
catch(IOException e){
System.out.print("ERROR:"+e);
}
finally{
if(hpc != null){
hpc.close();
hpc = null;
}
if(dis != null){
dis.close();
}
}
// ====================================
// 由于内容可能有中文,所以在接受到信息后要对内容进行字符集的转换
// ====================================
content = (unicodeTogb2312(content)).trim();
return content;
}
public static String unicodeTogb2312(String s){
if (s==null){ return ""; }
if (s.equals("")){ return s; }
try{
return new String(s.getBytes("ISO8859_1"),"gb2312");
}
catch(Exception uee){
return s;
}
}
以上就是一个简单的HTTP连接并且从服务器获取响应信息的例子,应该很简单了吧。客户端就是上面那个样子,服务器端只要配置好IIS,增加一个网页来对客户端的请求做出响应就行了,其实跟一般的网页请求没有多大区别,很简单吧!!
上面的Socket客户端连接程序就应该算是完工了,下面是搭建服务器端对客户端的连接进行响应。建立服务器端程序,只需要有以下代码即可:
SocketConnection
下面还是从实例入手讲一下J2me的Socket编程。
程序首先打开以IP地址为192.168.0.1:6666的Socket连接,如果连接失败则抛出异常,程序结束。如果Socket连接成功,则继续。
public boolean SocketConn(String s) throws IOException{
// ==================================
// s是Socket连接字符串
// 这里的例子是发送用的用户名和密码到服务器端进行用户验证
// 比如 String s = "socket://192.168.0.1:6666"
// ==================================
private StreamConnection conServer;
private String strServerAddr;
private boolean bConnected;
conServer = null;
strServerAddr = s; // 连接地址
bConnected = false; // 连接状态
try
{
conServer = (StreamConnection)Connector.open(strServerAddr);
}
catch(Exception exception)
{
System.out.println("Connect server error");
bConnected = false;
return false;
}
bConnected = true;
System.out.println("connect ok!");
return true;
}
上面的Socket客户端连接程序就应该算是完工了,下面是搭建服务器端对客户端的连接进行响应。建立服务器端程序,只需要有以下代码即可:
……….
try{
// 建立端口为6666的socket服务器
ServerSocketConnection SocketSer;
SocketSer = (ServerSocketConnection)Connector.open("socket://:6666");
// 等待客户端连接
SocketConnection sc;
// 如有连接,则新增一个线程对连接进行处理
sc = (SocketConnection)SocketSer.acceptAndOpen();
……….
while(true){
// 对sc的InputStream和OutPutStream进行处理
}
}
……….
在这里需要说明一下我的看法,手机通过Socket连接上服务器后,由于我用的是中国移动的号码,所以跑的是GPRS通道,我所建立的服务器连接所获得的客户端IP只是一个虚拟IP,而这个IP估计是以用户当前最近的移动机站的编码通过一些变化而产生的,所以当用户不停的移动的时候,IP也许会发生变化(这里我就不太清楚了),有兴趣的可以去看看“移动虚拟IP技术”相关的报道。本来我以前的想法是用户连接到服务器后只要IP不变就可以实现服务器向客户端广播数据,但是这个IP并非是长连接,服务器在广播数据的时候也许会有很大部分的客户端的IP会出现变化,所以最后还是采用由客户端主动发送信息的形式。感觉有点扯远了,还是回到正题吧。
客户端在建立Socket连接成功后,即可向服务器发送信息,以下是发送信息模块
protected boolean sendData(byte abyte0[])//自己替换[]
{
System.out.println("send :" + bConnected);
// 判断连接情况
if(!bConnected)
return false;
OutputStream outputstream = null;
try
{
outputstream = conServer.openOutputStream();
// 写信息到outputstream中
outputstream.write(abyte0);
// 我的理解是强制送出所有已经写了的信息
outputstream.flush();
outputstream.close();
}
catch(Exception exception)
{
System.out.println("Send Data error");
bConnected = false;
try
{
if(outputstream != null)
outputstream.close();
// 调用断开连接的函数
disconnect();
}
catch(Exception exception1) { }
return false;
}
return true;
}
下面是读取服务器响应的信息
,其他的就不一一说了,把outputstream改为inputstream,然后使用inputstream的read方法就可以了。
…………..
inputstream = conServer.openInputStream();
…………..