//
// main.m
// CLesson04
//
// Created by 康 亮亮 on 15/10/10.
// Copyright (c) 2015年 Darling.com. All rights reserved.
// 一维数组、数组排序、字符数组
#import <Foundation/Foundation.h>
int main(int argc,const char * argv[]) {
#pragma mark 一维数组
定义一个数组
// long a = 12;// 类型声明 变量名 赋初值
//
// // int :声明数组的类型,数组类型一旦确定,那么数组的元素类型也确定下来
// // array : 数组名,给数组取的名字
// // [5] :确定数组的长度,数字是几,就放几个元素(元素的类型必须和数组的类型一致)
// // {} :表示给数组赋值,数组元素之间要使用逗号分隔
// int array[5] = {12, 23, 34, 45, 56};
// // 数组的内存占用
// printf("整形变量占用的字节数是:%lu\n",sizeof(a)); //无符号长整形使用%lu输出
// // 使用sizeof()函数求出数组占用的字节数
// printf("整形数组变量占用的字节数是:%d\n",sizeof(array)); // 5*4
// //我们在定义一个数组时,可以省略数组元素的个数,由编译器自动推断。注意1:“[]”不能省
// int array1[] = {12, 23, 34, 45, 56};
// //我们在定义一个数组时,可以不给每个元素都赋值,没有赋值的元素,默认为0.
// int array2[5] = {12, 23, 34};
// //定义一个数组,给定了数组长度,首元素为0,其他元素不赋值,默认也是0.这样五个元素均为0;
// int array3[5] = {0};// 注意:数组初始化时0尽量不要省去
// // 定义一个整形数组,有5个元素,分别是12,21,32,23.
// int array4[5] = {12, 21, 32, 23};
//
// //数组元素的访问方式:数组名+下标
// //访问arrary中的32这个元素,数组名:array,下标,从0开始计数,32在第3个位置上,所以32的下标就是2.
// // []:在定义数组时,方括号中的数字表示声明数组的元素个数;而在访问数组元素时,方括号表示要访问的元素的下标。
// int temp = array4[2];
// printf("temp = %d, array4[2] = %d", temp, array4[2]);
// 数组下标越界:数组下标超过了数组长度,访问了不属于数组的内存空间。
// 注意2:C语言中,没有“数组下标越界保护”机制,所以在写代码时,要注意避免下标越界。
// int temp = array4[5];
// printf("temp = %d, array4[5] = %d", temp, array4[5]);//数组下标越界(C中没有越界保护,OC中有越界保护)
// // 修改array数组的第2个元素,改为99
// array4[1] = 99;
// printf("array4[1] = %d", array4[1]);
//
// // 定义一个新数组,array5,将array4的元素,原样赋给array5;
// int array5[5] = {0};
// // array5 = array 4;这是错的。数组中,不能整体访问数组元素,而要逐一的遍历数组元素!
array5[0] = array4[0];
array5[1] = array4[1];
array5[2] = array4[2];
array5[3] = array4[3];
array5[4] = array4[4];
//
// for (int i = 0; i < 5; i++) {
// array5[i] = array4[i];// 说明数组下标可以是常量,也可以是变量
//
// }
// // 遍历数组时,一般使用for循环
// for (int i = 0; i < 5; i++) {
// printf("arrary5[%d] = %d\n", i, array5[i]);
// }
// 1、定义一个具有20个元素的整型数组,每个元素的取值范围是【30,70】,求数组元素的和。
// // 直观写法,便于理解
// // 1、定义一个整形数组,长度20,初始化
// int array[20] = {0};
//
// // 2、开启一个for循环,使用循环给数组元素赋值
// for(int i = 0; i < 20; i++){
// //2.1生成满足范围的20个随机数
// int temp = arc4random() % (70 - 40 + 1) + 30;
// //2.2 将生成的随机数赋给对应的元素
// array[i] = temp;
// printf("array[%d] = %d\n", i, array[i]);
// }
//
// // 3、求数组元素的和
// // 3.1 定义一个保存和的变量
// int sum = 0;
// // 3.2使用for循环换便利数组元素,同时将元素累加起来
// for(int i = 0; i < 20; i++) {
// // 3.3累加
// sum = sum + array[i];
// }
//
// printf("\n20个数组元素的和sum = %d",sum);
// 精简方法
// // 1、定义一个整形数组,长度20,初始化
// int array[20] = {0};
//
//经典面试题:(数组元素个数的计算)
printf("sizeof(arr) / sizeof(int)= %ld\n", sizeof(arr) / sizeof(int));
//
// // 2、求和变量
// int sum = 0;
// printf("20个随机数为:\n");
// // 3、开启一个for循环,使用循环给数组元素赋值
// for(int i = 0; i < 20; i++){
// //3.1生成满足范围的20个随机数
// int temp = arc4random() % (70 - 40 + 1) + 30;
// //3.2 将生成的随机数赋给对应的元素
// array[i] = temp;
// sum = sum + array[i];
// printf("array[%d] = %d\n", i, array[i]);
// }
// printf("\n20个数组元素的和sum = %d",sum);
// 2、复制一个数组,即两个数组容量一样,把其中一个数组中的元素复制到另外一个数组中。
// int arr1[5] = {12, 23, 34, 45, 56};
// int arr2[5] = {0};
//
// for (int i = 0; i < 5; i++) {
// arr2[i] = arr1[i];
// printf("%d\t", arr2[i]);
//
// }
// 3、生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相加,放到另外一个数组中。
// // 1.定义三个数组,长度为10
// int array1[10] = {0};
// int array2[10] = {0};
// int array3[10] = {0};
// // 2.使用一个for循环,给第一,第二个数组分别赋值;再将前两个数组对应的元素,交给第三个数组
// for(int i = 0; i < 10; i++){
// // 2.1给第一个、第二个数组赋值
// array1[i] = arc4random() % (20 + 1) + 20;
// array2[i] = arc4random() % (20 + 1) + 20;
//
// // 2.2将前两个数组对应的元素相加,赋给第三个数组对应的元素
// array3[i] = array1[i] + array2[i];
// printf("array1[%d] = %d, array2[%d] = %d, array3[%d] = %d\n", i, array1[i],i, array2[i],i, array3[i]);
//
// }
#pragma mark 冒泡排序
// 冒泡排序规律:公式1 趟数=元素个数-1;公式2每趟比较的次数=元素个数-当前的趟数
// 两层for循环,外层循环比较趟数、内层控制比较次数
// 趟数
int array[5] = {23,45, 43, 56, 13};
//外层循环,控制排序趟数,趟数 = 数组元素个数 - 1
for (int i =0; i < 5 - 1; i++) {
//内层循环,控制比较次数,每趟比较的次数=元素个数-当前的趟数(i + 1)
for (int j =0; j < 5 -(i +1); j++) {
// 判断,并且交换
if (array[j] > array[j+1]) { // 因为每趟比较,都要从下标为零开始,j在每次从外层循环进入内层时,下标都要加一,j在每次内层循环时,也会加一,所以,在这里使用j做下标是没有问题的。
// 满足交换条件,开始交换位置
// 定义一个临时变量
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
printf("冒泡排序后:");
// 使用for循环遍历打印数组
for (int i =0; i < 5; i++) {
printf("%d\t", array[i]);
}
// int arr[10] = {0};
//
//
// printf("10个随机数是:");
// for (int i = 0; i < 10; i++) {
// int num = arc4random() % (40 - 20 + 1) + 20;
// arr[i] = num;
// printf("%d ", arr[i]);
// }
//
// int temp;
// for (int i = 0; i < 10; i++) {
//
// for (int j = 0; j < 10 - 1 - i; j++) {
//
// if (arr[j] > arr[j+1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
//
// }
// }
// }
//
// printf("\n排序后的10个数为:\n");
// for (int i = 0; i < 10; i++) {
// printf("%d\t",arr[i]);
// }
#pragma mark 字符数组
//保存字符的数组,就是字符数组
// //定义一个字符数组第一种方式:声明类型、数组名、数组长度、赋初值
// char char_Array[5] = {'h', 'e', 'l', 'l', 'o'};
// printf("%lu\n", sizeof(char_Array)); //每个字符占一个字节,数组长度是5,所以数组占用5*1个字节的内存。
// char char_Array1[] = {'w', 'o', 'r', 'l', 'd'};
// printf("%lu\n", sizeof(char_Array1));
// //定义字符数组的第二种方式:这种形式的赋值,默认在字符末尾插入了一个'\0','\0'是字符串结束的标志,我们在用%s作为字符数组/字符串的输出占位符时,程序会从数组的零号元素开始打印,一直打印到遇到'\0'为止
char string[] = "hello";
printf("%lu\n",sizeof(string));
printf("%s\n", string);// 打印字符串使用的占位符是%s,在遇到'\0'后,会自动停止输出。
#pragma mark 字符串和字符数组的区别
#pragma mark 字符串操作函数
// strlen():返回字符串的有效字符个数(不包括\0)
printf("string字符串的长度是%lu\n",strlen(string));
// strcpy():字符串拷贝函数:把第2个参数的值拷贝给第一个参数
char string1[10];
strcpy(string1, string);
printf("string1 = %s\n", string1);
// strcat():字符串拼接
char string3[20] ="hello";
char string4[] = "world";
strcat(string3, string4); // 把string4的值,拼接到string3后边,string3必须有充足的空间盛放string4
printf("string3 = %s\n", string3);
// strcmp():字符串比较
int b = strcmp(string3, string4);//第一个参数大于第二个参数,返回一个正整数;第一个参数小于第二个参数,返回一个负数;两个参数相等,返回0.
//helloworld
//world
printf("b = %d\n",b);
return 0;
}