//
// main.m
// C4_数组
//
// Created by YIem on 15/11/13.
// Copyright (c) 2015年 www.yiem.net YIem博客. All rights reserved.
//

import <Foundation/Foundation.h>

define SIZE (5)//宏定义

// 宏命名 1.全大写字母 eg: SIZE MAX MIN
// 2.k + 驼峰命名 eg: kSize kMax kMin
int main(int argc, const char * argv[]) {
// 参数宏

define ADD(a, b) ((a) + (b))// ->单个加括号 整体加括号 保证数据安全


// 数组 Array

// 构造类型 用来保存一组 相同数据类型的 数据

// 数字定义
    // 类型 说明符 数组名[元素的个数] 赋值运算符(=) 初值{ 初值};
    // 元素个数为 整型表达式(常量)iOS

if 0

int a[SIZE] ={1, 2, 3, 4, 5};
int a2[5] = {0};// 创建空数组
int a3[5] = {1, 2, 3};
// 数组创建时 元素个数和初值 最少有一个
int a4[] = {1, 2, 3, 4, 5};
    
// 浮点型 数组
float a5[5] = {1.2 , 3.4, 5.6};
// 字符 数组
char a6[5] = {'a', 'p', 'p', 'l', 'e'};

// 访问/ 设置 数组元素

// // 通过 数组名[索引/ 下标]

a4[1] = 100;
printf("%d\n", a4[2]);

endif

//遍历

if 0

int a7[] = {1, 2, 3, 4, 5};
//数组元素个数
// sizeof 获取某个表达式/类型的大小
//  unsigned long > %lu
printf("**%lu\n", sizeof(a7[0]));
// 个数 = 总大小 / 单个大小

int count = sizeof(a7) / sizeof(int)//也可以写成sizeof(a7[0])

;

// i >index 索引
for (int  i = 0; i < count; i++) {
    printf("%d\n", a7[i]);
}

endif

// 练习 1.定义一个具有20个元素的整型数组, 每个元素的取值范围是30-70之间,求数组的和

if 0

int a[20] = {0}, sum = 0;
for (int i = 0; i < 20; i++) {
    a[i] = arc4random() % (70 -30 +1) +30;
    sum += a[i];
    printf("-%d",a[i]);
}
printf("\nsum = %d\n", sum);

// 练习2.复制一个数组,即两个数组 容量一样,把其中一个数组中的元素 复制 到另外一个数组中

int b[20] = {0};
for (int i = 0; i < 20; i++) {
    b[i] = a[i];
     printf("-%d",b[i]);
}

endif


// 练习3.生成 2个数组,每个数组都有 10个元素 ,元素取值范围 20-40之间,数组对应元素相加,放到另外一个数组中

if 0

int a1[10] = {0}, a2[10] = {0}, a3[10] = {0};
for (int i = 0; i < 10; i++) {
    a1[i] = arc4random() % (40 - 20 + 1) + 20;
    a2[i] = arc4random() % (40 - 20 + 1) + 20;
    // 这样子 赋值 值不一样
    a3[i] = a1[i] + a2[i];
}
for (int i = 0; i < 10; i++) {
    printf("%d ", a1[i]);
}
printf("\n");
//
for (int i = 0; i < 10; i++) {
    printf("%d ", a2[i]);
}
printf("\n");
for (int i = 0; i < 10; i++) {
    printf("%d ", a3[i]);
}
printf("\n");

endif

// 区分概念
// int a[5]  -> 定义数组  [5] 代表元素个数
// a[5]  访问 -> 数组使用  [5] 代表下标/索引
// 一个5个元素的数组 下标的变化为0-4 (元素个数-1) 如果访问a[5] 则发生数组越界

/ 数组排序**/


//冒泡排序

if 0

int a[5] = {2, 7, 4 , 9, 6};
// 外层 循环 控制每次找到 一个最大值  放在最后
// -1 如果是5个数 4个数序时 整个数组就会有序
for (int i = 0; i < 5 - 1; i++) {
    // 内层 循环 控制比较和交换
    for (int j = 0; j < 5 - 1 - i; j++) {
      // 比较 和 交换
        // -1 防止越界访问
        // -i 防止重复对有顺序的数进行比较
        if (a[j] > a[j + 1]) {
            int temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = temp;
            
        }
        
        
    }
    // 打印
    for (int i = 0; i < 5; i++) {
        printf("-%d", a[i]);
    }
    printf("\n");
}

endif

// 练习: 随机产生 10个[20-40]数,幷对10个数从小到大排序 从大到小排序

if 0

int a[10] ={0};
for (int i = 0; i < 10 - 1; i++) {
    a[i] = arc4random() % (40 - 20 + 1) + 20;
}
for (int i = 0; i < 10 - 1; i++) {
    // 内层循环 控制比较和交换
    // -1 防止越界访问
    // -i 防止重复对有序区的数进行比较
    for (int j = 0; j < 10 - 1 - i; j++) {
        // 比较和交换
        if (a[j] > a[j + 1]) {
            int temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = temp;
        }
        
    }
    
}
for (int i = 0; i < 10; i++) {
    printf("%d ", a[i]);
   
}
printf("\n");

endif

if 0

int a[10] ={0};
for (int i = 0; i < 10 - 1; i++) {
    a[i] = arc4random() % (40 - 20 + 1) + 20;
}
for (int i = 0; i < 10 - 1; i++) {
    // 内层循环 控制比较和交换
    // -1 防止越界访问
    // -i 防止重复对有序区的数进行比较
    for (int j = 0; j < 10 - 1 - i; j++) {
        // 比较和交换
        if (a[j] < a[j + 1]) {
            int temp = a[j];
            a[j] = a[j + 1];
            a[j + 1] = temp;
        }
    }
}
for (int i = 0; i < 10; i++) {
    printf("%d ", a[i]);
}
printf("\n");

endif

if 1

/****** 字符数组/字符串******/

// 字符数组
char c[] = {'a', 'p', 'p', 'l', 'e', };// 可以加'\0' 变成字符串
//字符串 String
char string[] = "apple";// 有\0 时结束打印
//字符串的结尾处有"\0" 总大小 = 字符个数+1
printf("%lu %lu\n", sizeof(c), sizeof(string));

// 打印字符串
int i = 0;
while (string[i]) {
    printf("%c", string[i]);
    i++;
}
printf("\n");
// 打印
// 数组名为数组的 首地址 通过首地址 逐个访问数组元素 直到\0 停止
printf("%s\n", string);

// 字符串操作函数
// <string.h> 库文件
// 字符串长度 string length
// 字符个数不包含结尾的\0
printf("%lu\n", strlen(string));

//**** 字符串考贝 string copy
char newStr[10] = "";
// 参数一: 目标字符串
// 参数二: 原字符串
strcpy(newStr, string);
printf("%s\n", newStr);

//**** 字符串拼接
// 参数一: 目标字符串
// 参数二: 原字符串

strcat(newStr, "TV");// 在appple 后面接TV
printf("%s\n", newStr);

//**** 字符串比较 string compare

char str1[] = "iPhone6s";
char str2[] = "iPhone7";
// 第一个第二个字符串中 从左向右 第一个不相同的字符对应的 ASCII码的差值计算
int result = strcmp(str1, str2);
printf("%d\n", result);

//结果为负 升序 Ascending

//结果位正 降序 Descending

endif


//****** ******//

// 参数宏使用

printf("%d\n", ADD(3, 5) * ADD(3, 5));
//宏的作用 : 完全替换
// 宏在使用时,需要考虑数据安全问题







return 0;

}