C语言

  .png)

老版.png)

printf用法

printf用法

去除警告 宏 :#define _CRT_SECURE_NO_DEPRECATE

定义:#define IP 3.14158

框架

include

include

int main(void)

{

  1. system("pause");
  2. return 0;

}

程序执行的过程:

源程序(.c)—编译(目标文件.obj)—链接(可执行文件.exe)—运行程序

进制问题

  1. 十进制:由

主函数的基本形式

include

int main()

{

语句;

return 0;

}

写法规范

连续注释:

  1. int a;
    int b;
  2. int a,b,c,d;
  3. 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语句

卡住

  1. system(“pause”);
  2. getchar();
  3. while();

1.基本数据类型

整数就是整形数据类型,小数就是浮点型数据类型,一句话叫字符型数据类型
头文件(#include <stdio.h>)
printf("%d/n")
前后都可加提示
可以放多个值,参数“,”隔开,顺序填充

数值类型

字符型

整形(%d:格式化输出符/转义字符 以10进制整数形式 输出 参数/数据)

5..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

  1. integer缩写
  2. 关键字
  3. a变量名:尽量英文
  4. =:赋值运算符不是等于
  5. 数据
  6. 空格:大气好看(int和a之间必须要有空格)

申请一个储存数值的空间进行赋值/重新多次赋值

重新赋值.png)

申明变量:int a/int b放在函数最前面a=13//常数给变量赋值

//变量和变量赋值:a=b

//连续赋值:a=b=13

//不能给常数赋值

int c;//声明(调试放到变量上显示0xcccccc=变量没有初始化)

int a;//定义并赋值

常量只代表自己;变量值可以变

左操作数必须为左值左值—变量 右值—常量

属性

有符号:

  1. signed int(signed可省略)
  2. 表示数的范围(圈的原理)

-2 ^ 31~2 ^ 31-1

-2147483648~2147483647

  1. 内存大小

    @4字节(输出字节:运算符sizeof(放入int或a ))

字节是8个2进制位

位是计算机最小的存储单位

字节是计算机常用的存储数据

一个2进制位只有两个数0或者1

@int b;

b=sizeof()

K:C语言 - 图5.png)

无符号

  1. 写法:unsigned int a ;不可省略
  2. 输出用printf (“%u\n”,a);%u表示无符号的十进制整形输出
  3. 表示数的范围:0 ~ 4294967295/0~2^32-1
  4. 内存大小:4字节
  5. 得到类型的大小:sizeof(类型/变量名)

两种表示的数的个数一样

  1. 4294967296个
  2. 有符号从0分成两部分,个数一边多
  3. 无符号从0开始
  4. 选择按照数据的类型(按照意义上来)

2.short变量类型

短整型:short int(int可省略)

  1. 内存字节数:(《C和指针》标准只规定int不少于short的长度)

2字节

sizeof()取类型的大小

printf(“short:%d\n”,sizeof(变量名/类型));

  1. 范围:

有符号:signed short -2 ^ 15~2 ^ 15-1 -32768~32767

无符号:unsigned short 0~2 ^ 16-1 0~65535

  1. 输出格式符:%hd/%d

3.long

长整形 :long int (int可省略)

  1. 内存字节数:(《C和指针》标准只规定long不小于int的长度)

4字节

  1. 范围:

有符号:signed short -2 ^ 15~2 ^ 15-1 -32768~32767

无符号:unsigned short 0~2 ^ 16-1 0~65535

  1. 输出格式符:%ld/%d

4.long long

超长整形 :long long int(int可省略)

注意:C99标准扩展的新类型

        vc++6.0不支持
  1. 内存字节数:

8字节

  1. 范围:

无符号:unsigned long long int :0~2 ^64-1

有符号:signed long long int :-2 ^63~2 ^63-1

  1. 输出格式符:%lld/%d

选择取决于数据的大小

变量取地址

字节

一个字节是一个bit b/s kb 1kb=1024bit 1mb=1024kb 1GB=1024MB

