文章目录
程序设计入门—C语言(MOOC—翁恺)
Week 1 程序设计与C语言
lesson 1 计算机和编程语言
- 告诉人做一件事情是 what to do
- 告诉计算机做一件事情是 how to do
- 编程语言并非人与计算机交流的语言,人与计算机通过人机交互进行交流
辗转相除法
int u = 32;
int v = 26;
while ( v != 0 ) {
int temp = u % v;
u = v;
v = temp;
}
printf("%d\n", u);
- 如果 v 等于 0 ,计算结束,u 就是最大公约数
- 如果 v 不等于 0 ,那么计算 u 除以 v 的余数,让 u 等于 v ,而 v 等于那个余数
- 回到第一步
程序的执行
- 解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行
- 编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机能懂的机器语言程序并可直接执行
lesson 2 第一个程序
- 程序框架
#include <stdio.h>
int main()
{
//代码
return 0;
}
- 在接触函数之前,所有代码都是这个框架
Week 2 计算
lesson 1 变量
变量的定义及初始化
- <类型名称> <变量名称> = <初始值>;
int price = 0;
int amount = 100;
- 定义组合变量时,也可在定义中单独给单个变量赋初值
int price = 0, amount = 100;
- C语言严格区分大小写
- 变量的命名规则: 一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)
变量类型
int price = 0;
,这一行定义了一个变量,变量名是price,类型是int,初始值是0- C是一种强类型语言,所有变量在使用之前必须定义或声明,且必须具有确定的数据类型。数据类型表示在变量中可以存放且只能存放什么类型的数据,程序运行过程中也不能改变变量的类型
※ 关于scanf
scanf里不能有\n
,否则当输入完需要输入的内容后就算按无数回车也必须要再输入一个值才能成功输入,但该值并不会参与程序的运行
常量
- 一种定义方式(C99 ONLY):
const int AMOUT = 100;
- const 是一个修饰符,加在 int 前面,用来给这个常量加上一个const(不变)的属性,这个const的属性表示这个变量的值一旦初始化就不能更改
lesson 2 数据类型
- 浮点数:带小数点的数值
- 浮点的本意就是指小数点是浮动的,是计算机内部表达非整数(包括分数和无理数)的一种方式,另一种方式叫定点数,但C语言中没有定点数
- double
printf("%f", ...);
scanf("%lf", ...);
lesson 3 表达式
- 计算时间差
int hour1, minute1; int hour2, minute2; scanf("%d %d", &hour1, &minute1); scanf("%d %d", &hour2, &minute2); int t1 = hour1 * 60 + minute1; int t2 = hour2 * 60 + minute2; int t = t1 - t2; printf("时间差是%d小时%d分", t / 60, t % 60);
- hour * 60 + minute → 转换为分钟为单位
- t / 60 → 小时,t % 60 → 分钟
- a++(- -) 是 a 加(减)1 之前的值,在使用i之后,使i的值加(减)1 ,先使用再运算
- ++(- -)a 是 a 加(减)1 之后的值,在使用i之前,先使i的值加(减)1 ,先运算再使用
-
int a = 3; int c1, c2, c3, c4; c1 = a++; // a赋值给c1后自身再加1 printf("c1的值是%d,a的值是%d\n", c1, a); a = 3; c2 = ++a; // a自身加1后再赋值给c2 printf("c2的值是%d,a的值是%d\n", c2, a); a = 3; c3 = a--; // a赋值给c3后自身再减1 printf("c3的值是%d,a的值是%d\n", c3, a); a = 3; c4 = --a; // a自身减1后再赋值给c4 printf("c4的值是%d,a的值是%d\n", c4, a);
Week 3 判断与循环
lesson 1 判断
-
C语言提供了六个关系运算符:
- == 相等
- != 不相等
- > 大于
- >= 大于或等于
- < 小于
- <= 小于或等于
-
注意其中有两个字符的运算符:==、>=和<=的两个字符必须紧紧连在一起,中间不能插入空格。
-
关系运算的结果是一个逻辑值,逻辑值只有两种可能的值:true(真,表示成立)或 false(假,表示不成立)。当两个值的关系符合关系运算符的预期时,关系运算的结果为 true,否则为 false。
-
当两个值的关系符合运算符的预期时,关系运算的结果为整数1,否则为整数0
printf("%d\n", 5 == 3); printf("%d\n", 5 != 3); printf("%d\n", 5 > 3); printf("%d\n", 5 >= 3); printf("%d\n", 5 < 3); printf("%d\n", 5 <= 3);
- 比较两个数的大小
- 代码一:
int a, b; printf("请输入两个整数:"); scanf("%d %d", &a, &b); int max = 0; if ( a > b ) max = a; else max = b; printf("大的那个是%d\n", max);
- 代码二:
int a, b; printf("请输入两个整数:"); scanf("%d %d", &a, &b); int max = b; if ( a > b ) max = a; printf("大的那个是%d\n", max);
if( 1<=n<=10 );
可以通过编译,但不表示 n 属于 [1,10]-
- 先判断 1<=n ,判断结果为0(假)或1(真),然后在判断 (1<=n) 的整体值(0或1)是否小于等于 10,结果为真
- 可以执行,但并不能表示 n 介于 1 到 10 之间的判断
- 如果要执行 n 介于 1 到 10 之间的判断,应表示为:
if( n>=1 && n<=10 )
lesson 2 循环
- while语句 是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体
- do-while循环 和 while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环
- do-while循环结尾有分号
for(a=10;a>0;a--)
表示:对于一开始的 a=10,当 a>0 时,重复执行循环体,每一轮执行完循环体时使得 a- -
- 做求和程序时,和变量初始值应为0
- 做求积程序时,积变量初始值应为1
- 在循环语句内定义循环变量(C99 ONLY)
- 每个for循环都可转换为一个while循环:
for ( int i=1; i<=n; i++ ) {
fact *= i;
}
//等同于
int i = 1;
while ( i<=n ) {
fact *= i;
i++;
}
- 循环语句的选择:
- 若有固定次数:用for
- 若必须执行一次(至少执行一次):用do-while
- 其他情况用while
Week 4 进一步的判断和循环
lesson 1 逻辑类型与运算
bool 布尔类型
//导入 stdbool.h 来使用布尔类型,C99 ONLY
#include <stdbool.h>
#include <stdio.h>
//计算n!,n的值在main中定义
int main(void)
{
int n = 10; //计算叠乘数
int sum = 1; //用来存放叠乘的结果
bool flag = false; //叠乘标记
int num = n; //循环次数
while ( !flag ) {
sum = sum * (num--);
//当num=1时结束循环
if ( num == 1 ) {
flag = true;
}
}
printf ("%d的叠乘值为 %d \n", n, sum);
return 0;
}
逻辑运算
- 逻辑运算是对逻辑量进行的运算,结果只有0或1
- 逻辑量是关系运算或逻辑运算的结果
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | ! a | 真假颠倒 |
&& | 逻辑与 | a && b | 全真才真,一假即假 |
|| | 逻辑或 | a || b | 一真即真,全假才假 |
- 如何表达
x ∈ (4, 6)
4 < x < 6
是错误的表达方式,因为x < 4
表示的是一个逻辑值 0 或 1- 正确的表达方式是:
x < 6 && x > 4
x ∈ [4, 6]
同理
短路运算
-
逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
-
a == 6 && b == 1
-
a == 6 && b += 1
,如果左边为假,右边的赋值就不会进行切记! 不要把赋值包括复合赋值写进逻辑运算表达式
-
对于 && ,左边是 false 时就不会进行右边
-
对于 ||,左边是 ture 时就不会进行右边
条件运算符
count = (count > 20) ? count - 10 : count + 10;
- 条件 ?条件满足时的值 :条件不满足的值
- 自右向左结合
- 忌用嵌套的条件表达式
逗号表达式
- 连接两个表达式
- 用右边的表达式作为结果
i = (3 + 4, 5 + 6)
,i 的值是11
lesson 2 级联和嵌套的判断
-
//单一出口,f的值可灵活使用,并且程序修改相对容易,推荐 int f; if ( x < 0 ) { f = -1; } else if ( x == 0 ) { f = 0; } else { f = 2 * x; } printf("%d",f); /**********************************************/ //写死了,不推荐 if ( x < 0 ) { printf("%d", -1); } else if ( x == 0 ) { printf("%d", 0); } else { printf("%d", 2 *x); }
lesson 3 多路分支——switch-case语句
//if-else语句
if ( type == 1 )
printf("你好");
else if ( type == 2 )
printf("早上好");
else if ( type == 3 )
printf("晚上好");
else if ( type == 4 )
printf("再见好"