程序员,标记思想你要会。

来源:互联网 发布:淘宝运营推广培训 编辑:程序博客网 时间:2024/05/16 15:30
放两天假,昨天第一次去珠海的图书馆,然后又去体育中心。在宿舍闲的蛋疼。今天下午跑完4000米。跑完后感觉一个字爽。哈哈。回寝室的时候脑海中突然有个一闪而过的想法,发现很多的业务都要用到一个思想那就是标记。根据之前做过的题,我举出了下面四个例子来证明这个标记思想。

第一个例子:购物车
  • javaweb中servlet实现:
    //这是一个servlet 中用来进行购买的操作
    protected void  storelist (HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
         String pid =request.getParameter("pid");  //得到双击后的编号
    ArrayList<Adj_proBean> adjlist = (ArrayList<Adj_proBean>) request.getSession().getAttribute("adjlist");
    if(adjlist==null){
adjlist=new  ArrayList<Adj_proBean>();  //第一次创建 集合
    }
          boolean bl=false;  //假设购物车中没有
  for(int i=0;i<adjlist.size();i++){
  if(adjlist.get(i).getpId().equals(pid)){
 adjlist.get(i).setAdjAmount(adjlist.get(i).getAdjAmount()+1);  //改变数量
 float a=adjlist.get(i).getAdjAmount()*Float.parseFloat(adjlist.get(i).getPrice());
 adjlist.get(i).setAdjTotal(Float.toString(a)); //设置价格
         bl=true;  //标记状态表示找到了
        break;// break 不再往后找了,提高效率
  }   
  }
  if(!bl)  // 购物车中没有该商品,则添加这种商品到购物车
  {
      Adj_proBean ab=new AdjustService().show_adj_info(pid);  
      ab.setAdjAmount(1);  
      float money=ab.getAdjAmount()*Float.parseFloat(ab.getPrice());
      ab.setAdjTotal(Float.toString(money)); 
      adjlist.add(ab); 
  } 
 request.getSession().setAttribute("adjlist", adjlist);  //存到session中
    }

第二个例子:求素数

C语言实现:
//这里举的例子是输出100之内的素数
void main()
{
    int i,j;
    int bl;
    for(i=2;i<100;i++){
        bl=1;//默认每个数都是素数
        for(j=2;j<i;j++){
          if(i%j==0){
              bl=0;  //只要有一个%j是0 就不是素数
              break;
          }
        }
        if(bl)
         printf("%d\n",i);
    } 
}

分析:
         根据这个例子,我们在web程序中可能会遇到这样一个业务,比如: 一个调整单据,记录一些商品进行调整情况,然后保存。但由于业务需求,可能那张调整单据,后期还要进行修改,或者再往那张单据中添加一些商品,则那张单据一些数据需要进行修改,一些数据需要进行往数据库中添加。这里,用此标记思想就可以解决这个问题。
解决:
         以下是我的思路: 对单据里的商品进行添加或修改后,从session中得到新集合,把对象存到一个数组中, 然后再根据该单据编号从数据库中查出所有商品编号,放到字符串数组中。 接下来用两个for 循环判断就是啦。若被标记了就表示数据库中有,然后就对该编号的商品进行修改,如果没有标记就进行增加操作。 OK,一切都不是问题。



第三个例子:产生10个15以内不重复的数字。
C实现: 
思路:既然要不重复的数字,这里我就想,产生过了,肯定要有个标记来记录这个数字产生过。若下次循环继续产生同一数字的话,就根据标记,跳过该循环,进行下一个。OK,思路有了,代码自然就出来了。
如下:
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main()
{
  int arr[15]={1,0};  //默认0出现过,1-30都没出现过
  int i,n;
  srand(time(NULL));
  for(i=1;i<=10;i++)
  {
     n=rand()%15;
     if(arr[n]!=0){
       i--;
       continue//出现过则跳过
     }
     else{
      printf("%d\t",n);
      arr[n]=1; //标记出现过
     }
  }
}
//我举这个例子的话是有原因的,记得有一次,我用javascript做了一个网页式数字拼图游戏,其中就要用到不同的随机数。所以,万变不离其中,可见标记思想的重要性了。




第四个例子:没有交作业的学生
 
Java 实现:
//这个例子真是突发奇想,有一天,有个学弟说,交了作业天天都要数数谁没教作业,于是,想法就有了,做一个检查没教作业的学生程序。

OK,下面是Java程序代码:
1、首先建立一个Student类,有属性name .有于较简单,这里省略该类的代码。
2、建立一个dao : 里面有方法
   public ArrayList<Student> initStudents(){
     //这里是初始化学生。
   }
  
  //下面的这个方法是检查学生姓名,若存在则移除集合中的该学生。
  public  static boolean CheckStudent(ArrayList<Student> stulist){
        File file =new File("E:\\62班作业"); //这是指明要检查的文件夹
        boolean bl=false;
        if(file.isDirectory()){   //判断是否存在该文件夹
            File[] files=file.listFiles(); //得到该目录下得文件
            for(int i=0;i<files.length;i++){  //循环该文件夹
               String stuName=files[i].getName();  //得到该文件夹的名字
               Student stu=new Student(stuName);
               for(int j=0;j<stulist.size();j++){  //循环集合中的名字
                   if(stulist.get(j).equals(stu)){  //如果包含该文件夹的名字   
                     stulist.remove(stu); //移除集合中存在的学生名字
                   }
               }
            }
            bl=true;
        }else{
            System.out.println("请检查的文件夹的命名是否为”88班作业”,注意路径应放在E盘");
            bl=false;
        }
        return bl;
    }
3、 建立一个Client  应用
               public static void main(String[] args) {
           StudentDao sd=new StudentDao();
           sd.initStudents();  //初始化学生
           boolean bl=sd.CheckStudent();  //检查没交作业的学生
           if(bl){
                              System.out.println("没交作业的人数:"+stulist.size()+"  信息如下↓");
            for(int i=0;i<stulist.size();i++){  //查看没交的学生名单
                System.out.println(stulist.get(i).toString());
            } 
           }else{
                                    System.out.println("要检查的文件夹不存在,请数据正确的路径");
                            } 
               }

//OK,这就是我的检查作业的程序,其核心原理就是查看文件夹名,然后和集合中的对象进行对比,如果相等,则把集合中的对象移除,最后集合剩下的就是没交作业的学生。
 
标记思想就先归纳到这里,以后我还有继续发一些关于技术上新的思路和总结。 
                            2013-11-23          小高  
     
原创粉丝点击