浙大版《C语言程序设计(第3版)》 - 翁恺 - 学习笔记

这是一份关于浙江大学翁恺教授的《C语言程序设计(第3版)》的学习笔记,涵盖了从变量、运算符、表达式、分支、循环到函数、数组、指针、字符串、结构体等多个核心概念的详细讲解,还包括了编程实践中的数据类型选择、内存管理、错误处理等方面的内容。笔记强调了理解计算机思维方式、变量的赋值与初始化、循环控制、函数调用及参数传递的重要性,并提供了多种编程技巧和实例解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.1.1.2 计算机和编程语言:计算机的思维方式

程序的执行

  • 解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行。
  • 编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言——机器语言——写的程序,然后,这个机器语言写的程序就能直接执行了。

11.2.1.3 变量:变量赋值与初始化

这里写图片描述

如果变量没有初始化,就直接拿到右边去用,会出现什么呢?

这里写图片描述

得到了一个非常奇怪的结果,这是因为,在内存当中,我们有一个变量 i 我们没有给它一个初始值,那么,它正好在内存当中,在什么地方,那个地方原本有一些什么样的值在里头,它就是那个值了。

12.2.1.4 变量:变量输入

读整数

  • scanf("%d", &price);
  • 要求scanf这个函数读入下一个整数,读到的结果赋值给变量price。

scanf和printf中,f表示format格式化的意思。

13.2.1.5 变量:常量VS变量

常量(C99)

  • int change = 100 - price;
  • 固定不变的数,是常数。直接写在程序里,我们称作直接量(literal)。
  • 更好的方式,是定义一个常量:const int AMOUNT = 100
#include <stdio.h>

int main()
{
    const int AMOUNT = 100;
    int price = 0;

    printf("请输入金额(元):");
    scanf("%d", &price);

    int change = AMOUNT - price;
    printf("找您%d元。\n", change);

    return 0;
}

const(C99)

  • const是一个修饰符,加在int的前面,用来给这个变量加上一个const(不变的)的属性。这个const的属性表示这个变量的值一旦初始化,就不能再修改了。
  • int change = AMOUNT - price;
  • 如果你试图对常量做修改,把它放在赋值运算符的左边,就会被编译器发现,指出为一个错误。

14.2.1.6 变量:浮点数

这里写图片描述

这里写图片描述

这里写图片描述

%lf对应double。

这里写图片描述

16.2.2.2 表达式:运算符优先级

注意这里优先级为1的单目运算符+-

这里写图片描述

这里写图片描述

注意,a=6这个式子本身,是有结果的,也就是6。

这里写图片描述

17.2.2.3 表达式:交换变量

视频中4分20秒开始出现Dev C++断点调试的使用方法。

20.3.0.1 编程练习解析:PAT再解释

视频中5分30秒开始,出现了对scanf的讲解。

出现在scanf格式字符串里面的东西,是它一定要你输入的东西,而不是它会给你看的东西。

28.3.2.1 分支:嵌套的if-else

这里写图片描述

这里写图片描述

(学习笔记:能用大括号就用大括号,避免歧义。)

这里写图片描述

29.3.2.2 分支:级联的if-else if

这里写图片描述

30.3.2.3 分支:if-else的常见错误

这里写图片描述

这里写图片描述

31.3.2.4 分支:多路分支

这里写图片描述

这里写图片描述

这里写图片描述

(以下代码利用了switch-case的某个特性)

这里写图片描述

34.4.1.3 循环:do-while循环

这里写图片描述

(注意:while结尾要有分号)

35.4.2.1 循环应用:循环计算

这里写图片描述

(计算之前先保存原始的值,后面可能有用。)

40.5.1.2 第三种循环:循环的计算和选择

这里写图片描述

41.5.2.1 循环控制:循环控制

(判断素数)

这里写图片描述

(上面的代码中,设置一个标志位的写法,我认为值得借鉴。)

(判断素数的另一种写法。)

这里写图片描述

43.5.2.3 循环控制:从嵌套的循环中跳出

#include <stdio.h>

int main()
{
    int x;
    int one, two, five;
    int exit = 0;

    scanf("%d", &x);
    for (one=1; one<x*10; one++)
    {
        for (two=1; two<x*10/2; two++)
        {
            for (five=1; five<x*10/5; five++)
            {
                if (one + tw0*2 + five*5 == x*10)
                    {
                        printf("可以用%d个1角加%d个5角得到%d元\n",
                            one, two, five, x);
                        exit = 1;
                        break;
                    }
            }
            if (exit == 1) break;
        }
        if (exit == 1) break;
    }
}

