• 2023年信息科学与工程学院学生科协第一次软件培训


    2023年信息科学与工程学院学生科协第一次软件培训

    运行第一个代码(“Hello World!”)

    首先,我们先看以下程序:

    #include 
    int main()
    {
        printf("Hello World!");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出应该是这个样子:

    Hello World!
    
    • 1

    显然,这个程序是可以成功运行的

    那么,它为什么能成功运行呢?这就是我们接下来的第一个主题:

    初识C语言代码的具体结构

    简单来说,一个C程序就是由若干头文件函数组成。

    头文件

    以上面的程序为例,下面这一行代码就是头文件。

    #include 
    
    • 1

    你可以认为这就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。有了头文件,你就可以在你写的C语言程序中调用其他文件定义的函数,即可以在该程序中使用其他文件写好的部分内容,列如 p r i n t f printf printf s c a n f scanf scanf

    ppt上已经给出常见的头文件和函数,以及查找相关函数的方法,这里就不过多赘述了

    (主)函数

    一个程序中,有且仅有一个主函数

    主函数的函数名是main,也就是 “主要的” 的意思,主函数就是下面的:

    int main()
    {
        // DoSomething
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果不想在考试中得到一个非常好看的0分的话,主函数这个格式就按照我上面写的这样写就行 (先不谈什么void main()的抽象使用方式和return 0;要不要写,为何要写,如果感兴趣的话可以百度)

    好的,主函数说完了,我们来说一下一般的函数。

    在C语言程序中,函数的形式应该是这样的:

    返回值类型 函数名(参数值) //这里的括号可不是对函数名的解释,这个括号是实打实需要写上的
    {
        // DoSomething
        return 返回值;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们一般用 f u n c t i o n function function这个词代表函数,所以我们下面就定义一个简单的函数:

    int fun(int x)
    {
        x = x + 1;
        return x;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后我们执行这样的一个语句:

    int a = fun(3);
    
    • 1

    显然,a的赋值是4。

    (这里另外提一嘴,如果你要在一个函数中引用另一个函数的东西,请先确保该函数被声明)

    比如:

    #include 
    int slove(int b)
    {
        b = 1 + fun(3);
        return b;
    }
    int fun(int x)
    {
        x = x + 1;
        return x;
    }
    int main()
    {
        int a = slove(5);
        printf("%d",a);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    哦,这个程序好像比较复杂,正好,我们来学习一下C语言语句的运行顺序。

    首先执行的是第一句的头文件,这是毋庸置疑的。

    然后,先执行主函数中的那句话,

    由于a的定义引用到了函数slove,所以我们要执行函数slove,该函数的传入的参数是5(也就是说此时的b = 5)

    但是这不是主要的,因为我们的b又在后面被修改了,可以看到,b = 1 + fun(3)

    此时,我们要引用fun(3),可是我们把这段代码在本地编译运行时可以发现这一行报错了(为什么呢)

    我们都知道一般来说C语言都是从上往下运行的,显然,slove前面并没有任何关于fun()函数的定义,所以在这个函数中,slove就没法引用fun函数,导致报错

    那我们不妨换个写法:

    #include 
    int fun(int x)
    {
        x = x + 1;
        return x;
    }
    int slove(int b)
    {
        b = 1 + fun(3);
        return b;
    }
    int main()
    {
        int a = slove(5);
        printf("%d",a);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    此时,我们能够得到如下输出

    5
    
    • 1

    这样通过一个程序我们就完成了C语言的运行顺序以及函数的调用的基本学习

    输入与输出

    scanf函数

    使用格式:

    scanf("变量数据类型", &变量名);
    
    • 1

    作用:

    获取若干个数据并赋值于指定的变量

    使用:

    #include 
    int main()
    {
        int a, b;
        scanf("%d %d", &a, &b);
        printf("%d", a);
        printf("%d", b);
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    衷心提醒:

    不要写成如下的输入方式,否则你会经历很多很多挫折。

    scanf("%d,%d", &a, &b);//理论上这是正确的,但是逗号的输入很容易因为中英文的输入法出问题,所以别写
    scanf("%d", a); //忘了加取地址符!
    
    • 1
    • 2

    printf函数

    使用格式:

    printf("变量数据类型", 变量名);
    
    • 1

    使用:

    使用:
    #include 
    int main()
    {
    	int a;
    	scanf("%d", &a);
    	printf("%d", a);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    转义字符

    转义字符有很多,也是因为直播中讲过,我们只挑两个来解释:

    1. \n,意义是换行,例如
    printf("1\n2");
    
    • 1

    那么你的输出应该是:

    1
    2
    
    • 1
    • 2
    1. \0,意义是空字符,同时代表着字符串的结束,列如
    printf("1234\0ABC");
    
    • 1

    你会得到如下的输出:

    1234
    
    • 1

    变量的定义

    格式:

    变量的数据类型 变量的名称;

    int a;
    
    • 1

    也可以一次定义多个变量

    int a, b;
    
    • 1

    变量的命名规则:

    1.可以用小写字母、大写字母、数字和下划线(即‘_’)来命名。

    2.名称的第1个字符必须是字符或者下划线,不能是数字

    进一步了解数据类型

    整形数据的存储

    00000011

    在数据的储存时,一个字节由八个二进制组成: ( 1 B y t e = 8 b i t ) (1 Byte = 8 bit) 1Byte=8bit

    有符号类型(signed):第一位为符号位,0表示正数,1表示负数,所以范围为 [ − 128 , 127 ] [-128,127] [128,127]

    无符号类型(unsigned):没有符号位,范围为 [ 0 , 255 ] [0,255] [0,255]

    一个int占有4个字节,即 4 B y t e 4Byte 4Byte 32 b i t 32bit 32bit。所以int的范围是

    ( − 2147483648 ~ 2147483647 ( − 2 31 ~ 2 31 − 1 ) ) (-2147483648~2147483647(-2^{31} ~ 2^{31}-1)) (21474836482147483647(2312311))

    负数的存储

    计算机只能做加法,不能做减法,减去一个数,等于加上一个负数。

    在计算机中,负数以补码的形式存在

    补码

    1. 对原码除符号位以外取反(1变0,0变1)

    2. 加一

    浮点型数据的存储

    这不是必须了解的内容,大家只需要记住两种浮点型数据的精度范围就好了

    1. float 的精度是6~7位有效数字
    2. double的精度是15~16位有效数字

    想了解原理的同学可以点这里浮点数的底层原理和精度损失问题

    变量的初始化

    有三种初始化变量的方法

    1. 在声明变量的同时指定初值
    int a = 3, b = 2;
    int c = 4;
    
    • 1
    • 2
    1. 先声明变量,再赋值
    int a, b;
    a = 3;
    b = 2;
    
    • 1
    • 2
    • 3
    1. 从外部读入数据
    int a;
    scanf("%d", &a);
    
    • 1
    • 2

    在这里我要问,C语言中的单个等于号(也就是赋值)与数学中的等于是相同的含义吗?

    显然不是的

    int a = 2;
    if (a = 1) printf("Yes");
    else printf("No");
    
    • 1
    • 2
    • 3

    输出是这样的

    Yes
    
    • 1

    因为if中执行的是赋值,而不是判断,如果你要写判断a 和 1 相等的话,应该这样写

    int a = 2;
    if(a == 1) printf("Yes");
    else printf("No");
    
    • 1
    • 2
    • 3

    这一点大家一定不要记混哦~

    变量的转换

    赋值运算中的自动类型转换

    这一部分在直播和ppt中已经提到过了,我们就简要说几个例子吧

    double x;
    x = 4.6;
    printf("%d", x);
    
    • 1
    • 2
    • 3

    输出应该是

    4
    
    • 1

    不难看出,浮点型小数如果要转化成整数,后面的小数位数会被直接抹掉,不会有任何的四舍五入

    强制类型转换

    格式:(数据类型)(表达式)

    这里的表达式可以为常量,变量或表达式

    #include 
    int main()
    {
        int i, j;
        double f = 4.5;
        i = (int)f;
        j = (int)(f + 2.5);
        printf("%d %d", i, j);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出为:

    4 7
    
    • 1

    算术表达式

    算术运算符

    运算符类型举例含义
    +一元运算符+aa的值
    -一元运算符-aa的负值
    +二元运算符a+ba与b的和
    -二元运算符a-ba与b的差
    *二元运算符a*ba与b的积
    /二元运算符a/ba除以b的商(整除)
    %二元运算符a%ba除以b的余数(取余)

    关于/与%更多的细节:

    1. 正负问题

      / :若一个为负数则结果为负数,两个为负数则负负得正

      % :分子为负则结果为负,分子为正则结果为正,不受分母影响

    2. 小数问题

      / :若两个都是整数,则做整除运算;若有一个浮点数,则做实数除法

      % :要求两个都必须为整数,否则会报错

    int main()
    {
        int a = 3, b = 2;
        float c = 3, d = 2;
        printf("%d\n", a / b);
        printf("%f\n", c / d);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出:

    1
    1.500000
    
    • 1
    • 2

    可以看出,第一个作用与两个整数a, b中的 ‘ / ’ 意义应该是整除,而下面作用于c, d 的 ’ / ’ 才是我们熟悉的除法

    复合运算符

    运算符实例等价式
    +=a += ba = a + b
    -=a -= ba = a - b
    *=a *= ba = a * b
    /=a /= ba = a / b
    %=a %= ba = a % b

    复合运算符的结合方向为自右向左!

    这里有两个例子:

    int a = 4, b = 5, c = 6;
    (1) a *= b -= c + 3
    (2) a += b -= c *= 2
    
    • 1
    • 2
    • 3

    答案应该是:

    (1) -16
    (2) -3
    
    • 1
    • 2

    自增、自减运算符

    表达式"等效"表达式注意
    i++i = i + 1先使用i,再自增
    i–i = i – 1先使用i,再自减
    ++ii = i + 1先自增,再使用i
    –ii = i - 1先自减,再使用i

    注意运算符前置与后置的区别!

    int i = 1, j = 1;
    printf("%d\n", i++);
    printf("%d\n", ++j);
    printf("%d %d\n", i, j);
    
    • 1
    • 2
    • 3
    • 4

    这里的四个输出应该分别为:

    1
    2
    2 2
    
    • 1
    • 2
    • 3

    “等效”并不代表真的完全相同!

    位运算符

    现有:

    A:00000101 B:00001011

    其他运算符

    逻辑运算符

    基本知识:

    ​ C语言中,0为, 1为

    变量的逻辑含义:

    ​ bool变量 0假 1真 只有这两种取值

    ​ 其他变量 0假 其余均为真

    关系运算符

    关系运算符含义
    ==两个等号,当左右两边相等的时候为真,不等的时候为假
    !=不等号,当左右两边相等的时候为假,不等的时候为真
    >大于号
    <小于号
    >=大于等于号
    <=小于等于号

    实例:

    int main()
    {
        int a = 1, b = 2;
        printf("%d\n", a == a);
        printf("%d\n", a != b);
        printf("%d\n", a >= b);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出:

    1
    1
    0
    
    • 1
    • 2
    • 3

    逻辑运算符

    逻辑与的写法是&&,而位运算中的与写法是&

    逻辑或的写法是||,而位运算中的或写法是|

    运算符之间的优先级

    多个逻辑表达式

    例:

    int main()
    {
        int a = 1, b = 2;
        printf("%d\n", a || b ++ );
        printf("%d\n%d\n", a, b);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出:

    1
    1
    2
    
    • 1
    • 2
    • 3

    条件控制

    if 语句

    if 是最常见的条件分支语句

    语法:

    if (表达式1) {
        语句组1;
    }
    
    • 1
    • 2
    • 3

    if 语句是最常见的条件分支语句

    表达式1是一个逻辑表达式,它的值可能是非0(真)或0(假)

    当表达式1为真时,会执行下面的语句组1,否则不会执行。

    if-else 语句

    if (表达式1) {
        语句组1;
    } else {
        语句组2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    else 常常搭配 if 出现

    当表达式1为真时,只会执行下面的语句组1

    当表达式1为假时,不会执行语句组1,并且会进入执行语句组2

    多个 if-else 形成的多条件分支

    if (表达式1) {
        语句组1;
    } else if (表达式2) {
        语句组2;
    } else if (表达式3) {
        语句组3;
    } else {
        语句组4;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    当表达式1为真时,只会执行语句组1,当表达式1为假时,会判断一下表达式2的真假值,当表达式2为真时,只会执行语句组2,否则接着判断表达式3的真假值,当表达式3为真时,只会执行语句组3,否则执行语句组4。

    switch-case语句

    switch (表达式) {
        case 常量1: 语句1; break;
        case 常量2: 语句2; break;
        case 常量3: 语句3; break;
        default: 语句n; break;  // 结尾的 break; 可以省略
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    switch 语句是根据表达式的值来进行选择,看一看执行哪条语句

    常量几和表达式相等就从语句几开始执行,直到语句中出现break才会中断

    都没有的话就执行语句n。

    例:

    #include 
    
    int main()
    {
        int day = 0;
        scanf("%d", &day);
        switch (day) {
            case 1: printf("星期一\n");
            case 2: printf("星期二\n");
            case 3: printf("星期三\n");
            case 4: printf("星期四\n"); break;
            case 5: printf("星期五\n");
            case 6: printf("星期六\n");
            case 7: printf("星期天\n");
            default: break;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    输入1:

    5
    
    • 1

    输出1:

    星期五
    星期六
    星期天
    
    • 1
    • 2
    • 3

    输入2:

    1
    
    • 1

    输出2:

    星期一
    星期二
    星期三
    星期四
    
    • 1
    • 2
    • 3
    • 4

    循环控制

    while 语句

    语法:

    while (condition) {
        // DoSomething
    }
    
    • 1
    • 2
    • 3

    while 语句执行流程图:

    例:
    使用 while 语句打印 0 ~ 9

    #include 
    
    int main()
    {
        int a = 0;
        while (a < 10) {
            printf("%d ", a);
            ++a;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出:

    0 1 2 3 4 5 6 7 8 9 
    
    • 1

    do-while 语句

    语法:

    do {
        // DoSomething
    } while (condition);
    
    • 1
    • 2
    • 3

    do-while 语句执行流程图:

    例:
    使用 do-while 循环打印 0 ~ 9

    #include 
    
    int main()
    {
        int a = 0;
        do {
            printf("%d ", a);
            ++a;
        } while (a < 10);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出:

    0 1 2 3 4 5 6 7 8 9 
    
    • 1

    for 语句

    语法:

    for (init; condition; increment) {
        // DoSomething
    }
    
    • 1
    • 2
    • 3

    for 语句执行流程图:

    例:
    使用 for 循环打印 0 ~ 9

    #include 
    
    int main()
    {
        // 考试时最好还是不要用 init 语句定义变量,将变量定义在 for 语句之前。
        for (int a = 0; a < 10; ++a) {
            printf("%d ", a);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出:

    0 1 2 3 4 5 6 7 8 9 
    
    • 1

    init, condition, increment 语句都可以不写,不写 condition 则默认为真。(但是一般肯定还是要写的)

    如果你想实现无限循环,可以这么写:

    for (;;) {/* DoSomething */}
    
    • 1

    循环的嵌套

    循环结构是可以嵌套的,比如下面的代码,外层是一层for循环,在循环中的每一次操作都会执行一次while循环。

    例:

    #include 
    
    int main()
    {
        int i, j;
        for (i = 1; i <= 5; ++i) {
            j = 1;
            while (j <= i) {
                printf("*");
                ++j;
            }
            printf("\n");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出:

    *
    **
    ***
    ****
    *****
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    仿游戏热血江湖游戏类32
    springboot+jsp停车场车位租赁管理系统
    VUE之axios总结
    CPPs-BDI-1-载MMC白蛋白纳米微球/Au@BSA血清白蛋白包裹金纳米粒子纳米球的制备
    企业微信下班后能收到通知吗?不接收消息怎么设置?
    微服务07-认识MQ+RabbitMQ入门
    蚁创互联告诉您何为品牌霸屏?“品牌霸屏”是什么意思呢?
    QGC 中添加海康威视摄像头记录(Qt For Android 使用 JNI 进行JAVA 与 C++ 的通讯)
    CANopen Object 1000h: Device type 多设备信息
    Hadoop分布式集群搭建教程
  • 原文地址:https://blog.csdn.net/NOTFOUND_Liu/article/details/133875992