目录
第一章:初识C语言
第一节:显示计算结果
📖读书笔记
-
程序和编译:
作者以“显示整数15和37的和”这个程序,来讲解如何在屏幕上打印想要的信息,程序如下:
/*
显示整数15和37的和
*/
#include<stdio.h>
int main(void)
{
printf("%d", 15 + 37); /*十进制数显示整数15和37的和*/
return 0;
}
在书写main函数时,函数没有参数可以不用写void,现在的写法都是不写void的,所以下面的代码在书写时也不写void。
在上面的程序中,所有符号都必须是英文符号,而且区分大小写和全半角。如果想要运行这段代码,需要经过编译链接过程才可以。这段代码也称为一个源程序,保存源程序的文件称为源文件,在C语言中,源文件的扩展名是“.c”,比如list.c就是一个源文件。当然,如果在执行代码时发生错误,编译器会显示相应的诊断信息,根据诊断信息,就可以确定错误原因并设法解决。
-
注释:
在上面的程序中,/*和*/之间的部分被称为注释,它不被计算机识别,只是帮助编程者理解代码的,用来提高代码的可读性。
-
固定代码:
作者将main函数的这段代码称为“固定代码”,现在先简单理解即可,代码如下。
#include<stdio.h>
{
return 0;
}
-
printf函数——格式化输入输出函数:
printf函数包含在头文件stdio.h中,是一个输出函数,它的功能是将""之间的内容输出到屏幕上,同时也可以指定输出格式,比如%d。那么在执行printf函数时,实际上是完成了一次函数调用。该函数有多个实参,比如代码printf("%d", 15 + 37);的实参分别是“%d”和“15 + 37”,如果有多个实参,需要使用英文逗号分隔开。另外这两个实参的作用是将15和37两个整数相加,并且以十进制输出(%d)。
-
语句:
在C语言的程序中,每条代码的后面都要加上一个英文分号,这就代表是一条语句,也就是说,语句必须以英文分号结尾,另外语句之间是按照从上到下的顺序执行的。
-
计算并显示整数的差:
有代码:printf("%d", 15 - 37);,在printf函数的另一个实参“15 - 37”中,计算的就是15和37的差,并且把这个结果使用%d的格式打印出来。
-
格式化字符串和转换说明:
printf函数的第一个实参%d就是格式化字符串,它的功能是将另一个实参以十进制数的形式显示,这个功能被称为转换说明。有代码:printf("%d\n", 15 + 37);,其中在%d的后面加上了一个换行符\n,这就说明是将%d表示的内容显示出来之后再进行换行操作。
-
符号的称呼:
C语言中的一些符号有着自己的称呼,具体如下:
符号 | 称呼 | 符号 | 称呼 | 符号 | 称呼 |
---|---|---|---|---|---|
+ | 加号、正号、加 | ; | 分号 | > | 大于 |
- | 减号、负号、连字符、减 | ' | 单引号 | ? | 问号 |
* | 星号、乘号、米号、星 | " | 双引号 | ! | 感叹号 |
/ | 斜线、斜杠、除号 | ( | 左括号、左圆括号、左小括号 | & | and符 |
\ | 反斜线、反斜杠 | ) | 右括号、右圆括号、右小括号 | ~ | 波浪线 |
¥ | 货币符号 | { | 左大括号、左花括号 | ^ | 音调符号 |
% | 百分号 | } | 右大括号、右花括号 | # | 井号 |
. | 点 | [ | 左方括号、左中括号 | _ | 下划线 |
, | 逗号 | ] | 右方括号、右中括号 | = | 等号 |
: | 冒号 | 小于 | | | 竖线 |
-
无格式化输出:
作者利用几个程序,说明了在输出时,将换行符放在的位置就会实现换行,并且如何使程序的可读性提高,代码如下:
/*
打招呼并进行自我介绍
*/
#include<stdio.h>
int main()
{
printf("您好!我叫柴田望洋。\n"); /* 使用换行符,在一行输出,书写一条语句 */
printf("您好!\n我叫柴田望洋。\n"); /* 使用换行符,在两行输出,书写一条语句 */
printf("您好!\n");
printf("我叫柴田望洋。\n"); /* 使用换行符,在两行输出,书写两条语句 */
return 0;
}
-
字符串常量:
在printf函数中,使用""引起来的字符串就成为字符串常量,比如上面的“您好!我叫柴田望洋。”就是一个字符串常量,这也说明了,在printf的""之间可以书写任意字符,中英文、大小写、全半角都不受限制,代码如下:
#include<stdio.h>
int main()
{
printf("我\n");
printf("I\n");
printf("はたし\n");
return 0;
}
-
转义字符:
转义字符是具有特定功能的特殊符号,比如上面的\n(换行符)就是转义字符,此外还有\a(蜂鸣、响铃)等,当程序执行到\a时,计算机就会响铃一次,代码如下:
/*
打招呼并响铃三次
*/
#include<stdio.h>
int main()
{
printf("您好!\a\a\a");
return 0;
}
转义字符必须在printf函数中使用才能发挥作用。
📝课后习题
-
练习1-1:
编写一段程序,计算出15减去37的结果,并以“15减去37的结果是-22。”的格式进行显示。
✏️解答:
/* 编写程序,计算15键37的结果,并按照指定格式输出 */
#include<stdio.h>
int main()
{
printf("%d减去%d的结果是%d。", 15, 37, 15 - 37);
return 0;
}
-
练习1-2:
编写一段程序,调用一次printf函数,显示下方的内容。
天
地
人
✏️解答:
/* 调用一次printf函数,输入相应的内容 */
#include<stdio.h>
int main()
{
printf("天\n地\n人\n");
return 0;
}
-
练习1-3:
编写一段程序,调用一次printf函数,显示下方的内容。
喂!
您好!
再见。
✏️解答:
/* 调用一次printf函数,输入相应的内容 */
#include<stdio.h>
int main()
{
printf("喂!\n\n您好!\n再见。\n");
return 0;
}
第二节:变量
📖读书笔记
-
变量和声明:
变量和常量是程序中用来记录结果的量,常量就是不会变化的量,而变量就是可以改变的量。可以把变量想象成一个存储数据的盒子,定义变量就相当于拿出一个盒子用来存储数据。声明就是在使用变量之前,来告诉程序这个变量的信息,比如它是什么类型的。那么声明变量的代码比如:int a;,含义是声明了一个变量a,它的类型是int(整型)。
那么变量声明之后是怎么使用的呢?作者以一段代码做了演示,代码如下:
/*
为两个变量赋整数值并显示
*/
#include<stdio.h>
int main()
{
int vx, vy; /* vx和vy是int类型的变量 */
vx = 57; /* 把57赋值给vx */
vy = vx + 10; /* 把vx+10的值赋值给vy */
printf("vx的值是%d。\n", vx); /* 显示vx的值 */
printf("vy的值是%d。\n", vy); /* 显示vy的值 */
return 0;
}
从上面的代码可以看出,变量就是用来记录值的,这个值是可以被改变的,如果再次对vx和vy赋值,那么它们的值就是新值。
-
赋值:
变量的赋值的规则是右边的值赋给左边的变量,所以变量赋值的写法都是左值为变量。赋值过程可以理解为把一个新的数据放到原来的盒子中,盒子不变,但是数据已经不是原来的数据了。
-
初始化:
变量可以在声明的同时进行初始化,也相当于拿出一个盒子,而这个盒子里面就被放进去一个数据一个道理。
这里容易误解的时,变量在声明后没有初始化就没有值了,其实这是错误的。变量一旦被声明,它就一定有一个值,只不过这个值是随机值(作者称为“垃圾值”),我们不知道是什么,只有初始化或者给变量赋值之后,这个值才是我们能够掌控的。
/*
使用未初始化的变量
*/
#include<stdio.h>
int main()
{
int vx, vy;
printf("vx的值是:%d\n");
printf("vy的值是:%d\n");
return 0;
}
-
声明时初始化:
在声明变量时可以为变量初始化,这时的值就是我们可以掌控的了,但是仍然需要注意的是,这个初始化的值不能太随意,比如一个int类型(整型,也就是整数)的变量,总不能初始化成小数吧,这样的话会丢失数据的。
/*
为两个变量进行初始化并显示
*/
#include<stdio.h>
int main()
{
int vx = 57; /* vx是int类型的变量,初始化为57 */
int vy = vx + 10; /* vy是int类型的变量,初始化为vx+10 */
printf("vx的值是%d。\n", vx); /* 显示vx的值 */
printf("vy的值是%d。\n", vy); /* 显示vy的值 */
return 0;
}
-
初始化和赋值:
其实初始化和赋值并不是一回事,虽然都是把值放到变量中,但初始化是声明变量时把值放到变量中,赋值是使用变量时把值放到变量中。
📝课后习题
-
练习1-4:
如果在int型变量的声明中为变量赋一个实数值的初始值(如3.14或5.7等)会怎样呢?请试着生成程序并确认。
✏️解答:
/* int型变量赋小数值 */
#include<stdio.h>
int main()
{
int a = 0, b = 0; /* 定义变量a和b,初始化为0 */
printf("a = %d, b = %d\n", a, b); /* 赋值之前a和b的值 */
/* 赋值 */
a = 3.14;
b = 5.7;
printf("a = %d, b = %d\n", a, b); /* 赋值之后a和b的值 */
return 0;
}
可以看出,赋值之前a和b都是0,之后a和b只取了小数的整数部分,小数部分被舍弃了,这也就是精度丢失现象,如果一个int型(整型)变量被赋小数值时,就会发生精度丢失。
第三节:输入和显示
📖读书笔记
-
通过键盘进行输入:
C语言中的函数既然能够把数据显示到屏幕中,就也能把数据输入到计算机中,这也就是通过键盘进行数据输入,这需要借助C语言中的scanf函数,代码如下:
/*
显示并确认输入的整数值
*/
#include<stdio.h>
int main()
{
int no;
printf("请输入一个整数:");
scanf("%d", &no); /* 读取整数值 */
printf("您输入的是%d。\n", no);
return 0;
}
-
格式化输入函数scanf:
scanf函数也是C语言本身自带的一个函数,它的功能是从键盘中读取数据输入到计算机中,它也有转换说明,比如上面代码中的%d就表示输入一个十进制整数,而后面的&no就是要把输入的数放到no中。
现在可以先暂时记住&no这种写法,不用管符号&的具体含义。
-
乘法运算:
这里作者介绍了一个符号*,它可以表示乘法,这与数学中的乘法基本相同,另外*两边的操作数可以调换位置,也就是下面代码中的5 * no可以写成no * 5,含义不变。
/*
读取一个整数并显示其5倍的值
*/
#include<stdio.h>
int main()
{
int no;
printf("请输入一个整数:");
scanf("%d", &no);
printf("它的5倍数是%d。\n", 5 * no);
return 0;
}
-
输出函数puts:
这个函数和printf函数功能基本相同,都是将数据输出到屏幕上,但是printf函数可以指定格式(比如显示整数等),puts不能指定格式,另外printf函数需要借助换行符才能换行,而puts函数执行结束后默认换行,可以把这两个函数搭配着使用,代码如下:
/*
显示出读取到的两个整数的和
*/
#include<stdio.h>
int main()
{
int n1, n2;
int wa;
puts("请输入两个整数。");
printf("整数1:"); scanf("%d", &n1);
printf("整数2:"); scanf("%d", &n2);
wa = n1 + n2; /* 把n1和n2的和赋值给变量wa */
printf("它们的和是%d。\n", wa);
return 0;
}
📝课后习题
-
练习1-5:
编写一段程序,像下边那样读取一个整数并显示该整数加上12之后的结果。
请输入一个整数:57
该整数加上12的结果是69。
✏️解答:
/* 读取一个整数,并把整数加上12再输出 */
#include<stdio.h>
int main()
{
int num = 0;
printf("请输入一个整数:");
scanf("%d", &num);
printf("该整数加上12的结果是%d\n", num + 12);
return 0;
}
-
练习1-6:
编写一段程序,像下边那样读取一个整数并显示该整数减去6之后的结果。
请输入一个整数:57
该整数减去6的结果是51。
✏️解答:
/* 读取一个整数,并把整数加上12再输出 */
#include<stdio.h>
int main()
{
int num = 0;
printf("请输入一个整数:");
scanf("%d", &num);
printf("该整数减去6的结果是%d\n", num - 6);
return 0;
}
-
练习1-7:
编写一段程序,使其显示“天”、“地”、“人”。注意用puts函数而非printf函数来进行显示。
天
地
人
✏️解答:
/* 编写程序使用puts函数显示相应内容 */
#include<stdio.h>
int main()
{
puts("天");
puts("地");
puts("人");
return 0;
}
-
练习1-8:
编写一段程序,像下边这样显示读取到的两个整数的乘积。
请输入两个整数。
整数1:27
整数2:35
它们的乘积是945。
✏️解答:
/* 编写程序,读取两个数的乘积 */
#include<stdio.h>
int main()
{
int n1 = 0, n2 = 0;
puts("请输入两个整数。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);
printf("它们的乘积是%d。\n", n1 * n2);
return 0;
}
-
练习1-9:
编写一段程序,像下边这样显示读取到的三个整数的和。
请输入三个整数。
整数1:7
整数2:15
整数3:23
它们的和是45。
✏️解答:
/* 编写程序,读取三个数的和 */
#include<stdio.h>
int main()
{
int n1 = 0, n2 = 0, n3 = 0;
puts("请输入三个整数。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);
printf("整数3:");
scanf("%d", &n3);
printf("它们的和是%d。\n", n1 + n2 + n3);
return 0;
}
注:本章内容完成,再次我认为作者的代码有一些风格不是很好,比如声明变量后不初始化(可能会导致访问的变量是随机值)、使用的注释不太好用(作者使用的注释是C语言的注释,但是这个注释不支持嵌套,一些复杂代码注释时可能不太好用)、一行存在多条语句(会降低代码的可读性)等,关于这些问题,我解决方法是:在之后的章节学习中,声明变量同时进行初始化、使用C++的注释(//,它支持嵌套使用)、一行只写一条语句。另外,书写练习的程序时,程序最上面的说明的注释不写题意了(面对一些复杂的题时,一行可能概括不下),直接写题号。虽然作者写出的代码风格不是特别好,我只是稍加改动,使其风格变得更加优秀,代码本意不会改变。
以上就是我本次的分享了,写的不好,请多多担待!