今天的内容就是做一个小demo,详细讲解如下
小demo简述
1:请输入参与人数 比如输入7
2:每个人就编一个号
3:请输入杀人编号比如 3
4: 没死的人 只要报到3的人就死 直接输出最后没死的人的编号
#include<stdio.h>
#include<stdlib.h>
#define KILLED 0//宏定义(取别名):想给一个特殊的数字 字符串 表达式 以特殊的意义时,就取个别名。注意这里没有分号
//好处1:增强可读性 2:更方便改变 可操作性更强
int main (void){
/*//先输入一个数字
//然后利用循环给数组每个元素赋值
//输入杀人编号
//for循环,拿掉第三个数,当最后的数组元素个数变成1时,输出这个元素
int shuru = 0;
scanf("%d",&shuru);
int a[shuru];
for(int i = 0;i < shuru;i++){
a[i] = i+1;
}
for(int i = 0;i < shuru;i++){
printf("%d ",a[i]);
}
int naqu = 0;
scanf("%d",&naqu);
while(1){
//int del(int a[],int n, int x)//删除长度为n的数组中值为x的元素
int del(int a[],int n, int x)//删除长度为n的数组中值为x的元素
}
//12457*/
int count ;//保存输入的人数
int num[90] = {};//保存每个人的编号
int killNum;//被杀的人的编号
printf("请输入参与人数:");
scanf("%d",&count);
//开始编号
for(int i = 0;i < count ;i++){
num[i] = i+1;
}
printf("请输入杀人的编号:");
scanf("%d",&killNum);
//开始游戏 比如1234567 去掉3后 后面依次往前面替换 成了1245677 但是效率低,频繁地删除/增加 但是可以将被选中的数赋值为0 比如 1204507
int current = 0;//记录当前报数的位置
int totalKilled = 0;//记录当前死亡人数
for(int i = 0;i < count;i++){
if(num[i] != KILLED){ //可能以前已经死的人 又被杀死了
current++;
} /*else{
printf("这是已经死亡的编号%d",num[i]);
continue;
} *///问题所在
//判断当前编号是不是死亡编号
if(current == killNum){
printf("被杀死的人是:%d\n",num[i]);
//杀掉
num[i] = KILLED; //这里弄成KILLED,就是能让别人看懂
current = 0;//还原current
totalKilled++;
//当还剩一个的时候就退出循环
if(totalKilled == count - 1){
break;
}
}
//判断是否到末尾
if(i == count - 1){
i = -1;//这一点很重要,一开是没想出来。命名为-1
}
}
for(int i = 0;i < count;i++){
printf("%d ",num[i]);//最后再输出一下
}
system("pause");
return 0;
}
下面是自己课下写的
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main (void){
//输入参与人数
//给每一个参与的人附上编号
//输入杀人编号3
//依次显示被杀死的人的编号
//将最后的数组显示出来
printf("游戏开始\n");
Sleep(2000);
system("cls") ;
int count;//记录参与人数
int a[500] = {};
int current = 0;
int killed = 0;//记录杀人编号
int totalkilled = 0;//记录总共被杀死的人,这一点尤为重要,后来自己写的时候忘了
scanf("%d",&count);
for(int i = 0;i < count;i++){
a[i] = i + 1;
printf("%d",a[i]);
}//给每个人附上编号
printf("\n");
printf("请输入杀人编号:");
scanf("%d",&killed);//输入杀人编号
for(int i = 0;i < count;i++){
if(a[i] != 0){
current++;
}
if(killed == current){
printf("被杀死的人是:%d\n",a[i]);
a[i] = 0;
current = 0;//将次序归为0
totalkilled++;
if(totalkilled == count - 1){//这里不能用while因为while也是一个循环,用break是退出它的循环而不是退出外面的for循环
break;
}
}
if(i == count - 1){
i = -1;
}
}
for(int i = 0;i < count;i++){
printf("%d",a[i]);
}
system("pause");
return 0;
}
总结:
今天倒是没有学什么新知识,只是在老师带领下做了一个小demo,但是在做的过程中有很多收获,尤其在课下再做一遍的时候,会遗忘很多步骤和思路(具体见上面代码的注释)这时再和老师写的代码做对比就会找到很多问题。还有一个很大的收获就是在写小demo的过程中要在最上面以注释的形式把所有的步骤一步一步地写出来,这样便于使我的思路清晰,知道下一步需要干什么课下作业
游戏:
猜数字 游戏开始 产生四个0-9之间的不重复的从小到大排序的数字。
比如 2348
请输入猜测数字 :
如果猜测的数字正确且位置正确 那么输出A 数字正确 位置不正确 B
比如 2589 则输出1A1B