数组的应用深入

来源:互联网 发布:初中编程学哪个 编辑:程序博客网 时间:2024/05/16 23:45

数组2

* 练习 *

求签:
网络求签,要求用户输入5个两位数,保存到数组中
如果某一个数中同时包含8和4 那么这个数无效
如果5个数中只要出现一个含有4的数,那么属于下下签
如果5个数中没有4,也没有8那么属于中等签
如果5个数中没有4 但是有8 那么属于上上签.
请用户输入5个数,判断是哪一种签

#include <stdio.h>int main(int argc, const char * argv[]){    int nums[5];                   //1.定义数组    int len = sizeof(nums)/sizeof(int);        for (int i = 0; i < len; i++)        {            printf("请输入第%d个数:\n", i+1);            scanf("%d", &nums[i]);         //    .2.请用户输入        }    //3.判断    //    如果某一个数中同时包含8和4 那么这个数无效    //一个旗帜变量,目的 标识这个循环到底是不是正常结束的    //nums[i]    int flag = 0;    int flag8 = 111;    for (int i = 0; i < len; i++)    {        if (nums[i] == 48 || nums[i] == 84)        {                                            //这个数无效                                            //无效:不参与下下签或者什么签的判断            continue;//下一个数        }                                      //如果这个数num[i],个位或者十位包含4那么就是下下签        int ge = nums[i] % 10;        int shi = nums[i] / 10;        if (ge == 4 || shi == 4)        {            //下下签            flag = 1;            break;        }        if (ge == 8 || shi == 8)        {            //有一个是8            flag8 = 888;            //            break;//            //这里不能break 为什么?因为下一个数还不没判断        }    }    //程序执行到这,可能是出现了4结束的 也可能是循环正常结束的    if (flag == 1) {        printf("你个屌丝 还想娶媳妇\n");    }    if (flag == 0) {        //证明没有4        //两种情况        //1.有8        if (flag8 == 888) {            //有8            printf("您的如意郎君即将到来\n");        }else{            //没有            printf("你只能靠自己找,注册世界佳缘把\n");        }        //2.没8    }    /*     num     个位 = num % 10;     十位 = num / 10;     num ==  84 || num == 48     */    //    如果5个数中只要出现一个含有4的数,那么属于下下签    //    如果5个数中没有4,也没有8那么属于中等签    //    如果5个数中没有4 但是有8 那么属于上上签.    //    4.得出结论

参数的值传递

  • 什么值传递

    • 参数的类型是 int float double char 等基本数据类型的时候
    • 调用者传入一个实参, 然后在函数中改变这个参数的值,那么调用者中的实参不会改变
  • 数组的元素 能不能当这一函数的参数?

    • 可以数组的元素的本质就是一个普通变量
    void test(int num);    int nums[] = {10,20,304};    test(nums[1]);//调用函数    // 数组的匀速作为函数的参数和 普通变量没有任何区别
  • 数组的可不可以作为函数的参数
    • 可以
  • 数组名代表数组的地址,数字党参数时传递的是数组名,即数组的地址

在函数内部无法使用 sizeof计算参数数组的长度

所以只能在调用者在调用的时候 传递一个数组的长度
* 什么时候叫做值传递什么时候叫做地址传递
* 值传递:就是参数类型是普通变量时
* 地址传递 : 参数的类型是数组时
* 值传递和地址传递的区别
* 值传递不会改变原有变量的值
* 地址传递会改变原有变量的值

 总结:     1. 当数组作为函数的参数的时候,在函数内部如何获取数组的长度?        不可以!!!!!!        只要数组作为函数的参数,那么这个函数必须加一个参数        就是数组的长度!!!!!     2. 当数组作为函数的参数的时候,是地址传递            在函数内部修改数组  会对原来的数组产生影响
  • * 冒泡排序*
int arr[] = {12,3,234,45,6,3567,6,73,45,46,2};int len = sizeof(arr) / sizeof(arr[0]);for(int i = 0; i < len-1; i++){    for(int j = 0; j < len -1 -i; j++)    {        if(arr[j] > arr[j+1])        {            int temp = arr[j];            arr[j] = arr[j+1];            arr[j+1] = temp;        }    }}

二维数组

  • 二维数组是什么
    • 二维数组可以看成一维数组,这个一维数组中每一个元素都是一个数组
    • 看成一个几行几列的表格
  • 格式:
    * 数据类型 数组名称[行数][列数];
  • 专业术语

    • 元素
    • 下标: 每一个元素都有两个下标 行和列
    • 长度 : 是指数组中元素的个数
  • * 如何向二维数组中存储数据*

    • printf(“%d”,二维数组名[行][列]);
    • 行下标和列下标都不能越界
  • * 遍历二维数组的元素*
int nums[3][4];    可以看成3行4列的表格    /*     10 20 30 40     50 60 70 80     90 90 89 80     */    for (int i = 0; i < 行数; i++) {        for (int j = 0; j < 列数; j++) {            //nums[i][j];        }        printf("\n")    }
  • 二维数组中元素的默认值问题

    • 在声明二维数组的时候 必须要指定行数和列数
    • 并且这个行数和列数 可以是常量。变量。表达式。
    • 一定不能是小数和负数
    • 如果二维数组没有初始化 那么就是垃圾值
  • 二维数组的初始化

    • 静态初始化
    • 全部赋值:
int nums[3][4] = {{1,2,3,4},{5,6,6,8},{4,5,6,7}};        int nums[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};        2>部分赋值        int nums[3][4] = {{1,2},{3,4},{5,6,7}};        /*         1 2 0 0         3 4 0 0         5 6 7 0         */        int nums[3][4] = {1,2,3,4,5,6,7};        /*         1 2 3 4         5 6 7 0         0 0 0 0         */        // 行可以省略 列不能省略        int nums[][4] = {1,2,3,4,5,6,7,8,9,10};        /*         1 2 3 4         5 6 7 8         9 10 0 0         */        3>奇葩的方式        int nums[3][4] = {[0]= {1,2,3,4},[2]= {6,7,8,9}};        int nums[3][4] = {[0][1] = 10};        /*         1 2 3 4         0 0 0 0         6 7 8 9         */

只要静态初始化,没有初始化的部分默认为 0

0 0