复习
vim编辑器的使用:
vi 文件名
vi test.c .c C语言源文件
i 键: 进入输入模式 左下角出现insert
esc 键: 退出输入模式 左下角的insert没有了
:wq 保存并退出vi编辑器
:q! 强制退出不保存
:wq! 强制保存退出
#include <stdio.h>
//# 预处理 在编译之前做的处理
//include 包含头文件, 为了声明
//stdio.h 标准输入输出头文件
//< > 在标准库中查找头文件,暂时都是<>
//main函数 程序入口 逻辑开始执行的地方 {}以内都是main函数
//printf 输出 输出""里面的内容 \n转义字符 换行回车 将光标移动到下一行的行首
//%d十进制整数 %f浮点型数 如果printf输出需要整数或者小数,而值又不能确定,要根据变量的值确定,那就在""里该出现整数的地方写%d 出现浮点型数的时候%f,在实际输出的时候,会根据变量的值代替%d 和%f
int main()
{
printf("hello world\n");
return 0;//结束main函数,结束main函数就是结束程序。
}
如何定义变量
类型名 变量名;
int 整型
float 浮点型
char 字符型
命名规则(标识符):
- 数字、字母和下划线组成。
- 不能以数字开头。 1a 2f 都是错的
- 严格区分大小写。 num Num 不是一个变量,大小写是不同的字符
- 不能使用关键字。 int float char include return等都是C语言的关键字。
- 不能使用拼音。 起名要准确表达含义。
变量赋值
= 赋值运算符
将右边的值(右值)赋值给左边的值(左值)
int a;
a = 10;
什么是初始化:
int a = 10; 定义变量的时候就赋值。虽然在C语言中区别不明显,但是赋值和初始化不是一回事。
格式符
%d %o %x
%f
%c
输入和输出函数:
输入
scanf 是有坑的,我们学习它主要是我们做练习的时候,需要用到输入。
\n 是scanf禁忌。
输出
printf
1、运算符
1. 算术运算符
±*/%
±*和我们熟知的数学概念是一样的。
除法 /
整数相除得整数 10/6 1 除不开的部分直接舍掉,只保留整数部分。
结果是1
小数相除得小数 和我们熟知的数学概念是一样的。
结果是1.66666667
整数和小数相除得小数。
100/13结果是7 小数部分直接舍掉。
模除 % 取余数。 100%13 得9。 一般用来判断整除,a%b结果0 说明a被b整除。
%的左右操作数必须是整数。
除法和模除要求右操作数不能是0。运行会崩溃。
分母不小心为0了。
编译没错但是运行崩溃。
2. 关系运算符
关系运算符的结果是真假值
真 非0整数都是真 -1 100都是真。 在关系运算符中如果结果是真,C语言会默认使用1来表示真。
假 整数0
< <=(中间没有空格) > >=(中间没有空格) ==(中间没有空格) !=(中间没有空格)
== 判断两个数相等,相等结果是1,不相等结果是0
!= 判断两个数不相等,不相等结果是1,相等结果是0
注意区分: ==(只能用来判断) 与 =(用来赋值)
示例:
x = 7; 赋值,把7赋值给变量x
x == 5; 比较,判断x的值是不是5
int main()
{
int a = 10; //定义变量a,初始化10
int b = 3; //定义变量b,初始化3
printf("%d\n", a<b);//输出0 如果a>b?结果是1
return 0;
}
3. 逻辑运算符
&& 逻辑与 数字键7+shift
|| 逻辑或 shift+回车上面的键
! 逻辑非
逻辑与真值表:
表达式1 && 表达式2 结果
-------------------------------
0 0 0
1 0 0
0 1 0
1 1 1
示例: a=2, b = 9; (a>0) && (b<0)
int main()
{
int a = 2;
int b = 9;
printf("%d\n", (a>0)&&(b<0)); //0 如果(a>0)&&(b>0) 1
return 0;
}
逻辑或真值表:
表达式1 || 表达式2 结果
-------------------------------
0 0 0
1 0 1
0 1 1
1 1 1
示例: x=2, y=1 ; (x>0) || (y<0)
#include <stdio.h>
int main()
{
int x = 2;
int y = 1;
printf("%d\n", (x>0)||(y<0));//1 (x<0)||(y<0) 0
return 0;
}
逻辑非真值表:
a !a
------------------
1 0
0 1
思考
int main()
{
int a = 10;
a = !a;//执行完毕 a 0
a = !a;//执行完毕 a 1
printf("%d\n", a);
return 0;
}
4. 优先级
1+2*3 先算乘法,再算加法
算术运算 > 关系运算 > 逻辑运算
1+2>3 || 2+3<4
3>3 || 5<4
0 || 0
0
因为逻辑运算符的优先级低于关系运算符,所有上面逻辑与和逻辑或的示例中代码的()是可以省略的。
练习:
输入三个小数,求和,求平均值分别打印
#include <stdio.h>
int main()
{
float a, b, c;
scanf("%f%f%f", &a, &b, &c);
float sum = a+b+c;//求和,将结果存放到变量sum中
float avg = sum/3;//求平均值,结果存放到avg中
printf("sum = %f avg = %f\n", sum, avg);
return 0;
}
2、if语句
正常的程序,是从上向下执行,顺序结构。
if语句属于分支结构,有选择性的去执行某段逻辑。
1.标准格式:
if( 条件 ) //条件为真 执行语句1 条件为假 执行语句2
{
语句1。
}
else //else 不一定存在,根据实际的逻辑,可以省略。
{
语句2.
}
int main()
{
if(0)//条件为假 不能输出hehe
{
printf("hehe\n");
}
return 0;
}
示例:
请输入一个数字,判断这个数字是否为偶数。
#include <stdio.h>
int main()
{
int num;
scanf("%d", &num);
if(num%2 == 0)//整数能被2整除,说明是偶数
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
练习:
输入一个整数,判定是否为偶数,如果是偶数,再判定这个数的一半是不是偶数。
#include <stdio.h>
int main()
{
int num;
scanf("%d", &num);
if(num%2 == 0)
{
printf("yes\n");
//优先级相同,先算左边
if(num/2%2 == 0)
{
printf("half yes\n");
}
else//每个else必须有与之匹配的if
{
printf("half no\n");
}
}
else
{
printf("no\n");
}
return 0;
}
2. if嵌套
if( 条件1 ) //条件1真 判断条件2
{
if( 条件2 ) //条件1真 条件2真 执行语句2
{
语句2.
}
语句3.//条件1真 执行语句3 和条件2无关
}
3.if并列
if( 条件1 )//条件1真 执行语句1
{
语句1.
}
if( 条件2 )//条件2真 执行语句2 条件2不受条件1影响
{
语句2.
}
3. if - else if - else 多分支选择结构
if( 条件1 )//条件1真 执行语句1
{
语句1.
}
else if( 条件2 ) //条件1假 才判断条件2 条件2真执行语句2
{
语句2.
}
else //条件1 条件2都是假 才执行else里的语句3 else可以省略
{
语句3.
}
后面的条件受前面条件的影响
示例:
#include <stdio.h>
int main()
{
int week;
scanf("%d", &week);
if( week > 7 || week < 1 )//保证输入的数字在1~7之间,否则程序结束
{
printf("error\n");
return 0;//结束main函数,结束程序
}
//week在1~7之间才可能去执行下面的代码
if( week == 1 )//如果week为1 后面的条件都不判断了
{
printf("Monday\n");
}
else if( week == 2 )
{
printf("Tuesday\n");
}
else if( week == 3 )
{
printf("Wednesday\n");
}
else
{
printf(“other days\n”);
}
return 0;
}
#include <stdio.h>
int main()
{
int week;
scanf("%d", &week);
if( week > 7 || week < 1 )//保证输入的数字在1~7之间,否则程序结束
{
printf("error\n");
//return 0;//结束main函数,结束程序
}
//week在1~7之间才可能去执行下面的代码
else if( week == 1 )//如果week为1 后面的条件都不判断了
{
printf("Monday\n");
}
else if( week == 2 )
{
printf("Tuesday\n");
}
else if( week == 3 )
{
printf("Wednesday\n");
}
else
{
printf(“other days\n”);
}
return 0;
}
练习:
请输入一个成绩,然后用 5 分制 去评定成绩。
成绩在0~100之间
A 90~100
B 80~89
C 70~79
D 60~69
E 0~59
关系运算符连写的坑 1<a<10 表达式必为真!!
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
printf("%d\n", 1<a<10);//优先级相同,从左到右执行
//先执行1<a,无论a的值是多少,表达式的结果都是0或者1,然后无论用1还是0跟10比较,都小于10.
//修改 1<a && a<10
return 0;
}
#include <stdio.h>
int main()
{
int score;
scanf("%d", &score);
//在表示一个区间的时候,要使用前比后开区间。 [1, 10) 能取到1,但是取不到10
if(score<0 || score>100)
{
printf("error\n");
}
else if(score>=90)//执行到这里,一定是前面条件为假
{
printf("A\n");
}
else if(score>=80)
{
printf("B\n");
}
else if(score>=70)
{
printf("C\n");
}
else if(score>=60)
{
printf("D\n");
}
else if(score>=0)
{
printf("E\n");
}
return 0;
}
4、进制
1. 进制表:
十进制: 逢十进一。 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
二进制: 逢二进一。 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 10000
C语言没有二进制常量的表示方式,二进制只在心中。因为没人爱看二进制常量。
八进制: 逢八进一。 00 01 02 03 04 05 06 07 010 011 012 013 014 015 016 017 020
十六进制:逢十六进一。 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10
前缀:
八进制,前缀为0 072 010
十六进制,前缀为 0x 0x82
十进制格式: %d
八进制格式: %o
十六进制格式:%x
int main()
{
int a = 100;
printf("%d %o %x\n", a, a, a);//输出是什么?
//不同的进制,仅仅是同一个数据不同的显示形式。主要取决于我们开发者看什么样的进制方便。
return 0;
};
2. 二进制转其他
二转十: 二进制每个位上的数,与其对应的权值相乘,再将对应的结果相加。得到的就是十进制的值 。
0110 1011 = 107
二转八: 二进制的每三位数,对应转换成八进制的一位数。
001 101 011 = 0153
二转十六:二进制的每四个数,对应转换成十六进制的一位数。
0110 1011 = 0x6B
练习:
将以下二进制数,转换成其他进制的值。
010000111 010101000 00011100
十进制 135 168 28
八进制 0207 0250 034
十六进制 0x87 0xA8 0x1C
3. 其他进制转换二进制
十转二: 将十进制数,对二取余数,再将本次的商作为被除数继续对二取余,直到商为0时为止。将得到的余数,从后向前依次读出,即为转换的二进制数
八转二: 八进制每位数,对应转换成二进制的三位数。
十六转二: 十六进制的每位数,对应转换为二进制的四位数。
短除法:
135 / 2 = 67 …… 1
67 / 2 = 33 …… 1
33 / 2 = 16 …… 1
16 / 2 = 8 …… 0
8 / 2 = 4 …… 0
4 / 2 = 2 …… 0
2 / 2 = 1 …… 0
1 / 2 = 0 …… 1
1000 0111
练习:
将下列数转换成二进制
0xb6 1011 0110
0231 010 011 001
234 11101010
234/2 = 117…0
117/2 = 58…1
58/2= 29…0
29/2 = 14…1
14/2 = 7…0
7/2 = 3…1
3/2 = 1…1
1/2 = 0…1
进制总结:
各个进制,不影响整数在内存中的存储方式,内存中都是以二进制存储的。各个进制存在的意义是为了方便我们去阅读数据。
5、字符常量
1. 字符常量:
由单引号引起来的一个字符。
注意事项:
-
必须是单引号引起来的。不能是其他符号。 “a” `a` 反引号 ‘a’ 是字符常量,因为有单引号
-
只能是单个字符,不能是多个。 ‘a’ ‘ab’//语法错误
-
如果非要多于一个字符,转义字符是被允许的。 ‘\n’ ‘\0’ \b’
2. ascii 码
(ASCII(American Standard Code for Information Interchange,美国信息交换标准代码))
每个字符都有一个编号,这个编号就是 ascii 码。
ascii码表里有的字符,才叫字符。
使用手册查表: man ascii 按 q 退出
‘\0’ — 0
’ ’ — 32
‘0’ — 48 ‘9’ — 57
‘A’ — 65 ‘Z’ — 90
‘a’ — 97 ‘z’ — 122
字符在内存中是以整数形式存储的。
3. 示例:
字符型和整型的关系
#include <stdio.h>
int main()
{
char a = 'A';
printf("%c %d\n",a ,a);// A 65
return 0;
}
在C语言中,字符就是整数,字符存在的意义是为了让人类看着更舒服。对于计算机而言,字符都是整数。
每个字符在内存中都是以ascii表中对应的编码来存储的。
#include <stdio.h>
int main()
{
char c = 'b';
char c2 = 'o';
char c3 = 'b';
printf("%c%c%c\n", c, c2, c3);//以字符形式输出 bob
printf("%d%d%d\n", c, c2, c3);//以整数形式输出 9811198
return 0;
}
将数字字符转换成对应的整数
int main()
{
char a = '9';//字符9不能当做整数9来运算
//有些是后,我们需要将数字字符转换成对应的整数进行运算。
int num = a-'0';//使用数字字符减去字符0,能够得到对应的整数
int num2 = a-48;//减去48 也可以,因为48和字符0对于计算机而言是一样的。
printf("%d %d\n", num, num2);// 9 9
return 0;
}
练习:
输入一个字符,判定这个字符是否是大写字母。
#include <stdio.h>
int main()
{
char input;
scanf("%c", &input);
if(input>='A' && input<='Z')
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
作业1:
完成如下功能:
1 显示: “please input a number:”
2 用户输入
3 判断用户输入的数是不是 > 90
作业2:
判断一个数是否满足条件:
a) 是7的倍数
b) 不是3的倍数
如果同时满足,输出该数
作业3:
输入某一时间,输出它的下一秒:(笔试编程题)
效果示例: 输入: 20 59 59
输出: 21:0:0
存储的。
#include <stdio.h>
int main()
{
char c = 'b';
char c2 = 'o';
char c3 = 'b';
printf("%c%c%c\n", c, c2, c3);//以字符形式输出 bob
printf("%d%d%d\n", c, c2, c3);//以整数形式输出 9811198
return 0;
}
将数字字符转换成对应的整数
int main()
{
char a = '9';//字符9不能当做整数9来运算
//有些是后,我们需要将数字字符转换成对应的整数进行运算。
int num = a-'0';//使用数字字符减去字符0,能够得到对应的整数
int num2 = a-48;//减去48 也可以,因为48和字符0对于计算机而言是一样的。
printf("%d %d\n", num, num2);// 9 9
return 0;
}
练习:
输入一个字符,判定这个字符是否是大写字母。
#include <stdio.h>
int main()
{
char input;
scanf("%c", &input);
if(input>='A' && input<='Z')
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
作业1:
完成如下功能:
1 显示: “please input a number:”
2 用户输入
3 判断用户输入的数是不是 > 90
作业2:
判断一个数是否满足条件:
a) 是7的倍数
b) 不是3的倍数
如果同时满足,输出该数
作业3:
输入某一时间,输出它的下一秒:(笔试编程题)
效果示例: 输入: 20 59 59
输出: 21:0:0
要求,如果用户输入了错误的时间,退出 24点退出, 61秒退出