电脑内部的具有记忆储存空间元组(byte)为单位组成通常是8位

byte有多个位元(bit)

每个位元存0或1

两个位元是4

2的次方

一般为4G

取地址运算符:& 输出用%p

K:C语言 - 图6.png)

内存的地址以16进制的形式表示%p/10进制也可

表达式:&a/12+13==(规定:每一个表达式都有自己的运算结果)==

语句:表达式+;

给地址加前缀(0x):%#p

scanf:变量的输入

  1. 形式:scanf(“%d”,&a);

格式:%d这个一定要跟变量a类型对应上

&a:一定要取地址

输入后回车结束

输入类型和变量要相同

  1. 可以输入多个scanf (“%d%d/%d %d”,&a,&b);

K:C语言 - 图7.png)

分割符:转义字符中间用什么隔开,输入就用什么分开

字母符号均可

加提示:scanf前放printf配合(内不要加\n)

K:C语言 - 图8.png)

注意:

  1. scanf()不要加换行什么的
  2. 分隔符一定要跟程序的一样:比如逗号,程序里用英文,输入时候就要用英文逗号
  3. 消除警告:vs2012及以下版本会报警报,方法:用scanf_s替换scanf
  4. 第二种:文件首加宏
    K:C语言 - 图9.png)
  5. 第三种:在int前加:#pragma warming(disable:4996)
  6. 消除报错:在vs2013中和vs2015中,scanf这个会报错
  7. 第一种:用scanf_s替换scanf
  8. 第二种:文件首加宏:参见消除警报方法二!

二、浮点型

定义:

  1. float a = 12.13;
  2. double b;
  3. long double c;

输出:

  1. %f float 默认是打印6位小数
  2. %lf double long double 不初始化不行
  3. %e 科学计数法

属性/区别:

float:

  1. 内存大小:4字节 sizeof(float)
  2. 可表示数的范围

    正数部分:1.17549e-038 ~ 3.40282e+038

    负数部分:-3.40282e+038 ~ -1.17549e-038

    0.0:浮点数赋值要赋值0.0,不要赋值0

    K:C语言 - 图10.png)

    标准规定:指数范围不小于-37~38

    看编译器默认的这个值:宏:FLT_MIN 头文件: float.h

  3. 有效数位(单精度)

    ANSI C规定的最小值是6

    注意不是小数的为数,是第一个非0数字计算的

    windows是7位: 12345.6789 1.2456789

  4. 使用

    float和double常用

double:

  1. 内存大小:8字节
  2. 可表示数的范围

    正数部分:+1.79769e-308 ~ +2.22507e+308

    负数部分:-1.79769e+308 ~ -2.22507e-308

    0.0

    标准格式:指数范围不少于-37 ~38

  3. 有效位数(双精度)

    ANSI C规定的最小值是10位 windows是15位

    实测16位

long double:

  1. 内存大小:不小于double,没有明确规定,编译器不同节数不同
  2. 表示数的范围:vs的话跟double是一样的
  3. 有效数位(精度):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)

例题:计算平均

无小数

有小数(转型)

K:C语言 - 图11.png)

得到对应的数值:/3.(double)

K:C语言 - 图12.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’ 用双引号括住的是字串

    K:C语言 - 图13.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

  • 嵌套

    • 程序从上到下进行执行
    • 代码缩进————可读性 ```

      include

      include

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;
}

注意点

  • 嵌套的话,for循环的结构比while会更清晰
    ```

    include

    include

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;
}
  • 嵌套循环,两层循环用一个循环控制变量,可能会出问题
    ```

    include

    include

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稍微快一点,这点儿的效率不值一提了,所以使用的时候,没有选择标准,根据实际情况选择

灵活性

  • 有无break
    • 比else if更灵活多变
  • 表示范围
    ```c

    include

    include

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;
}

绘制特定长度的横线

  • 让使用者输入正整数N,绘制该长度的文字横线。

#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();   //结束游戏

}