//
// 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;
}