---------------------------------交换变量-------------------------------------------------------------------
1, 是使用中间变量(实际开发)
// int temp = num1;
// num1 = num2;
// num2 = temp;
不使用中间变量
// 2.1 利用 + - 法
// num1 + num2 == 15
// num1 = 15 - num1 得到原来 num2 的值
// num2 = 15 - num1 15 减去原来 num2 的值,得到原来num1的值
// num2 = num1 + num2;
// num1 = num2 - num1;
// num2 = num2 - num1;
// num2 = num1 * num2;
// num1 = num2 / num1;
// num2 = num2 / num1;
// 0 | 1 == 1
// 1 ^ 1 == 0
// 1 ^ 0 == 1
// num2 = num1 | num2;
// num1 = num2 ^ num1;
// num2 = num2 ^ num1;
// 0 ^ 1 = 1
// 1 ^ 1 = 0
// 1 ^ 0 = 1
// num2 = num1 ^ num2;
// num1 = num2 ^ num1;
// num2 = num2 ^ num1;
// java, .net, oc
num2 = num1 + (num1 = num2)*0;
----------------------------------------------------------------------------------------------------
定义数组
数据类型 数组名[元素的个数];
使用数组元素
数组名[下标]
数组初始化的方法(先定义,再初始化,最后使用)
初始化:
1, 定义的同时进行初始化
int nums[5] = { 1, 2, 3, 4, 5 }; // {1,2,3,4,5}
不完全初始化
int nums[10] = { 1, 2, 3 }; // 前三个元素进行初始化, 后面的所有元素初始化为 0
省略数组长度, 利用初始化的元素个数进行自动的判断
int nums[] = { 1, 2, 3, 4, 5 }; // 初始化的时候提供了 5 个数字, 那么数组的长度会被编译自动的设置为 5
2, 定义完成之后进行初始化
使用 数组名[下标] = 值; 的方式一个一个的初始化
----------------------------------------------------------------------------------------------------
// int nums1[5] = { 1, 2, 3, 4, 5 };
// int nums2[10] = { 1 };
// int nums3[] = { 1, 3, 5, 6, 4, 7 };
// 实际开发过程中,常常使用如下方法对数组进行清零
// int nums4[10] = { 0 };
// 用花括弧的方式对数组进行复制,只能在初始化的时候
// int nums5[4];
// nums5 = {0, 2, 4, 6};
// 在实际开发过程,常常利用循环对已定义的数组进行初始化
/*
int nums6[LEN];
for (int i = 0; i < LEN; i++) {
// scanf("%d", &nums6[i]);
int numTemp;
scanf("%d", &numTemp);
nums6[i] = numTemp;
// nums6[i] = getNum(); // 防止用户乱输入, 可以自定义输入函数
// scanf("%d", &num);
}
*/
// 在 C99 标准以前, 数组的定义不允许使用变量
// K&R C -> ANSI C(C89) -> C99 -> C11
// clang
// 由用户提出数组的长度为多少,然后再初始化
printf("请输入数组的长度\n");
int length;
scanf("%d", &length);
int nums[length];
for (int i = 0; i < length; i++) {
scanf("%d", &nums[i]);
}
// printf("%d\n", nums[1]);
return 0;
----------------------------------------------------------------------------------------------------
使用数组元素有时称为引用数组元素
printf("请输入数组的长度\n");
int length;
scanf("%d", &length);
int nums[length];
for (int i = 0; i < length; i++) {
scanf("%d", &nums[i]);
}
// 遍历验证数据是否已经存储
printf("====================\n");
for (int i = 0; i < length; i++) {
printf("%d\n", nums[i]);
}
-------------------------------数组统计---------------------------------------------------------------------
int main(int argc, const char * argv[]) {
int length;
printf("请输入数组的个数\n");
scanf("%d", &length);
int nums[length];
printf("请初始化数组,输入 %d 个数字\n", length);
for (int i = 0; i < length; i++) {
scanf("%d", &nums[i]);
}
int sum = 0, min, max;
sum = max = min = nums[0];
// max = min = nums[0];
for (int i = 1; i < length; i++) {
sum += nums[i];
if(max < nums[i]) {
max = nums[i];
}
if(min > nums[i]) {
min = nums[i];
}
}
printf("sum = %d\n", sum);
printf("max = %d\n", max);
printf("min = %d\n", min);
printf("avg = %f\n", sum * 1.0 / length); // avg average 平均数
return 0;
}
------------------------------数组 实现栈结构----------------------------------------------------------------------
// 栈就是薯片桶
// 先进后出,后进先出
// int nums[256];
// int index = 0;
// 0,1 1,2 2,3 3,4
// nums[index++] = 1;
// index 0 赋值一次, index -> 1
// index 1 赋值一次, index -> 2
// index 的值是不是总是指向将来要放数据的位置
// index 的值刚好是数组中重新存入的数据的个数
// printf("%d\n", nums[--index]); // 打印最后添加到数组中的数字
// 同时 index 减一, 指向前一个位子
int nums[256];
int index = 0;
// 存 10 个数字到数组中
for(int i = 0; i< 10; i++ ) {
int temp;
scanf("%d", &temp);
nums[index++] = temp;
// nums[i] = temp;
}
// index 的值指向下一个要方数据的位子
// 并且 index 表示了有都少个数字
while(index > 0) {
printf("%d\n", nums[--index]);
}
return 0;
}
------------------------------数组 打印二进制----------------------------------------------------------------------
int num = 123;
int nums[33];
int index = 0;
for(int i = 0; i < 31; i++) {
int temp = num & 1;
// printf("%d", temp);
nums[index ++] = temp;
num >>= 1;
}
while (index > 0) {
printf("%d", nums[--index]);
}
printf("\n");
return 0;
-------------------------------数组的 特点---------------------------------------------------------------------
数组
1, 同一个数据类型
2, 内存是连续分配
3, 可以定义多个变量
4, 数组初始化
5, 数组中的每一个元素都可以直接看作为一个变量
6, 数组的遍历
7, 使用数组模拟实现栈结构
数组越界
1, 在函数中声明的数组是如何存储的 存储在栈上, 随函数的结束而释放
2, 函数中定义的数组的生命周期 函数执行,数组创建,函数结束,数组回收
3, 数组不允许出现越界
变量的存储是在栈上由高到低
数组越界,就是使用了不在数组下标范围内的下标访问了数组的元素
即使答案的结果是正确,也是错误的
数组与函数连用
1, 数组元素作为函数参数
2, 数组名作为函数参数
int nums[10];
func(nums[1]);
func(nums);
数组元素作为函数参数
数组元素是变量, 就是与值传递的用法一样
数组元素作为函数参数使用
相当于变量作为函数参数使用,是值传递
数组名作为函数参数使用
相当于函数内与函数外的数组是同一个数组,是引用传递
数组名就是数组的首地址
定义一个数组,其实是定义了很多的变量
但是这些变量没有办法引用
用数组名 记录数组这些变量的首地址
nums[下标]
使用下标在访问对应地址位置的变量
int nums[3];
数组名只是首地址,要访问变量需要使用[]
而方括弧中的下标,是指数组偏移的大小
单位偏移量由数组的类型决定
----------------------------------------------------------------------------------------------------
int nums[256]; // int num[~(1 << 31)]
int index = 0;
// 编程时, 用户输入多少? 我的程序分配多少空间?
// 提示用户输入,如果用户输入字母q表示输入结束
int input, count;
char ch = '\0';
while(1) {
count = scanf("%d", &input);
if(count > 0) {
nums[index++] = input;
} else {
scanf("%c", &ch);
if(ch == 'q')
break;
}
}
int i = 0;
for(i = 0; i < 10; i++) {
nums[i] = i;
nums[index++] = i;
nums[index] = i;
index++;
}
return 0;
------------------------数组统计----------------------------------------------------------------------------
// init 是 initialize 的简写
void initArray(int nums[10]) {
for(int i = 0; i < 10; i++) {
scanf("%d", &nums[i]);
}
printf("初始化完成\n");
}
int getSum(int nums[10]) {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += nums[i];
}
return sum;
}
double getAvg(int nums[10]) {
return getSum(nums) * 1.0 / 10;
}
int getMax(int nums[10]) {
int max = nums[0];
for (int i = 1; i < 10; i++) {
if(max < nums[i]) {
max = nums[i];
}
}
return max;
}
int getMin(int nums[10]) {
int min = nums[0];
for (int i = 1; i < 10; i++) {
if(min > nums[i]) {
min = nums[i];
}
}
return min;
}
int main(int argc, const char * argv[]) {
// 1, 创建一个数组
int nums[10];
// 2, 初始化
initArray(nums);
// 3, 求和
int sum = getSum(nums);
// 4, 求平均
double avg = getAvg(nums);
// 5, 求最大
int max = getMax(nums);
// 6, 求最小
int min = getMin(nums);
// 打印结果
printf("求和的结果为: %d\n", sum);
printf("求平局的结果为: %lf\n", avg);
printf("最大为 %d, 最小为: %d\n", max, min);
return 0;
}
----------------------------------------------------------------------------------------------------
在实际开发过程中,一般数组名作为函数参数都有两个参数:1 数组的名字, 2: 数组的长度
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void func(int nums[]) {
for (int i = 0; i < 10; i++) {
printf("%d\n", nums[i]);
}
}
void func1(int nums[], int length) {
for (int i = 0; i < length; i++) {
printf("%d\n", nums[i]);
}
}
int main(int argc, const char * argv[]) {
int nums[] = {1,2,3,4,5,6,7,8,9,0};
func1(nums, 10);
// 统计各个班的人数
int classNum[10] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
// 初始化...
for (int i = 0; classNum[i] > 0; i++) {
// 统计
}
return 0;
----------------------------------------------------------------------------------------------------
一般,函数中的变量,会按照栈地址的从高到低的方式存储
-----------------------------------排序$-----------------------------------------------------------------
// 要实现冒泡排序
/*
for(int i= 0; i< n-1; i++) {
for(int j = 0; j < n - 1 - i; j++) {
if(nums[j] > nums[j+1]) ...
int temp = nums[i];
nums[i] = nums[i+1];
nums[i+1] = temp;
}
}
*/
------------------------------------选择排序$----------------------------------------------------------------
int nums[] = { -2, 3, 12, -4, 90, -15, 67, 34 };
// sizeof 计算字节数
// int nums1[3];
// printf("%d\n", sizeof(nums1) / sizeof(int));
int length = sizeof(nums) / sizeof(int);
for( int j = 1; j < length; j++) {
for(int i = j; i < length; i++) {
// nums[i] 与 nums[j - 1]
if( nums [i] < nums[j - 1]) {
int temp = nums[i];
nums[i] = nums[j - 1];
nums[j - 1] = temp;
}
}
}
-------------------------------二分法查找---------------------------------------------------------------------
// 二分法查找, 又叫折半查找
// 如果有一个数组, 需要找到里面是否具有某一个数字
// 首先数组需要排序
// 随意的找一个数字(一般选择中间的那一个), 查看这个数字是否与我要找的数字相匹配
// 如果相等就是找到了, 如果不相等 至少可以判断 我的数字 与中间的这个数字的大小
// if( 我的 > 这个数字) 在后面找
// if( 我的 < 这个数字) 在前面找
int nums[] = {2, 4, 6, 8, 10};
int search = 5;
int length = sizeof(nums)/sizeof(int);
int index = -1;
int low = 0, high = length - 1;
while (low <= high) {
int mid = (low + high) / 2;
int num = nums[mid];
if(search == num) {
index = mid; break;
} else if(search > num) {
// 从 mid + 1 开始往后找
low = mid + 1;
} else {
high = mid - 1;
}
}
if(low > high) {
printf("没有找到\n");
} else {
printf("%d\n", index);
}
return 0;
----------------------------------------------------------------------------------------------------
创建一个函数, 在函数中,判断某一个数字是否存在于数组中
#include <stdlib.h>
int indexOf(int nums[], int length, int search) {
for(int i = 0; i < length; i++) {
if(nums[i] == search) {
return i;
}
}
return -1;
}
--------------------------------------------------------------------------------
int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 10;
while(i > 0) {
int index = arc4random_uniform(i);
// nums[index] 与 nums[i - 1] 交换
int temp = nums[index];
nums[index] = nums[i - 1];
nums[i - 1] = temp;
i--;
}
for (int i = 0; i < 10; i++) {
printf("%d\n", nums[i]);
}
return 0;
}
------------------------------all ----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
// 创建一个函数, 在函数中,判断某一个数字是否存在于数组中
int indexOf(int nums[], int length, int search) {
for(int i = 0; i < length; i++) {
if(nums[i] == search) {
return i;
}
}
return -1;
}
int main(int argc, const char * argv[]) {
// 创建一个随机数, 判断数组中是否有这个随机数, 如果没有才加入
// for
// while
// do-while
// int nums[10];
// int isExist = 0; // exist 存在
// for (int i = 0; i < 10; i++) {
// int num = arc4random_uniform(10);
// // 判断nums中是否存在这个随机数
// for(int j = 0; j < i; j++) {
// if(nums[j] == num) {
// // 存在
// isExist = 1;
// break;
// }
// }
//
// if(isExist) {
// i--;
// isExist = 0;
// } else {
// nums[i] = num;
// }
//
// }
// int nums[10];
// int num;
// for (int i = 0; i < 10; i++) {
// lable:
// num = arc4random_uniform(10);
// // 判断nums中是否存在这个随机数
// for(int j = 0; j < i; j++) {
// if(nums[j] == num) { // 已经有了这个数字
// goto lable;
// }
// }
//
// nums[i] = num;
// }
// int nums[10];
// int index = 0;
// while(index < 10) {
// int num = arc4random_uniform(10);
// if(!(indexOf(nums, index, num) >= 0)) {
// nums[index++] = num;
// }
// }
// int nums[10] = {0};
// int nums[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
//
// int i = 0;
//
// while(i < 10) {
// int index = arc4random_uniform(10);
// // 判断, 这个位置是否已经被用了, 如果 位置上的数字是 -1
// if(nums[index] != -1) continue;
//
// nums[index] = i++;
//
// }
// int num = arc4random_uniform(10); // => 0-9 之间的随机数
// 2
// 0-1 3-9
// 算的不是数字,算的是位置
int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//
// int index = arc4random_uniform(10);
// nums[10 - 1] 与 nums[index] 交换 相当于找一个随机数放到最后一个位置
// 2
// 0, 1, 9, 3, 4, 5, 6, 7, 8, 2
// 2
// 0, 1, 8, 3, 4, 5, 6, 7, 9, 2
//
// int index = arc4random_uniform(9); // 0 - 8
// nums[10 - 2] 与 nums[index] 交换
//
// int index = arc4random_uniform(8); // 0 - 7
// nums[10 - 3] 与 nums[index] 交换
int i = 10;
while(i > 0) {
int index = arc4random_uniform(i);
// nums[index] 与 nums[i - 1] 交换
int temp = nums[index];
nums[index] = nums[i - 1];
nums[i - 1] = temp;
i--;
}
for (int i = 0; i < 10; i++) {
printf("%d\n", nums[i]);
}
return 0;
}
----------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
// 创建一个函数, 在函数中,判断某一个数字是否存在于数组中
int indexOf(int nums[], int length, int search) {
for(int i = 0; i < length; i++) {
if(nums[i] == search) {
return i;
}
}
return -1;
}
int main(int argc, const char * argv[]) {
// 创建一个随机数, 判断数组中是否有这个随机数, 如果没有才加入
// for
// while
// do-while
// int nums[10];
// int isExist = 0; // exist 存在
// for (int i = 0; i < 10; i++) {
// int num = arc4random_uniform(10);
// // 判断nums中是否存在这个随机数
// for(int j = 0; j < i; j++) {
// if(nums[j] == num) {
// // 存在
// isExist = 1;
// break;
// }
// }
//
// if(isExist) {
// i--;
// isExist = 0;
// } else {
// nums[i] = num;
// }
//
// }
// int nums[10];
// int num;
// for (int i = 0; i < 10; i++) {
// lable:
// num = arc4random_uniform(10);
// // 判断nums中是否存在这个随机数
// for(int j = 0; j < i; j++) {
// if(nums[j] == num) { // 已经有了这个数字
// goto lable;
// }
// }
//
// nums[i] = num;
// }
// int nums[10];
// int index = 0;
// while(index < 10) {
// int num = arc4random_uniform(10);
// if(!(indexOf(nums, index, num) >= 0)) {
// nums[index++] = num;
// }
// }
// int nums[10] = {0};
// int nums[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
//
// int i = 0;
//
// while(i < 10) {
// int index = arc4random_uniform(10);
// // 判断, 这个位置是否已经被用了, 如果 位置上的数字是 -1
// if(nums[index] != -1) continue;
//
// nums[index] = i++;
//
// }
// int num = arc4random_uniform(10); // => 0-9 之间的随机数
// 2
// 0-1 3-9
// 算的不是数字,算的是位置
int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//
// int index = arc4random_uniform(10);
// nums[10 - 1] 与 nums[index] 交换 相当于找一个随机数放到最后一个位置
// 2
// 0, 1, 9, 3, 4, 5, 6, 7, 8, 2
// 2
// 0, 1, 8, 3, 4, 5, 6, 7, 9, 2
//
// int index = arc4random_uniform(9); // 0 - 8
// nums[10 - 2] 与 nums[index] 交换
//
// int index = arc4random_uniform(8); // 0 - 7
// nums[10 - 3] 与 nums[index] 交换
int i = 10;
while(i > 0) {
int index = arc4random_uniform(i);
// nums[index] 与 nums[i - 1] 交换
int temp = nums[index];
nums[index] = nums[i - 1];
nums[i - 1] = temp;
i--;
}
for (int i = 0; i < 10; i++) {
printf("%d\n", nums[i]);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
// 创建一个函数, 在函数中,判断某一个数字是否存在于数组中
int indexOf(int nums[], int length, int search) {
for(int i = 0; i < length; i++) {
if(nums[i] == search) {
return i;
}
}
return -1;
}
int main(int argc, const char * argv[]) {
// 创建一个随机数, 判断数组中是否有这个随机数, 如果没有才加入
// for
// while
// do-while
// int nums[10];
// int isExist = 0; // exist 存在
// for (int i = 0; i < 10; i++) {
// int num = arc4random_uniform(10);
// // 判断nums中是否存在这个随机数
// for(int j = 0; j < i; j++) {
// if(nums[j] == num) {
// // 存在
// isExist = 1;
// break;
// }
// }
//
// if(isExist) {
// i--;
// isExist = 0;
// } else {
// nums[i] = num;
// }
//
// }
// int nums[10];
// int num;
// for (int i = 0; i < 10; i++) {
// lable:
// num = arc4random_uniform(10);
// // 判断nums中是否存在这个随机数
// for(int j = 0; j < i; j++) {
// if(nums[j] == num) { // 已经有了这个数字
// goto lable;
// }
// }
//
// nums[i] = num;
// }
// int nums[10];
// int index = 0;
// while(index < 10) {
// int num = arc4random_uniform(10);
// if(!(indexOf(nums, index, num) >= 0)) {
// nums[index++] = num;
// }
// }
// int nums[10] = {0};
// int nums[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
//
// int i = 0;
//
// while(i < 10) {
// int index = arc4random_uniform(10);
// // 判断, 这个位置是否已经被用了, 如果 位置上的数字是 -1
// if(nums[index] != -1) continue;
//
// nums[index] = i++;
//
// }
// int num = arc4random_uniform(10); // => 0-9 之间的随机数
// 2
// 0-1 3-9
// 算的不是数字,算的是位置
int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//
// int index = arc4random_uniform(10);
// nums[10 - 1] 与 nums[index] 交换 相当于找一个随机数放到最后一个位置
// 2
// 0, 1, 9, 3, 4, 5, 6, 7, 8, 2
// 2
// 0, 1, 8, 3, 4, 5, 6, 7, 9, 2
//
// int index = arc4random_uniform(9); // 0 - 8
// nums[10 - 2] 与 nums[index] 交换
//
// int index = arc4random_uniform(8); // 0 - 7
// nums[10 - 3] 与 nums[index] 交换
int i = 10;
while(i > 0) {
int index = arc4random_uniform(i);
// nums[index] 与 nums[i - 1] 交换
int temp = nums[index];
nums[index] = nums[i - 1];
nums[i - 1] = temp;
i--;
}
for (int i = 0; i < 10; i++) {
printf("%d\n", nums[i]);
}
return 0;
}