C语言数组和函数

简介: C语言数组和函数

一、数组

1、一维数组

#include <stdio.h>
int main() {
    //int arr[5];  //数组声明语句,数组里包含5个整数类型的存储区
    //int arr[5] = {1, 2, 3, 4, 5};   //数组初始化的方法
    //int arr[5] = {1, 2, 3, 4, 5, 6, 7};   //没有对应存储区的初始化数据自动被忽略
    //int arr[5] = {1, 2, 3};  //没有对应初始化数据的存储区会自动被初始化成0
    int arr[] = {1, 2, 3, 4, 5};  //如果初始化数组时省略了数组里包含的存储区个数则存储区个数就是初始化数据的个数
    int num = 0;
    //arr[2/*有效下标*/] /*代表数组里下标为2的存储区*/ = 10;
    /*for (num = 0;num <= 4;num++) {
        arr[num] = num;
    }*/
    for (num = 4;num >= 0;num--) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    int arr[5] = {0};
    //数组名称代表数组里第一个存储区的地址
    printf("arr是%p\n", arr);
    printf("&arr[0]是%p\n", &arr[0]);
    printf("sizeof(arr)是%d\n", sizeof(arr));  //对数组名称进行sizeof计算的结果是数组里所有存储区的总大小    
    return 0;
}


2、一维数组练习

