目的:掌握用C语言编程的基本技能
内容:1. #define的使用
2. 冒泡排序
3. 选择排序
4. 插入排序
5. 函数及其应用
6. 杀人小游戏实战
7. 猜数字小游戏实战
define的使用
- define可以为类型定义别名
#define INT int
- define可以为数值定义别名,在为数值定义别名时,可以达到定义一个常量的效果
#define KILLED 0 //宏定义(取别名)
- 使用#define的好处:
- 增强阅读性:加强了代码的可读性
- 可操作性:便于代码的修改。当多出使用#define定义的别名,而别名对应值需要修改时,可直接在#define处快速修改
冒泡排序
- 原理:依次从头开始将第一个数和下一个数进行比较,大的沉底,通过一次循环的到一个最大的数,重复该操作直到排序结束
- 实现方式:每次遍历整个数组,找到最大的一个数沉底。如果数组有N个元素,第一次需要遍历N-1次(沉第一个数据),第二次需要遍历N-2次(沉第二个数据)
......总共需要比较N-1次- 代码如何实现:两层循环 。第一层循环控制总共需要遍历多少次(N-1次) ;第二层循环控制每次需要遍历多少次才能找到最大的数(每次从头i=0开始,让i和i+1
进行比较,确保i+1是最大的数)#include <stdio.h> int main(){ int num[10] = {3,0,1,8,7,2,5,4,9,6}; for(int i = 0;i < 10;i++){//控制总共遍历次数 //开始每一次遍历 找到一个最大的数沉底 for(int j = 0;j < 10 - i;j++){ //让j和j+1的值进行比较 if(num[j] > num[j+1]){ //交换j和j+1的值 int temp = num[j]; num[j] = num[j+1]; num[j+1] = temp; } } } //输出结果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
选择排序
- 原理:先默认一个数是最小的,依次和其他的数进行比较,通过交换位置让该值始终保持最小。这样每一次循环都会得到一个最小的值,重复该操作直到排序结束
- 代码如何实现:两层循环。外层循环控制需要遍历多少次(N-1次);内层循环遍历出当前最小的数
#include <stdio.h> int main(){ int num[10] = {3,0,1,8,7,2,5,4,9,6}; for(int i = 0;i < 10 - 1;i++){//控制次数 //取出i对应的数,默认是最小的数 int temp = num[i]; //从i后面开始查找当前最小的数,放到i的位置 for(int j = i + 1;j < 10;j++){ //让temp和i后面的每一个数进行比较 //temp始终保存最小的那个数 if(num[j] < temp){ //交换 int n = temp; temp = num[j]; num[j] = n; } } //当前的temp值是最小的,写入i对应的位置 num[i] = temp; } //输出结果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
插入排序
- 原理:对于未排序数据,通过构建有序序列在已排序序列中从后向前扫描,找到相应的位置并插入
- 代码如何实现:两层循环。外层循环控制需要遍历多少次(N-1次);内层循环找到这个数的位置
#include <stdio.h> int main(){ int num[10] = {3,0,1,8,7,2,5,4,9,6}; for(int i = 0;i < 10 - 1;i++){//控制次数 //判断i和i+1的大小 if(num[i] > num[i+1]){ //换位置 int temp = num[i]; num[i] = num[i+1]; num[i+1] = temp; //让i对应的值和前面所有的值进行比较 for(int j = i;j > 0;j--){ //j和j-1进行比较 if(num[j] > num[j-1]){ //当前这个位置就是这个数的位置 break; }else{ //j和j-1换位置 int temp = num[j]; num[j] = num[j-1]; num[j-1] = temp; } } } } //输出结果:0123456789 for(int i = 0;i < 10;i++){ printf("%d",num[i]); } return 0; }
函数及其应用
- 函数:一组一起执行一个任务的语句(函数就是代码块,一个功能对应一个函数);每个C程序都至少有一个函数,即主函数main()
- 函数声明:告诉编译器函数的名称,返回类型和参数,而函数的实际主体可以单独定义。在函数声明中,参数的名称并不重要,只有参数的类型是必需的。
- function_name(名称):这是函数的实际名称。函数名和参数列表一起构成函数签名
- return_type(返回类型):一个函数可以返回一个值。它是函数返回的值的数据类型。有些函数执行所需的操作而不返回值时,return_type是关键字void
- parameter(参数):参数就像是占位符(函数可能不包含参数)。当函数被调用时,你向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。如果函数要使用参数,则必须声明接受参数值的变量,这些变量称为函数的形式参数。形式参数就像函数内的的其他局部变量,在进入函数时被创建,退出函数时被销毁
- body of the function(函数主体):函数主体包含一组定义函数执行任务的语句
- 函数的定义提供函数的实际主体,定义函数有两种方式:
- 声明和实现一起
int add(int a,int b){ int sum = a + b; return sum; }
- 先声明,后实现
int minus(int a,int b);
- 调用函数:通过调用函数的函数名
- 当程序调用函数时,程序控制权会转移给被调用的函数
- 被调用的函数执行已定义的任务,当函数的返回语句被执行或到达函数的结束括号时,会把程序控制权交还给主程序
add(1,2){ int result = add(3,3); return 0; }
- 函数的应用
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> /*产生一个随机数 返回值:int 函数名:generateNumber 参数:min max */ int generateNumber(int min,int max); //产生4个随机数 保存到数组中 void initArray(int array[],int count); //判断数组中是否包含一个数字 bool isNumberExist(int array[],int temp,int num); //输出数组 void show(int array[],int num); int main(){ int org[4] = {}; initArray(org,4); show(org,4); return 0; } int generateNumber(int min,int max){ srand(time(NULL)); return rand()%(max - min + 1) + min; } void initArray(int array[],int count){ for(int i = 0;i < count;i++){ //获取随机数 int temp = generateNumber(1,9); //判断当前数组里面是否存在 bool result = isNumberExist(array,temp,4); if(result == true){ i--; }else{ array[i] = temp; } } } bool isNumberExist(int array[],int temp,int num){ for(int i =0;i < num;i++){ if(array[i] == temp){ return true; } } return false; } void show(int array[],int num){ for(int i = 0;i < num;i++){ printf("%d",array[i]); } printf("\n"); }
杀人小游戏实战
#include <stdio.h> #define KILLED 0 int main(){ int num[50] = {};//保存每个人的编号 int count;//保存输入的人数 int killnum;//被杀的人的编号 printf("请输入参与人数:"); scanf("%d",&count); //开始编号 for(int i = 0;i < count;i++){ num[i] = i + 1; } printf("请输入杀人的编号:"); scanf("%d",&killnum); //开始游戏 int current = 0;//记录当前报数的位置 int totalkilled = 0;//记录当前死亡人数 for(int i = 0;i < count;i++){ //i指向的这个人开始报数 if(num[i] != KILLED){ current++; } //判断当前编号是不是死亡编号 if(current == killnum){ printf("死忙编号%d\n",num[i]); num[i] = KILLED;//杀掉 current = 0;//还原 totalkilled++; //当还剩一个的时候就退出循环 if(totalkilled == count - 1){ break; } } //判断是否到末尾 if(i == count - 1){ i = -1; } } for(int i = 0;i < count;i++){ printf("%d",num[i]); } return 0; }
猜数字小游戏实战
游戏规则:电脑自动产生四个不重复的在1-9之间的随机数,接着对产生的随机数按从小到大的顺序排好,玩家对这四个数进行猜测并输入电脑。如果猜测的数字的位置和数值都正确提示A,如果猜测的数字的数值正确而位置错误提示B。例如:猜测的数字中,如果四个数字全部猜对则提示4A,如果一个数字的数值和位置都正确而有三个数字的数值正确位置错误则提示1A3B
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int org[4] = {};//保存随机数 int input[4] = {};//保存用户输入 int aCount = 0; int bCount = 0; //产生随机数 srand(time(NULL));//播种子 for(int i = 0;i < 4;i++){ //产生一个随机数 int temp = rand()%9 + 1; if(i == 0){ //第一个数直接保存 org[i] = temp; }else{ //判断之前这个数是否存在 int j = 0; for(;j < i;j++){ if(temp == org[j]){ //重复了 break; } } //判断for循环怎么出来的 if(i == j){ //不重复 保存 org[i] = temp; }else{ //重复了 i--; } } } for(int i = 0;i < 4-1;i++){ for(int j = 0;j < 4 - i - 1;j++){ if(org[j] > org[j+1]){ int temp = org[j]; org[j] = org[j+1]; org[j+1] = temp; } } } //开始游戏 while(1){ //提示输入 printf("请输入猜测的数字:"); for (int i = 0; i < 4; i++) { scanf("%d", &input[i]); } //开始 for (int i = 0; i < 4; i++) { for (int 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("全对!!!!\n"); break; }else{ aCount = 0; bCount = 0; } } return 0; }