分页函数算法

  最近在做毕业设计,界面要用到分页技术,于是就将自己所整理的以及思考的结果整理出来给大家分享,希望对你们有所帮助。

  首先分页要用到4个属性

  pageNow:当前页 

       pageSize:每页条数 

       pageCount:总页数 

        rowCount:总条数

        其中rowCount可以通过查询获得,而pageCount可以通过计算获得。    

if(rowCount%pageSize==0){
				pageCount=rowCount/pageSize;
			}else{
				pageCount=rowCount/pageSize+1;


       不过这段代码完全可以简化位一句:

       pageCount=(rowCount+pageSize-1)/pageSize;//计算总页数

  下面给出详细的算法和分析:

public ArrayList<UserBean> getUsersByPage(String sql,int pageSize,int pageNow){
		ArrayList<UserBean> al=new ArrayList<UserBean>();
		try {
			
			Connection conn=this.getConn();
			System.out.println(conn);
			ps=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
			rs=ps.executeQuery();
			rs.last();//光标指向查询结果集中的最后一条记录
			int rowCount=rs.getRow();//获取记录总数
			int pageCount=(rowCount+pageSize-1)/pageSize;//计算总页数
			if(pageNow>pageCount) pageNow=pageCount;
			if(pageNow<1) pageNow=1;
			if(pageCount>0){
				/*将记录定位到待显示页的第一条记录上,absolute(int row)函数
				 * 表示将记录移动指定的row行中*/
				rs.absolute((pageNow-1)*pageSize+1);
				int i=0;//设置计数器
				//i小于pageSize并且光标还没移动到最后一行记录的后面
				while(i<pageSize&&!rs.isAfterLast()){
					UserBean ub=new UserBean();
					ub.setUserid(rs.getInt(1));
					ub.setUsername(rs.getString(2));
					ub.setTruename(rs.getString(3));
					ub.setEmail(rs.getString(4));
					ub.setPhone(rs.getString(5));
					ub.setAdress(rs.getString(6));
					ub.setPostcode(rs.getString(7));
					ub.setGrade(rs.getInt(8));
					rs.next();
					i++;
					al.add(ub);
				}
			}

		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally{
			this.close();
		}
		return al;
	}

  其中ps=conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)中必须用到可滚动的结果集TYPE_SCROLL_INSENSITIVE,表示rs指针可再结果集上前后滚动移动,rs.last()就表示了这个用法。

       而getConn()为数据库连接函数,close()为关闭资源函数,还有一个UserBean的get和set函数,这些应该是不难的。

       有不理解或是不足的地方欢迎提出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一份简单的 C 语言代码来模拟实现请求分页虚存分页替换算法。 首先,我们需要定义一些变量和数据结构来实现虚拟内存管理。我们可以使用一个结构体来表示每一页,并使用一个数组来表示虚拟内存中的所有页面。这个数组可以初始化为空,表示所有的页面都未分配。 ```c #define PAGE_SIZE 4096 #define NUM_PAGES 1024 struct Page { int pid; // 进程ID int pnum; // 页号 int valid; // 页面是否有效 int dirty; // 页面是否被修改 char *data; // 页面数据 }; struct Page pages[NUM_PAGES]; ``` 在模拟实现请求分页虚存分页替换算法时,我们需要使用一个页表来记录每个进程的虚拟地址和实际物理地址之间的映射关系。我们可以使用一个结构体来表示页表中的每一项。该结构体应包含虚拟页号、物理页号和一些标志位,如是否有效、是否被修改等。 ```c struct PageTableEntry { int vpage; // 虚拟页号 int ppage; // 物理页号 int valid; // 该项是否有效 int dirty; // 该页是否被修改 }; ``` 然后,我们需要实现一个函数来分配物理页。我们可以使用一个简单的循环来遍历所有的页面,并找到第一个未被分配的页面。如果找到了这样的页面,我们就将其标记为已分配,并返回其页面号。 ```c int allocate_page() { for (int i = 0; i < NUM_PAGES; i++) { if (!pages[i].valid) { pages[i].valid = 1; return i; } } return -1; // 没有可用页面 } ``` 接下来,我们需要实现一个函数来读取或写入某个进程的某一页。此函数应该首先检查该页是否已经在物理内存中。如果是,则直接读取或写入该页。否则,我们需要使用虚存分页替换算法来选择一个页面,并将其替换出去。我们可以使用 LRU 算法来实现这个虚存分页替换算法。该算法会选择最近最少使用的页面进行替换。 ```c void access_page(int pid, int pnum, int write) { // 在页表中查找该页 for (int i = 0; i < NUM_PAGES; i++) { if (page_table[pid][i].vpage == pnum) { // 页已经在物理内存中,直接读取或写入 int ppage = page_table[pid][i].ppage; pages[ppage].dirty |= write; // 更新最近使用时间 pages[ppage].last_access = time(NULL); return; } } // 页不在物理内存中,需要替换页面 int ppage = allocate_page(); if (ppage == -1) { // 没有可用页面,无法替换 printf("Error: out of physical memory.\n"); return; } // 将当前页面替换出去 int victim = find_victim(pid); if (victim == -1) { // 找不到可替换的页面 printf("Error: cannot find victim page.\n"); return; } // 将虚拟页面释放 page_table[pid][victim].valid = 0; if (pages[page_table[pid][victim].ppage].dirty) { // 如果页面被修改了,需要写回磁盘 write_page_to_disk(pid, page_table[pid][victim].ppage); } // 在物理内存中加载新页面 pages[ppage].pid = pid; pages[ppage].pnum = pnum; pages[ppage].valid = 1; pages[ppage].dirty = write; // 从磁盘读取页面数据 read_page_from_disk(pid, pnum, pages[ppage].data); // 更新页表 page_table[pid][ppage].vpage = pnum; page_table[pid][ppage].ppage = ppage; page_table[pid][ppage].valid = 1; page_table[pid][ppage].dirty = write; // 更新最近使用时间 pages[ppage].last_access = time(NULL); } ``` 最后,我们需要实现一个函数来查找可替换的页面。我们可以使用 LRU 算法来实现这个函数,选择最近最少使用的页面进行替换。该算法需要遍历所有的页面,并找到最近最少使用的页面。 ```c int find_victim(int pid) { int min_time = INT_MAX; int victim = -1; for (int i = 0; i < NUM_PAGES; i++) { if (pages[i].valid && pages[i].pid == pid) { if (pages[i].last_access < min_time) { min_time = pages[i].last_access; victim = i; } } } return victim; } ``` 这样,我们就完成了一份简单的 C 语言代码来模拟实现请求分页虚存分页替换算法。请注意,此代码可能并不完整或正确,仅供参考。在实际使用中,您可能需要进行更多的测试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值