(
我主要对这里的先设置一个标志int exit = 0;,然后满足某种条件后,改变标志exit = 1,进而改变程序控制流程的写法,感兴趣。
)

45.5.3.2 循环应用:整数分解

(这一段的视频值得重新一看,整数正序分解,因为C 语言中没有趁手的工具,所以这里实现起来略繁琐。)

46.5.3.3 循环应用:求最大公约数

辗转相除法求最大公约数

这里写图片描述

48.6.0.2 编程练习解析:编程练习解析4-1

(水仙花数编程实现,值得一看)

49.6.0.3 编程练习解析4-2:九九乘法表

50.6.0.4 编程练习解析4-3:统计素数求和

(关键词:素数、质数)

52.6.0.6 编程练习解析5-0:n项求和

每一项的分子是前一项分子与分母的和,分母是前一项的分子。

这里写图片描述

(下面的代码值得一看)

这里写图片描述

54.6.1.1 数据类型:数据类型

sizeof

  • 是一个运算符,给出某个类型或变量在内存中所占据的字节数
  • sizeof(int)
  • sizeof(i)

这里写图片描述

55.6.1.2 数据类型:整数类型

这里写图片描述

整数

  • char:1字节(8比特)
  • short:2字节
  • int:取决于编译器(CPU),通常的意义是“1个字”
  • long:取决于编译器(CPU),通常的意义是“1个字”
  • long long:8字节

这里写图片描述

当我们在说1台计算机的字长的时候,我们指的是寄存器是多少宽的,也就是说,这个寄存器是几个bit的。比如说,当我们说寄存器是32个bit的,每一个寄存器可以表达32个bit的数据,同时也是在说,CPU和RAM之间在总线上传递数据的时候,每一次的传递是32个bit,也就是说,当要从内存RAM取数据到CPU里面去,每一次就会要取32个bit。

除了32,现在更常见的是64个bit。

字长在C语言中,反映为int。int表达的是1个寄存器的大小。所以,在不同的平台、CPU上面,int会不一样大。

56.6.1.3 数据类型:整数的内部表达

这里写图片描述

这里写图片描述

这里写图片描述

所以,为什么我们要在计算机的内部使用补码呢?

最大的好处就是,如果你有了一个补码,你用补码来表示这个-1,那么,当你在做加法的时候,你不需要根据条件,去变换,把加+变成减-,你直接拿它去做普通的二进制的加法,你就会得到你想要的那个结果。

57.6.1.4 数据类型:整数的范围

整数越界

整数是以纯二进制方式进行计算的,所以:
- 11111111 + 1 –> 100000000 –> 0
- 01111111 + 1 –> 10000000 –> -128(这里我存在疑问)
- 10000000 + 1 –> 01111111 –> 127

下面的代码似乎可以解答我的疑问:

这里写图片描述

这里写图片描述

-2^(32-1) —— 2^(32-1)-1

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

(关键词:无符号数、unsigned
这整段视频建议重新细看、加强理解。)

这里写图片描述

这里写图片描述

58.6.1.5 数据类型:整数的格式化

这里写图片描述

(如下的代码,建议看视频的详细解释)

这里写图片描述

59.6.1.6 数据类型:选择整数类型

这里写图片描述

60.6.1.7 数据类型:浮点类型

这里写图片描述

(inf:正负的无穷大
nan:表示不是一个有效的数字
这段视频建议再去详细看。)

这里写图片描述

科学计数法

#include <stdio.h>

int main()
{
    double ff = 1234.56789;
    printf("%e,%f\n", ff, ff);

    return 0;
}

输出:

1234568e+03,1234.567890

这里写图片描述

#include <stdio.h>

int main()
{
    double ff = 1E-10;
    printf("%E,%f\n", ff,ff);

    return 0;
}

输出:

1.000000E-10,0.000000

