在前几天的时候做过一个小的猜数字的游戏,但是这次比上次的更高级哦!具体操作见下面的介绍
内容
1:排序
2:猜数字demo
3:函数基本定义
一.排序:
首先,排序有多种。其中最常用的是冒泡排序法(既好理解又好用),然后还有插入排序和选择排序。至于后两者,稍微懂意思就可以,既然有更好用的冒泡排序,那为何不用它而用别的呢?
另外,在优酷搜索《舞动的排序》可以更形象地理解
冒泡排序法:
基本是两个循环。最外面的循环是控制总共比几次,也就是总共遍历几次 一般是 元素个数-1次,里面的循环是控制每一次循环比几个,也就是每次需要遍历多少个才能找到最大,一般是 元素个数-1-i(i是大循环中的循环控制变量)每次比较都是从头开始,确保i+1是最大的
实现方式:每次遍历整个数组,找到最大的一个数沉底。
代码示例如下
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
int main (void){
Sleep(2000);
int a[5] = {5,2,9,4,3};
for(int i = 0;i < 5-1;i++){
for(int j = 0;j < 5-1-i;j++){
if(a[j+1] < a[j]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(int i = 0;i < 5;i++){
printf("%d ",a[i]);
}
system("pause");
return 0;
}
选择排序:
每次选出第一个数默认为最小值,然后拿这个数和后面的进行比较,如果小于其他的数则继续比较,如果大于则互换然后继续比较。总共也是比元素个数-1。每次外层循环控制需要遍历多少次,内层循环遍历出当前最小的数。
代码示例如下
#include<stdio.h>
#include<stdlib.h>
int main(void){
int a[10] = {5,2,9,4,3,0,1,6,7,8};
for(int i = 0;i < 10;i++){
printf("%d ",a[i]);//输出一下这个数组。
}
printf("\n ");
for(int i = 0;i < 10-1;i++){
//取出i对应的数,默认是最小的数
int temp = a[i];
for(int j = i+1;j < 10;j++){//每次比较都是和这个数的下一位比,所以要i+1
if(temp > a[j]){//让temp和i后面的每一个数进行比较,temp始终保存最小的那个数 .
//这一行当时做的时候总是找不到原因,但是最后才发现,这个小循环是j进行变化,而不是i+1,我一开始写的temp>a[i+1},所以错了
int n = temp;
temp = a[j];//交换值
a[j] = n;
}
}
a[i] = temp;//将每一次的最小值赋值给相应的a[i]
}
for(int i = 0;i < 10;i++){
printf("%d ",a[i]);
}
return 0;
}
二.小demo:猜数字
思路:
随机产生四个 1-9之间不重复的已经排好序的数
用户从终端输入猜测的数字
用A和B来提示 A表示数字和位置都正确 B表示数字正确 位置错误
整个程序的难点对我来说就是后面的输出A和B的代码不会写
代码如下(跟着老师写的)
//随机产生四个 1-9之间不重复的已经排好序的数
//用户从终端输入猜测的数字
//用A和B来提示 A表示数字和位置都正确 B表示数字正确 位置错误
//限制最多不超过十次
//整个程序的难点对我来说就是后面的输出A和B的代码不会写
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
int main(void){
int i;
int j;
int org[4] = {}; //定义数组,用来保存随机产生的几个数字
int input[4] = {};//保存用户输入
int aCount;//A的个数
int bCount;//B的个数
srand(time(NULL));//播种子
for( i=0;i<4;i++){
int temp = rand()%9 + 1;//产生一个随机数
if(i == 0){//一定注意这里是两个等于号
org[i] = temp;
}else{
for( j=0;j<i;j++){
if(org[j] == temp){
printf("重复了%d\n",temp);
break;
}
}
if(j == i){
//不重复,保存
org[i] = temp;
}else{
//重复了
i--;
continue;
}
}
}
for(int i=0;i<4;i++){
printf("%d ",org[i]);//输出一下已经产生的数组
}
for(i=0;i<4-1;i++){//利用冒泡排序法对数组进行排序
for(j=0;j<4-1-i;j++){
if(org[j]>org[j+1]){
int n = org[j];
org[j] = org[j+1];
org[j+1] = n;
}
}
}
printf("\n");//整个换一下行
for(int i=0;i<4;i++){
printf("%d ",org[i]);//输出一下已经产生的并且排好序的数组
}
printf("即将清屏\n");
Sleep(2000);
system("cls");//清屏
printf("\n");//整个换一下行
while(1){
printf("请输入猜测的数字:");
for(i=0;i<4;i++){
scanf("%d",&input[i]);
}
for(i=0;i<4;i++){
printf("%d ",input[i]);
}
for(i = 0;i<4;i++){//控制原始数组
for(j=0;j<4;j++){
if(org[i] == input[j]){
//数字存在 判断位置
if(i == j) {
aCount++; //数字和位置都正确
}else{
bCount++;//数字正确位置错误
}
}
}
}
printf("%dA,%dB\n",aCount,bCount);
//判断是否正确
if(aCount == 4){
printf("全对!!!");
} else{
aCount = 0;
bCount = 0;
printf("猜的真垃圾,重来,妈卖批!\n");
continue;
}
}
system("pause");
return 0;
}
下面是自己课下写的
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
int main(void){
printf("请认真阅读以下规则.\n");
//Sleep(2000);
system("cls");
printf(" 猜数字游戏\n");
printf("首先,系统生成四个不相同的1-9随机数,并按从小到大的顺序排列\n");
printf("然后,请输入四个数字。\n");
printf("在这四个数字中,与产生的随机数数相同且位置也相同的输出一个A,数相同但是位置不相同的输出一个B\n");
printf("\n");
//Sleep(10000);
system("cls");
printf("游戏开始\n");
printf("系统正在生成数据,请稍等\n");
//猜数字游戏
//首先,系统生成四个不相同的1-9随机数,并按从小到大的顺序排列
//然后,自己输入四个数字。
//在这四个数字中,与产生的随机数数相同且位置也相同的输出一个A,数相同但是位置不相同的输出一个B
//最后输出几A几B
int i;//定义循环控制变量
int j;//定义循环控制变量
int org[4] = {};//定义装四个随机数的数组
int shuru;//储存用户输入的数字
int allRight = 0;//储存A数目
int halfRight = 0;//储存B数目
for(i=0;i<4;i++){
srand(time(NULL));
Sleep(1000);
int temp = rand()%9+1;//用temp装着产生的随机数
if(i==0){//这里是两个等于号
org[i] = temp;//数组第一个元素直接赋值
//printf("%d ",org[i]);//打印一下第一个
}else{
for(j=0;j<i;j++){
if(temp == org[j]){
break;
}
}
if(i == j){//判断循环是如何跳出来的,如果i == j,则是没有重复的,则正常赋值,如果不相等,则证明是非正常跳出,则需要i--然后继续下一次大循环
org[i] = temp;
}else{
i--;
}
}
}
for(i=0;i<4;i++){
printf("%d ",org[i]);//打印一下数组中的每个元素
}
printf("\n");//换行
for(i=0;i<4-1;i++){
for(j=0;j<4-1-i;j++){
if(org[j]>org[j+1]){
int temp = org[j];
org[j] = org[j+1];
org[j+1] = temp;
}
}
}//利用冒泡排序法,将产生的四个数字,按从小到大的顺序排列
for(i=0;i<4;i++){
printf("%d ",org[i]);//打印一下已经排列好顺序的数组中的每个元素
}
//system("cls");//清屏
while(1){
printf("请输入数字:");//提示玩家输入数字
for(i=0;i<4;i++){
scanf("%d",&shuru);//用户输入数字
if(shuru == org[i]){
//printf("进入A\n");
allRight++;//A++
}else{
for(j=0;j<4;j++){
if(shuru == org[j]){
halfRight++;//B++
//printf("进入B\n");
}
}
}
}
printf("%dA,%dB\n",allRight,halfRight);//打印A和B
if(allRight == 4){
printf("全对!!\n");
break;
}else{
printf("游戏继续,请准备\n");
allRight = 0;//这两步尤为重要,极易忽略,我做的时候就死活找不出来问题,原来这里需要清空
halfRight = 0;
Sleep(2000);
}
}
system("pause");
return 0;
}
三.函数
函数就是一个代码块,一个功能对应一个函数
1:返回值(不一定有)用return。
2:函数名字(驼峰命名法)
3:参数(外部传过来),这是形参,形参也就是这个代码块的局部变量
定义函数两种方式:声明和实现一起,或者先声明后实现
函数使用:通过调用函数的函数名();括号里面写相对应的参数
如果函数功能很复杂,就选择先声明后实现,平时写的时候,就应该做到做到先声明后实现
下面是猜数字游戏的函数版本(部分)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<stdbool.h>
//下面的函数来表示产生一个随机数
int generateNumber(int min,int max);//参数要有,这个参数是范围,即控制min和max
//下面的函数表示生成四个随机数 ,保存到数组中
void initArray(int array[],int count);//第一个是保存到哪个数组中,第二个是控制保存几个
//下面的函数用来判断数组中是否已经存在此时产生的随机数
bool isNumberExist(int array[],int temp);//第一个参数是判断哪个数组,第二个参数是判断哪个数
//下面的函数用来输出数组
void show (int array[]);
int main (void){
int org[4] = {};
initArray(org,4);
show(org);
system("pause");
return 0;
}
int generateNumber(int min,int max){
Sleep(2000);
srand(time(NULL));
return rand()%(max - min +1) + 20;
}
void initArray(int array[],int count){
for(int i = 0;i < count;i++){
int temp = generateNumber(1,9);//获取随机数
bool result = bool isNumberExist(int array[],int temp);//判断是否重复
if(result == true){
i--;
} else{
array[i] = temp;
}
}
}
bool isNumberExist(int array[],int temp){
// int count = sizeof(array)/sizeof(int); 这样不行
int count =4;
for(int i = 0;i<count;i++){
if(array[i] == temp){
return true;
}
}
return false;
}
void show (int array[]);{
for(int i = 0;i<count;i++){
printf("%d",array[i]);
}
printf("\n");
}
总结
1:学过排序之后,对代码的逻辑性掌握更强了
2:通过课下再次写猜数字demo,找到很多问题,比如要注意清空啊、利用printf找到问题所在呀、还有for循环嵌套的应用更熟练了
3:初次接触函数,目前还很难熟练应用。相信近期通过多用我就可以做到了