C 入门 第四节

/*
    1. 数组属于构造类型
    2. 具有相同数据类型成员数组的一组数据
    3. 存储不同类型数据的数据有对应的名称,整形数组;数组中成员变过来都整型的;浮点型数组:数组中成员变量都浮点型的
    4. 数组是由多个成员组成,每个成员被称为数组元素
 
    定义数组
    类型修饰符 数组名[常量表达式] = [值1, 值2, 值3];
    1. 类型修饰符: 指定数组中元素的类型
    2. []中设定数组元素的个数,即数组的存储空间.只能是常量表达式,不能是变量表达式.
    3. 初始值之间用,隔开
    4. 定义一个整型数组,存放( ⊙ o ⊙ )3个数组元素 2, 3, 4
    
    int a[3] = {1, 3, 4,};
    float a[5] = {1, 2, 3, 4, 5};
 
    定义数组的方式 1:没有赋值初始的元素,自动设置初始值为0;
    int b[5] = {3, 4, 5};
    
    定义数组方式 2:
    int c[3] = {0};
        
    定义数组方式 3:根据初始化设置,判断数组元素个数
    int d[] = {3, 4, 5, 6};
 
    错误的 定义数组方式 1 :指定的数组元素个数<设定初始值的数量
    int e[2] = {3, 4, 5,6};
 
    错误的 定义数组方式 2: 既没有指定元素个数, 也没有赋值初始值
    int f[] = {0};
 
    定义数组后, 数组的存储空间是连续的
    数组的存储空间 = 数组元素的个数*元素占的字节
    
    printf("%lu\n",sizeof(e));
 
 访问数组元素
    1. 不能一次整体调用整个数组全部元素的值,基本数据类型变量中值存储一个数据.数据中存储多个数据,不能通过数组变过来调用所有的元素.
    2. 访问数组元素 使用下标实现 数组名[下标]
    3. 下标: 数组元素在数组中序号,数组中的元素是有序的, 每个元素都有序号,序号从0开始递增, 最后一个元素的序号是 n-1, n表示数组元素的个数
    4. 下标的范围: 0~n-1
    5. 下标可以用整型常量或变量表示
 
 遍历数组
    1. 按照顺序,从数组的第一个元素开始,访问数组的最后一个元素结束
    2. 使用for循环实现数组遍历
    3.循环和数组关系密切
 */
 /*
    int age[5] = {18,15,23,28,21};
    printf("%d\n",age[0]);
    
    for (int i = 0; i < 5; i ++)
    {
        printf("%d ",age[i]);
    }
 
// 修改数组元素:根据数组下标确定需要修改的数组元素
    int aa[] = {1,2,3,4,6};
//遍历数组
    for (int i = 0; i <5; i ++)
    {
        printf("%d ",aa[i]);
    }
//修改数组元素
    aa[1] = 22;
    aa[3] = 44;
    for (int j = 0; j < 5; j ++)
    {
        printf("%d ",aa[j]);
    }

//   通过循环方式给数组元素赋值
//    1. 定义一个数组, 必须设置数组元素数量, 数组元素初值为0
//    2. 透过循环给数组元素赋值
    
    int num[5] = {0};
//  在 0 ~ 10 之间取随机数,分别赋给每个元素
    for (int i = 0; i < 5; i ++)
    {
        num[i] = arc4random()%(10 - 0 + 1) + 0;
        printf("%d ",num[i]);
    }

// 定义一个具有10个元素的整型数组,每个元素的值在30 ~ 80之间取随机数.
    
    int num[10] = {0};
    for (int i = 0; i < 10; i ++)
    {
        num[i] = arc4random()%(80 - 30 + 1) + 30;
        printf("%d ",num[i]);
    }

//越界
//    1. 使用数组下标是,超出下标范围.
//    2. 数组越界很危险,一旦越界, 即访问了不属于数组的存储空间
//    3. 编译器不会检测数组下标是否越界,因此操作数组是必须保证没有越界
//
    int Crazy[4] = {3,4,5,6};
    printf("%d ",Crazy[4]);
    
    注意事项:
    定义数组  类型 数组名[元素个数]
    数组元素      数组名

    int c = 0;
    int a[5] = {1,2,3,4,5};
    int b[5] = {0};
    for (int i = 0; i < 5; i++)
    {
        c = a[i];
        b[i] = c;
        printf("%d ",b[i]);
    }
    printf("\n");
*/
    
