【C 语言之项目实战】生成随机数并排序(详细版)
目录
1.项目要求
2.定义模块函数
3.各模块函数实现
4.项目源代码
1. 项目要求
1.1 定义大小为 100 的整型数组,使用随机函数给数组元素赋值。
1.2 数组中的数值的范围为 0 - 100,数组中的元素不允许重复。
1.3 对数组中的元素使用冒泡排序进行排序。
2. 定义模块函数
2.1 主函数:main()
2.2 打印函数:Print_Ar()
2.3 初始化函数:Init_Ar()
2.4 冒泡排序函数:BubbleSort()
2.5 交换函数:Sweap_Int()
3. 各模块函数实现
3.1 打印函数:Print_Ar()
①. 循环打印数组中的各元素,一行 10 个元素。
②. 源程序
/** 打印函数 */
void Print_Ar(int* br, int n)
{assert(br != nullptr);for (int i = 0; i < n; ++i){printf("%4d ", br[i]);if ((i + 1) % 10 == 0) // 一行打印 10 个元素{printf("\n");}}printf("\n");
}
3.2 初始化函数:Init_Ar()
①. 思想:随机生成 100 个数值,数值范围为 0 - 100,存放到数组中。因调用查询函数进行查询是否有重复值,该算法时间复杂度较高,效率较低,故采用查表法。生成的数值即为表 table 的下标,表 table 初始值均为 0,如果当前下标表中没有存放数据,则将该随机数存放到数组中,然后将表中的 0 变为 1,说明已经存放数据。
②. 源程序
/** 初始化 生成随机数 */
void Init_Ar(int* br, int n)
{assert(br != nullptr);/** 查表法 */int i = 0;int table[ARSIZE + 1] = {}; // 新建表 table 范围 0 ... 100 表中数据均为为 0while (i < n){int tmp = rand() % RANDSIZE + 1; // 生成随机数 0 ... 100if (table[tmp] == 0) // 如果当前下标表中没有存放数据 tmp 为 table 的下标{br[i] = tmp; // 则将该随机数存放到数组中++i;table[tmp] = 1; // 将表中的 0 变为 1 说明已经存放数据}}
}
3.3 冒泡排序函数:BubbleSort()
①. 算法思想:冒泡排序 n 个元素比较 n - 1 趟,该趟中比较 n - i 次。若前面一个元素大于后面一个元素,则这两个元素进行交换。提前设标记 tag,如果需要交换则改变标记,如果不需要交换(即标记 tag 未改变),则退出当前循环,进行下一趟的比较,直到排序完成。
②. 源程序
/** 冒泡排序 */
void BubbleSort(int* br, int n)
{assert(br != nullptr); // 断言机制 br 不为空 则继续执行下面代码 运行时检查 如果为假则不执行后面代码for (int i = 1; i < n; ++i) // n 个数比较 n - 1 趟 {bool tag = true; // 标记 tagfor (int j = 0; j < n - i; ++j) // 该趟中比较 n - i 次{if (br[j] > br[j + 1]) // 若前面元素大于后面元素 则两两交换{Sweap_Int(&br[j], &br[j + 1]); // 调用交换函数进行交换tag = false; // 交换则改变标记}}if (tag) // 如果不用交换(即标记 tag 未被改变)则退出当前循环{break;}}
}
3.4 交换函数:Sweap_Int()
①. 思想:交换函数进行交换,使用指针变量进行交换,调用交换函数时,改变指针所指向的值,可以实现交换。
②. 源程序
/** 交换函数 */
void Sweap_Int(int* ar, int* br)
{assert(ar != nullptr && br != nullptr);int tmp = *ar;*ar = *br;*br = tmp;
}
3.5 主函数:main()
/** 主函数 */
int main()
{const int n = 100; // 常整型 只可读不可写 int ar[n] = {}; // 整型数组 ar 未初始化Init_Ar(ar, n); // 调用初始化函数 生成随机数printf("排序前:\n");Print_Ar(ar, n);BubbleSort(ar, n); // 调用排序函数 对生成的随机数进行排序printf("排序后:\n");Print_Ar(ar, n); // 调用打印函数 进行输出打印return 0;
}
4. 项目源代码
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>/**
* 要求:
* 定义大小为 100 的整型数组
* 使用随机函数给数组元素赋值 数值范围为 0 - 100 不允许重复
* 并用冒泡排序进行排序
*/
#define RANDSIZE 100 // 宏定义 随机数大小 100
#define ARSIZE 100 // 宏定义 数组大小 100/** 交换函数 */
void Sweap_Int(int* ar, int* br)
{assert(ar != nullptr && br != nullptr);int tmp = *ar;*ar = *br;*br = tmp;
}/** 冒泡排序 */
void BubbleSort(int* br, int n)
{assert(br != nullptr); // 断言机制 br 不为空 则继续执行下面代码 运行时检查 如果为假则不执行后面代码for (int i = 1; i < n; ++i) // n 个数比较 n - 1 趟 {bool tag = true; // 标记 tagfor (int j = 0; j < n - i; ++j) // 该趟中比较 n - i 次{if (br[j] > br[j + 1]) // 若前面元素大于后面元素 则两两交换{Sweap_Int(&br[j], &br[j + 1]); // 调用交换函数进行交换tag = false; // 交换则改变标记}}if (tag) // 如果不用交换(即标记 tag 未被改变)则退出当前循环{break;}}}/** 查询函数 */
/**
int FindValue(int* br, int n, int val)
{assert(br != nullptr);int pos = -1;for (int i = 0; i < n; ++i){if (br[i] == val) // 找到查询的值{pos = i; // 当前下标break;}}return pos; // 找到返回当前下标 没找到返回 -1
}
*//** 初始化 生成随机数 */
void Init_Ar(int* br, int n)
{assert(br != nullptr);/** 代码改进 查表法 */int i = 0;int table[ARSIZE + 1] = {}; // 新建表 table 范围 0 ... 100 表中数据均为为 0while (i < n){int tmp = rand() % RANDSIZE + 1; // 生成随机数 0 ... 100if (table[tmp] == 0) // 如果当前下标表中没有存放数据 tmp 为 table 的下标{br[i] = tmp; // 则将该随机数存放到数组中++i;table[tmp] = 1; // 将表中的 0 变为 1 说明已经存放数据}}/** 时间复杂度较高 效率较低int i = 0;while (i < n){int tmp = rand() % RANDSIZE + 1; // 生成随机数 1 ... 100//等价于 ==> *(br + i) = rand() % RANDSIZE + 1;if (FindValue(br, n, tmp) == -1) // 避免生成的随机数相同 没找到相同的值则将该值输入到数组里{br[i] = tmp;++i;}}*/
}/** 打印函数 */
void Print_Ar(int* br, int n)
{assert(br != nullptr);for (int i = 0; i < n; ++i){printf("%4d ", br[i]);if ((i + 1) % 10 == 0) // 一行打印 10 个元素{printf("\n");}}printf("\n");
}/** 主函数 */
int main()
{const int n = 100; // 常整型 只可读不可写 int ar[n] = {}; // 整型数组 ar 未初始化Init_Ar(ar, n); // 调用初始化函数 生成随机数printf("排序前:\n");Print_Ar(ar, n);BubbleSort(ar, n); // 调用排序函数 对生成的随机数进行排序printf("排序后:\n");Print_Ar(ar, n); // 调用打印函数 进行输出打印return 0;
}
运行结果
【C 语言之项目实战】生成随机数并排序(详细版)相关推荐
- R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项)、randomSequence函数创建不含重复项的随机序列数据集、创建随机字符串
R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项).randomSequence函数创建不含重复项的随机序列数据集.创建随机字符串 ...
- c语言期中项目实战二—简易扫雷,思路分析加代码详细注释
c语言期中项目实战二-简易扫雷,思路分析+代码详细注释 游戏介绍 项目步骤 模块化编程 设置菜单 设置棋盘 打印棋盘 布置雷 排查雷 总结及总代码和详细注释 游戏介绍 扫雷这个经典游戏,直到现在仍有很 ...
- 新书推荐 |《OpenCV 4计算机视觉项目实战(原书第2版)》
新书推荐 <OpenCV 4计算机视觉项目实战(原书第2版)> 长按二维码 了解及购买 一本使用OpenCV进行计算机视觉应用开发的实践,指南不仅介绍OpenCV基础知识,还详细讲解各种实 ...
- R语言:逆变换法生成随机数
逆变换法生成随机数: 一.概念解释 1.PDF 2.PMF 3.CDF 二.连续型情况举例 三.离散型情况举例 一.概念解释 1.PDF probability density function 概率 ...
- 线性同余法产生随机数C语言,线性同余生成随机数的一点思考
今天下午 pk 和我讨论了一个问题,他看到在另一个项目组的 lua 代码里有一段使用线性同余产生随机数的代码,但是那个项目组的同事告诉他这个函数生成的随机数是分布不均的.于是他想到了我前两天给他讲的关 ...
- python实战===生成随机数
用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限. import random print random.uniform(10, 20) print random.uniform ...
- R语言学习笔记:生成随机数
R语言中,可以根据不同的分布生成随机数 均匀分布 runif(par1) runif(par1, min = par2, max = par3) 我们需要输入3个参数: par1:生成随机数的个数 p ...
- ThinkPHP5多语言切换项目实战
ThinkPHP5多语言切换实战 1.在配置文件中开启多语言配置 2.然后添加多语言目录 这里创建你需要的语言包 在语言包里定义需要翻译的文本,中英文数组的键名写成一致 然后在html文件里输入 {: ...
- 【C 语言之项目实战】判断闰年及计算天数(详细版)
目录 1.项目要求 2.定义模块函数 3.各模块函数实现 4.项目源代码 5.项目总结 1. 项目要求 1.1 首先判断用户输入的年份是否为闰年: 1.2 计算一年中每个月份的天数: 1.3 用户输入 ...
最新文章
- RecyclerView悬浮标题
- boost::fusion::find_if用法的测试程序
- SAP S/4HANA Cloud 系统集成的一些场景介绍
- linux nacos启动_Nacos集群安装配置
- npm aes 加密(js aes 加密)
- nginx 启动命令_Nginx实战001:Window中配置使用Nginx入门
- 实体与表映射关系XXX.hbm.xml配置详解(转)
- 2021-08-04 模糊查询
- 说出来你可能不信,内核这家伙在内存的使用上给自己开了个小灶!
- 诺,你们要的Python进阶来咯!【函数、类进阶必备】
- 用HFFS实例讲解PCB蛇形天线设计技巧
- web test performance tools / linux performance tools / windows performance tools
- 手把手教你封装属于自己的Windows7安装镜像
- python_使用需要的气象台站提取气象数据
- java自下而上和自上而下_编程中自上而下和自下而上方法的区别
- mysql error1205 博客_MySQL的ERROR 1205错误分析
- 停车场反向寻车实现方法和算法
- Hystrix学习(2)雪崩效应
- STM32——OLED显示实验
- RTFNet——用于城市场景语义分割的RGB和热红外融合网络