浅学C++ (3)学习C语言(数组)

七,数组
    什么是数组:变量的组合,批量定义类型相同变量的方式
    定义:类型名 数组名[数量];
        int arr[5]; 内存中已经存在5个int类型的变量
    使用:数组名[下标]; 从0开始  范围:0~数量-1
    遍历:与for循环配合使用,使用循环变量当作下标
    数组初始化:类型名 数组名[数量] = {数值,数值,...};  int[5] = {1,2,3,4,5}
        1,因为数组的默认值是随机的,一般为了安全起见要对数组进行初始化
        2,初始化的数据过多,编译器会产生警告并丢弃多余数据
        3,初始化的数据不够,编译器会末尾补0
        4,初始化时数据可以省略,相当于给所有成员初始化为0
        5,初始化语法只能在定义数组时使用,并且只能逐个赋值,不能整体赋值(int arr[5] = 2 错误)
        6,初始化时数组的数量可以省略,编译器会自动统计初始化中数据的个数,一旦确认数组数量,后续无法改变
        sizeof(arr)/sizeof(arr[0]) 计算出数组的个数
        sizeof(arr) 数组的总字节数
        sizeof(arr[0]) 数组单个成员的字节数

八,数组越界 
    为了程序的编译,运行效率,编译器不会检查数组的下标
    数组越界的后果:
        1,段错误(核心已转储)
        2,一切正常(表现的一切正常)
        3,脏数据
    在使用数组的过程中时刻注意不要越界!!!

九,二维数组
    一维数组相当于把变量排成一排,通过编号访问
    二维数组相当于把变量排成一个矩阵,通过行号和列号访问
    定义:类型 数组名[][];
    使用:数组名[行下标][列下标];
        行下标 0~行数-1
        列下标 0~列数-1
    遍历:一般与双层for循环配合,一般外层负责遍历行,内层负责遍历列
    int arr[5][5]
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {

        }
        printf("\n");
    }
    初始化: 类型名 数组名[行数][列数] = {{第一行},{第二行},{第三行}...};

十,变长数组
    定义数组时使用变量作为数组的长度,在代码编译期间数组的长度是不确定的,当运行到数组的定义函数时数组的长度才定义下来
    长度一旦确定,后面无法改变
    优点:可以根据实际情况来确定数组的长度,以此来节约内存空间
    缺点:不能进行初始化,因为初始化发生在编译时
作业1: 定义一个5*5的二维数组并初始化,找出最小值的坐标,计算出最小值周围一圈数据之和
作业2: 输入N,显示N层杨辉三角
作业3: 输入一个日期(yyyy-mm-dd),计算该日期距离1年1月1日过了多少天
#include <stdio.h>

int main(int argc,const char* argv[])
{
    int arr[7][7]=
    {{0,0,0,0,0,0,0},
    {0,13,13,14,15,16},
    {0,1,3,5,7,2},
    {0,34,22,56,34,33},
    {0,32,45,66,19,43},
    {0,12,45,34,3,56}
    };
    int min=arr[1][1];
    int x,y,sum;
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            if(arr[i][j]<min)
            {
                x=i;
                y=j;
                min=arr[i][j];
            }
        }
    }
    sum=arr[x-1][y]+arr[x-1][y-1]+arr[x][y-1]+arr[x+1][y-1]+arr[x+1][y]+arr[x+1][y+1]+arr[x][y+1]+arr[x-1][y+1];
    printf("%d ",sum);
}
#include <stdio.h>

int main(int argc,const char* argv[])

{
    int N;
    printf("请输入N:");
    scanf("%d",&N);
    int arr[N][N];
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            if(0 == j)
            {
                arr[i][j]=1;
            }
            if(i == j && 0 != j)
            {
                arr[i][j]=1;
            }
            if(i>j && j != 0)
            {
                arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
            }
            if(i<j && j != 0)
            {
                continue;
            }

            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
}
#define<stdio.h>

int main(int argc,const char* argv[])
{
    int year,month,day,sum=0,flag;
    printf("请输入年月日(yyyy-mm-dd):");
    scanf("%d %d %d",&year,&month,&day);
    int arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    for(int i=1;i<year;i++)
    {
        if((0 == i%4) && ( 0 != (i%100)) || 0 == i%400)
        {
            sum += 366;
            flag = 1;
        }
        else
        {
            sum += 365;
            flag = 0;
        }
    }
    for(int i=0;i<month-1;i++)
    {
        if(1 == flag)
        {
            sum = sum+arr[i]+1;
        }
        else
        {
            sum += arr[i];
        }
    }
    sum += day;
    printf("从1年1月1日到%d年%d月%d日过了%d天",year,month,day,sum-1);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值