找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2250|回复: 0
打印 上一主题 下一主题
收起左侧

计算机算法基础实验程序及运行结果

[复制链接]
跳转到指定楼层
楼主
ID:632295 发表于 2019-10-29 21:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一找最大和最小元素与归并分类算法实现(用分治法)
一、实验目的

1.掌握能用分治法求解的问题应满足的条件;
2.加深对分治法算法设计方法的理解与应用;
3.锻炼学生对程序跟踪调试能力;
4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
二.实验内容

(1)找最大最小元素:输入n个数,找出最大和最小数的问题。
(2)归并分类:对n个数用归并方法排序。
三.实验要求

(1)用分治法求解问题
(2)上机实现所设计的算法;
四.实验过程设计(算法设计过程)

常规的做法是遍历一次,分别求出最大值和最小值,但我这里要说的是分治法(Divide and couquer),将数组分成左右两部分,先求出左半部份的最大值和最小值,再求出右半部份的最大值和最小值,然后综合起来求总体的最大值及最小值。这是个递归过程,对于划分后的左右两部分,同样重复这个过程,直到划分区间内只剩一个元素或者两个元素。

解决问题的策略:

蛮力策略:对金块逐个进行比较查找。(扫描数组一轮,寻找最大和最小的数。)该策略需要进行(n-1)次的比较才能得到max和min。
分治法(二分法)策略:问题可以简化为在n个数里面寻找最大和最小值。
(1)将数据等分为两组(两组数据的个数可能相差1),目的是分别选取其中的最大(小)值。
(2)递归分解直到每组元素的个数<=2,则可以简单地找到其中的最大(小)值。
(3)回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,即合并为当前问题的解。

五.源代码

(1)找最大最小元素:
  1. #include <iostream>
  2. using namespace std;

  3. void findMinMax(int a[],int l,int r,int *maxnum,int *minnum){
  4.    if(l==r){//如果只有一个元素,则最小最大都是这个元素
  5.         *maxnum = *minnum = a[l];
  6.         return;
  7.     }
  8.     int mid,lmin,rmin,lmax,rmax;
  9.     mid = (l+r)/2;
  10.     findMinMax(a,l,mid,&lmax,&lmin);//寻找数组左边的最大最小元素
  11.     findMinMax(a,mid+1,r,&rmax,&rmin);//寻找数组右边的最大最小元素
  12.     *maxnum = lmax>rmax?lmax:rmax;//比较左右边的最大元素找出更大的
  13.     *minnum = lmin<rmin?lmin:rmin;//比较左右边的最小元素找出更小的
  14. }
  15. int main()
  16. {
  17.     int a[] = {1,2,3,4,5,6,7,8,9};
  18.     int max,min;
  19.     findMinMax(a,0,8,&max,&min);
  20.     cout<<"max = "<<max<<"\n";
  21.     cout<<"min = "<<min<<"\n";
  22.     return 0;
  23. }
复制代码

程序运行结果如下图所示:
(2)归并分类:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void merge(int low,int mid,int high,int a[]){
  4.     int h,i,j,k;
  5.     h = i = low;
  6.     j = mid+1;//把数组a从mid分成两个集合
  7.     int b[high];//数组b为辅助数组
  8.     while(h <= mid && j <= high){//当两个集合都没有取尽时
  9.         if(a[h] <= a[j]){
  10.             b[i] = a[h];
  11.             h++;
  12.         }else{
  13.             b[i] = a[j];
  14.             j++;
  15.         }
  16.         i++;
  17.     }
  18.     /*处理剩余的元素*/
  19.     if(h > mid){//前一个数组先取完
  20.         for(k = j;k <= high;k++){
  21.             b[i] = a[k];
  22.             i++;
  23.         }
  24.     }else{//后一个数组先取完
  25.         for(k = h;k <= mid;k++){
  26.             b[i] = a[k];
  27.             i++;
  28.         }
  29.     }
  30.     /*将已经合并的集合从辅助数组复制到原数组*/
  31.     for(k = low;k <= high;k++){
  32.         a[k] = b[k];
  33.     }
  34. }

  35. void mergeSort(int low,int high,int a[]){
  36.     if(low < high){
  37.         int mid = (low+high)/2;//求集合的分割点
  38.         mergeSort(low,mid,a);//将前半个集合分类
  39.         mergeSort(mid+1,high,a);//将后半个集合分类
  40.         merge(low,mid,high,a);//归并两个已经分类的集合
  41.     }
  42. }

  43. int main()
  44. {
  45.     int a[] = {2,4,3,6,1,7,8,5,9};
  46.     mergeSort(0,8,a);
  47.     for(int i = 0;i <= 6;i++){
  48.         printf("\t%d\n",a[i]);
  49.     }
  50.     return 0;
  51. }
复制代码

程序运行结果如下图所示:

实验二 背包问题和最小生成树算法实现(用贪心法)
一、实验目的

1.掌握能用贪心法求解的问题应满足的条件;
2.加深对贪心法算法设计方法的理解与应用;
3.锻炼学生对程序跟踪调试能力;
4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
二.实验内容

有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
三.实验要求

(1)用贪心法求解背包问题;
(2)上机实现所设计的算法;
四.实验过程设计(算法设计过程)

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
    贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
基本思路
建立数学模型来描述问题;
把求解的问题分成若干个子问题;
对每一子问题求解,得到子问题的局部最优解;
把子问题的解局部最优解合成原来解问题的一个解。
算法实现
从问题的某个初始解出发。
采用循环语句,当可以向求解目标前进一步时,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模。
将所有部分解综合起来,得到问题的最终解。
实例分析
实例1 背包问题
问题描述
有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
  • 问题分析
    1.目标函数: ∑pi最大,使得装入背包中的所有物品pi的价值加起来最大。
    2.约束条件:装入的物品总重量不超过背包容量:∑wi<=M( M=150)
    3.贪心策略:
    • 选择价值最大的物品
    • 选择价值最大的物品
    • 选择单位重量价值最大的物品
      有三个物品A,B,C,其重量分别为{30,10,20},价值分别为{60,30,80},背包的容量为50,分别应用三种贪心策略装入背包的物品和获得的价值如下图所示:
三种策略
  • 算法设计:
  • 计算出每个物品单位重量的价值
  • 按单位价值从大到小将物品排序
  • 根据背包当前所剩容量选取物品
  • 如果背包的容量大于当前物品的重量,那么就将当前物品装进去。否则,那么就将当前物品舍去,然后跳出循环结束。

五.源代码

(1)背包问题
  1. #include <iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. /*定义物品的结构体*/
  5. struct Object{
  6.     double weight;//物品重量
  7.     double value;//物品价值
  8.     double avg;//单位重量价值
  9.     double prop;//放入比例:0表示没有放入,1表示全部放入
  10. };

  11. /*定义物品排序的标准*/
  12. bool cmp(Object a,Object b){
  13.     return a.avg>b.avg;
  14. }

  15. int main()
  16. {
  17.     Object *ob;
  18.     double volume;//背包容量
  19.     int num;//物品种类
  20.     double maxValue = 0;//背包中的最大价值
  21.     cout<<"请输入所有物品数量和背包容量\n";
  22.     cin>>num>>volume;
  23.     ob = new Object[num];
  24.     /*初始化物品的重量和价值,并计算单位重量价值*/
  25.     for(int i = 0;i<num;i++){
  26.         cout<<"输入第"<<i+1<<"个物品的重量和价值\n";
  27.         cin>>ob[i].weight>>ob[i].value;
  28.         ob[i].avg = ob[i].value/ob[i].weight;
  29.     }
  30.     sort(ob,ob+num,cmp);//物品按单位重量价值降序
  31.     int i;
  32.     /*开始装入物品*/
  33.     for(i = 0;i<num;i++){
  34.         if(ob[i].weight <= volume){//如果这个物品能全部装入
  35.             volume =  volume -ob[i].weight;
  36.             ob[i].prop = 1;//表示全部装入
  37.             maxValue = maxValue + ob[i].value;
  38.         } else{//这个物品已经不能全部装人
  39.             break;
  40.         }
  41.     }
  42.     if(i<num){//有一个物品不能全部装入
  43.             ob[i].prop = volume/ob[i].weight;//装入的比例
  44.             volume = 0;
  45.             maxValue = maxValue + ob[i].prop*ob[i].value;
  46.     }
  47.     cout<<"放入的物品的重量,价值,比例\n";
  48.     for(int i = 0;i<num;i++){
  49.         cout<<ob[i].weight<<" "<<ob[i].value<<" "<<ob[i].prop<<"\n";
  50.    }
  51.     cout<<"放入物品的总价值:"<<maxValue;
  52.     return 0;
  53. }
复制代码


程序运行结果:
(2)最小生成树
  1. /*
  2. S:当前已经在联通块中的所有点的集合
  3. 1. dist[i] = inf
  4. 2. for n 次
  5.     t<-S外离S最近的点
  6.     利用t更新S外点到S的距离
  7.     st[t] = true
  8. n次迭代之后所有点都已加入到S中
  9. 联系:Dijkstra算法是更新到起始点的距离,Prim是更新到集合S的距离
  10. */
  11. #include <iostream>
  12. #include <cstring>
  13. using namespace std;
  14. const int N = 510, INF = 0x3f3f3f3f;

  15. int n, m;//n=|V|,m=|E|
  16. int g[N][N], dist[N];
  17. //邻接矩阵存储所有边
  18. //dist存储其他点到S的距离
  19. bool st[N];

  20. int prim() {
  21.     //如果图不连通返回INF, 否则返回res
  22.     memset(dist, INF, sizeof dist);
  23.     int res = 0;

  24.     for(int i = 0; i < n; i++) {
  25.         int t = -1;
  26.         for(int j = 1; j <= n; j++)
  27.             if(!st[j] && (t == -1 || dist[t] > dist[j]))
  28.                 t = j;
  29.         //寻找离集合S最近的点
  30.         if(i && dist[t] == INF) return INF;
  31.         //判断是否连通,有无最小生成树

  32.         if(i) res += dist[t];
  33.         //cout << i << ' ' << res << endl;
  34.         st[t] = true;
  35.         //更新最新S的权值和

  36.         for(int j = 1; j <= n; j++) dist[j] = min(dist[j], g[t][j]);
  37.     }

  38.     return res;
  39. }

  40. int main() {
  41.     cout << "顶点数和边数:" << endl;
  42.     cin >> n >> m;//n=|V|,m=|E|
  43.     int u, v, w;//u,v,w,表示点u和点v之间存在一条权值为w的边

  44.     for(int i = 1; i <= n; i++)
  45.         for(int j = 1; j <= n; j++)
  46.             if(i ==j) g[i][j] = 0;
  47.             else g[i][j] = INF;

  48.     while(m--) {
  49.         cout<< "两顶点和边长:" << endl;
  50.         cin >> u >> v >> w;
  51.         g[u][v] = g[v][u] = min(g[u][v], w);
  52.     }
  53.     int t = prim();
  54.     cout <<"最小生成树的树边权重之和:"<< t << endl;
  55. }
复制代码

程序运行结果:

实验三 多段图和货郎担问题算法实现(用动态规划方法)
一.实验目的

1.掌握能用动态规划方法求解的问题应满足的条件;
2.加深对动态规划方法的理解与应用;
3.锻炼学生对程序跟踪调试能力;
4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
二.实验内容

              (1)多段图:对于任意数目的n个节点,分别用1~n编号,对于k段,分别用1~k编号,则这个问题归结为在k段n个节点的带权图中寻找从节点1到节点n的最短路径。(自己添加的内容)
              (2)货郎担:对于任意数目的n个城市,分别用1~n编号,则这个问题归结为在有向带权图中,寻找一条路径最短的哈密尔顿回路问题。
三.实验要求

