- printf用法
- 去除警告 宏 :#define _CRT_SECURE_NO_DEPRECATE
- 框架
- include
- include
- 主函数的基本形式
- include
- 写法规范
- C语言运算符
- 控制语句
- 一、整形
- 属性
- 2.short变量类型
- 3.long
- 4.long long
- 变量取地址
- 字节
- scanf:变量的输入
- 注意:
- 二、浮点型
- 类型转换
- 例题:计算平均
- 字面常数:在程序码内可以使用字面常数来表示已知值的资料,字面常数一样具有型别:
- 字符:(是一种整数的型别)在电脑中储存文字资讯
- 字符类型
- char型别
- putchar
- 程式空壳:
- 怎么选择要使用的类型
- 资料的储存和处理
- 赋值运算子
- 表示式的真或加
- 等号与关系运算子
- 逻辑运算
- 运算子的先后顺序(算术 > 关系 > 逻辑)
- 特殊:
- 条件运算符:
- 求两个数的和
- 程序控制:
- if述句
- 注意点:
- include
- include
- define _CRT_SECURE_NO_DEPRECATE //去除警告(宏)
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- if和Switch的对比
- 两个变量比大小(if-else)
- 猜数字练习(if-else)
- 简易的四则运算
- 对多个变量求最大值
- while循环语句
- for循环 for(循环变量的初始值;循环执行的条件;循环控制变量的变化)
- for循环的灵活性
- 循环嵌套
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- include
- inculde
- include
- 表达式
- 多次运算(Switch)
- if和Switch的对比
- 注意点
- 对比if else
- 灵活性
- include
- include
- include
- include
- include
- include
- 有条件的重复执行
- 至少执行一次的述句
- 复合赋值和递增递减的运算
- 练习:消费金额计算
- for语法
- 绘制特定长度的横线
- 韩信点兵最大值
- 有范围的韩信点兵练习(使用for语句)
- 韩信点兵最大值的练习
- 韩信点兵
- 有次数的韩信点兵
- 质数
- 印出九九乘法表
- 用文字绘制长方形的练习
- 用文字绘制空心长方形
- 用文字绘制实心三角形
- 用文字绘制空心的三角形
- 使用坐标法绘制三角形
- 浮点型的比较
- 死循环无限多的时候中断:CTRL+C
- 指针
- 指针变数的宣告与取值的运算
- 指针型别于取址和间接运算
- 函数呼叫的特性
- 两个变量的数值交换
- 两个变量的排序
- 贪吃蛇
C语言
.png)
.png)
printf用法
去除警告 宏 :#define _CRT_SECURE_NO_DEPRECATE
定义:#define IP 3.14158
框架
include
include
int main(void)
{
system("pause");
return 0;
}
程序执行的过程:
源程序(.c)—编译(目标文件.obj)—链接(可执行文件.exe)—运行程序
进制问题
- 十进制:由
主函数的基本形式
include
int main()
{
语句;
return 0;
}
写法规范
连续注释:
- int a;
int b; - int a,b,c,d;
- int a, //加注释
b, //注释
c,
d;
C语言运算符
优先级 | 运算符 | 名称或含义 | 运算分量 | 运算形式 | 结合方向 |
---|---|---|---|---|---|
1 | |||||
1 | |||||
1 | |||||
1 | |||||
2 | |||||
2 | |||||
2 | |||||
2 | |||||
2 | |||||
2 | |||||
2 | |||||
3 | |||||
3 | |||||
3 | |||||
4 | |||||
4 | |||||
5 | |||||
6 | |||||
7 | |||||
8 | |||||
9 | |||||
10 | |||||
11 | |||||
12 | |||||
13 | |||||
14 | |||||
14 | |||||
14 | |||||
15 |
控制语句
- 分支语句: if ,switch语句
- 循环语句:for.while .do-while语句
- 调换语句: break.continue.goto.return语句
卡住
- system(“pause”);
- getchar();
- while();
1.基本数据类型
整数就是整形数据类型,小数就是浮点型数据类型,一句话叫字符型数据类型
头文件(#include <stdio.h>)
printf("%d/n")
前后都可加提示
可以放多个值,参数“,”隔开,顺序填充
数值类型
字符型
整形(%d:格式化输出符/转义字符 以10进制整数形式 输出 参数/数据)
.png)
%d是10进制,%o是8进制,%x/%X是16进制(进制转换)
浮点型
int
short
long
long long
一、整形
1.int类型变量
写出整数系统默认int类型
问题:1.多,记不住,容易写错
2.修改麻烦
好处:int a=187435
定义一个整形的变量:数用a来代替
换数据直接该一个位置int a=**就可
定义变量:变量名称a,将数赋值给a
- integer缩写
- 关键字
- a变量名:尽量英文
- =:赋值运算符不是等于
- 数据
- 空格:大气好看(int和a之间必须要有空格)
申请一个储存数值的空间进行赋值/重新多次赋值
.png)
申明变量:int a/int b放在函数最前面a=13//常数给变量赋值
//变量和变量赋值:a=b
//连续赋值:a=b=13
//不能给常数赋值
int c;//声明(调试放到变量上显示0xcccccc=变量没有初始化)
int a;//定义并赋值
常量只代表自己;变量值可以变
左操作数必须为左值左值—变量 右值—常量
属性
有符号:
- signed int(signed可省略)
- 表示数的范围(圈的原理)
-2 ^ 31~2 ^ 31-1
-2147483648~2147483647
- 内存大小
@4字节(输出字节:运算符sizeof(放入int或a ))
字节是8个2进制位
位是计算机最小的存储单位
字节是计算机常用的存储数据
一个2进制位只有两个数0或者1
@int b;
b=sizeof()
.png)
无符号
- 写法:unsigned int a ;不可省略
- 输出用printf (“%u\n”,a);%u表示无符号的十进制整形输出
- 表示数的范围:0 ~ 4294967295/0~2^32-1
- 内存大小:4字节
- 得到类型的大小:sizeof(类型/变量名)
两种表示的数的个数一样
- 4294967296个
- 有符号从0分成两部分,个数一边多
- 无符号从0开始
- 选择按照数据的类型(按照意义上来)
2.short变量类型
短整型:short int(int可省略)
- 内存字节数:(《C和指针》标准只规定int不少于short的长度)
2字节
sizeof()取类型的大小
printf(“short:%d\n”,sizeof(变量名/类型));
- 范围:
有符号:signed short -2 ^ 15~2 ^ 15-1 -32768~32767
无符号:unsigned short 0~2 ^ 16-1 0~65535
- 输出格式符:%hd/%d
3.long
长整形 :long int (int可省略)
- 内存字节数:(《C和指针》标准只规定long不小于int的长度)
4字节
- 范围:
有符号:signed short -2 ^ 15~2 ^ 15-1 -32768~32767
无符号:unsigned short 0~2 ^ 16-1 0~65535
- 输出格式符:%ld/%d
4.long long
超长整形 :long long int(int可省略)
注意:C99标准扩展的新类型
vc++6.0不支持
- 内存字节数:
8字节
- 范围:
无符号:unsigned long long int :0~2 ^64-1
有符号:signed long long int :-2 ^63~2 ^63-1
- 输出格式符:%lld/%d
选择取决于数据的大小
变量取地址
字节
一个字节是一个bit b/s kb 1kb=1024bit 1mb=1024kb 1GB=1024MB
电脑内部的具有记忆储存空间元组(byte)为单位组成通常是8位
byte有多个位元(bit)
每个位元存0或1
两个位元是4
2的次方
一般为4G
取地址运算符:& 输出用%p
.png)
内存的地址以16进制的形式表示%p/10进制也可
表达式:&a/12+13==(规定:每一个表达式都有自己的运算结果)==
语句:表达式+;
给地址加前缀(0x):%#p
scanf:变量的输入
- 形式:scanf(“%d”,&a);
格式:%d这个一定要跟变量a类型对应上
&a:一定要取地址
输入后回车结束
输入类型和变量要相同
- 可以输入多个scanf (“%d%d/%d %d”,&a,&b);
.png)
分割符:转义字符中间用什么隔开,输入就用什么分开
字母符号均可
加提示:scanf前放printf配合(内不要加\n)
.png)
注意:
- scanf()不要加换行什么的
- 分隔符一定要跟程序的一样:比如逗号,程序里用英文,输入时候就要用英文逗号
- 消除警告:vs2012及以下版本会报警报,方法:用scanf_s替换scanf
- 第二种:文件首加宏
.png)
- 第三种:在int前加:#pragma warming(disable:4996)
- 消除报错:在vs2013中和vs2015中,scanf这个会报错
- 第一种:用scanf_s替换scanf
- 第二种:文件首加宏:参见消除警报方法二!
二、浮点型
定义:
- float a = 12.13;
- double b;
- long double c;
输出:
- %f float 默认是打印6位小数
- %lf double long double 不初始化不行
- %e 科学计数法
属性/区别:
float:
- 内存大小:4字节 sizeof(float)
可表示数的范围
正数部分:1.17549e-038 ~ 3.40282e+038
负数部分:-3.40282e+038 ~ -1.17549e-038
0.0:浮点数赋值要赋值0.0,不要赋值0
.png)
标准规定:指数范围不小于-37~38
看编译器默认的这个值:宏:FLT_MIN 头文件: float.h
有效数位(单精度)
ANSI C规定的最小值是6
注意不是小数的为数,是第一个非0数字计算的
windows是7位: 12345.6789 1.2456789
使用
float和double常用
double:
- 内存大小:8字节
可表示数的范围
正数部分:+1.79769e-308 ~ +2.22507e+308
负数部分:-1.79769e+308 ~ -2.22507e-308
0.0
标准格式:指数范围不少于-37 ~38
有效位数(双精度)
ANSI C规定的最小值是10位 windows是15位
实测16位
long double:
- 内存大小:不小于double,没有明确规定,编译器不同节数不同
- 表示数的范围:vs的话跟double是一样的
- 有效数位(精度):ANSI C规定最小值是10位 Windows是18
==后缀直接一个小数默认为double
long double:小数后加l/L
long double ld=123.456L/l;
注意:
如果不是对应的,会涉及到类型的转换,类型转换的结果可能就会造成内存阶段,导致数据不是我们想要的
只有数值类型一样考虑。计算机才能进行计算,不一样就转成一样的,转不成就会报错
输入输出
printf
输出的字串可以用类似字元跳脱的方法,放置一些格式符来输出特定格式的资料
d或i十进位数有号整数
u 十进位无号整数
o 八进位无号整数
x十六进位无号整数
X十六进位无号整数
f 十进位浮点数
scanf
scanf (要输入的资料格式,变数位置)
i 任何格式的整数
d十进位有号整数
u十进位无号整数
f十进位浮点数
%f,%lf这两个都行,输出没有严格要求
默认是6位小数
第六位四舍五入
%5.2f
%e科学计数法
5代表整个数占据屏幕多少个字符位
.表示小数点的
2表示小数得位数,第二位是四舍五入
-是向左对齐
float %f
double %lf
long double %lf
这个输入要求极为严格,如果对应不上,就会输入失败
类型转换
(int) / (int)会得到 (int) 有小数用double average—-%f(隐形转型)
隐形转型:当整数转型成浮点数时,如果在可表示发范围里面,会转型成最接近的浮点数值
- 表达式计算时的转换
- 赋值转换
隐形转型是当运算有需要时自动发生的
规范化转换:表达式中有short,char类型,在运算前先转换成int型,unsigned short类型先转换成unsigned int型,float类型先转换成double型,这种转换称为规范化
保值转换:运算符两端操作类型不一样,在运算前先将类型等级低的转换为类型等价高的
显性转型是当我们有需要时直接强加的
不一样型别的值做算术运算的结果
当两个不一样整数或浮点数型别的值做算术运算时,如果可以算,会隐形转型成范围较大的型别并算出该型别的值:
(int)+ (float) → (float)+ (float) → (float)
(double)+ (float) →(double)+ (double)→(double)
(int) + (double) → (double) + (double) → (double)
例题:计算平均
无小数
有小数(转型)
.png)
得到对应的数值:/3.(double)
.png)
运算做了3次转型:
float average = (num1 + num2 +num3) / (double) 3;
第一次:显性转型:(double) 3;
第二次:隐形转型:(num1 + num2 +num3) / (double) 3
第三次:隐形转型:float average =3.3333f;
字面常数:在程序码内可以使用字面常数来表示已知值的资料,字面常数一样具有型别:
123 ———int ,long int
123.45————-double
1223.456f———-float
字符:(是一种整数的型别)在电脑中储存文字资讯
将字长什么样子或是哪个字两种资讯分开
字长什么养样子
字型
当我们需要输出文字(与人互动)时才需要用到
- 怎么存储是哪个字的资讯
给每个字符一个独一无二的编号
编码
字符有几种可能
一般是英文键盘可以输入的字符;
英文字母:52种
数字:10种
常用符号:20~30种
一共不到256种
我们只需要使用一个位元组就可以表示了
C语言使用的字符编码
使用哪种编码是实作定义
一般常用的编码是ASCII(美国资讯交换标准代码)
不管使用哪种编码都必须要包含大小写英文字母、数字及一些常见的符号
字符类型
C语言主要是两种字符类型:
char
wchar_t
一般我们使用的是char型别,而wchar_t型别则是使用在宽字元。
char型别占用的记忆位大小为1个位元组。
多种可能:使用多个char或者wchar_t表示
char型别
char型别的特点
常见的是使用ASCII编码
char型别占用一个位元组
char型别是一种整数型别
char的字面常数
用一组单引号括住:’A’ ‘a’ ‘0’ ‘\n’ 用双引号括住的是字串
.png)
printf或scanf的字元格式符
使用%c
char型别做运算
‘A’ + 1得 到 ‘ B’
65 66
‘a’ + 1得到 ‘b’
97 98‘A’ -1得到’@’
65 64
‘A’ + ‘1’得到 ‘r’
65 49 114
练习:字符的大小间转换
- 如果使用者输入 A,则程式要输出 a
- 如果使用者要输入 B,则程式要输出b
- 如果使用者输出 Z,则程式要输出z
#include <stdio.h>
int main () {
char input,output;
printf("输入一个字母:");
scanf("%c",&input);
output = input + 32;
printf("%c\n",output);
return 0;
}
#include <stdio,h>
int main () {
char input,output;
printf("输入一个字母:");
scanf("%c",&input);
output = input + ('a'-'A');
printf("%c\n",output);
return 0;
}
putchar
putchar()函数的功能是向终端输出一个字符,其中,函数的参数可以是字符常量,变量或表达式,也可以是转义符,还可以是整数,如果要输出单引号,应使用putchar(‘/”)
#include<stdio.h>
void main()
{
char a,b,c;
a = 'B';b='O';c='Y';
putchar(a);putchar('\n');
putchar(b);putchar('\n');
putchar(c);putchar('\n');
}
程式空壳:
#include <stdio.h>
int main() {
return 0;
}
怎么选择要使用的类型
资料的储存和处理
储存 处理
记忆 运算
(记忆体) (CPU)
- 先乘除后加减
- 每一步结果:暂时物件(具有型别跟值)算完就会消失
- 算完的结果也叫暂时物件
- 表示式(表示一笔资料)(具有型别跟值)
注意:整数除法两数相除的时候要注意和浮点数除法的区别
浮点数除法:(double)3/3.
%代表将两个数相除求余数 整数可用 浮点数不可用,先后顺序较高,,,由左到右 、
赋值运算子
- = 是赋值运算子,赋值运算会做两件事情:
赋值运算子会将右方的值复制给左方的变数
赋值运算的运算结果是左方变数最后的型别跟值
左方要放一个要改变的变数
左方变数值的改变是一种副作用( side effect)
赋值运算子的先后顺序比大部分运算子都低
赋值运算子的运算顺序是由右向左
int a,c;
double b,d;
a = b = c = d =3 + 7/2;
double变int隐形转换无条件舍去
表示式的真或加
非零的值为真,零的值为假
1为真
0为假
-1为真
2为真
0.001为真
‘A’为真
‘\0’为假
\是跳脱的概念
空字元(null character)[编号0号的字元]
等号与关系运算子
运算子 | 运算内容 | 范例 | 结果 |
---|---|---|---|
> | 大于 | 3 > 5 | 0 |
< | 小于 | 3 < 5 | 1 |
== | 等于 | 3 == 5 | 0 |
!= | 不等于 | 3 != 5 | 1 |
>= | 大于等于(不小于) | 3 >= 5 | 0 |
<= | 小于等于(不大于) | 3 <= 5 | 1 |
结果为假的话,算出 Int 的 0
结果为真的话,算出 int的 1
(C语言的设计)
==3 == 5跟 3 = 5有什么不一样:35比较3和5是否相等,不相等,输出0 3 = 5试着把右边的值给左边,但3不是变量 所以是语法错误
3 > 2 > 1是真还是假?
(每次只进行一次运算)3 > 2 > 1等同于1 > 1的意思;因为3 > 2正确,输出1,1 > 1错误,所以输出0
逻辑运算
逻辑运算子(关系运算子优先于&&或||)
运算子 | 运算内容 | 范例 | 结果 |
---|---|---|---|
&& | 而且 | 3 > 2 && 2>1 | 1 |
|| | 或者 | 3 > 2 || 2 > 3 | 1 |
不一定要都求出两边运算元的值才能算,||只要计较左边满足即可短路求值(short circuit evaluation)
运算子 | 运算内容 | 范例 | 结果 |
---|---|---|---|
! | 非 | ! (3>2) | 0 |
相当于3 <= 2
跟 !3 > 2 有什么不一样
3是非零,所以是真,!3输出是假=0,相当于0 > 2为假,输出0
怎么表示a > b > c这个条件
3 > 2 && 2 > 1
运算子的先后顺序(算术 > 关系 > 逻辑)
顺序 | 运算子 | 运算类型 | 结合顺序 | 运算元个数 |
---|---|---|---|---|
1 | * / % | 算术运算 | 由左往右 | 二元运算子 |
2 | + - | 算术运算 | 同上 | 同上 |
3 | > < >= <= | 关系运算 | 同上 | 同上 |
4 | == != | 关系运算 | 同上 | 同上 |
5 | && | 逻辑运算 | 同上 | 同上 |
6 | || | 逻辑运算 | 同上 | 同 |
&&优先于||
1. a + b > c - d == a > d:先加减,后按由左往右的顺序比较大小,最后比相等
2. (a + b > c - d)== (a > d): 优先算小括号内的左右两边算完再比较是否相同
3. a > b && b > c || a < b && b < c :先比较大小,后&&,最后||和例4相同意思
4. (a > b && b > c)|| 1(a < b && b <c):先计算括号内的运算最后||
特殊:
顺序 | 运算子 | 运算类型 | 结合顺序 | 运算元个数 |
---|---|---|---|---|
特殊 | ! | 逻辑运算 | 由右往左 | 一元运算子 |
特殊 | = | 赋值运算 | 由右往左 | 二元运算子 |
!a > b !(a > b) 先比较a和b,再取非 !!(a > b)由右往左
a = b = c + d 先加后赋值,由右往左
条件运算符:
格式:条件 ? 真:假;
1 ? printf ("真\n"):printf ("假\n");
优先级:低
条件运算符镶嵌
- 从右向左 找一套
- 转成if结构
- 结合性
求两个数的和
#include <stdio.h>
int main(){
int integer1;
int integer2;
int sum;
printf("Please enter the first integer:");
scanf("%d",&integer1);
printf("Please enter the second integer:");
scanf("%d",&integer2);
sum = integer1 + integer2;
printf("Sum is %d.\n",sum);
return 0;
}
程序控制:
- 无条件的执行一次(一般述句)
- 有条件的执行一次(if述句)
- 无条件的重复执行(无穷回圈)
- 有条件的重复执行(while述句)
- 计次型重复执行(for述句)
- 选择性的执行一次(Switch述句)
- 至少执行一次下有条件的重复执行(do-while述句)
- if > for > while > switch > do-while
有条件的执行(if述句)
if述句
if(表示式){程式片段}
如果表达式成立,就执行程式片段#include <stdio.h> int main() { int a = 5;或3; printf("a is larger than 4.\n"); return 0; } 结果:a is larger than 4.
#include <stdio.h> int main(){ int a = 5; if (a > 4) { printf("a is larger than 4.\n"); } return 0; }
#include <stdio.h> int main(){ int a; printf("a = "); scanf("%d",&a); is (a > 4) { printf("a is larger than 4.\n"); } return 0: }
#includ <stdio,h> int main(){ int a = 5; if (a >4) { printf("a is larger than 4.\n"); } if (a < 4) { printf("a is smaller than 4.\n"); } if (a == 4) { \\注意是== printf("a is equal to 4.\n"); } return 0; }
if(表达式1,表达式2,表达式3)
表达式1正确,if输出表达式2的值
表达式1错误,if输出表达式3的值
注意点:
加花括号:当我们得if代码块只有一条语句的时候,可以不加花括号
- 不要随意加分号
条件的写法
错误写法:if (a == 1,2,3,4,5) 正确写法:if( 2 == a || 3 == a)
区间条件的写法 连续比较:错误写法:12< a <14 60 <= a <= 70(正确的语法,只不过产生错误的逻辑) 比如a==15 正确写法:a> 12 && a<14 60 <= a && a <=70
if (a = 2)//赋值 if(2 == a)//比较 避免:60 == a
嵌套
int main(void) { if () { if () { if () {
}
}
if()
{
}
}
system("pause");
return 0;
}
<a name="38c1268c"></a>
### 成绩
define _CRT_SECURE_NO_DEPRECATE //去除警告(宏)
include
include
int main(void) { //成绩的变量 int score = -1; //初始化不要影响本身的值 //输入成绩 printf(“请输入成绩:”);
scanf("%d", &score);
//判断
if (score >= 60 && score >=0 && score <= 100)
{
//满足,打印及格
printf ("%d分及格\n",score);
}
//跳过,程序结束
system("pause");
return 0;
}
<a name="d41d8cd9"></a>
#
<a name="70a508e4"></a>
## 猜数字
include
int main() { int answer = 4; int guess; printf(“Please enter your guess:”); scanf(“%d”,&guess); if (guess > answer ) { printf(“Too lager!\n”); } if (guess < answer) { printf(“Too small!\n”); } if(guess == answer) { printf(“Correct!\n”); } return 0; }
<a name="d4739174"></a>
## 满额折扣计算练习
-
<a name="fe7a8113"></a>
#### 某吃到饱餐厅的套餐1人300元(无额外的费用)。今日因周年特价方案,每桌消费满3000元就打八折。试写一程式让服务生输入一桌的消费人数后,输出该桌顾客应付的数额。
include
int main(){ int number, total; printf(“Please enter the number of customers:”); scanf(“%d”,&number); if (300 number < 3000) { total = 300 number; } if (300 number >= 3000) { total +300 number * 0.8; } printf(“Total: %d\n”,total); return 0; }
include
int main() { int number, total, original; printf(“please enter the number of customers:”); scanf(“%d”,&number); original = 300 number; if (orignal < 3000) { total = original; } if (original >= 3000) { tatal = original 0.8; } printf(“Total: %d\n”,total); return 0; }
include
int main(){ int number, total; printf(“Please enter the number of customers:”); scanf(“%d”,&number); total = 300 number; if (total < 3000) { total = total; } if (total >= 3000) { total = total 0.8; } printf(“Total:%d\n”,total); return 0; }
include
int main(){ int number,total; printf(“Please enter the number of customers:”); scanf(“%d”,&number); total = 300 number; if (total >= 3000) { total = total 0.8; } printf(“Total: %d\n”, total); return 0; }
<a name="f9891066"></a>
## 正三角形判断练习
<a name="b3a31aef"></a>
#### 输入某三角形的是三边长(皆为整数),判断这三角形是不是正三角形(regular triangle)?
include
int main() { int side1, side2, side3; printf(“Please enter the lengths:”); scanf(“%d%d%d”, &side1, &side2, &side3); if (side1 == side2) { if (side2 == side3) { printf(“Regular triangle\n”); } } return 0; }
include
int main() { int side1, side2, side3; printf(“Please enter the lengths:”); scanf(“%d%d%d”,&side1,&side2,&side3); if (side1 == side2 && side2 ==side3) { printf(“Regular triangle\n”); } return 0; }
<a name="6f8de047"></a>
## 等腰三角形判断练习
<a name="ef280b7b"></a>
#### 输入某三角形的三边长(皆为整数),判断这三角形是不是等腰三角形(isosceles triangle)?
include
int main() { int side1, side2, side3; printf(“Please enter the lengths:”); scanf(“%d%d%d”, &side1, &side2, &side3); if (side1 == side2 || side2 == side3 || side1 ==side3) { printf(“Isosceles triangle\n”); } return 0; }
<a name="ac69bf0e"></a>
## 直角三角形判断练习
<a name="a17eca71"></a>
#### 输入某三角形的三边长(皆为整数),判断这三角形是不是直角三角形(rectangular triangle)?
include
int main() { int side1, side2, side3; printf(“Please enter the lengths:”); scanf(“%d%d%d”, &side1, &side2, &side3); if(side1 side1 + side2 side2 == side3 side3 || side2 side2 + side3 side3 == side1 side1 || side2 side2 +side3 side3 == side1 * side1) { printf(“Rectangular triangkle\n”); } return 0; }
<a name="40c5959f"></a>
## 三角形种类判断练习
include
int main() { int side1, side2, side3; printf(“Please enter the lengths:”); scanf(“%d%d%d”,&side1 ,&side2, &side3); if (side1 == side2 && side2 == side3) { printf(“Rrgular triangle\n”); } if (side1 == side2 || side1 == side3 || side2 == side3) { printf(“Isosceles triangle\n”); } if (side1 side1 + side2 side2 == side3 side3 || side1 side1 + side3 side3 == side2 side2 || side2 side2 + side3 side3 == side1 * side1) { printf(“Rectangular triangle\n”); } return 0; }
<a name="47807826"></a>
## 三角形种类判断练习(简化)
如果 side1 <=side2<=side3
include
int main() { int side1, side2 ,side3; printf(“Please enter the lengths:”); scanf(“%d%d%d”, &side1, &side2, &side3); if (side1 == side3) { printf(“Reglar triangle\n”); } if (side1 == side2 || side2 == side3) { printf(“Isosceles triangle\n”); } if(side1 side1 + side2 side2 == side3 *side3) { printf(“Rectangular triangle\n”); } return 0; }
<a name="3d1e96c5"></a>
# 和三角形有关的计算
include
include
int main(){ printf(“欢迎使用本系统\n”);
while (1) {
double a, b, c, s, area;
int side1, side2 ,side3;
printf("Please enter the number of a: ");
scanf("%lf",&a);
printf("Please enter the number of b: ");
scanf("%lf",&b);
printf("Please enter the number of c: ");
scanf("%lf",&c);
if(a+b>c&&a+c>b&&c+b>a) {
s= (a+b+c)/2.;
area = sqrt(s*(s-a)*(s-b)*(s-c));
printf("a = %.2f ,b = %.2f , c = %.2f\n",a,b,c);
printf("area = %.4f\n", area);
}else {
printf("No!\n");
}
if (a == c) {
printf("Reglar triangle\n");
}
if (a == b || b == c) {
printf("Isosceles triangle\n");
}
if(a * a + b * b == b *b) {
printf("Rectangular triangle\n");
}
}
return 0;
}
<a name="7e8dc526"></a>
# 对两个变量求最大值
include
int main() { int a, b, max; printf(“Please enter the integer:”); scanf(“%d”,&a); printf(“Please enter the integer:”); scanf(“%d”,&b); if (a >= b) { max = a; } if ( a < b) { max = b; } printf(“The maximun is %d.\n”,max); return 0; }
include
int main() { int a, b, max; printf(“Please enter the integer:”); scanf(“%d”,&a); printf(“Please enter the integer:”); scanf(“%d”,&b); max = a; if (max < b) { max = b; } printf(“The maximun is %d.\n”,max); return 0; }
<a name="cb629d42"></a>
# 对三个变量求最大值
include
int main() { int a, b, c, max; printf(“Please enter three integers: “); scanf(“%d%d%d”, &a, &b, &c); max = a; if (b > max) { max = b; } if (c > max) { max = c; } printf(“The maxinum is &d.\n”,max); return o; }
<a name="ac442717"></a>
# 对四个变量求最大值
include
int main() { int a, b, c, d, max; printf(“Please enter four integers: “); scanf(“%d%d%d%d”, &a, &b, &c, &d); max = a; if(b > max) { max = b; } if(c > max) { max = c; } if(d > max) { max = d; } printf(“The maxinum is %d.\n”,max); return o; }
<a name="aa7a40a4"></a>
# 对多个变量求最小值
include
int main() { int a,b, min; printf(“Please enter tow integers: “); scanf(“%d%d”,&a ,&b); min = a; if(b < min) { min = b; } printf(“The mininum is %d.\n”,min); return 0; }
include
int main() { int a, b, c, min; printf(“Please enter four integers: “); scanf(“%d%d%d”, &a, &b, &c); min = a; if(b < min) { min = b; } if(c < min) { min = c; } printf(“The mininum is %d.\n”,min); return 0; }
<a name="fbba6101"></a>
# 对多个变量求中位数
include
int main() { int a, b, c, med; printf(“Please enter three integers: “); scanf(“%d%d%d”, &a, &b, &c); med = a; if (a <= b && b <= c || c <= b && b <= a) { med = b; } if (a <= c && c <= b || b <= c && c <= a) { med = c; } printf(“The median is %d.\n”,med); return 0; }
<a name="ede2c002"></a>
# 对多个变量排序
<a name="c407bbfd"></a>
## 数值交换
int old_side1; old_side1 = side1; side1 = side2; side2 = old_side1;
include
int main() { int a,b,t; scanf(“%d%d”, &a, &b); printf(“Before:%d %d\n”,a,b); if (a > b) { t = a; a = b; b = t; } printf(“After: %d %d\n”,a,b) return 0; }
<a name="b7cbd48e"></a>
## 三个变量的数值交换
include
int main() { int a = 2, b = 7, c = 9, t ; printf(“Before: %d %d %d\n”,a ,b ,c); t = a ; a = c; c = t; t = b; b = c; c = t; printf(“After: %d %d %d\n”,a, b, c); return 0; }
<a name="27aa8d9c"></a>
## 对三个变量依照大小排序
<a name="869e7d4f"></a>
#### 漏洞
include
int main() { int a, b, c, t; scanf(“%d%d%d”,&a ,&b); printf(“Before: %d %d %d\n”,a, b, c); if (a < c && c < b) { t =b; b = c; c = t ; } if (b < a && a < c) { t = a; a = b; b = t; } if (b < c && c < a) { t = a ; a = b ; b = c ; c = t; } if (c < a && a < b) { t = a ; a = c ; c = b ; b = t; } if (c < b && b < a) { t = a; a = c; c = t; } printf(“After: %d %d %d\n”,a ,b, c); return 0; }
<a name="e55b0968"></a>
## 用对两个变量的数值交换对三个数进行排序
include
int main(){ int a, b, c, t; scanf(“%d%d%d”, &a, &b, &c); printf(“Before: %d %d %d\n”, a, b, c); if (b < a) { t = b; b = a; a = t; } if (c < a) { t = c; c = a; a = t; } if (c < b) { t = c; c = b; b = t; } printf(“After: %d %d %d\n”, a, b, c); return 0; }
<a name="3a8f2073"></a>
# 当if的{}内只包含一条述句是,{}可以省略
<a name="fbddba5e"></a>
## 用排序简化三角形判断的条件
include
int main() { int side1, side2, side3, t; printf(“Please enter the lengths: “); scanf(“%d%d%d”, &side1, &side2 , &side3); if (side1 > side2) { t = side1; side1 = side2; side2 = t;} if (side1 > side3) { t = side1; side1 = side3; side3 = t;} if (side2 > side3) { t = side2; side2 = side3; side3 = t;} if (side1 == side3) printf(“Regular triangle\n”); if (side1 == side2 || side2 == side3) printf(“Isosceles triangle\n”); if (side1 side1 + side2 side2 == side3 * side3) printf(“Rectangular triangle\n”); return 0; }
<a name="2e0e489e"></a>
# if-eles述句
if (表达式) {程序片段一} else {程式片段二}
- 如果(表达式)成立,就执行 {程式片段一}
- 如果(表达式)成立,就执行{程式片段二}
include
int main() { int grade; printf(“Please enter the grade: “); scanf(“%d”, &grade); if (grade >= 60) { printf(“PASS”); } else { printf(“FALL”); } return 0; }
include
int main() { int grade; printf(“Please enter the grade: “); scanf(“%d”, &grade); if (grade >= 60) printf(“PASS”); else printf(“FALL”); return 0; }
include
include
int main(void) { int a = 60;
if ( a >= 60)
{
printf ("及格\n");
}
else
{
printf ("不及格\n");
}
system("pause");
return 0;
}
<a name="f16908f7"></a>
## 注意点
- 不要随便加分号
- else后面没有条件
- else必须跟if挨着
- else跟同层的,上边的最近的if匹配
include
include
int main() { if(b > 60) { if(b > 60) { printf(“及格\n”); } else { printf(“不及格\n”); } } else { if(b > 60) { printf(“及格\n”); } else { printf(“不及格\n”); } }
system("pause");
return 0;
}
<a name="e98ca302"></a>
### if语句(多选一)
if(条件){} else if(条件){} else{}
```
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 65;
if (a < 60)
{
printf("不及格\n");
}
else if (a >= 60 && a < 70)
{
printf("良\n");
}
else if (a >= 70 && a < 80)
{
printf("好\n");
}
else if (a >= 80 && a < 90)
{
printf("优\n");
}
else
{
printf ("完美\n");
}
system("pause");
return 0;
}
例子:重复打出学生的成绩进行评级输入-1退出系统,输入非法数据提示重新输入,并重新输入,提示欢迎使用系统与感谢使用本系统
//1、提示欢迎
//2、开始,循环
//3、输入一个数
//4、检测这个数
//-1 退出
//检测分数,不合法就重新输入
//分数分级
//5、感谢使用
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf ("欢迎使用本系统\n");
while (1)
{
int value = -1;
printf ("请输入一个分数(0~100),输入-1退出系统:");
scanf ("%d", &value);
if (-1 == value)
{
break;
}
if (value < 0 || value > 100)
{
printf ("输入的指令非法,请重新输入\n");
continue;
}
if(value < 60 )
{
printf("不及格\n");
}
else if (value >= 60 && value < 70)
{
printf("及格\n");
}
else if (value >= 70 && value < 80)
{
printf("良\n");
}
else if (value >= 80 && value < 90)
{
printf("优秀\n");
}
else
{
printf("完美\n");
}
}
system("pause");
return 0;
}
if和Switch的对比
#inclued <stdio.h>
#include <stdlib.h>
int main(void)
{
int order = -1;
scanf("%d", &order);
if (1 == order)
{
printf ("添加一个学生\n");
}
else if (2 == order)
{
printf("删除一个学生\n");
}
else if (3 == order)
{
printf("浏览学生信息\n");
}
else if (4 == order)
{
printf("推出系统\n");
}
else
{
printf ("系统不存在该指令\n");
}
system("pause");
return 0;
}
两个变量比大小(if-else)
#include <stdio.h>
int main() {
int a, b;
printf("Please enter a and b: ");
scanf("%d%d", &a, &b);
if (a > b) {
printf("a > b\n");
}else {
if(a < b) {
printf("a < b\n");
}else{
if (a == b) {
printf("a = b\n");
}
}
}
return 0;
}
#include <stdio.h>
int main() {
int a, b;
printf("Please enter a and b: ");
scanf("%d%d", &a, &b);
if (a > b) {
printf("a > b\n");
}else {
if(a < b) {
printf("a < b\n");
}else{
printf("a = b\n");
}
}
return 0;
}
#include <stdio.h>
int main() {
int a, b;
printf("Please enter a and b: ");
scanf("%d%d", &a, &b);
if (a > b)
printf("a > b\n");
else
if(a < b)
printf("a < b\n");
else
printf("a = b\n");
return 0;
}
猜数字练习(if-else)
#include <stdio.h>
int main() {
int guess;
printf("Please enter your guess: ");
scanf("%d", &guess);
if (guess > 4) {
printf("Too large!\n");
} else {
if (guess < 4) {
printf("Too small!\n");
} else {
if (guess = 4) {
printf("Correct!\n");
}
}
}
return 0;
}
#include <stdio.h>
int main() {
int guess;
printf("Please enter your guess: ");
scanf("%d", &guess);
if (guess > 4)
printf("Too large!\n");
else
if (guess < 4)
printf("Too small!\n");
else
printf("Correct!\n");
return 0;
}
#include <stdio.h>
int main() {
int answer = 4;
int guess;
printf("Please enter your guess: ");
scanf("%d", &guess);
if (guess > answer)
printf("Too large!\n");
else if (guess < answer)
printf("Too small!\n");
else
printf("Correct!\n");
return 0;
}
简易的四则运算
op:字元形态运算符号 char op
#include <stdio,h>
int main() {
int num1, num2;
char op;
float answer;
scanf("%d%C%d", &num1, &op, &num2);
if (op == '+') {
answer = num1 + num2;
} else if (op == '-') {
answer = num1 - num2;
} else if (op == '*') {
answer = num1 * num2;
} else is (op == '/') {
answer = (float)num1 / num2;
}
printf("ANS: %f\n", answer);
return 0;
}
对多个变量求最大值
#include <stdio.h>
int main() {
int a, b, max;
printf("Please enter two integers: ");
scnaf("%d%d", &a. &b);
if (a >= b) {
max = a;
} else {
max = b;
}
printf("The maxinum is %d.",max);
return 0;
}
#include <stdio.h>
int main() {
printf("Please enter three integers: ");
scanf("%d%d%d", &a , &b, &c);
if (a >= b && a >= c) {
max = a;
} else if (b >= a && b >= c){
max = b;
} else {
max = c;
}
printf("The maxinum is %d.",max);
return 0;
}
while循环语句
#include <stdio.h>
#include <stdilb.h>
int main(void)
{
int i = 1; //初始值
while (i <= 5) //关键字和条件(满足条件执行代码块,不满足就跳出循环)
{
printf ("%d ", i);!
i++;
}
systen("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 1;
while (i <= 5)
printf("%d ", i++); //只有这一句在循环内,下面再有也不算循环
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 1;
while (i <= 5)
{
printf("%d ", i++);
printf("que");
} //加花括号才能算是在循环内
//一条语句不用加,多条语句需要加
system("pause");
return 0;
}
for循环 for(循环变量的初始值;循环执行的条件;循环控制变量的变化)
- for (初始式;条件式;回圈式) {程式片段}
- 执行初始式。
- 当条件式成立时,执行程式片段。否则就结束回圈
- 执行回圈式后再回到上一步。
for (初始式;条件式;回圈式) {
程式片段
}
相当于
初始式;
while (条件式) {
程式片段
回圈式;
}
int count = 1;
while (count <= 10) {
printf("%d\n", count);
count = count + 1;
}
int count;
for (count = 1; count <= 10; count = count + 1){
printf("%d\n",count);
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i ;
for(i = 1; i <= 5 ; i++)
{
printf("%d",i);
}
system("pause");
return 0 ;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i ;
for(i = 1; i <= 5 ; i++)
{
printf("%d",i);
}
printf("%d",i); //输出结果的后面多一位
system("pause");
return 0 ;
}
for循环的灵活性
语句一
通常是做循环控制变量的初始值
可一些多条赋值语句,之间用逗号
可以什么也不写但是分号一定不能丢
可以写其他表达式,甚至写个函数调用都行
综合:只要是合法语句都能写,通常,循环控制变量的初始值
语句二
必须写条件
可以什么也不写,表示真,死循环
甚至可以加一个函数
综合:只要是合法的语句都可以写,通常,条件
语句三
一般写循环控制变量的变化
可以写多个变化,逗号隔开
可以什么都不写 变化可以放在代码块内
综合:只要是合法的语句都能写,通常,循环控制变量的变化
循环嵌套
嵌套的格式(多样化)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
for(;;)
{
for(;;)
{
for(;;)
{
}
}
for(;;)
{
}
}
system("pause");
return 0;
}
执行次数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, //外部循环控制变量
j; // 内部循环控制变量
int nCount = 0; //计数器
for (i= 1; i <= 3; i++) //三次
{
for (j = 1; j < 3; j++) //两次
{
nCount++;
printf("次数\n", n Count); //一共六次
}
}
system("pause");
return 0;
}
执行顺序
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, //外部循环控制变量
j; // 内部循环控制变量
int nCount = 0; //计数器
for (i= 1; i <= 3; i++) //三次
{
printf ("外部循环\n");
for (j = 1; j < 3; j++) //两次
{
nCount++;
printf("次数\n", nCount); //一共六次
}
}
system("pause");
return 0;
}
注意点
int main(void) { int i = 1, j = 1;
while (i <= 3)
{
while(j < 3)
{
printf("次数\n");//两次
j++;
}
i++;
}
system("pause");
return 0;
}
```
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 1,
j = 1;
while (i <= 3)
{
j = 1;
while(j < 3)
{
printf("次数\n");//;六次
j++;
}
i++;
}
system("pause");
return 0;
}
int main(void) { int i;
int nCount = 0; //计数器
for (i= 1; i <= 3; i++)
{
printf ("外部循环\n");
for (i = 1; j < 3; j++)
{
nCount++;
printf("次数\n", nCount); //三次
}
}
system("pause");
return 0;
}
- 内层循环第一个语句不设置 语法通过,但是逻辑可能不通过
include
include
int main(void) { int i=1, //外部循环控制变量 j=1; // 内部循环控制变量 int nCount = 0; //计数器
for (; i <= 3; i++)
{
printf ("外部循环\n");
for (; j < 3; j++)
{
nCount++;
printf("次数\n", nCount); //一共两次
}
}
system("pause");
return 0;
}
include
int main() { int N; printf(“Please enter the number: “); scanf(“%d”, &N); int count; for (count = 1; count <= N; count++) { printf(“%d\n”,count); } return 0; }
include
int main() { int M, N; printf(“Please enter the number M : “); scanf(“%d”, &M); printf(“Please enter the number N: “); scanf(“%d”, &N); int count; for (count = M; count <= N; count++) { printf(“%d\n”, count);
}
return 0;
}
<a name="fbceae28"></a>
### 入口条件循环和退出条件循环
- 入口条件循环:先判断再循环
- 退出条件循环:先循环再判断
<a name="0336a8b5"></a>
## do{} while{}循环
include
include
int main(void) { // 1 2 3 4 5 int i = 1;
do
{
//代码块
priintf("%d",i);
i++;
}while( i <= 5);
system("pause");
return 0;
}
<a name="9155af53-1"></a>
#### 注意:
- 最后要有分号
- 条件的意义,跟之前咱们说的条件都是一样的
- 执行的顺序
include
include
int main(void) { // 1 2 3 4 5 int i = 1;
while(i <= 5)
{
//代码块
printf("%d", i);
i++;
}
printf("\n");
i = 1; // 重置
do
{
//代码块
priintf("%d",i);
i++;
}while( i <= 5);
system("pause");
return 0;
}
- 与while和for循环的区别
> do while至少执行一次,即使我们得条件有限,也执行一次代码块
>
> 执行多次效果一样的
<a name="458345fb"></a>
# break和continue
<a name="4a2ed190"></a>
## 一、break跳出所在循环
- 配合if使用
include
include
int main(void) { // 1 2 3 4 5 int i = 0; for ( i = 1; i <= 5; i++) { if ( 3 == i ) { break; } printf (“%d”, i); }
system("pause");
return 0;
}
- 嵌套只跳所在循环,不是跳所有
inculde
include
int main() { int i, j; for (i = 1; i <= 2; i++) { for (j = 1; j < 4; j++) { printf (“2\n”); if (2 == j) { break; } } if (2 == j) { break; } } system(“pause”); //输出两个 return 0; }
```
#inculde <stdio.h>
#include <stdlib.h>
int main()
{
int i,
j;
for (i = 1; i <= 2; i++)
{
for (j = 1; j < 4; j++)
{
printf ("2\n");
if (2 == j)
{
break;
}
}
}
system("pause"); //输出四个
return 0;
}
- 循环之外不能写break
二、continue执行下一次循环
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0;
for (i = 1; i <=5; i++)
{
printf("前半句 ");
continue; //直接执行i++
printf("后半句\n ");
}
system("pause");
return 0;
}
举例:打印1 ~ 20的奇数/偶数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0;
for (i = 1; i <= 5; i++)
{
if (i % 2 == 0 ) / if (i % 2 != 0)
{
continue;
}
printf ("%d", i);
}
system("pause");
return 0;
}
- 只在循环中使用
表达式
- 定义 :表达式是一种有值的语法结构,它是由运算符将(变量、常量、函数调用返回值)结合而成。 每个表达式一定有一个值 | 名称 | 例子 | 值 | | —- | —- | —- | | 变量常量表达式 | a,12,12.4 | 1.就是变量或常量本身的值 2.作为条件时:非0即真,0即假 | | 算数表达式 | a+b c*d+a 12/3+d i++ —a | 1.就是计算的结果2. 作为条件时:非0即真,0即假 | | 赋值表达式 | a = 12 a+=12 a =c =d | 1.赋值完毕a的值,即为结果2.作为条件时:非0即真,0即假 | | 关系表达式 | a > b 2 == 3 | 1.1 0 2.作为条件的时候:非0即真,0即假 | | 逗号表达式 | (1 , 2 , 3 , 4 ,a) | 1.最右边的值是逗号表达式的结果2.作为条件的时候:非0即真,0 即假 | | 逻辑表达式 | a &&b c|| d !a | 1. 1 0 2.作为条件的时候:非0即真,0即假 | | 复合表达式 | x = (y =(a + b +a >4),z=10) | 1.依据运算符优先级和结合性得到结果2.作为条件:非0即真,0即假 | | 其他的 | 有返回值的函数,也是一个表达式 | 其他运算符 |
语句:表达式+;就是语句了
逗号表达式(运算级最低)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a;
int b;
int c;
c = (a = 2, 4, b = a);
printf ("%d,%d,%d",a,b,c);
system("pause");
return 0;
}
多次运算(Switch)
switch (匹配标签的// 整形表达式) {
case 整数常数值:
程式片段;
break; (执行到break停止)
default: (可以设定 default 在所有 case都不符合时执行)
程式片段;
}
结构执行顺序
- 计算Switch中的表达式的值
- 按顺序扫描标签
- 发现有匹配的值,就进入标签中执行 执行到break,跳出Switch结构
- 没有发现一样的,就最后进入default 执行完到最后的花括号
#include <stdio.h>
int main() {
int num1, num2;
char op;
float answer;
scanf("%d%c%d", &num1, &op, &num2);
switch (op) {
case '+':
answer = num1 +num2;
break;
case '-':
answer = num1 - num2;
break;
case '*':
answer = num1 * num2;
break;
case '/':
answer = (float)num1 / num2;
break;
}
printf("ANS: %f\n", answer);
return 0;
}
if和Switch的对比
#inclued <stdio.h>
#include <stdlib.h>
int main(void)
{
int order = -1;
scanf("%d", &order);
if (1 == order)
{
printf ("添加一个学生\n");
}
else if (2 == order)
{
printf("删除一个学生\n");
}
else if (3 == order)
{
printf("浏览学生信息\n");
}
else if (4 == order)
{
printf("推出系统\n");
}
else
{
printf ("系统不存在该指令\n");
}
system("pause");
return 0;
}
#inclued <stdio.h>
#include <stdlib.h>
int main(void)
{
int order = -1;
scanf("%d", &order);
switch (order)
{
case 1:
printf ("添加一个学生\n");
break;
case 2:
printf ("删除一个学生\n");
break;
case 3:
printf ("浏览学生信息\n");
break;
case 4:
printf ("退出系统\n");
break;
default:
printf ("系统无该指令\n");
}
system("pause");
return 0;
}
注意点
- switch后面没分号,case后面是冒号,case和标签之间要有空格,break要有
- 结构代码风格
- break跳出Switch
- 循环内部有Switch,Switch内有break,那么跳出Switch,不跳出循环
- 条件 整形表达式
- 浮点型不行
- 范围的语法通过,但是意义变了
- 标签 整形常量表达式
- 要是空格,必须是冒号
标签内部定义变量需要加上花括号
case 2: { int a = 23; printf("删除一个学生%d\n",a); } break;
标签重复的时候:报错
- default课可以不写,那就是没有默认处理
对比if else
- if适合复杂条件,比如范围,浮点型比较,复合表达式(或与非),Switch就不方便
- 书上讲到:完成同样的功能,Switch稍微快一点,这点儿的效率不值一提了,所以使用的时候,没有选择标准,根据实际情况选择
灵活性
int main(void) { int a = 63;
switch (a)
{
case 60:
case 61:
case 62:
case 62:
case 62:
case 62:
case 62:
case 62:
case 62:
case 62:
printf ("及格\n");
break;
case 70:
break;
}
system("pause");
return 0;
}
include
int main() { int id; printf(“ID: “); scanf(“%d”, &id); switch (id) { case 2: printf(“Jphn\n”); break; case 13: printf(“Mary\n”); break; case 16: printf(“Amy\n”): break; default: printf(“Not found\n”); }
return 0;
}
<a name="10050ca9"></a>
## 猜数字到对为止
include
int main() { int answer = 4; int guess; printf(“Please enter your guess: “); scanf(“%d”, &guess); if (guess > answer) printf(“Too large!\n”); else if (guess < answer) printf(“Too small!\n”); else printf(“Correct!\n”); if (guess != answer) { printf(“Please enter your guess: “); scanf(“%d”, &guess); if (guess > answer) printf(“Too large!\n”); else if (guess < answer) printf(“Too small!\n”); else printf(“Correct!\n”); } return 0; }
include
int main() {
int answer = 4;
int guess;
printf(“Please enter your guess: “);
scanf(“%d”, &guess);
if (guess > answer)
printf(“Too large!\n”);
else if (guess < answer)
printf(“Too small!\n”);
else
printf(“Correct!\n”);
while (guess != answer) {
printf(“Please enter your guess: “);
scanf(“%d”, &guess);
if (guess > answer)
printf(“Too large!\n”);
else if (guess < answer)
printf(“Too small!\n”);
else
printf(“Correct!\n”);
}
return 0;
}
include
int main() { int answer = 4; int guess; printf(“Please enter your guess: “); scanf(“%d”, &guess); while (guess != answer) { if (guess > answer) { printf(“Too larger!\n”); } else { printf(“Too small!\n”); } printf(“Please enter your guess: “); scanf(“%d”, &guess); } printf(“Correct!\n”);
return 0;
}
<a name="7857caef"></a>
## 总共猜了几次
```c
#icnlude <stdio.h>
int main() {
int answer = 4;
int guess;
int count = 0;
printf("Please enter your guess: ");
scanf("%d", &guess);
count = count + 1;
while (guess != answer) {
if (guess > answer) {
printf("TOO large!\n");
}else {
printf("Too small!\n");
}
printf("Please enter your guess: ");
scanf("%d", &guess);
count = count + 1;
}
printf("Correct! (%d)\n", count);
return 0;
}
#icnlude <stdio.h>
int main() {
int answer = 4;
int guess;
int count = 0;
while (count == 0 || guess != answer) {
printf("Please enter your guess: ");
scanf("%d", &guess);
count = count + 1;
if (guess > answer) {
printf("TOO large!\n");
}else {
printf("Too small!\n");
}
}
printf("Correct! (%d)\n", count);
return 0;
}
求不定个数正整数和
使用者连续输入正整数知道输入0时为止,计算出所有输入的正整数和
#include <stdio.h>
int main() {
int number;
int sum = 0;
printf("Please enter the numbers (0: quit):\n");
scanf("%d" , &number);
while (number != 0) {
sum = sum + number;
scanf("%d", &number);
}
printf("The sum is %d.\n",sum);
return 0;
}
不定个数正整数平均
#include <stdio.h>
int main() {
int number;
int sum = 0;
int count = 0;
float average;
printf("Please enter the numbers (0: quit):\n");
scanf("%d", &number);
count = count + 1;
while (number != 0) {
sum = sum + number;
scanf("%d", &number);
count = count + 1;
}
average =(float) sum / count;
printf("The average is %f\n", average);
return 0;
}
数数字
#include <stdio.h>
int main() {
int count = 1;
while(count <= 100) {
printf("%d\n",count);
count = count + 1;
}
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("Please enter the number: ");
scanf("%d" , &N);
int count = 1;
while (count <= N) {
printf("%d\n",count);
count = count + 1;
}
return 0;
}
#include <stdio.h>
int main() {
int M, N;
printf("Please enter the number M: ");
scanf("%d", &M);
printf("Please enter the number N: ");
scanf("%d", &N);
int count = M;
while (count <= N) {
printf("%d\n", count);
count = count + 1;
}
return 0;
}
成绩排级
#include <stdio.h>
int main() {
printf("欢迎使用本系统\n") ;
while (1) {
int score = -1;
printf ("请输入一个分数(0~100),输入-1退出系统:");
scanf("%d", &score);
if (-1 == score)
{
break;
}
if (score < 0 || score > 100)
{
printf ("输入的指令非法,请重新输入\n");
continue;
}
if (score < 60)
printf("不及格\n");
else if (score < 70 && score >= 60)
printf("及格\n");
else if (score <80 && score >= 70)
printf("良好\n");
else if (score <90 && score >= 80)
printf("优秀\n");
else
printf("完美\n");
}
return 0;
}
有条件的重复执行
while述句
while (表达式){程式片段}
#include <stdio.h>
int main() {
int count = 0;
while (count < 3) {
printf("%d\n",count);
count = count + 1;
}
return 0;
}
至少执行一次的述句
do-whlile 述句
do {程式片段} while(表达式)
#include <stdio.h>
int main () {
int count = 0;
do {
printf("%d\n", count);
count++;
}while (count < 3);
return 0;
}
猜数字
#include <stdio.h>
int main() {
int answer = 4;
int guess;
do {
printf("Please enter your guess: ");
scanf("%d", &guess);
if (guess > answer) {
printf("Too large!\n");
} else if (guess < answer) {
printf("Too small!\n");
} else {
printf("Correct!\n");
}
}while (guess != answer);
return 0;
}
复合赋值和递增递减的运算
复合赋值运算
运算子 | 意义 | 例子 | 相当于 |
---|---|---|---|
+= | 加等于 | a += 2(a+2后赋值给a) | a = a + 2 |
-= | 减等于 | a -= 2 | a = a - 2 |
*= | 乘等于 | a *= 2 | a = a * 2 |
/= | 除等于 | a /= 2 | a = a / 2 |
%= | 求余等于 | a %= 2 | a = a % 2 |
&= | |||
|= | |||
*= | |||
/= | |||
%= |
递增递减运算
运算子 | 意义 | 例子 | 对a相当于 | 运算结果 |
---|---|---|---|---|
++ | 递增 | a++ | a = a + 1 | a原本的值 |
— | 递减 | a— | a = a -1 | a原本的值 |
++ | 递增 | ++a | a = a + 1 | a加1后的值 |
— | 递减 | —a | a = a - 1 | a减1后的值 |
int a = 0 ;
int b;
b = ++a; //a = 1, b = 1
b = a++; //a = 2 ,b = 1
a = a++; //未定义的行为
v op = e
等价于 : v = v op e
练习:消费金额计算
试写一方程让使用这分别输入每个商品的编号。输入为0时依照右方的售价进行结算后,表示卖出的总金额
#include <stdio.h>
int main () {
int total;
int id;
do {
scanf("%d",&id);
switch (id) {
case 1: total += 90;break;
case 2: total += 75;break;
case 3: total += 83;break;
case 4: total += 89;break;
case 5: total += 71;break;
}
} while (id != 0);
printf("Total: %d\n", total);
return 0;
}
for语法
练习:印出1到10
#include <stdio.h>
int main() {
int count = 1;
while (count <= 10) {
printf("%d\n",count);
count = count +1;
}
return 0;
}
#include <stdio.h>
int main() {
int count;
for (count = 1; count <= 10;count++) {
printf("%d\n", count);
}
return 0;
}
练习:印出1到N
#include <stdio.h>
int main() {
int N;
printf("Please enter the number: ");
scanf("%d", &N);
int count;
for (count = 1; count <= N; count++) {
printf("%d\n", count);
}
return 0;
}
#include <stdio.h>
int main() {
int count;
for (count = 10; count >=1 ; count--) {
printf("%d\n", count);
}
return 0;
}
#include <stdio.h>
int main() {
int count;
for (count = 1; count <= 10; count++) {
int number = 11 - count;
printf("%d\n",number);
}
return 0;
}
印出1到10 的奇数
#include <stdio.h>
int main() {
int count;
for (count = 1 ; count <= 10 ; count +=2) {
printf("%d\n", count);
}
return 0;
}
#include <stdio.h>
int main() {
int count;
for (count = 1; count <= 5; count++) {
int number = 2 * count - 1;
printf("%d\n", number);
}
return 0;
}
#include <stdio.h>
int main() {
int count;
for (count = 1; count <= 10; count++) {
if (count % 2 == 1) {
printf("%d\n",count);
}
}
return 0;
}
数特定数列的练习
- 印出1到10件不是三的倍数的偶数
`#include <stdio.h>
int main(){
int count;
for (count = 1; count <= 10; count++) {
if (count % 2 == 0 && count % 3 != 0) {
printf("%d\n",count);
}
}
return 0;
}
#include <stdio.h>
int main() {
int count;
for (count = 2; count <= 10; count += 2) {
if (count % 3 != 0) {
printf("%d\n",count);
}
}
return 0;
}
求连续整数和的练习
#include <stdio.h>
int main() {
int sum = 1;
int i;
for (i = 2; i <= 100; i++) {
sum = sum + 1;
}
printf("%d\n", sum);
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int sum = 1;
int i;
for (i = 2; i <= N; i++) {
sum = sum + i;
}
printf("%d\n",sum);
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int sum = (1 + N) * N /2;
printf("%d\n",sum);
return 0;
}
绘制特定长度的横线
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int count;
for (count = 1; count <= N; count++) {
printf("*");
}
printf("\n");
return 0;
}
韩信点兵最大值
让使用者输入搜寻上限,找出上限内所有韩信点兵问题答案中最大的
#include <stdio.h> int main() { int max; printf("Max = "); scanf("%d", &max); int answer = 0; int number; for (number = max; number >= 1 && answer == 0; --number){ if (number%3 == 2 && number%5 == 3 && number%7 == 2) { answer = number; } } if (answer != 0) { printf("%d\n",answer); } return 0; }
#include <stdio.h> int main() { int max; printf("Max = "); scanf("%d", &max); int number; for (number = max; number >= 1 ; --number){ if (number%3 == 2 && number%5 == 3 && number%7 == 2) { break; } } printf("%d\n",number); return 0; }
#include <stdio.h>
int main() {
int number = 1;
while (number%3 != 2 || number%5 != 3 || number%7 != 2) {
++number;
}
printf("%d\n", number);
return 0;
}
合格条件 : number%3 == 2 && number%5 == 3 && number%7 == 2
#include <stdio.h>
int main() {
int number;
for (
number = 1;
!(number%3 == 2 && number%5 == 3 && number%7 == 2);
++number);
printf("%d\n", number);
return 0;
}
有范围的韩信点兵练习(使用for语句)
#include <stdio.h>
int main() {
int max;
printf("MAX = ");
scanf("%d", &max);
int number;
for (number = 1; number <= max; ++number) {
if (number%3 == 2 && number%5 == 3 && number%7 == 2) {
printf("%d\n", number);
}
}
printf("\n");
return 0;
}
#include <stdio.h>
int main() {
int min, max;
printf("MIN = ");
scanf("%d", &min);
printf("MAX = ");
scanf("%d", &max);
int number;
for (number = min; number <= max; ++number) {
if (number%3 == 2 && number%5 == 3 && number%7 == 2) {
printf("%d\n", number);
}
}
printf("\n");
return 0;
}
#include <stdio.h>
int main() {
int min, max;
printf("MIN =");
scanf("%d", &min);
printf("MAX = ");
scanf("%d", &max);
int number;
for (number = max; number >= min; --number) {
if (number%3 == 2 && number%5 == 3 && number%7 == 2) {
printf("%d\n", number);
}
}
printf("\n");
return 0;
}
韩信点兵最大值的练习
#include <stdio.h>
int main() {
int max;
printf("MAX = ");
scanf("%d", &max);
int number = max;
while (
number > 0 &&
!(number%3 == 2 && number%5 == 3 && number%7 == 2)) {
-- number;
}
if (number > 0) {
printf("%d\n", number);
}
return 0;
}
#include <stdio.h>
int main() {
int max;
printf("MAX = ");
scanf("%d", &max);
}
找出所有正因数
- 让使用者输入正整数N,找出N的所有正因数。
- N的因数:可以整除N 的整数
- N的正因数:可以整除N的正整数
- 例如:
- 8的正因数是:1,2,3,4,8
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int munber;
for (number = 1; number <= N;number++) {
if(N % number == 0) {
printf("%d\n", number);
}
}
printf("\n");
return 0;
}
韩信点兵
#include <stdio.h>
int main() {
int max;
printf("MAX = ");
scanf("%d", &max);
int answer = 0;
int number;
for (number = 1; number <= max; ++ number) {
if ( number%3 == 2 && number%5 == 3 && number%7 == 2) {
answer = number;
}
}
if (answer != 0) {
printf("%d\n", answer);
}
retrun 0;
}
有次数的韩信点兵
#include <stdio.h>
int main() {
int count = 0;
int number;
for (number = 1; number <= 1000 && count <3; ++ number) {
if (number%3 == 2 && number%5 == 3 && number%7 == 2) {
++count;
if ( count <= 3) {
printf("%d\n", number);
}
}
}
printf("\n");
return 0 ;
}
质数
- 除了1和本身以外没有其他正因数
- 不包括 1
- 例:
- 2, 3, 5, 7, ,11
- 质数有无穷多个
- 现代多个密码系统的基础之一
- 无法非常有效率的进行因数分解
质数判断练习
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int number;
for (number = 2; number < N; ++number) {
if (N % number == 0) {
++numberOFDivisors;
}
}
if (numberOFDivisors == 0) {
printf("Yes\n");
}else {
printf("No\n");
}
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int isPrime = 1;
int number;
for (number = 2; number < N; ++number) {
if (N % number == 0) {
isPrime = 0;
}
}
if (isPrime == 1) {
printf("Yes\n");
}else {
printf("No\n");
}
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int isPrime = 1;
int number;
for (number = 2; number < N; ++number) {
if (N % number == 0) {
isPrime = 0;
}
}
if (isPrime) { //(放的0的值代表错,1 的值代表对)
printf("Yes\n");
}else {
printf("No\n");
}
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int number;
for (number = 2; number < N && N % number != 0; ++ number);
if (number == N) {
printf("Yes\n");
}else {
printf("No\n");
}
return 0;
}
印出九九乘法表
#include <stdio.h>
int main() {
int i,j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; ++j)
printf("%d * %d = %d\n" ,i,j ,i * j)
}
return 0;
}
用文字绘制长方形的练习
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int i , j;
for (i = 1; i <= N;i++){
for (i = 1; j <= N ; j++)
printf("*");
printf("\n");
}
return 0;
}
用文字绘制空心长方形
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int i, j;
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
if (i == 1 || i == N || j == 1 || j == N) {
printf("*");
}else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
用文字绘制实心三角形
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int i, j;
for (i = 1; i <=3; i++){
for (j = 1; j <= i; j++)
printf("*");
printf("\n");
}
return 0;
}
用文字绘制空心的三角形
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int i, j;
printf("*\n");
for (i = 0; i <=2; i++) {
printf("*");
for (j = 1; j <= i; j++){
printf(" ");
}
printf("*\n");
}
printf("*****\n");
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int i, j;
printf("*\n");
for (i = 0; i <= N-3; i++) {
printf("*");
for(j = 1; j <= i; j++) {
printf(" ");
}
printf("*\n");
}
for (j = 1; j <= N ; j++) {
printf("*");
}
printf("*\n");
return 0;
}
使用坐标法绘制三角形
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++) {
printf("(%d,%d)", i, j);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main(){
int i, j;
for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++) {
if (i >= j) {
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main(){
int i, j;
for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++) {
printf("(%d,%d)", i, j);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main(){
int N;
printf("N = ");
scanf("%d", &N);
int i, j;
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
if (j == 1 || i == N || i == j) {
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int i,j;
for (i = 1; i <= N; i++) {
for (j= 1; j <= N; j++) {
if (i + j >= N + 1){
printf("*");
} else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main() {
int N;
printf("N = ");
scanf("%d", &N);
int i,j;
for (i = 1; i <= N; i++) {
for (j= 1; j <= N; j++) {
for ( j = 1; j <= N; j++) {
if(j == N || i == N || i +j == N +1) {
printf("*");
}else {
printf(" ");
}
}
printf("\n");
}
return 0;
}
找简易方程式整数解
- 已知两个正整数相加为30,相乘为221.求此两个正整数为?
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 30; i++) {
for (j = 1; j <= 30; j++) {
if (i + j == 30 && i * j== 221) {
printf()
}
}
}
浮点型的比较
a < 6.2 + 0.01
a == 6.2
九九乘法表
#include <stdio.h>
int main() {
int i,j;
for(i=1; i <= 9; i++) {
for(j = 1; j <= i; j++)
printf("%d * %d = %2d\t" ,i ,j, i * j);
printf("\n");
}
return 0;
}
死循环无限多的时候中断:CTRL+C
指针
- 是一种资料型别,用来存储记忆体的位置、
- 一般情况我们是不需要指针的
- 增加这个型别为什么可以解决这些以前不能解决的问题?
- 在被呼叫的程式中修改引数值
- 直接复制阵列
- 直接复制字串
- 改变阵列的长度
指针变数的宣告与取值的运算
- 指针是C语言的主要特性,是中存储记忆体位置的资料型别
- 指针变数宣告语法:
资料型别 *变数名称;- 表示变数内存放的是一个存放这个资料型别值的记忆体位置
@宣告指针变数与其他变数的差别
- 宣告整数变数: int count;
- 宣告指针变数: int *countAddr; (存放整数的位置)
取址运算子 ( & )
- 变数依照资料型别会占据一定的记忆体空间。我们可以利用取址运算子( & )去取得变数开头的记忆体位置
指针变数与其他变数的差别
int count = 9;
int a;
int *b;
a = count; // (o) (int) = (int)
b = count; // (x) (int *) = (int)
a = &counr; // (x) (int) = (int *)
b = &count; // (o) (int *) = (int *)
count = *a; // (x) (int) = (int *)
count = *b; // (o) (int *) = (int *)
指针的间接运算
间接运算子( * )
- 相对的,我们可以利用间接运算子从记忆体位置取得开头位该位置的变数
int count = 9;
int *countAddr = &count;
int result = *countAddr;
表达式 | 资料型别 | 值 |
---|---|---|
count | int | 9 |
&count | int * | 2293620 |
countAddr | int * | 2293620 |
*countAddr | int | 9 |
指针的特殊能力
int count = 9;
int *countAddr = &count;
int result = *countAddr;
结果
int count = 9;
int result = count;
int count = 9;
int 8countAddr = &count;
*countAddr = 10;
结果
//不相当于
int count = 9;
int result = count;
result = 10;
//相当于
int count = 9;
count = 10;
int countA = 9;
int countB = 10;
int *countAddr;
countAddr = &countA;
*countAddr = 0;
countAddr = &countB;
*countAddr = 0;
相当于:
int countA = 9;
int countB = 10;
countA = 0;
countB = 0;
指针型别于取址和间接运算
- 指针:可储存记忆体位置的型别
- 取址运算子(&):可取得变量的记忆体起始位置
- &变量
- 间接运算子(*):取得以该记忆体位置起始的变量
- *记忆体位置
int count = 9;
int *countAddr = &count;
int result = *countAddr;
//相当于 int result = *&count; //看到相邻的*和&可以相互抵消
count | countAddr | result |
---|---|---|
(int)/9 | (int *)/&count | (int)/?? |
(int *) | (int **) | (int *) |
&count | &countAddr | &result |
函数呼叫的特性
- 呼叫函数时,作为引数的变量会别复制一份到函数内成为参数。在被呼叫的函数内对参数做任何的变量都不会改变到原来的变量。
复制值和复制位置的区别
#include <stdio.h>
void addone(int n) {
n = n + 1;
}
int main() {
int a =3;
addone(&a); /* 复制a的值给addone */
printf("%d",a); /* 3*/
return 0;
}
#include <stdio.h>
void addone(int *n) {
*n = *n + 1;
}
int main() {
int a = 3;
addone(&a);
printf("%d",a); /* 4 */
return 0;
}
两个变量的数值交换
例子数值交换
#include <stdio.h>
void swap(int, int);
int main() {
int a = 3, b = 5;
swap(a, b);
printf("a; %d\n", a);
printf("b: %d\n", b);
return 0;
}
void swap(int a, int b) {
int t = a;
a = b;
b = t;
} //a=3 b=5
#include <stdio.h>
void swap(int *, int *);
int main() {
int a = 3, b = 5;
swap(&a, &b);
printf("a; %d\n", a);
printf("b: %d\n", b);
return 0;
}
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = *t;
}
两个变量的排序
#include <stdio.h>
int main() {
int a = 5, b = 3;
if ( a > b) {
int t = a;
a = b;
b = t;
}
printf("a; %d\n",a);
printf("b: %d\n",b);
return 0;
}
#include <stdio.h>
void sort(int *, int *);
void swap(int *, int *);
int main() {
int a = 5, b = 3;
sort(&a, &b);
printf("a: %d\n", a);
printf("b: %d\n", b);
return 0;
}
void sort(int *a, int *b) {
if (*a > *b) {
swap(&*a, &*b);
}
}
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
贪吃蛇
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
//游戏窗口
#define FrameX 4 //游戏窗口左上角的X轴坐标
#define FrameY 4 //游戏窗口左上角的Y轴坐标
#define Frame_height 20 //游戏窗口的高度
#define Frame_width 20 //游戏窗口的宽度
//定义全局变量
int i,j;
int a[2]; //用于记住蛇尾坐标,其中a[0]、a[1]分别表示横、竖坐标
//声明蛇的结构体
struct Snake
{
int x[100]; //蛇的横坐标,其中x[0]表示蛇尾的横坐标,x[N-1]表示蛇头的横坐标
int y[100]; //蛇的竖坐标,其中y[0]表示蛇尾的竖坐标,y[N-1]表示蛇头的竖坐标
int count; //蛇吃食物的个数
int length; //蛇的长度
int speed; //蛇的速度
};
//声明食物的结构体
struct Food
{
int x; //食物的横坐标
int y; //食物的竖坐标
};
/******光标移到指定位置**************************************************************/
void gotoxy(HANDLE hOut, int x, int y)
{
COORD pos;
pos.X = x; //横坐标
pos.Y = y; //纵坐标
SetConsoleCursorPosition(hOut, pos);
}
/******设置文本为绿色*****************************************************************/
void Set_TextColor_Green (void)
{
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);
}
void Welcome()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTitle("经典贪吃蛇");
gotoxy(hOut,40,12);
printf("欢迎来到经典贪吃蛇游戏\n");
gotoxy(hOut,40,14);
system("pause");
system("cls");/*清屏*/
}
/******制作游戏窗口******************************************************************/
void make_frame()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13); //打印选择菜单
printf("Esc 退出游戏");
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
printf("长按方向键:加速");
gotoxy(hOut,FrameX,FrameY); //打印框角
printf("╔");
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
printf("╗");
gotoxy(hOut,FrameX,FrameY+Frame_height);
printf("╚");
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
printf("╝");
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(hOut,FrameX+i,FrameY);
printf("═"); //打印上横框
}
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(hOut,FrameX+i,FrameY+Frame_height);
printf("═"); //打印下横框
}
for(i=1;i<Frame_height;i++)
{
gotoxy(hOut,FrameX,FrameY+i);
printf("║"); //打印左竖框
}
for(i=1;i<Frame_height;i++)
{
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
printf("║"); //打印右竖框
}
gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称
Set_TextColor_Green (); //设置蛇为绿色
printf("贪吃蛇游戏");
}
/******结束菜单*******************************************************************/
void over_game()
{
system("cls");
printf("\n\n\n\n\n\n\n\n\t\t\t\t游戏结束\n\n\n");
Sleep(2000);
getch();
}
/******菜单信息***************************************************************/
print_information(HANDLE hOut,struct Snake *snake,struct Food *food)
{
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
printf("level : %d",snake->count/5+1); //打印游戏等级
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
printf("score : %d",10*snake->count); //打印游戏得分
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
printf("eat food : %d",snake->count); //打印产生食物个数
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);
printf("speed : %dms",snake->speed); //打印游戏速度
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9);
printf("foodX : %d",food->x); //打印食物的横坐标
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11);
printf("foodY : %d",food->y); //打印食物的竖坐标
}
/******初始化蛇**********************************************************************/
void init_snake(struct Snake *snake)
{
snake->x[0]=FrameX+2; //初始化蛇的横坐标
snake->y[0]=FrameY+Frame_height/2; //初始化蛇的竖坐标
snake->speed=300; //初始化蛇的速度为300ms
snake->length=3; //初始化蛇的长度为3节
snake->count=0; //初始化蛇吃的个数为0
for(i=1;i<snake->length;i++)
{/* 依次得到蛇身、蛇头的坐标 */
snake->x[i]=snake->x[i-1]+2;
snake->y[i]=snake->y[i-1];
}
}
/******移动蛇*************************************************************************/
void move_snake(HANDLE hOut,struct Snake *snake)
{
gotoxy(hOut,snake->x[0],snake->y[0]);
printf(" "); /* 清除蛇尾*/
for(i=1;i<snake->length;i++)
{/* 后一节的坐标依次取代前一节的坐标 */
snake->x[i-1]=snake->x[i];
snake->y[i-1]=snake->y[i];
}
}
/******打印蛇*************************************************************************/
void print_snake(HANDLE hOut,struct Snake *snake)
{
for(i=0;i<snake->length;i++)
{
gotoxy(hOut,snake->x[i],snake->y[i]);
if(i==0)
{
printf("*"); //打印蛇尾
}
else if(i==snake->length-1)
{
printf("*"); //打印蛇头
}
else
{
printf("*"); //打印蛇身
}
}
}
/******随机产生食物*******************************************************************/
void get_food(HANDLE hOut,struct Snake *snake,struct Food *food)
{
srand((unsigned)time(NULL)); //初始化随机数
while(1)
{/* 产生食物的条件:1.在游戏窗口内 2.不在蛇的身上 */
food->x = rand() % (Frame_width-1);
food->y = rand() % Frame_height;
if( food->x==0 || food->y==0 )
{
continue;
}
food->x = 2*food->x + FrameX; //得到食物的横坐标
food->y+=FrameY; //得到食物的竖坐标
for(i=0;i<snake->length;i++)
{/* 判断食物是否在蛇的身上,如果在蛇身上,则重新产生;否则,打印蛇身 */
if( food->x==snake->x[i] && food->y==snake->y[i] )
{
break;
}
}
if(i==snake->length)
{
gotoxy(hOut,food->x,food->y);
printf("$");
break;
}
}
}
/******吃食物***************************************************************************/
void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food)
{
if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y )
{/* 如果蛇头位置与食物位置相同,吃食物 */
snake->length++; //吃一个食物,蛇身增长一节
for(i=snake->length-1;i>=1;i--)
{/* 蛇后节坐标依次赋值给蛇前一节的坐标,依次得到蛇身及蛇头的坐标 */
snake->x[i]=snake->x[i-1];
snake->y[i]=snake->y[i-1];
}
snake->x[0]=a[0]; //得到蛇尾移动前的横坐标
snake->y[0]=a[1]; //得到蛇尾移动前的竖坐标
get_food(hOut,snake,food); //重新产生食物
snake->count++; //食物的个数增1
if( snake->count%5==0 )
{/* 当蛇吃Up_level个食物时,速度加快Up_speed毫秒并且升一级 */
snake->speed-=50;
}
}
}
/******穿墙**********************************************************************************/
void through_wall(HANDLE hOut,struct Snake *snake,char ch)
{
if( ch==72 && snake->y[snake->length-1]==FrameY)
{
snake->y[snake->length-1] = FrameY+Frame_height-1; //如果蛇在上框且向上移动,穿墙
}
if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height )
{
snake->y[snake->length-1] = FrameY+1; //如果蛇在下框且向下移动,穿墙
}
if( ch==75 && snake->x[snake->length-1]==FrameX )
{
snake->x[snake->length-1] = FrameX+2*Frame_width-4; //如果蛇在左框且向左移动,穿墙
}
if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 )
{
snake->x[snake->length-1] = FrameX+2; //如果蛇在右框且向右移动,穿墙
}
}
/******判断蛇是否死**************************************************************************/
int if_die(struct Snake *snake)
{/* 当蛇头碰到自身时,蛇死 ,返回值为0 */
for(i=0;i<snake->length-1;i++)
{
if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] )
{
return 0;
}
}
return 1;
}
/******开始游戏*******************************************************************************/
void start_game()
{
unsigned char ch=77; //定义用于接收键盘输入的字符变量
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量
struct Snake s,*snake=&s; //定义蛇的结构体指针并指向蛇的结构体
struct Food f,*food=&f; //定义食物的结构体指针并指向食物的结构体
make_frame(); //制作游戏窗口
init_snake(snake); //初始化蛇
get_food(hOut,snake,food); //随机产生食物
while(1)
{
print_information(hOut,snake,food); //打印菜单信息
a[0]=snake->x[0]; //记住蛇尾的横坐标
a[1]=snake->y[0]; //记住蛇尾的竖坐标
j=0;
if(kbhit())
{/* 判断是否按下键盘,如果按下,ch接收键盘输入 */
ch=getch();
if(kbhit())
{/* 如果长按键盘,则加速 */
Sleep(20);
j=1;
}
}
switch(ch)
{
case 72:
{/* 向上移动 */
move_snake(hOut,snake); //移动蛇
snake->y[snake->length-1]-=1; //蛇头的竖坐标向上移,即减1
break;
}
case 80:
{/* 向下移动 */
move_snake(hOut,snake); //移动蛇
snake->y[snake->length-1]+=1; //蛇头的竖坐标向下移,即加1
break;
}
case 75:
{/* 向左移动 */
move_snake(hOut,snake); //移动蛇
snake->x[snake->length-1]-=2; //蛇头的横坐标向左移,即减2
break;
}
case 77:
{/* 向右移动 */
move_snake(hOut,snake); //移动蛇
snake->x[snake->length-1]+=2; //蛇头的横坐标向右移,即加2
break;
}
}
through_wall(hOut,snake,ch); //穿墙
eat_food(hOut,snake,food); //吃食物
print_snake(hOut,snake); //打印蛇
if( if_die(snake)==0 || ch==27 || snake->speed==50 )
{/* 游戏结束条件:1.蛇碰到自身 2.按Esc键 3.速度为50ms */
gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1);
printf("Game Over");
Sleep(2000);
break;
}
if(j==0)
{
Sleep(snake->speed); //延迟时间
}
else
{
Sleep(10);
}
}
}
int main ()
{
system("color 0D"); //设置文本为粉红色
Welcome();
start_game(); //开始游戏
over_game(); //结束游戏
}