C语言是古老而长青的编程语言,它具备了现代程序设计的基础要求,它的语法是很多其他编程语言的基础,在系统程序、嵌入式系统等领域依然是无可替代的编程语言,在各类编程语言排行榜上常年占据前两名的位置。 本课程是零基础的编程入门课,是后续的操作系统、编译原理、体系结构等课程的基石。 —— 课程团队 课程概述 程序设计是一门基础课程。对于计算机相关专业而言,程序设计是专业基础知识,是进一步学习其他专业知识的第一步阶梯;对于非计算机专业而言,程序设计的学习有助于理解计算机的能力所在,理解哪些是计算机擅长解决的问题,怎样的方式方法是计算机擅长的手段,从而能更好地利用计算机来解决本专业领域内的问题。 C语言是古老而长青的编程语言,它具备了现代程序设计的基础要求,它的语法是很多其他编程语言的基础,在系统程序、嵌入式系统等领域依然是无可替代的编程语言,在各类编程语言排行榜上常年占据前两名的位置。 对于非计算机专业的学生,学习本课程的主要目的是掌握程序设计的基本方法,C语言是教学媒介。但是对于计算机专业的学生,本课程是向后续的计算机组成、操作系统、编译原理、体系结构等课程前进的基石,对于C语言本身甚至程序设计语言基础原理的深入理解都是应该掌握的。 本课程是零基础的入门课程,完成本课程之后,就能具有初步的运用C语言编写程序的能力。要想完整的学习C语言,还需要进一步学习本课程的后续课程——《C语言程序设计进阶》。 程序设计是实践性很强的课程,该课程的学习有其自身的特点,听不会,也看不会,只能练会。你必须通过大量的编程训练,在实践中掌握编程知识,培养编程能力,并逐步理解和掌握程序设计的思想和方法。在这里所提供的,只是基础的知识讲解,要想学会编程,还需要更多时间的投入和努力。 为了学习编程,你需要有一台计算机,安装必要的编程软件。无论是MS Windows、Mac OS X还是Linux,都有适合C语言编程的软件。如果搞不定自己电脑上的编程软件,我们也会提供在网页中编写、运行C语言程序的方法。 课程大纲 01 程序设计与C语言 课时 1 计算机和编程语言 2 C语言 3 第一个程序 02 计算 课时 1 变量 2 数据类型 3 表达式 4 在线评判系统 03 判断与循环 课时 1 判断 2 循环 04 进一步的判断与循环 课时 1 逻辑类型和运算 2 级联和嵌套的判断 3 多路分支 4 循环的例子 5 判断和循环常见的错误 05 循环控制 课时 1 循环控制 2 多重循环 3 循环应用 06 数组与函数 课时 1 数组 2 函数的定义与使用 3 函数的参数和变量 4 二维数组 07 数组运算 课时 1 数组运算 2 搜索 3 排序初步 08 指针与字符串 课时 1 指针 2 字符类型 3 字符串 4 字符串计算 预备知识 作为第一门编程课,本课程可以零基础学习。大学计算机(大学计算机基础、计算思维导论)等课程对于理解本课程的部分内容有帮助,但这些课程的学习不是必须的。 证书要求 课程的总分达到60分以上,可以获得本课程的合格证书。 课程的总分达到85分以上,可以获得本课程的优秀证书。 参考资料 何钦铭、颜晖,《C语言程序设计(第3)》,高等教育出社,2015年,ISBN 978-7-04-043128-3 颜晖、张泳,《C语言程序设计实验与习题指导(第3)》,高等教育出社,2015年,ISBN 978-7-04-043563-4 常见问题 Q:我需要特殊本的计算机吗? A:任何计算机都可以用于C语言编程,包括但不限于各个本的MS Windows、各个本的Mac OS X、各种发行本的Linux。有的手机有app也能实现C语言编程,不过我们不推荐那么小的屏幕。 Q:我需要安装特定的软件才能做这门课的作业吗? A:任何C语言的开发工具都可以。课程演示会使用Dev C++及命令行环境,但是你使用任何其他开发工具都不会影响做作业的正确性。可以使用的其他工具包括但不限于MS Visual Studio、C-Free等。 Q:每周会发布多少时间的视频?我需要花多少时间来学习? A:我们按照90分钟的授课时间来设计课程。但是发布的视频肯定小于90分钟,一般在50到70分钟左右。因为在线下上课时,老师可能会回顾一下上周的内容、某些内容会看学生的反应重复几遍、会当堂问做一些提问,以及在各种软件等教学工具之间切换,这些都要花点时间,而这些在线上课程中都不存在了,所以视频的时间不会正好是90分钟。但是一般我们设计课程需要1:1.5到1:2的课后学习时间,这包括预习、作业、练习和复习的时间,所以每周大约需要花费三到五小时的时间。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值