第五天 二维数组,字符串,函数

本文详细介绍了C语言中的二维数组概念,包括初始化、打印、大小计算及地址合一。同时,讲解了字符串的基本操作,如字符数组与字符串的区别、字符串的输入输出以及常用字符串函数。此外,还涉及了函数的作用、分类以及随机数的生成。内容覆盖了二维数组与字符串在编程中的基础应用。
摘要由CSDN通过智能技术生成

二维数组:

    int arr[10] = {1,2,3,5,6,7};

    {1,2,3,5,6,7};
    {1,2,3,5,6,7};
    {1,2,3,5,6,7};
    {1,2,3,5,6,7};

    定义语法:

    int arr[2][3] = 
        {
        {2, 5, 8},
        {7, 9 10}
        };

    int arr[3][5] = {{2, 3, 54, 56, 7 }, {2, 67, 4, 35, 9}, {1, 4, 16, 3, 78}};

    打印:
        for(i = 0; i < 3; i++)        // 行
        {
            for(j = 0; j <5; j++)   // 列
            {
                printf("%d ", arr[i][j]);
            }
            printf("\n");
        }        

大小:

    数组大小: sizeof(arr);

    一行大小: sizeof(arr[0]): 二维数组的一行,就是一个一维数组。

    一个元素大小:sizeof(arr[0][0])        单位:字节

    行数:row = sizeof(arr)/ sizeof(arr[0])

    列数:col = sizeof(arr[0])/ sizeof(arr[0][0])

地址合一:

    printf("%p\n", arr); == printf("%p\n", &arr[0][0]); == printf("%p\n", arr[0]);

    数组的首地址 == 数组的首元素地址 == 数组的首行地址。


二维数组的初始化:

    1)常规初始化:

        int arr[3][5] = {{2, 3, 54, 56, 7 }, {2, 67, 4, 35, 9}, {1, 4, 16, 3, 78}};

    2) 不完全初始化:

        int arr[3][5] = {{2, 3}, {2, 67, 4, }, {1, 4, 16, 78}};  未被初始化的数值为 0 

        int arr[3][5] = {0};    初始化一个 初值全为0的二维数组

        int arr[3][5] = {2, 3, 2, 67, 4, 1, 4, 16, 78};   【少见】 系统自动分配行列。

    3)不完全指定行列初始化:

        int arr[][] = {1, 3, 4, 6, 7};  二维数组定义必须指定列值。

          int arr[][2] = { 1, 3, 4, 6, 7 };  可以不指定行值。


练习:求出5名学生3门功课的总成绩。(一个学生的总成绩。一门功课的总成绩)

    int scores[5][3];

    int row = sizeof(scores) / sizeof(scores[0]);
    int col = sizeof(scores[0]) / sizeof(scores[0][0]);

    // 获取 5 名学生、3门功课成绩
    for (size_t i = 0; i < row; i++)
    {
        for (size_t j = 0; j < col; j++)
        {
            scanf("%d", &scores[i][j]);
        }
    }
    // 求一个学生的总成绩
    for (size_t i = 0; i < row; i++) // 每个学
    {
        int sum = 0;
        for (size_t j = 0; j < col; j++)// 每个学生的成绩
        {
            sum += scores[i][j];
        }
        printf("第%d个学生的总成绩为:%d\n", i+1, sum);
    }
    //求一门功课的总成绩
    for (size_t i = 0; i < col; i++)  // 第几门功课
    {
        int sum = 0;
        for (size_t j = 0; j < row; j++)  // 每门功课的第几个学生
        {
            sum += scores[j][i];
        }
        printf("第%d门功课的总成绩为:%d\n", i + 1, sum);
    }

快捷导入代码:

    VS --》 工具--》 代码片段管理器 --》 Visual C++


多维数组:【了解】

    三维数组:[层][行][列]

    数组类型 数组名[层][行][列];

    int arr[3][3][4];

    { {12, 3, 4, 5}
      {12, 3, 4, 5} },

    { {12, 3, 4, 5}
      {12, 3, 4, 5} },

    { {12, 3, 4, 5}
      {12, 3, 4, 5} },

    for(i = 0; i < 3; i++)  层

        for (j = 0; j < 3; j++)  行

            for (k = 0; k<4; k++)  列

                printf("%d ", arr[i][j][k]);

    4维、5维、6维。。。N维。


int arr[10];

short arr[20];

long long arr[20];


字符数组 和 字符串区别:

    字符数组: 
        char str[5] = {'h', 'e', 'l', 'l', 'o'};    

    字符串:
        char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};

        char str[6] = "hello";

        printf("%s");    使用printf打印字符串的时候,必须碰到 \0 结束。
        

