Android Day6

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

你可能感兴趣的:(Android Day6)