(1)用动态规划方法货郎担问题;实现多段图问题
(2)上机实现所设计的算法;
四.实验过程设计(算法设计过程)

动态规划的思想实质是分治思想和解决冗余。 与分治法类似的是,将原问题分解成若干个子问题,先求解子问题,再从这些子问题的解得到原问题的解。与分治法不同的是,经分解的子问题往往不是互相独立的。若用分治法来解,有些共同部分(子问题或子子问题)被重复计算了很多次。如果能够保存已解决的子问题的答案,在需要时再查找,这样就可以避免重复计算、节省时间。动态规划法用一个表来记录所有已解的子问题的答案。
动态规划方法的基本思想是,把求解的问题分成许多阶段或多个子问题,然后按顺序求解各子问题。最后一个子问题就是初始问题的解。
由于动态规划的问题有重叠子问题的特点,为了减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数组中。
五.源代码

(1)多段图
  1. #include <iostream>
  2. using namespace std;
  3. #define INFI 65535 //定义两节点之间的最大路径
  4. int c[12][12]; //两节点之间路径长度的数组

  5. /**/
  6. void FGRAPH(int n,int k){
  7.     int cost[n];//第n个节点到最后一个节点的最端路径
  8.    for(int i = 0;i<n;i++){
  9.         cost[i] = INFI;//初始化所有节点的最短路径为无穷大
  10.     }
  11.     cost[n-1] = 0;
  12.     int j,r;
  13.     int p[k],d[n];//p为段决策,d为节点决策
  14.     int min;
  15.     /*寻找所有节点到最后一个节点的最短路径和节点决策)*/
  16.     for(j = n-2;j>=0;j--){
  17.         min = INFI;
  18.         for(r = 0;r<=n-1;r++){
  19.             if(c[j][r]+cost[r]<min){
  20.                 min = c[j][r] + cost[r];
  21.                 d[j] = r; //r即为j节点的节点的决策
  22.             }
  23.         }
  24.         cost[j] = min; //j节点的最短路径
  25.     }
  26.     p[0] = 0;
  27.     p[k-1] = n-1;
  28.     for(int j = 1;j<=k-1;j++){
  29.         p[j] = d[p[j-1]];//上一个段的段决策的节点决策即为下一个段的段决策
  30.     }
  31.     for(int j = 0;j<=k-1;j++){
  32.         cout<<p[j]<<"\n";
  33.     }
  34. }
  35. int main()
  36. {
  37.     int N = 12;
  38.     /*节点之间距离初始化*/
  39.     for(int i = 0;i<N;i++){
  40.         for(int j = 0;j<N;j++){
  41.             if(i == j)
  42.                 c[i][j] = 0;
  43.             else{
  44.                 c[i][j] = INFI;
  45.                 c[j][i] = INFI;
  46.             }

  47.         }
  48.     }
  49.     c[0][1] = 9;
  50.     c[0][2] = 7;
  51.     c[0][3] = 3;
  52.     c[0][4] = 2;
  53.     c[1][5] = 4;
  54.     c[1][6] = 2;
  55.     c[1][7] = 1;
  56.    c[2][5] = 2;
  57.     c[2][6] = 7;
  58.     c[3][7] = 11;
  59.     c[4][6] = 11;
  60.     c[4][7] = 8;
  61.     c[5][8] = 6;
  62.     c[5][9] = 5;
  63.     c[6][8] = 4;
  64.     c[6][9] = 3;
  65.     c[7][9] = 5;
  66.     c[7][10] = 6;
  67.     c[8][11] = 4;
  68.     c[9][11] = 2;
  69.     c[10][11] = 5;
  70.     FGRAPH(N,5);//调用多段图函数
  71.     return 0;
  72. }
复制代码

程序运行结果如下图所示:

