Android Day6
内容:
Ⅰ随机数的使用方法,并利用随机数编写猜数字游戏
Ⅱ利用C语言数组编写数字游戏
Ⅲ冒泡法、选择法、插入法排序
实践
Ⅰ随机数
1.随机数的用法
(1)rand()函数是产生随机数的一个随机函数,rand()返回值为一随机数值
(2)在调用此函数前,必须先利用srand()设好随机数种子。如果未设随机数种子,rand()在调用时会自动设随机数种子为1。
(3)srand函数是随机数发生器的初始化函数
(4)rand()产生的是伪随机数字,每次执行时是相同的;若要不同,用函数srand()初始化它。
(5)rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。因为默认情况下随机数种子为1,而相同的随机数种子产生的随机数是一样的,失去了随机性的意义,所以为使每次得到的随机数不一样,用函数srand()初始化随机数种子。srand()的参数,用time函数值(即当前时间),因为两次调用rand()函数的时间通常是不同的,这样就可以保证随机性了。
2.随机数的具体使用:猜数字游戏
随机产生4个不相同的数字 从小到大排序
1 2 3 4
玩家开始输入
1 4 5 6
如果位置正确且数字正确用A输出
如果数字正确位置不正确用B输出
先进行数组和变量的全局定义
int orgArray[4] = {};
int guessArray[4] = {};
int countA = 0;
int countB = 0;
利用srand函数产生随机数
srand((unsigned int)time(NULL));
int randomNum = 0;
while (1) {
for (int i = 0; i < 4; i++)
{
bool isExist = false;
randomNum = rand() % 10;
for (int j = 0; j < i; j++) {
if (orgArray[i] == randomNum) {
//当新产生的数在原数组中是否出现,若出现则跳出,同时给isExist变量赋值为true
isExist = true;
break;
}
}
//没有出现时
if (isExist == false) {
break;
}
开始排序
int j = 0;
for (; j < i; j++) {
//当新产生的数小于数组中的数时
if (randomNum < orgArray[j]) {
for (int k = i; k > j; k--) {
orgArray[k] = orgArray[k - 1];
}
break;
}
}//保存到数组里面去
orgArray[j] = randomNum;
}
//开始游戏
while (1) {
printf("请输入猜测的数字:");
for (int i = 0 ; i < 4 ; i++) {
scanf_s("%d", &guessArray[i]);
}
//判断输入
for (int i = 0; i < 4; i++) {
//控制原始数字,用原始数字依次和输入的4个数字比较
for (int j = 0; j < 4; j++) {
//控制输入
if (orgArray[i] == guessArray[j]) {
//判断两个的位置是否相同
if (i == j) {
//数字相同位置也相同时
countA++;
}
else {
//数字相同位置不同s时
countB++;
}
}
}
}
if (countA == 4) {
//全部正确时
printf("Congratulation!!!");
break;
}
else {
printf("%dA%dB\n", countA, countB);
//还原数据
countA = 0;
countB = 0;
}
}
}
Ⅱ数字游戏
终端输入参与的人数:7
1 2 3 4 5 6 7
大家围成一圈
请输入死亡编号:3
凡是报道3的人都死亡 后面的人继续数数
输出最后一个活着的人的编号
int total = 0;
int number[10] = {};
int killNumber = 0;
int count = 0;
int totalKilledNumber = 0;
printf("请输入参与人数:");
scanf_s("%d", &total);
给数组赋值 编号
for (int i = 0; i < total; i++) {
number[i] = i + 1;
}
printf("请输入死亡号码:");
scanf_s("%d", &killNumber);
开始游戏
for (int i = 0; i < total; i++) {
//判断这个人有没有被杀掉
if (number[i] != KILLED) {
//报数
count = count + 1;
}
判断当前编号是不是死亡号码
if (count == killNumber) {
//杀掉人
number[i] = KILLED;
还原编号
count = 0;
死亡人数+1
totalKilledNumber++;
//是否结束
if (totalKilledNumber == total - 1) {
break;
}
}
判断这一次循环是不是完成
if (i == total - 1) {
//让i回到起始点
//防止++ 导致回到第二个
i = -1;
}
}
printf("\n");
//测试一次的结果
for (int i = 0; i < total; i++) {
printf("%d ", number[i]);
}
Ⅲ冒泡法、选择法、插入法排序
冒泡排序 通过一次排序 最大的沉底
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10; i++){//比较的次数
for (int j = 0; j < 10-i-1; j++){
if (num[j] > num[j+1]) {
//交换j和j+1的值
int temp = num[j+1];
num[j+1] = num[j];
num[j] = temp;
}
}
}
选择排序
一次取出一个值 默认他是最小的
如果发现比这个数小 就交换
遍历整个数组 找到一个最小的
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10-1; i++){
//默认这是最小的
//int min = num[i];//3
for (int j = i+1; j < 10; j++){
//控制用min和后面的每一个进行比较
if (num[i] > num[j]){
//j对应的数字比min还小 交换
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
//一次遍历之后找到最小的值min
//num[i] = min;
}
插入排序
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10; i++) {
//让i和i+1比较大小
if (num[i] > num[i+1]) {
//交换值
int temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
//让num[i]和前面的所有进行比较
for (int j = i; j > 0; j--){
if (num[j] < num[j-1]) {
temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
感想
今天应该是我写的最难的一次了,昨天思考了一下,没有头绪就没有再写,现在明白了当时应该多思考思考,哪怕写不出来,第二天听讲的时候肯定也会更加轻松,虽然听完觉得恍然大悟,但是过一会自己再写,却拿起笔又放下,无从下笔,所以还是希望自己能在推敲这里多下点功夫,不能遇到一点难题就不继续了
peace