vi 文件名
vi test.c .c C语言源文件
i 键: 进入输入模式 左下角出现insert
esc 键: 退出输入模式 左下角的insert没有了
:wq 保存并退出vi编辑器
:q! 强制退出不保存
:wq! 强制保存退出
#include
//# 预处理 在编译之前做的处理
//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 字符型
= 赋值运算符
将右边的值(右值)赋值给左边的值(左值)
int a;
a = 10;
int a = 10; 定义变量的时候就赋值。虽然在C语言中区别不明显,但是赋值和初始化不是一回事。
%d %o %x
%f
%c
输入
scanf 是有坑的,我们学习它主要是我们做练习的时候,需要用到输入。
\n 是scanf禁忌。
输出
printf
±*/%
±*和我们熟知的数学概念是一样的。
除法 /
整数相除得整数 10/6 1 除不开的部分直接舍掉,只保留整数部分。
小数相除得小数 和我们熟知的数学概念是一样的。
整数和小数相除得小数。
100/13结果是7 小数部分直接舍掉。
模除 % 取余数。 100%13 得9。 一般用来判断整除,a%b结果0 说明a被b整除。
%的左右操作数必须是整数。
除法和模除要求右操作数不能是0。运行会崩溃。
关系运算符的结果是真假值
真 非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;
}
&& 逻辑与 数字键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
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;
}
1+2*3 先算乘法,再算加法
算术运算 > 关系运算 > 逻辑运算
1+2>3 || 2+3<4
3>3 || 5<4
0 || 0
0
因为逻辑运算符的优先级低于关系运算符,所有上面逻辑与和逻辑或的示例中代码的()是可以省略的。
输入三个小数,求和,求平均值分别打印
#include
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;
}
正常的程序,是从上向下执行,顺序结构。
if语句属于分支结构,有选择性的去执行某段逻辑。
if( 条件 ) //条件为真 执行语句1 条件为假 执行语句2
{
语句1。
}
else //else 不一定存在,根据实际的逻辑,可以省略。
{
语句2.
}
int main()
{
if(0)//条件为假 不能输出hehe
{
printf("hehe\n");
}
return 0;
}
请输入一个数字,判断这个数字是否为偶数。
#include
int main()
{
int num;
scanf("%d", &num);
if(num%2 == 0)//整数能被2整除,说明是偶数
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
输入一个整数,判定是否为偶数,如果是偶数,再判定这个数的一半是不是偶数。
#include
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;
}
if( 条件1 ) //条件1真 判断条件2
{
if( 条件2 ) //条件1真 条件2真 执行语句2
{
语句2.
}
语句3.//条件1真 执行语句3 和条件2无关
}
if( 条件1 )//条件1真 执行语句1
{
语句1.
}
if( 条件2 )//条件2真 执行语句2 条件2不受条件1影响
{
语句2.
}
if( 条件1 )//条件1真 执行语句1
{
语句1.
}
else if( 条件2 ) //条件1假 才判断条件2 条件2真执行语句2
{
语句2.
}
else //条件1 条件2都是假 才执行else里的语句3 else可以省略
{
语句3.
}
后面的条件受前面条件的影响
#include
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
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
十进制: 逢十进一。 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 二转十: 二进制每个位上的数,与其对应的权值相乘,再将对应的结果相加。得到的就是十进制的值 。 0110 1011 = 107 二转八: 二进制的每三位数,对应转换成八进制的一位数。 001 101 011 = 0153 二转十六:二进制的每四个数,对应转换成十六进制的一位数。 0110 1011 = 0x6B 将以下二进制数,转换成其他进制的值。 010000111 010101000 00011100 十进制 135 168 28 八进制 0207 0250 034 十六进制 0x87 0xA8 0x1C 十转二: 将十进制数,对二取余数,再将本次的商作为被除数继续对二取余,直到商为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 各个进制,不影响整数在内存中的存储方式,内存中都是以二进制存储的。各个进制存在的意义是为了方便我们去阅读数据。 由单引号引起来的一个字符。 注意事项: 必须是单引号引起来的。不能是其他符号。 “a” `a` 反引号 ‘a’ 是字符常量,因为有单引号 只能是单个字符,不能是多个。 ‘a’ ‘ab’//语法错误 如果非要多于一个字符,转义字符是被允许的。 ‘\n’ ‘\0’ \b’ (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 字符在内存中是以整数形式存储的。 字符型和整型的关系 在C语言中,字符就是整数,字符存在的意义是为了让人类看着更舒服。对于计算机而言,字符都是整数。 每个字符在内存中都是以ascii表中对应的编码来存储的。 将数字字符转换成对应的整数 输入一个字符,判定这个字符是否是大写字母。 完成如下功能: 1 显示: “please input a number:” 2 用户输入 3 判断用户输入的数是不是 > 90 判断一个数是否满足条件: a) 是7的倍数 b) 不是3的倍数 如果同时满足,输出该数 输入某一时间,输出它的下一秒:(笔试编程题) 效果示例: 输入: 20 59 59 输出: 21:0:0 存储的。 将数字字符转换成对应的整数 输入一个字符,判定这个字符是否是大写字母。 完成如下功能: 1 显示: “please input a number:” 2 用户输入 3 判断用户输入的数是不是 > 90 判断一个数是否满足条件: a) 是7的倍数 b) 不是3的倍数 如果同时满足,输出该数 输入某一时间,输出它的下一秒:(笔试编程题) 效果示例: 输入: 20 59 59 输出: 21:0:0 要求,如果用户输入了错误的时间,退出 24点退出, 61秒退出#include
#include
4、进制
1. 进制表:
int main()
{
int a = 100;
printf("%d %o %x\n", a, a, a);//输出是什么?
//不同的进制,仅仅是同一个数据不同的显示形式。主要取决于我们开发者看什么样的进制方便。
return 0;
};
2. 二进制转其他
练习:
3. 其他进制转换二进制
练习:
进制总结:
5、字符常量
1. 字符常量:
2. ascii 码
3. 示例:
#include
#include
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
作业1:
作业2:
作业3:
#include
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
作业1:
作业2:
作业3: