C语言学习中需要注意的问题_1

目录

一、关于数组

二、static

三、关键字

四、switch

五、练习题

1.写一个代码:打印100~200之间的素数

2.给定两个数,求这两个数的最大公约数


一、关于数组

C99标准之前:

数组的大小只能是常量来指定如:

int arr[10];  或 int arr[5 + 5];

C99标准之中:

引入了一个:变长数组的概念,变长数组允许数组的大小使用变量来指定。

int n = 10;

int arr[n];                  同时c99也支持int arr[10];  或 int arr[5 + 5];

这里变长数组并不是意味着,数组大小能改变,一旦创建数组大小还是不能改变的。只是说数组的大小是通过变量来指定的。

还有一个注意⚠️事项

int arr[n];             不能初始化

二、static

static修饰的变量不能被改变,说法是错误的。只有const常属性才不会被修改。

static修饰变量

static修饰函数中局部变量:

      声明周期延长:该变量不随函数结束而结束

      初始化:只在第一次调用该函数时进行初始化

      记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值

      存储位置:不会存储在栈上,放在数据段

static修饰全局变量

     改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用

      修饰变量时,没有被初始化时会被自动初始化为0

static修饰函数

   改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用

三、关键字

typedef  

是关键字

#define

同#include  都是预处理指令

四、switch

switch语句中表达式的类型只能是:整形和枚举类型,切记不能为浮点型

五、练习题

1.写一个代码:打印100~200之间的素数

#include <stdio.h>

//素数的判断:
//只能被1和它本身整除的数,是素数
//        如:7
int main()
{
    int i = 0;
    for (i=100;i<=200;i++)
    {
        //判断i是否为素数
        //拿2~i-1之间的数字去试除i
        int flag=1;
        int j = 0;
        for (j =2;j<i;j++)
        {
            if(i%j==0)
            {
               flag=0;
                break;
            }
        }
        if(flag==1)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

优化:

思想->如果在^{\sqrt{i}}以内能找到不到因子,就一定是素数了

#include <stdio.h>
#include <math.h>

//素数的判断:
//只能被1和它本身整除的数,是素数
//        如:7
int main()
{
    int i = 0;
    for (i=100;i<=200;i++)
    {
        //判断i是否为素数
        //拿2~i-1之间的数字去试除i
        int flag=1;
        int j = 0;
        for (j =2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
               flag=0;
                break;
            }
        }
        if(flag==1)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

继续优化:

素数不可能是偶数所以

#include <stdio.h>
#include <math.h>

//素数的判断:
//只能被1和它本身整除的数,是素数
//        如:7
int main()
{
    int i = 0;
    for (i=101;i<=200;i+=2)
    {
        //判断i是否为素数
        //拿2~i-1之间的数字去试除i
        int flag=1;
        int j = 0;
        for (j =2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
               flag=0;
                break;
            }
        }
        if(flag==1)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

参考《素数求解的N种境界》,可以引发大家的思考。

2.给定两个数,求这两个数的最大公约数

例如:

输入:20 40

输出:20

普通解法:

#include <stdio.h>

int main()
{
    int m=0,n=0;
    scanf("%d %d",&m,&n);
    int k=(m < n ? m : n);
    while (1)
    {
        if(m % k == 0 && n % k == 0)
        {
            break;
        }
        k--;
    }
    printf("%d\n",k);
    return 0;
}

辗转相除法:

#include <stdio.h>

int main()
{
    int m=0,n=0;
    scanf("%d %d",&m,&n);
    int k=0;
    while (k = m % n)
    {
        m = n;
        n = k;
    }
    printf("%d\n",n);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KrisZhang10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值