C语言程序设计(苏小红,高等教育出版社)学习笔记(一)
第一章 为什么要学C语言
-
1.学编程的过程,其实就是学习怎样用编程语言说话,让编译器听懂的过程。
-
2.汇编语言缺少“可移植性”
- 除了机器语言和汇编语言以外,几乎所有的编程语言都被统称为高级语言,它的特点是更接近自然语言,而与机器语言基本没有瓜葛。
- 不同的高级语言编译器,可以把同样的高级语言程序翻译成适应不同机器的指令,因而高级语言大多具有较好的可移植性。
-
3.ken和der的可爱之处:
- 做事情以兴趣为出发点,并不在乎未来会怎样
- 极富钻研精神,喜欢迎接挑战
- 乐于分享,不计回报
-
4.如果一件事情可以用X语言做,就一定不要用C语言做。
-
5.C诡异离奇,缺陷重重,并获得巨大成功。
-
6.C语言设计原则的第一条是:信任程序员。
-
7.C语言完全满足人们对效率的苛求,精心设计的代码可以极大的节约资源,又不像汇编语言那样难用,所以受到程序员的欢迎。
-
8.现在还需要使用C语言的地方,大概只限于4个领域:
- C语言仍是编写操作系统的不二之选
- 在对程序的运行效率有苛求的地方
- 在需要继承和维护已有的C代码的地方
- 思想交流的首选媒介语言
-
9.C语言很适合作为入门级语言,这并不是C语言自身决定的,而是中国庞大的C语言教育体系决定的.
关于C语言的书籍资料、论坛、习题和教辅系统是最多的,而且无一例外都是面向程序设计的初学者。 -
10.计算思维代表着一种普遍的认识和一类普适的技能,每一个人,不仅仅是计算机科学家,都应热心于它的学习和应用。
-
11.编程是编写程序的简称,术语称为程序设计,程序是计算机的主宰,控制着计算机该去做什么事,所有托付给计算机去做的事情都要被编写成程序。
-
12.程序设计的步骤:
- 需求分析
- 设计:搞明白计算机该怎么去做这件事
- 设计算法、数学建模,用数学的方法对问题进行求解
- 设计程序的代码结构,使程序易于修正、扩充和维护
- 编写程序:把设计的结果变成一行行代码,输入到程序编辑器中
- 调试程序:将源代码编译变成可执行的程序,然后运行,看看是否能够满足要求
第二章 C数据类型
-
1.八进制整数由数字0开头,后跟0~7的数字序列组成
十六进制整数由数字0加字母x(或X)开头,后跟09,af(或A~F)的数字序列组成 -
2.整型常量:
默认的int型定义为有符号整数,因此对int型无需使用signed
无符号整型常量:U
长整型常量:L
无符号长整型常量:LU -
3.十进制小数形式
指数形式:3.45e-6=0.00000345 -
4.实型常量:
单精度:F
双精度(实型常量默认)
长双精度:L -
5.变量在使用前必须先定义
需要声明变量的类型和变量名
L2-1a-1
main()//以main()作为开头指定了C程序执行的起点
//一个C程序必须有且只能有一个用main()作为名称的函数,称为主函数
{
int a;
float b;
char c;
a = 1;
b = 2.5;
c = 'A';
}
- 6.变量名(标识符)是大小写敏感的
所有变量必须在第一条可执行语句之前定义
空格是为了增强程序的可读性
定义变量的同时可以对变量进行初始化,如int a=1;
L2-1a-2
main()
{
int a = 1; /* 定义整型变量a并对其初始化 */
float b = 2.5; /* 定义实型变量b并对其初始化 */
char c = 'A'; /* 定义字符型变量c并对其初始化 */
}
- 7.可同时定义多个相同的变量,如int a,b,c;
- 8.注释不可以嵌套
L2-1b
#include <stdio.h>//这是C的编译预处理命令
//这一行将会出现在每一个需要向屏幕输出数据或者从键盘输入数据的程序中
main()
{
int a = 1;
float b = 2.5;
char c = 'A';
printf("a = %d\n", a); /* 按整型格式输出变量a的值 */
printf("b = %f\n", b); /* 按实型格式输出变量b的值,除非特别指定,否则隐含输出6位小数 */
printf("c = %c\n", c); /* 按字符型格式输出变量c的值 */
printf("End of program\n"); /* 输出一行字符串 */
}
//\n表示输出一个换行
运行结果
a=1
b=2.500000
c=A
End of program
【思考问题】
a = 65
b = 0.000000
c =
End of program
- 9.变量或数据类型所占空间的大小
1B(字节)=8bit
sizeof()是C语言的关键字,不是函数名
sizeof()是C语言提供的专门用于计算指定数据类型字节数的运算符
L2-2
#include <stdio.h>
main()
{
printf("Data type Number of bytes\n");
printf("------------ ---------------------\n");
printf("char %d\n", sizeof(char));
printf("int %d\n", sizeof(int));
printf("short int %d\n", sizeof(short));
printf("long int %d\n", sizeof(long));
printf("float %d\n", sizeof(float));
printf("double %d\n", sizeof(double));
}
运行结果
Data type Number of bytes
------------ ---------------------
char 1
int 4
short int 2
long int 4
float 4
double 8
-
10.赋值表达式用于给变量赋值
有方向性
等号左侧是能表示一个特定存储单元的变量名 -
11.运算的优先级
综合性:左结合、右结合
C语言中需要两个操作数的算数运算符是左结合的
赋值运算符是右结合的 -
12.有符号整数和无符号整数
对有相同字数的整型数而言
有符号整数能表示的最大整数的绝对值只有无符号整数的一半
负数在计算机中都是以二进制补码的形式来表示和存储的
正数的反码、补码与其原码都是相同的 -
13.采用补码可以将减法运算也转换为加法运算来处理
采用补码可以以统一的形式来表示+0和-0 -
14.实数的指数部分称为阶码,小数部分称为尾数
阶码所占的位数决定实数的表数范围,尾数所占的位数决定实数的精度
尾数的符号决定实数的正负 -
15.浮点数并非真正意义上的实数,只是其在某种范围内的近似
L2-3
#include <stdio.h>
main()
{
float a;
double b;
a = 123456.789e4;
b = 123456.789e4;
printf("%f\n%f\n",a,b);
}
运行结果
1234567936.000000
1234567890.000000
第三章 简单的算术运算和表达式
-
1.算数运算符:一元、二元、三元(条件运算符)
1/2是整型除法,1.0/2是浮点数除法 -
2.求余运算(%)限定参与运算的两个操作数必须为整数
不能对两个实型数据进行求余运算
余数的符号与被除数的符号相同 -
3.C语言中没有幂运算符
L3-1
#include <stdio.h>
main()
{
int x = 153, b0, b1, b2, sum;
b2 = x / 100; /* 计算百位数字 */
b1 = (x - b2 * 100) / 10; /* 计算十位数字 */
b0 = x % 10; /* 计算个位数字 */
sum = b2 + b1 + b0;
printf("b2=%d, b1=%d, b0=%d, sum=%d\n", b2, b1, b0, sum);
}
运行结果
b2=1, b1=5, b0=3, sum=9
-
4.复合的赋值运算符
+=:a+=b; 等价于 a=a+b;
-=
*=
/=
%= -
5.增1和减1运算符
/* 一元运算符
++x:前缀运算符,在变量使用之前对其执行加1操作
m=++n; 等价于 n=n+1;m=n;
x++:后缀运算符,先使用变量的当前值,然后对其进行加1操作
m=n++; 等价于 m=n;n=n+1; -
6.良好的程序设计风格提倡在一行语句中一个变量最多只出现一次增1或者减1运算
不建议在程序中使用复杂的增1和减1运算符
过多的增1和减1运算符会导致程序的可读性变差
L3-2(宏常量和宏替换)
#include <stdio.h>
main()
{
double r = 5.3; /* 圆的半径 */
printf("circumference = %f\n", 2*3.14159*r);
printf("area = %f\n", 3.14159*r*r);
}
运行结果
circumference = 33.300854
area = 88.247263
L3-3
#include <stdio.h>
main()
{
double r;
printf("Input r:"); /* 提示用户输入半径的值*/
scanf("%lf", &r); /* 以双精度实型格式从键盘输入半径的值 */
//scanf()函数也是C的标准输入/输出函数
//&称为取地址运算符,&r指定了用户输入数据存放的变量的地址
printf("circumference = %f\n", 2*3.14159*r);
printf("area = %f\n", 3.14159*r*r);
}
运行结果
Input r:6
circumference = 37.699080
area = 113.097240
- 7.幻数:在程序中直接使用的常数
导致程序的可读性变差
容易发生书写错误
难以修改
把幻数定义为宏常量或const常量,用一个简单易懂的名字来代替一个长字符串
能提高程序的可读性
L3-4
#include <stdio.h>
#define PI 3.14159 /* 定义宏常量PI */
main()
{
double r;
printf("Input r:");
scanf("%lf", &r);
printf("circumference = %f\n", 2*PI*r); /*编译时PI被替换为3.14159*/
printf("area = %f\n", PI*r*r); /*编译时PI被替换为3.14159*/
}
-
8.宏定义中的标识符被称为宏名
习惯上用字母全部大写的单词来命名宏常量
将程序中出现的宏名替换为字符串的过程称为宏替换 -
9.宏定义的宏名与字符串之间可有多个空白符,无需加等号
字符串后不以分号结尾
宏定义不是C语句,而是一种编译预处理命令 -
10.宏常量没有数据类型,const常量可以声明数据类型
L3-5
#include <stdio.h>
main()
{
const double PI = 3.14159; /* 定义实型的const常量PI */
double r;
printf("Input r:");
scanf("%lf", &r);
printf("circumference = %f\n", 2*PI*r);
printf("area = %f\n", PI*r*r);
}
- 11.表达式中的自动类型转换
C编译器在对操作数进行运算之前将所有操作数都转换为取值范围较大的操作数类型,称为类型提升
类型提升可以避免数据信息丢失的情况发生 - 12.在一个赋值语句中,若赋值运算符左侧的变量的类型与右侧的表达式的类型不一致,则赋值时会发生自动类型转换
类型转换的规则是:将右侧表达式的值转换为左侧变量的类型
L3-6
#include <stdio.h>
main()
{
int n = 256;
float f = 3.6;
double d = 2.5;
n = f;
f = n;
d = f;
printf("n = %d\n", n);
printf("f = %f\n", f);
printf("d = %f\n", d);
}
运行结果
n = 3
f = 3.000000
d = 3.000000
-
13.将取值范围小的类型转换为取值范围大的类型是安全的,而反之则是不安全的
尽量避免使用这种自动的类型转换,建议使用强制类型转换运算符 -
14.强制类型转换就是明确地表明程序打算执行哪种类型转换,有助于消除因隐式的自动转换而导致的程序隐患
L3-7
#include <stdio.h>
main()
{
int m = 5;
printf("m/2=%d\n", m/2);
printf("(float)(m/2) = %f\n", (float)(m/2));
printf("(float)m/2 = %f\n", (float)m/2);
printf("m = %d\n", m);
}
运行结果
m/2=2
(float)(m/2) = 2.000000
(float)m/2 = 2.500000
m = 5
L3-8(常用的标准数学函数)
#include <stdio.h>
#include <math.h>//C的标准数学函数库提供了丰富的数学函数
//使用这些数学函数时,只要在程序的开头加上如下的编译预处理命令即可
main()
{
float a, b, c, s, area;
printf("Input a,b,c:");
scanf("%f,%f,%f", &a, &b, &c);
s = (float)(a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c));
printf("area = %f\n", area);
}
运行结果
Input a,b,c:3,4,5
area = 6.000000
- 15.常用的标准数学函数
表达式 | 函数 |
---|---|
sqrt(x) | 平方根 |
fabs(x) | 绝对值 |
log(x) | 自然对数 |
log10(x) | 以10为底的对数 |
exp(x) | 指数 |
pow(x,y) | x的y次方 |
sin(x) | 正弦 |
cos(x) | 余弦 |