#pragma mark  ------数组排序--------
 /*
    1. 常见的排序方法:冒泡排序,选择排序.插入排序等
    2. 排序的规律有俩种:升序, 降序
    3. 本节课: 冒泡排序
    4. 冒泡排序的思路:每次将相邻的俩个数进行比较,按照升序或降序进行交换,直到所有数字的顺序正确为止

    int a[5] = {5, 4, 3, 2, 1};
    for (int i = 0; i < 5; i ++)  //外循环,控制循环排序趟数;5
    {
        for (int j= 0; j < 5 - 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 < 5; i++)
    {
        printf("%d ",a[i]);
    }

//        随机产⽣生10个[20,40]数,并对10个数从⼩小到⼤大排序
    int a[10] = {0};
    for (int i = 0; i < 10; i ++)
    {
        a[i] = arc4random()%(40 - 20 + 1) + 20;
        //    printf("%d ",a[i]);
    }
    printf("\n");
    for (int j = 0; j < 10 - 1; j ++)
    {
        for (int z = 0; z < 10- j - 1; z ++)
        {
            int temp;
            if (a[z] > a[z + 1])
            {
                temp = a[z];
                a[z] = a[z + 1];
                a[z + 1] = temp;
            }
        }
    }
    for (int i = 0;i < 10; i ++)
    {
        printf("%d ",a[i]);
    }
*/  
#pragma mark  --------字符数组--------
//    1. 数组元素存储的是字符.
//    定义字符数组
/*
    char a[5] = {'h','e','l','l','o'};
    char b[] = {'h','e','l','l','o'};
    char c[10] = {'h','e','l','l','o'};
    a[3] = 't';   //修改
    printf("%c\n",a[3]);   //访问

// 字符串
    定义字符数组存储字符串
    char a[] = "hello";
    char b[] = {'h','e','l','l','o','\0'}; //有 \0 是字符串  没有是数组
      
    1 . 字符串常量 "hello"
    2 . 使用字符数组存储字符串
    3 . 使用%s, 输出字符串
    
    定义字符数组存储字符串
    1 . char a2[] = "hello";
    系统如何识别字符串: '\0'  数据存储在内存中,系统如何识别那先字符属于一个完整的字符串
    '\0'是字符串结束标志,在字符串的最后一位,由系统默认添加,不可以显示
    "hello"存储时,实际上是: 'h','e','l','l','o','\0'
    有效字符: 在字符串中,'\0'之前的字符
    字符数组a2中存储字符串: 数组元素为 'h','e','l','l','o','\0'
    存储字符串的字符数组元素个数: 有效字符个数  + 1
    输出字符串: printf("%s",a2)
   
    字符串和字符数组的关系
    1 .字符串是一个字符数组
    char p[] = "hello" //字符串
    char q[] = {'h','e','l','l','o'} //数组
    p  q  都是数组
    俩个数组存储的内容都是  字符串hello
    都可以访问,修改数组元素,遍历
    for (int i; i < sizeof(p)/sizeof(char); i ++)
    {
        printf("%c ",p[i]);
    }
    
    2 . 字符数组不一定是字符串但是字符串一定是字符数组.
    3 . 存储字符串的数组,可以输出单个字符,也可以使用%输出完整字符串,使用%s输出时,遇到'\0'是结束
    char a3[] = {'h','e','l','l','o','\0'};
    printf("%s ",a3);
    
    4 . 字符数组储存字符的数组, 只能输出单个字符
    char a4[] = {'h','e','l','l','o','\0'};
    for (int i; i < sizeof(a4) / sizeof(char); i ++)
    {
        printf("=====%c ",a4[i]);
    }
    printf("\n");
    printf("+++++++%s ",a4); //输出结果可能出问题,因为不知道什么时候才能读到'0'
*/
#pragma mark ------字符串操作函数---------
/*
1 . strlen 测量字符串常量.
    测量的是字符串的时间长度,不包含'/0'

    char name[] = "wangshuai";
    printf("%s的长度;%lu\n",name,strlen(name));
    
//2 . strcpy 字符串拷贝
    字符串2可以是常量,字符数组名
    字符数组1的存储空间 >= 字符数组2  注意'\0'
    牢记:吧一个字符数组的值给另一个字符赋值,只能用strcpy函数,不能直接堆一个字符数组赋值
    char a12[5] = {0};
    char b12[] = "lanou";
    strcpy(a12, b12);
    printf("%s\n",a12);
 
*/
/*
    char a22[30] = "lanou";
    char b22[] = "teacher";
3 .strcat(a22, b22);
    //将字符串2拼接到字符串1后,结果保留在字符串1中
    //字符数组2可以是常量
    //字符数组1的空间必须足够大
    //拼接之后,字符串1后面的'\0'取消,只在新的字符串后面保留'\0'
    printf("%s\n",a22);
4 . strcmp 字符串比较
    char a[] = "apple";
    char b[] = "goole";
    //将俩个字符串自左向右逐个字符相比(按ASDII吗值大小比较),直到出现不同的字符或者是遇到'\0'为止
    //字符串1的字符 - 字符串2的字符
    //字符串1 = 字符串2,则函数结果为0
    //字符串1 > 字符串2,则函数结果为正整数
    //字符串1 < 字符串2,则函数结果为负整数
    printf("%d\n",strcmp(a, b));
    printf("%d\n",strcmp("apple", "apple"));
    //查找字符串中的空格:例如:"I LOVE iOS, i want iphone6sp"
    char str[] = "I LOVE iOS, i want iphone6sp";
    int nn = 0;
    int count = 0;
    while (str[nn])
    {
        if (str[nn] != '0')
        {       
        count ++;
        }  
    nn ++;
    }
    printf("空格数是:%d\n",count);
*/

转载于:https://www.cnblogs.com/wangshuai-1129/p/5079061.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值