找回密码
 立即注册
首页 业界区 业界 一个昏暗的编程教室,电脑屏幕前坐着一位程序员(你), ...

一个昏暗的编程教室,电脑屏幕前坐着一位程序员(你),旁边站着一位好奇的朋友。

赙浦 2 小时前
1.png

 
可以先看视频:https://www.douyin.com/video/7602172380894563636
朋友:“嘿,伙计,你在干啥呢?这屏幕上一堆小球在动来动去的,是啥玩意儿?”
你(推了推眼镜):“哦,这是冒泡排序的可视化程序。你知道冒泡排序吗?”
朋友:“听说过,但具体咋回事我不太清楚。”
你:“那我就给你讲讲。就像这些小球一样,它们一开始是乱序的,我们要把它们从小到大排好。”
朋友:“那怎么排呢?”
你:“很简单,就是两两比较,如果前面的比后面的大,就交换位置。就像这样——”
(你指着屏幕)
“你看,第一个红球和橙球比,发现红球大,于是它们交换位置;接着橙球和黄球比……”
朋友:“哦,有点像打牌时理牌的感觉。”
你:“对对对!就是这么个意思。每一轮下来,最大的那个数就会‘沉’到最后面,就像气泡往上冒一样,所以叫‘冒泡排序’。”
朋友:“那这些小球为啥会动啊?”
你:“因为我们用了C++精灵库,每个小球都是一个‘Sprite’对象,有颜色、大小、位置等属性。每次交换的时候,我们不仅换数据,还让它们的图像也跟着移动。”
朋友:“哇,还挺直观的。”
你:“是啊,而且你看上面还有文字提示,说现在是第几轮,最后还会显示‘演示完毕!’”
朋友:“那谁写的这个程序啊?”
你(得意地笑):“我师祖——李兴球老师。他写了这个C++精灵库,方便我们做这种动画效果。”
朋友:“厉害啊!那我能不能也试试?”
你:“当然可以,代码都在这儿呢,你想改多少都行。”
  1. #include "sprites.h"  //包含C++精灵库
  2. using namespace std;
  3. Sprite rocket;      //建立角色叫rocket
  4. struct Node{
  5.    int value,x;  //值和坐标
  6.    Sprite *sp;
  7. };
  8. vector<Node *> datas;
  9. vector<string> colors = {"red","orange","yellow","green",
  10.                          "cyan","blue","purple","pink"};
  11. void swap(int i,int j){   //交换两个节点
  12.      Node *a = datas[i];
  13.      Node *b = datas[j];   
  14.      //交换a和b的x从标,并且到达自己的坐标   
  15.      int tempx = a->x;
  16.      a->x = b->x;
  17.      b->x = tempx;
  18.      a->sp->go(a->x,0);
  19.      b->sp->go(b->x,0);
  20.      //在datas中的位置也要交换
  21.      Node *temp ;   
  22.      temp = datas[i];
  23.      datas[i] = datas[j];
  24.      datas[j] = temp;     
  25. }
  26. int main(){        //主功能块
  27.    g_screen->bgcolor("black");
  28.    int n= randint(5,8);
  29.    int x = 50-100*n/2;    //最左边节点坐标(起始)
  30.    for(int i=0;i<n;i++){    //建立n个节点,放到datas中
  31.       int v = randint(30,200);
  32.       Node *node = new Node;
  33.       node->value = v;
  34.       node->x = x;
  35.       //按顺序选择索引为i的颜色,组合成角色的造型图片
  36.       string s = "res/circle_" + colors[i] + ".png";
  37.       Sprite *js = new Sprite(s); //新建角色,以s为造型
  38.       js->scale(v/100.0);        //把角色缩小,要不然太大了
  39.       js->penup();  js->go(x,0); js->speed(1); //定好起始位置
  40.       node->sp = js;             //节点包含有角色指针
  41.       datas.push_back(node);      
  42.       x = x + 100;     //每个节点相差100个单位
  43.    }
  44.    Sprite pen{"blank"};
  45.    pen.up().color(0).sety(300).write("冒泡排序算法可视化演示程序",50);
  46.    pen.color(30).sety(230).write("作者:李兴球,采用C++精灵库",30);
  47.    pen.color(60).sety(180).write("C++精灵库作者:李兴球",20);
  48.    rocket.wait(1).color("yellow").penup().sety(130).hide();
  49.    //真正的冒泡排序核心程序开始了
  50.    for(int j=1;j<n;j++){  //排序的核心程序在这里
  51.       string s = "第 " + to_string(j) + " 轮";   
  52.       //删除最早写的文字,然后写上新的文字,并且等待1秒  
  53.       rocket.cleartxts(1).write(s,42).wait(1);
  54.       for(int i=0;i<n-j;i++)   
  55.          if(datas[i]->value > datas[i+1]->value ) //发现更大的,则交换
  56.              swap(i,i+1);
  57.       rocket.wait(1);
  58.    }
  59.    rocket.cleartxts(1).write("演示完毕!",42).done();     //完成了
  60.    return 0;    //返回0
  61. }
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册