初步学习c语言1(2)

二维数组
   int arr[常量][常量]
初始化
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int arr[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
初始化时,只能省略行不能省略列
int arr[][5] = {[1,2],[3,4],[5,6]};
有:1 2 0 0 0
       3 4 0 0 0
       5 6 0 0 0

int main()
{
    int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
    int i = 0;
    for(i=0;i<3;i++)
    {
          int j = 0;
//        for(j=0;j<5;j++)
//        {
//            printf("%d",arr[i][j]);
//        }
//        printf("\n");
//    }
//    return 0;
//}
//1 2 3 4 5
//6 7 8 9 10
//11 12 13 14 15
//
//int main()
//{
14
//    int i = 0;
//    for(i=0;i<3;i++)
//    {
//        int j = 0;
//        for(j=0;j<5;j++)
//        {
//            scanf("%d",&arr[i][j]);
//        }
//    }
//    for(i=0;i<3;i++)//行
//    {
//        int j = 0;
//        for(j=0;j<5;j++)//列
//        {
//            printf("%d",arr[i][j]);
//        }
//        printf("\n");
//    }
//    return 0;
//}
//打印二维数组的地址
//int main()
//{
//for(i=0;i<3;i++)//行
//    {
//        int j = 0;
//        for(j=0;j<5;j++)//列
//        {
//            printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
//        }
//        printf("\n");
//    }
//    return 0;
//}
//二维数组在内存中也是连续存放
//    二维数组是一维数组的数组arr[0][j],arr[1][j]
//可以将arr[0]看成数组名 
//
//数组
//c语言在创建数组的时候,数组大小的指定只能使用常量,常量表达式。
//C99 中引入了变长数组的概念,数组的大小可以使用变量来指定
//但是VS默认是不支持C99中的变长数组,变长数组是不能初始化的。
//Dev-C++环境中
//#include<stdio.h>
//#include<stdlib.h>
//int main(int argc,char*argv[])
//{
//    int k = 0;
//    scanf("%d",&k);
//    int arr[k];

//    int i = 0;
//    for(i=0;i<k;i++)
//    {
//        arr[i] = i+1;
//    }
//    for(i=0;i<k;i++)
//    {
//        printf("%d",arr[i]);
//    }
//    return 0;
//}
//编写代码,演示多个字符从两端移动,向中间汇聚。
//int main()
//{
//    char arr1[] = "welcome to bit!!!!!";
//    char arr2[] = "*******************";
//    size_t left = 0;
//    size_t right = strlen(arr1)-1;
//    while(left<=right)
//    {
//        arr2[left] = arr1[left];
//        arr2[right] = arr1[right];
//        printf("%s\n",arr2);
//        Sleep(1000);//休眠,单位是毫秒
//        system("cls");
//        left++;
//        right--;
//    }
//    printf("%s\n",arr2);
//    return 0;
//}
//找练习
//    牛客网  洛谷

//
//二分查找----在有序(升序和降序)数组中
//int main()
//{
//    int arr[] = {1,2,3,4,5,6,7,8,9,10};
//    int k = 7;
//    int i = 0;
//    int sz = sizeof(arr)/sizeof(arr[0]);
//    for(i = 0;i<=sz;i++)
//    {
//        if(arr[i] == k)
//        {
//            printf("找到了,下标为:%d\n",i);
//            break;
//        }
//    }
//    if(i == sz)
//        printf("找不到\n");
//    return 0;
//}
//
//
对半
//int main()
//{
//    int arr[] = {1,2,3,4,5,6,7,8,9,10};
//    int k = 0;
//    scanf("%d",&k);
//    int sz = sizeof(arr)/sizeof(arr[0]);
//    int left = 0;
//    int right = sz - 1;
//    while(left<=right)
//    {
//        int mid = (left + right)/2;
//        if(arr[mid]<k)
//        {
//            left = mid + 1;
//        }
//        else if(arr[mid]>k)
//        {
//            right = mid - 1;
//        }
//        else
//        {
//            printf("找到了,下标为:%d\n",i);
//            flag = 1;//找到了
//            break;
//        }
//    }
//    if(flag == 0)
//        printf("找不到\n");
//    return 0;
//}
//函数
//    类型 函数名(形式参数)
//    {
//
//    }
//
//写一个加法函数,完成2个整形变量的加法操作
//int Add(int x,int y)
//{
//    int z = 0;
//    z = x + y;
//    return z;
//}
//int main()
//{
//    int n1 = 0;
//    int n2 = 0;
//    scanf("%d%d",&n1,&n2);
//    int r = Add(n1,n2);
//    printf("%d\n",r);
//    return 0;
//}
// 或
//int Add(int x,int y)//x,y为形参,只是形式上存在的,不会向内存申请空间,不会真实存在。对形参的修改不会影响实参

//int Add(int x,int y)
//{
//    return x + y;
//}
//int main()
//{
//    int n1 = 0;
//    int n2 = 0;
//    scanf("%d%d",&n1,&n2);
//    int r = Add(n1,n2);//n1,n1为实参
//    printf("%d\n",r);
//    return 0;
//}'                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
形参的名字可以和实参的个数相同。
return 0;就是将0返回给调用main函数的那个函数。
return后面可以什么都没有,但这种写法适合函数返回类型是void的情况
rerurn返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型。
main 函数中返回0表示正常返回,返回非0值表示异常返回。

数组作函数参数
#include<stdio.h>
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    set_arr();//设置数组内容为-1;
    print_arr();//打印数组内容
    return 0;
}

假设我们的计算某年某月有多少天?
31 28 31 30 31 30 31 31 30 31 30 31
   29
is_leap_year 函数判断闰年,如果是闰年返回1,不是返回0.
int is_leap_ year(int y)
{
    if((y % 4 = 0)&&(y % 100!=0)||(y % 400=0))
        return 1;
    else 
        return 0;
}
int get_days_of_month(int y,int m)
{
    int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
    int d = days[m];
    if(is_leap_year(y)&&m == 2)
        d+=1;
    return d;
}
int main()
{
    int year = 0;
    int month = 0;
    scanf("%d%d",&year,&month);
    int day = get_days_of_month(year,month);
    printf("%d\n",day);
    return 0;
}



int is_leap_ year(int y)
{
    
        return((y % 4 = 0)&&(y % 100!=0))||(y % 400==0));
}
int get_days_of_month(int y,int m)
{
    int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
    int d = days[m];
    if(is_leap_year(y)&&m == 2)
        d+=1;
    return d;
}
int main()
{
    int year = 0;
    int month = 0;
    scanf("%d%d",&year,&month);
    int day = get_days_of_month(year,month);
    printf("%d\n",day);
    return 0;
}
int is_leap_ year(int y)
{
    return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}


#include<stdbool.h>
    bool is_leap_ year(int y)
{
    return (((y % 4 = 0)&&(y % 100!=0))||(y % 400==0));
}
int get_days_of_month(int y,int m)
{
    int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
    int d = days[m];
    if(is_leap_year(y)&&m == 2)
        d+=1;
    return d;
}
int main()
{
    int year = 0;
    int month = 0;
    scanf("%d%d",&year,&month);
    int day = get_days_of_month(year,month);
    printf("%d\n",day);
    return 0;
}
int is_leap_ year(int y)
{
    return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}


链式访问

//正常
#include<stdio.h>
int main()
{
    int len = strlen("abcdef");
    printf("%d\n",len);
    return 0;
}
链式
#include<stdio.h>
int main()
{
    printf("%d\n",strlen("abcdef");
    return 0;
}


int main()
{
    printf("%d",printf("%d",printf("%d",43)));
    rerurn 0;
}
解释
    printf("%d",43);的返回是43
    由于43有两位数字组成,故printf("%d",printf("%d",43));返回的是432
    又由于2由一位数字组成,故为1,printf("%d",printf("%d",printf("%d",43)));打印的是4321

函数一定要满足:先声明后使用
int is_leap_ year(int y)
{
    return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
int main()
{
    int year = 0;
    sacnf("%d",&year);
    if(is_leap_ year(year))
        printf("闰年\n");
    else
        printf("不是闰年\n");
    return 0;
}
如果代码是这样
int main()
{
    int year = 0;
    sacnf("%d",&year);
    if(is_leap_ year(year))
        printf("闰年\n");
    else
        printf("不是闰年\n");
    return 0;
}
int is_leap_ year(int y)
{
    return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
则会报错
正确的是
//函数声明
int is_leap_ year(int y)

int main()
{
    int year = 0;
    sacnf("%d",&year);
    //函数调用
    if(is_leap_ year(year))
        printf("闰年\n");
    else
        printf("不是闰年\n");
    return 0;
}
//函数定义
int is_leap_ year(int y)
{
    return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
函数的声明通常放在头文件,函数的定义通常放在.c文件,在main函数声明格式为:#include"***.h"


//导入静态库
#pragma comment(lib,"add.lib")


static和extern

作用域  类似于局部变量
生命周期  变量从创建到结束 也与局部变量类似
举例
#include<stdio.h>
void test()
{
    int a = 5;
    a++;
    printf("%d",a);
}
int main()
{
    int i = 0;
    for(i = 0;i < 5;i++)
    {
        test();
    }
    return 0;
}
结果为:6 6 6 6 6
若加入static修饰局部变量
#include<stdio.h>
void test()
{
    static int a = 5;
    a++;
    printf("%d",a);
}
int main()
{
    int i = 0;
    for(i = 0;i < 5;i++)
    {
        test();
    }
    return 0;
}
结果为:6 7 8 9 10

结论: static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,
    本来一个局部变量是存储在内存的栈区的,但是被static修饰后存储到了静态区。
    存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了,
    只有程序结束,变量才销毁,内存才回收。但是作用域不变的。

如果外部文件1为;int g_val = 2024;

文件2为:
int main()
{
    printf("%d\n",g_val);
    return 0;
}
若要使用外部文件:
    则:
extern int g_val = 2024;//声明
int main()
{
    printf("%d\n",g_val);
    return 0;
}
如果外部文件为:static int g_val = 2024;
则无法使用
    因为:如果有static修饰的文件,那只能在本文件使用。
即:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值