#include <stdio.h>
int main() {
    int arr[5] = {0};
    int val = 0, num = 0;
    printf("请输入一个数字:");
    scanf("%d", &val);
    for (num = 4;num >= 0;num--) {
        //从后向前往每个存储区里
        //存放拆出来的一个数位内容
        arr[num] = val % 10;   //得到最右边数位内容并记录到循环变量做下标的存储区里
        val /= 10;    //丢掉最右边数位
        if (!val) {
            //处理不需要继续循环的情况
            break;
        }
    }
    //把数组里记录的每个数位内容显示在
    //屏幕上
    //num代表最左边的数位内容所在的存储区下标
    for (num = num;num <= 4;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    return 0;
}


3、二维数组声明

#include <stdio.h>
int main() {
    int arr[3/*分组个数*/][2/*分组里的存储区个数*/];   //二维数组声明
    int row = 0, col = 0, cnt = 1;
    arr[1/*有效的组下标*/][0/*有效的组内下标*/] = 10;
    for (row = 0;row <= 2;row++) {  //循环变量代表所有组下标
        for (col = 0;col <= 1;col++) {  //循环变量代表所有组内下标
            arr[row][col] = cnt;
            cnt++;
        }
    }
    return 0;
}


4、二维数组初始化

#include <stdio.h>
int main() {
    //int arr[3][2] = {1, 2, 3, 4, 5, 6};  //把二维数组当做一维数组进行初始化
    //int arr[3][2] = {{1, 2}, {3}, {5, 6}};  //把初始化数据进行分组,每组初始化数据用来初始化一组存储区
    //int arr[][2] = {1, 2, 3, 4, 5};   //5个初始化数据至少需要3组存储区,如果省略数组声明里的分组个数则计算机就会分配三组存储区
    int arr[][2] = {{1}, {2}, {3}};  //初始化数据分为三组,如果省略数组声明里的分组个数则计算机也会分配三组存储区
    int row = 0, col = 0;
    for (row = 0;row <= 2;row++) {
        for (col = 0;col <= 1;col++) {
            printf("%d ", arr[row][col]);
        }
        printf("\n");
    }
    return 0;
}


5、二维数组组名

#include <stdio.h>
int main() {
    int arr[3][2] = {0};
    printf("arr是%p\n", arr);   //二维数组名称可以代表数组里第一个存储区的地址
    printf("&arr[0][0]是%p\n", &arr[0][0]);
    printf("sizeof(arr)是%d\n", sizeof(arr));  //对二维数组名称进行sizeof计算结果是二维数组里所有存储区的总大小
    printf("arr[1]是%p\n", arr[1/*组下标*/]/*代表组下标为1的组里最前面那个存储区的地址*/);
    printf("&arr[1][0]是%p\n", &arr[1][0]);
    printf("sizeof(arr[1])是%d\n", sizeof(arr[1]));   //结果是一组存储区的总大小
    return 0;
}
运行结果:
arr是007DF830
&arr[0][0]是007DF830
sizeof(arr)是24
arr[1]是007DF838
&arr[1][0]是007DF838
sizeof(arr[1])是8


6、二维数组练习

#include <stdio.h>
int main() {
    int arr[5][5] = {0};
    int row = 0, col = 0;
    for (row = 0;row <= 4;row++) {
        for (col = 0;col <= 4;col++) {
            //按顺序处理二维数组里的每个存储区
            if (row == 0 && col < 4) {
                //组下标为0,组内下标小于4的
                //存储区里应该放1
                arr[row][col] = 1;
            }
            else if (row < 4 && col == 4) {
                //组下标小于4,组内下标等于4
                //的存储区里应该放2
                arr[row][col] = 2;
            }
            else if (row == 4 && col >= 1) {
                //组下标是4,组内下标大于等于1
                //的存储区里应该放3
                arr[row][col] = 3;
            }
            else if (row >= 1 && col == 0) {
                //组下标大于等于1,组内下标是0
                //的存储区里应该放4
                arr[row][col] = 4;
            }
        }
    }
    //把二维数组里所有存储区的内容从前向后
    //每组显示在一行里
    for (row = 0;row <= 4;row++) {
        for (col = 0;col <= 4;col++) {
            printf("%d", arr[row][col]);
        }
        printf("\n");
    }
    return 0;
}
运行结果:
11112
40002
40002
40002
43333


二、函数

1、普通函数

#include <stdio.h>
void func(void) {
    int val = 100;   //不同函数里的变量可以重名
}
int main() {
    int val = 10;    //不同函数里的变量可以重名
    printf("val是%d\n", val);  //不可以使用其他函数里的变量
    return 0;
}


2、带返回值函数

#include <stdio.h>
void func(void) {
    int val = 100;   //不同函数里的变量可以重名
}
int main() {
    int val = 10;    //不同函数里的变量可以重名
    printf("val是%d\n", val);  //不可以使用其他函数里的变量
    return 0;
}


3、带参数函数

#include <stdio.h>
void print(int val/*形式参数*/) {
    printf("数字是%d\n", val);
}
int main() {
    print(7/*实际参数*/);  //函数调用的时候计算机会把7放在形式参数val的存储区里
    print(5 + 3);
    return 0;
}
#include <stdio.h>
int add(int val, int val1) {  //每个形式参数的类型名称都不可以省略
    return val + val1;
}
int main() {
    int val = add(6, 3);
    printf("求和结果是%d\n", val);
    return 0;
}
#include <stdio.h>
void func(int val, int val1) {
    printf("%d X %d = %d\n", val, val1, val * val1);
}
int main() {
    /*func(1, 9);
    func(2, 8);
    func(3, 7);
    func(4, 6);
    func(5, 5);*/
    int num = 0;
    for (num = 1;num <= 5;num++) {
        func(num, 10 - num);
    }
    return 0;
}
运行结果:
1 X 9 = 9
2 X 8 = 16
3 X 7 = 21
4 X 6 = 24
5 X 5 = 25


4、鸡兔同笼问题

#include <stdio.h>
int rabbit(int heads, int legs) {
    int num = 0;
    for (num = 0;num <= heads;num++) {
        if (4 * num + 2 * (heads - num) == legs) {
            return num;
        }
    }
    return -1;
}
int main() {
    int heads = 0, legs = 0, ret = 0;;
    printf("请输入头和脚的数量:");
    scanf("%d%d", &heads, &legs);
    ret = rabbit(heads, legs);
    if (ret >= 0) {
        printf("兔子是%d只,鸡有%d只\n", ret, heads - ret);
    }
    else {
        printf("没有找到答案\n");
    }
    return 0;
}


5、数组做函数参数

#include <stdio.h>
void print(int arr[], int size) {
    int num = 0;
    for (num = 0;num <= size - 1;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    print(arr, 5);    //和数组形式参数配对的实际参数必须是一个地址
    return 0;
}


6、输入输出参数

#include <stdio.h>
void neg(int arr[], int size) {
    int num = 0;
    for (num = 0;num <= size - 1;num++) {
        arr[num] = 0 - arr[num];
    }
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int num = 0;
    neg(arr, 5);
    for (num = 0;num <= 4;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    return 0;
}


7、函数声明

#include <stdio.h>
double add(double , double );//定义的函数在后面,前面用到了就需要声明一下
int main() {
    int val = add(3, 8);
    printf("val是%d\n", val);
    return 0;
}
double add(double val, double val1) {
    return val + val1;
}


8、exit()退出函数

#include <stdio.h>
#include <stdlib.h>
void func(void) {
    printf("2\n");
    //return ;//退出该函数
    exit(0);//结束程序
    printf("3\n");
}
int main() {
    printf("1\n");
    func();
    printf("4\n");
    return 0;
}

9、递归函数()

#include <stdio.h>
void print(int max) {
    if (max == 1) {
        //处理最大数字是1的情况
        //这种情况不能再分解了
        printf("1 ");
        return ;  //分支必须保证函数可以结束
    }
    print(max - 1);   //显示1到max - 1之间所有整数,采用递归调用语句实现的
    printf("%d ", max);
}
int main() {
    int max = 0;
    printf("请输入最大数字:");
    scanf("%d", &max);
    print(max);
    printf("\n");
    return 0;
}
运行结果:
请输入最大数字:8
1 2 3 4 5 6 7 8


#include <stdio.h>
int fei(int sn) {
    if (sn <= 1) {
        //计算编号为0和编号为1的两个数字
        return 1;
    }
    return fei(sn - 2)/*计算编号为sn - 2的数字*/ + fei(sn - 1)/*计算编号为sn - 1的数字*/;
}
int main() {
    int sn = 0;
    printf("请输入一个编号:");
    scanf("%d", &sn);
    printf("结果是%d\n", fei(sn));
    return 0;
}
目录
相关文章
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2
|
1月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
66 16
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
52 1
|
1月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
61 24
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
63 23
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
68 15
|
2月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
69 9
|
2月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
64 6
|
2月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
94 10

热门文章

最新文章