【C++】自研超酷的数据看板(多功能分页显示)

效果

写个人通讯录管理系统中查看联系人时研究出来的,废话不多说,先看个效果!

自研超酷的数据看板示例演示

代码

接下来上代码!

void List::printNode() {
    int pos = 1, page = 1, total=0, allpage, ct=0, numPerPage=10;
    int input;
    contacts* temp = head, *count = head;
    //统计节点数
    while (count != nullptr) {
        total++;
        count = count->getNext();
    }
    if (total == 0) {
        cout << "您的通讯录中无数据,请先添加联系人!" << endl;
        Sleep(3000);
        return;
    }
    while (1) {
        //计算总页数
        if (total % numPerPage == 0) {
            allpage = total / numPerPage;
        }
        else {
            allpage = total / numPerPage + 1;
        }
        //屏幕输出
        system("cls");
        pos = (page - 1) * numPerPage + 1;
        temp = head;
        ct = 0;
        cout << "=============================================================================================================" << endl;
        cout << "[ " << right << setw(3) << numPerPage << "条数据/页                               通讯录  查看联系人                                 第" << right << setw(3) << page << '/' << left << setw(3) << allpage << "页 ]" << endl;
        cout << "=============================================================================================================" << endl;
        cout << "姓名    手机号         座机号         QQ号           邮箱                     单位      地址      分类  " << endl;
        while (temp != nullptr) {
            if (++ct<pos) {
                temp = temp->getNext();
                continue;
            }
            temp->printInfo();
            temp = temp->getNext();
            pos++;
            if (pos % numPerPage == 1) {
                break;
            }
        }
        cout << "=============================================================================================================" << endl;
        cout << "[     输入[0]返回至菜单  输入[1]查看上一页  输入[2]查看下一页  输入[3]进入页数跳转  输入[4]选择分页大小     ]" << endl;
        cout << "=============================================================================================================" << endl;
        while (1) {
            if (!(cin >> input) || input < 0 || input > 4) {
                cout << "数据输入错误,请重新输入:";
                cin.clear();
                cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
                continue;
            }
            if (input == 0) {
                return;
            }
            else if (input == 1) {
                if (page == 1) {
                    cout << "没有上一页了,请重新输入:";
                    continue;
                }
                page--;
            }
            else if (input ==2) {
                if (page == allpage) {
                    cout << "没有下一页了,请重新输入:";
                    continue;
                }
                page++;
            }
            else if (input == 3) {
                int target;
                while (1) {
                    cout << "请输入要跳转到的页码:";
                    if (!(cin >> target) || target < 1 || target > allpage) {
                        cout << "页码范围有误,请重新输入!" << endl;
                        cin.clear();
                        cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
                        Sleep(2000);
                        continue;
                    }
                    break;
                }
                page = target;
            }
            else if (input == 4) {
                int input;
                while (1) {
                    cout << "[1]10条/页  [2]20条/页  [3]30条/页  [4]50条/页  [5]100条/页\n请选择新的分页大小:";
                    if (!(cin >> input) || input < 1 || input > 5) {
                        cout << "页码范围有误,请重新输入!" << endl;
                        cin.clear();
                        cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
                        Sleep(2000);
                        continue;
                    }
                    break;
                }
                switch (input) {
                    case 1:
                        numPerPage = 10;
                        break;
                    case 2:
                        numPerPage = 20;
                        break;
                    case 3:
                        numPerPage = 30;
                        break;
                    case 4:
                        numPerPage = 50;
                        break;
                    case 5:
                        numPerPage = 100;
                        break;
                    default:
                        numPerPage = 10;
                        break;
                }
                page = 1;
            }
            break;
        }
    }
    return;
}

我的解释

下面由我来讲解一下整体思路:

首先定义变量。

pos是当前的数据位置,默认在第一个数据;page是当前的页数,默认是第一页;total待会要统计的所有节点数;allpage是经过不同分页大小设置后计算得到的总页数;ct是计数器;numPerPage是分页大小,默认是10条数据/页。

接下来遍历链表统计有多少数据计入total中。

如果total==0,没有数据直接提示无联系人,然后返回。

进入while(1)无限循环。

接下来通过取余numPerPage计算有多少页计入allpage。

然后就是输出最基本的数据,计数器ct归零,根据page和numPerPage计算当前的pos应该在哪里。

一切准备就绪之后,重新遍历链表。

在这次遍历操作中,程序需要判断当前遍历位置ct是否到达了之前计算好的pos,这也就是找到当前页的起始元素个数(位置)pos,遍历链表到达这个位置。如果没到的话,就直接下一个节点,然后continue。如果到了就print当前节点信息,判断当前pos是否到达了页尾,就是用取余的方式,取余numPerPage是否等于1,因为之前已经pos++了,所以判断取余结果是不是1,如果在之后pos++可以判断取余结果是不是0。

再下面就是操作部分,可以自己看,很简单的。

ChatGPT的解释

这段代码实现了一个函数 List::printNode(),其作用是在控制台输出通讯录中联系人的信息,并允许用户进行分页查看。让我逐步解释其中的主要部分:

  1. 变量声明与初始化
    • pos, page, total, allpage, ct, numPerPage, input 是函数内部用于控制显示逻辑的变量。
    • contacts* temp = head, *count = head; 声明了两个指向 contacts 类型的指针,tempcount,并将它们都初始化为指向通讯录头部。
  2. 统计节点数
    • while (count != nullptr) { total++; count = count->getNext(); } 这段代码通过遍历链表,计算通讯录中的节点总数。
  3. 处理空通讯录情况
    • 如果 total 为 0,说明通讯录为空,函数会输出一条提示信息并等待3秒后返回。
  4. 分页显示
    • 使用 while (1) 进入一个无限循环,该循环用于控制分页展示逻辑。
    • 首先计算 allpage 即总页数。
    • 清空屏幕,准备进行信息输出。
    • 使用 pos 来追踪当前页的起始位置。
    • 输出一页的联系人信息,通过 temp->printInfo() 来打印每个联系人的信息。
    • 显示分页控制选项 [0]返回菜单 [1]上一页 [2]下一页 [3]跳转页数 [4]选择分页大小
    • 进入内层的无限循环,等待用户输入选择分页操作。
  5. 用户输入处理
    • 通过 cin >> input 获取用户输入的操作。
    • 如果输入不合法,会要求用户重新输入。
    • 根据用户选择的操作,更新 page 变量以实现翻页或跳转到指定页数。
    • 如果用户选择更改分页大小,会要求用户输入新的分页大小并进行相应的更新。
  6. 循环逻辑
    • 整个函数都被包裹在一个外层的无限循环内,只有在用户选择输入 0 时才会通过 return; 语句退出循环和函数。

总体来说,这段代码通过循环、条件语句和用户输入来实现了一个在控制台中分页显示通讯录信息的功能。同时也提供了用户界面来进行交互,允许用户根据需要浏览通讯录信息。

© 版权声明
THE END
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容