(2) 货郎担
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;

  4. int n;
  5. int cost[20][20];
  6. bool done[20]={1};
  7. int start = 0; //从城市0开始
  8. int imin(int num, int cur)
  9. {
  10.     if(num==1) //递归调用的出口
  11.         return cost[cur][start];  //所有节点的最后一个节
  12. //最后返回 最后一个节点到起点的路径
  13.     int  mincost = 10000;
  14.     for(int i=0; i<n; i++)
  15.     {
  16.         cout<<i<<"  i:"<<done[i]<<endl;  
  17.         if(!done[i] && i!=start) //该结点没加入且非起始点
  18.         {
  19.             done[i] = 1;   //递归调用时,防止重复调用
  20.             int value = cost[cur][i] + imin(num-1, i);
  21.             if(mincost > value)
  22.             {
  23.                 mincost = value;
  24.                 cout<<mincost<<endl;
  25.             }
  26.             done[i] = 0;//本次递归调用完毕,让下次递归调用
  27.         }
  28.     }
  29.     return mincost;
  30. }

  31. int main()
  32. {   
  33.     n=4;
  34.     int cc[4][4]={{0,4,1,3},{4,0,2,1},{1,2,0,5},{3,1,5,0}};
  35.     for(int i=0; i<n; i++)
  36.    {
  37.         for(int j=0; j<n; j++)
  38.         {
  39.             cost[i][j]=cc[i][j];
  40.         }
  41.     }
  42.     cout << imin(n, start) << endl;
  43.     return 0;
  44. }
复制代码

程序运行结果如下图所示:
   
实验四 皇后与子集和数问题算法实现(用回溯法)
一、实验目的

1.掌握能用回溯法求解的问题应满足的条件;

2.加深对回溯法算法设计方法的理解与应用;

3.锻炼学生对程序跟踪调试能力;

4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。

二.实验内容
(1)n皇后问题

由N2个方块排成N行N列的正方形,称为N元棋盘,在N元棋盘上放置N个皇后,如果某两个皇后位于N元棋盘的同一行或同一列或同一斜线(斜率为±1)上,则称它们在互相攻击,试设计算法找出使N个皇后互不攻击的所有布局。

(2)子集和数问题

子集和数问题是假定有n个不同的正数(通常称为权),要求找出这些数中所有事的某和数为M的组合。

(1)我们假设一个前提条件:这些正数是按照非降次序排列的。

(2)引入一个记号:B(X(1),...,X(k))表示是否可以把第K个正数加入进来,所以它的取指为true或者false。

那么当我们考虑是否要把第K个正数加入到解向量中的时候,我们就能找到两个条件组成这个限界函数了:

(1)这个公式的含义是:当你考虑是否要把第K个正数加入到解向量的时候,不管你要加进来或者是不打算把它加进来,前K个解向量的和(包括第K个,当然X(k)可能是0或者1),加上后面所有的数的和一定要大于等于M,否则你把剩下的数都加了进来还比M小,这次的决策X(k)=0或者1肯定得不到满足条件的解向量。所以也就没有必要扩展这个结点的左儿子或者右儿子了。

(2)这个公式的含义是,当你考虑是否要把第K个正数加入到解向量的时候,不管你要加进来或者是不打算把它加进来,提前往后看一步,判断如果把第K+1个正数算进来后的值大于M,就不把第K个正数加进来。也就是说不生成第K-1个节点的儿子。

三.实验要求

(1)用回溯法算法设计方法求解N元皇后问题;

(2)找出N皇后问题的互不攻击的所有解;

(3)皇后数N由键盘动态输入;

(4)上机实现所设计的算法;

(5)分析所设计的算法的时间/空间复杂性。
四.实验过程设计(算法设计过程)

(1)分析N皇后问题的约束条件,并将其显示化,选择存储结构建立相应的数学模型;

(2)根据所建立的数学模型,设计求解该问题的粗略算法;

(3)对所设计的粗略算法求精,得具体算法;

(4)在C/C++下实现所设计的算法;

(5)分析运行结果的正确性;

(6)进行算法效率分析;

(7)课后写出实验报告。

五.源代码
(1) n皇后问题
  1. #include <iostream>
  2. using namespace std;
  3. const int N = 20;

  4. // bool数组用来判断搜索的下一个位置是否可行
  5. // col列,dg对角线,udg反对角线
  6. // g[N][N]用来存路径
  7. //count表示第几个解

  8. int n;
  9. char g[N][N];
  10. bool col[N], dg[N], udg[N];
  11. int count = 0;
  12. void dfs(int u)
  13. {
  14.     // u == n 表示已经搜了n行,故输出这条路径
  15.     if (u == n)
  16.     {
  17.         count++;
  18.         cout<<"第"<<count<<"个解:"<<endl;
  19.         for (int i = 0; i < n; i ++ ) cout << g[i] << endl;
  20.         cout<<endl;
  21.         return;
  22.     }

  23.    //对n个位置按行搜索
  24.     for (int i = 0; i < n; i ++ )
  25.         // 剪枝(对于不满足要求的点,不再继续往下搜索)
  26.         //udg[n - u + i],+n是为了保证大于0
  27.         if (!col[i] && !dg[u + i] && !udg[n - u + i])
  28.         {
  29.             g[u][i] = 'Q';
  30.             col[i] = dg[u + i] = udg[n - u + i] = true;
  31.             dfs(u + 1);
  32.             // 恢复现场 这步很关键
  33.             col[i] = dg[u + i] = udg[n - u + i] = false;
  34.             g[u][i] = '.';

  35.         }
  36. }

  37. int main()
  38. {
  39.     cout<<"请问这是几皇后问题:"<<endl;
  40.     cin >> n;
  41.     cout<<endl;
  42.     for (int i = 0; i < n; i ++ )
  43.        for (int j = 0; j < n; j ++ )
  44.             g[i][j] = '.';

  45.     dfs(0);
  46.     return 0;
  47. }
复制代码

运行结果:

(2) 子集和数问题

  1. #include <iostream>
  2. using namespace std;

  3. //求解函数
  4. void sumOfSub(float s, int k, float r, int *x, float m, float *w);
  5. void sumOfSub(int *x, int n, float m, float *w);

  6. int main()
  7. {
  8.               int n; //n表示集合元素个数
  9.               float m; //m表示目标和
  10.               cout << "请输入集合元素个数:";
  11.               cin >> n;
  12.               cout << "请输入目标和:";
  13.               cin >> m;
  14.               float *arr = new float [n + 1];
  15.               int *x = new int [n + 1]; //求解状态
  16.               cout << "请输入" << n <<"个集合元素(正值):";
  17.               for(int i=0; i < n; i++)
  18.               {
  19.                             cin >> arr[i];
  20.               }
  21.               cout << "可行解:\n";
  22.               sumOfSub(x, n, m, arr);

  23.               return 0;
  24. }

  25. void sumOfSub(float s, int k, float r, int *x, float m, float *w)
  26. {
  27.               x[k] = 1;
  28.               if(s + w[k] == m)//一个可行解
  29.               {
  30.                             for(int j = 0;j <= k; j++)//两种输出方式任选
  31.                             {
  32.                                           if(x[j] == 1)  //完成输出,输出选取的元素
  33.                                             cout << w[j] << " ";
  34.                             }
  35.                             cout << endl;
  36.               }
  37.               else if(s + w[k] + w[k+1] <= m)
  38.               {
  39.                             sumOfSub(s+w[k], k+1, r-w[k], x, m, w);//搜索左子树
  40.               }
  41.               if((s + r - w[k] >= m)&&(s + w[k]+1 <= m))
  42.               {
  43.                             x[k] = 0;
  44.                             sumOfSub(s, k+1, r - w[k], x, m, w); //搜索右子树
  45.               }
  46. }
  47. void sumOfSub(int *x, int n, float m, float *w)
  48. {
  49.               float r = 0;
  50.               for(int i = 0; i < n; i++)  r += w[i];//计算总值,判断是否有解
  51.               if(r >= m && w[0] <= m)  sumOfSub(0, 0, r, x, m, w);
  52. }
复制代码

运行结果:

完整的Word格式文档51黑下载地址:
计算机算法基础实验指导201909.doc (416.5 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表