练习:键盘输入字符串,存至str[]中,统计每个字母出现的次数。

    for (size_t i = 0; i < 10; i++)
    {
        scanf("%c", &str[i]);
    }

    int count[26] = {0};  // 代表26个英文字母出现的次数。 

    for (size_t i = 0; i < 11; i++)
    {
        int index = str[i] - 'a';    // 用户输入的字符在 count数组中的下标值。
        count[index]++;
    }

    for (size_t i = 0; i < 26; i++)
    {
        if (count[i] != 0)
        {
            printf("%c字符在字符串中出现 %d 次\n", i+'a', count[i]);
        }
    }

字符串获取 scanf:

    注意:    1)用于存储字符串的空间必须足够大,防止溢出。 char str[5];

        2) 获取字符串,%s, 遇到空格 和 \n 终止。

    借助“正则表达式”, 获取带有空格的字符串:scanf("%[^\n]", str);


字符串操作函数:

    gets: 从键盘获取一个字符串, 返回字符串的首地址。 可以获取带有 空格的字符串。 【不安全】

        char *gets(char *s);

            参数:用来存储字符串的空间地址。

            返回值:返回实际获取到的字符串首地址。
    

    fgets: 从stdin获取一个字符串, 预留 \0 的存储空间。空间足够读 \n, 空间不足舍弃 \n  【安全】

        char *fgets(char *s, int size, FILE *stream);

            参1:用来存储字符串的空间地址。

            参2:描述空间的大小。

            参3:读取字符串的位置。    键盘 --》 标准输入:stdin

            返回值:返回实际获取到的字符串首地址。


    puts:将一个字符串写出到屏幕. printf("%s", "hello"); / printf("hello\n"); / puts("hello");   输出字符串后会自动添加 \n 换行符。

        int puts(const char *s);    

            参1:待写出到屏幕的字符串。

            返回值: 成功:非负数 0。 失败: -1.        


    fputs:将一个字符串写出到stdout.输出字符串后, 不添加 \n 换行符。

        int fputs(const char * str, FILE * stream);    

            参1:待写出到屏幕的字符串。        屏幕 --》标准输出: stdout

            参数:写出位置 stdout

            返回值: 成功:0。 失败: -1.


    strlen: 碰到 \0 结束。

        size_t strlen(const char *s);

            参1: 待求长度的字符串

            返回:有效的字符个数。

字符串追加:

    char str1[] = "hello";
    char str2[] = "world";

    char str3[100] = {0};

    int i = 0;        // 循环 str1
    while (str1[i] != '\0')
    {
        str3[i] = str1[i];  // 循环着将str1中的每一个元素,交给str3
        i++;
    }                    // str3=[h e l l o]
    //printf("%d\n", i);  --> 5

    int j = 0;        // 循环 str2
    while (str2[j]) // 等价于 while(str2[j] !='\0') 等价于 while (str2[j] != 0)
    {
        str3[i+j] = str2[j];
        j++;
    }                    // str3=[h e l l o w o r l d]

    // 手动添加 \0 字符串结束标记
    str3[i + j] = '\0';
    

---------------------------------------

函数的作用:

    1. 提高代码的复用率

    2. 提高程序模块化组织性。


函数分类:

    系统库函数: 标准C库。 libc

        1. 引入头文件 --- 声明函数
        
        2. 根据函数原型调用。

    用户自定义:

        除了需要提供函数原型之外,还需要提供函数实现。

随机数:

    1. 播种随机数种子: srand(time(NULL));

    2. 引入头文件 #include <stdlib.h>  <time.h>

    3. 生成随机数: rand() % 100;

    
函数定义:

    包含 函数原型(返回值类型、函数名、形参列表) 和 函数体(大括号一对, 具体代码实现)

    形参列表: 形式参数列表。一定包 类型名 形参名。

    int add(int a, int b, int c)
    {
        return a+b+c;
    }

    int test(char ch, short b, int arr[], int m)
    
函数调用:

    包含 函数名(实参列表);  

    int ret = add(10, 4, 28);
        
    实参(实际参数): 在调用是,传参必须严格按照形参填充。(参数的个数、类型、顺序)  没有类型描述符

    int arr[] = {1, 3, 6};
    

函数声明:

    包含 函数原型(返回值类型、函数名、形参列表) + “;”

    要求 在函数调用之前,编译必须见过函数定义。否则,需要函数声明。

    int add(int a, int b, int c);


    隐式声明:【不要依赖】

        默认编译器做隐式声明函数时,返回都为 int ,根据调用语句不全函数名和形参列表。


    #include <xxx.h> --> 包含函数的声明


exit函数: #include <stdlib.h>

    return关键字:

        返回当前函数调用,将返回值返回给调用者。

    exit()函数:

        退出当前程序。

多文件编程:

    将多个含有不同函数功能 .c 文件模块,编译到一起,生成一个 .exe文件。


    <>包裹的头文件为系统库头文件。

    ""包裹的头文件为用户自定义头文件。

    
    防止头文件重复包含:头文件守卫。

        1) #pragma once        --- windows中

        2) #ifndef __HEAD_H__        <--- head.h

            #define __HEAD_H__

            .... 头文件内容

            #endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值