八维教育 程序设计基础 课间笔记 宋老师

程序设计

c语言 数据类型与变量

数据类型

    基本数据类型 整型 实型(浮点型) 字符型 
    构造数据类型 是由多个基本数据类的组合构造而成 数组 结构体 联合体 枚举等
    
    基本数据类型
        整型(五虎上将)
        int 整型 在内存中占4个字节
        unsigned int 无符号整型 在内存中占4个字节
        long int 长整型 在内存中占4个字节
        unsigned long int 无符号长整型 在内存中占4个字节 
        short 短整型 在内存中占2个字节 
        
        实型/浮点型(桃园三结义)
        float 单精度实型 在内存中占4个字节 小数点后有效位数7位
        double 双精度实型 在内存中占8个字节 小数点后有效位数15位
        long double 长双精度实型 在内存中占16个字节 小数点后有效位数19位 
        
        字符型(阿斗)
        char 单字符型 在内存中占1个字节 
        
        int  float  char  double
    定义变量
        格式:
            类型关键字 变量名;
            
    变量赋值:
        初始化赋值		
            int a=76;
            float b=3.789;
            char c='Y';	
        引用赋值
            a=54;
            b=741.8523;
            c='n';					
    
    格式转换说明符
    %d	输出一个十进制整数 
    %f  输出一个十进制小数 默认输出6位小数 
    %c	输出一个字符     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include "windows.h"
#include "math.h"

int main() {
int a=126,d=852,e,f;//定义一个整型变量命名为a
float b=3.789;//定义一个实型变量命名为b
char c='Y';//定义一个字符型变量命名为c
a=54;
b=741.8523;
c='n';

printf("a=%d\n",a);
printf("b=%.4f\n",b);
printf("c=%c\n",c);
}

运算符

运算符与表达式
C语言中有34种运算符
运算符的结合性
C语言中运算符,除了单目运算符、条件运算符、赋值运算符及其扩展运算符结合方向从右向左,其他所有运算符
结合方向从左向右
运算符的优先级
单目运算符 –> 算术运算符 –> 关系运算符 –> 逻辑运算符 –> 条件运算符 –> 赋值运算符 –> 逗号运算符
单 算 关 逻 条 赋 逗

    算术运算符及其表达式
        七种
        + - * / %	
        /(除法):
            /(除号)的左右两侧都是整数时,结果一定是整数  10/3
            /(除号)的左右两侧出现小数时,结果一定是小数  10.0/3 
        %模:%是正常的除法运算,但是求余数(取余运算)
            %模的左右两侧只能是整数 
        算术表达式
            是由算术运算符与操作数组成的式子,叫做算术表示式 
                操作数也叫作运算对象 可以是常量,变量,表达式或函数	
    C语言中规定,双目运算符左右两侧运算类型必须一致,如果不一致则需要进行数据类型转换			
    数据类型转换
        自动类型转换
            是由计算机主动发起的数据类型转换 也叫作隐式类型转换
            转换规则: 小转大 低精度向高精度转换 
                char --> short --> int --> long int --> float --> double	
        强制类型转换
            是由人为发起的数据类型转换
            使用场合: 大转小 高精度向低精度转换
            强制类型转换可能会造成数据或精度的丢失		
        
    关系运算符:
        六种 > >= < <= == !=
        >  : 判断 大于号 左侧表达式的值 是否大于 右侧表达式的值 3>2 17>29
        >= : 判断 大于等于号 左侧表达式的值 是否大于或等于 右侧表达式的值  3>=2 3*5>=15 17>=29
        <  : 判断 小于号 左侧表达式的值 是否小于 右侧表达式的值 3<5 12<7
        <= : 判断 小于等于号 左侧表达式的值 是否小于或等于 右侧表达式的值 
        == : 判断 等于号 左侧表达式的值 是否等于 右侧表达式的值  1==0  25==5*5
        != : 判断 不等于号 左侧表达式的值 是否不等于 右侧表达式的值 1!=0 25!=5*5
        优先级:
            > >= < <= 优先级相同  == != 优先级相同  前者优先级高于后者 
        关系表达式:
            由关系运算符和操作数组成的式子
            关系表达式的结果只有0或1 0表达式不成立(条件为假) 1表达式成立(条件为真)	
        3-7<5-11==12*3>=25+7!=96/4<=47-21	
        
        x=500
        1<x&&x<10 
        
    
    逻辑运算符:
        三种 && || !
        逻辑与: &&
            格式: 条件A&&条件B;
            当条件A与条件B都成立时,逻辑与表达式才成立
            特点:全真为真,遇假则假 
        逻辑或: ||	
            格式: 条件A||条件B;
            条件A或条件B有一个成立,逻辑或表达式就成立 
            特点:全假为假,遇真则真
        逻辑非: !
            格式: !条件A;
            条件A成立时,逻辑非不成立,条件A不成立时,逻辑非成立
            特点:非真既假,非假既真	 
        优先级:
            ! --> && --> ||
        逻辑表达式的结果只有0和1   0表示条件为假  1表示条件为真	
    C语言中规定 所有的非零值表示条件为真 0值表示条件为假
    
    条件运算符: C语言中唯一的一个三目运算符(三元运算符)	
        ? :
        格式: 条件?操作1:操作2;
        判断条件是否成立,成立执行操作1,否则执行操作2
        //输入一个数字判断是奇数还是偶数
        int n;
        printf("请输入一个数字:");//提示用户输入内容
        scanf("%d",&n); 
        n%2==0?printf("%d是偶数\n",n):printf("%d是奇数\n",n);				
        //输入购买商品的数量与单价,计算最终消费 消费满500打九折 否则抹零优惠
        int sl;
        float dj,zxf;
        printf("请输入商品的数量:");
        scanf("%d",&sl);
        printf("请输入商品的单价:");
        scanf("%f",&dj);
        zxf=sl*dj;
        zxf>=500?
            printf("消费满500元享9折优惠,消费额%.2f元,实际支付%.2f元\n",zxf,zxf*0.9):
                printf("消费不满500元享抹零优惠,消费额%.2f元,实际支付%d\n",zxf,(int)zxf/10*10);
                
    赋值运算符
        基本赋值运算符: =	
            格式: 变量=表达式;
            将右侧表达式的值赋值给左侧的变量
        复合赋值运算符: += -= *= /= %=
            格式: 变量+=表达式;
            先用变量原先的值参与到右侧表达式的计算中,然后将结果重新赋值给变量	
    
    自增自减运算符 ++ --		
        格式:
            ++变量;  变量++;
            --变量;  变量--;
        是变量的值自增一或自减一
    自增自减运算符单独使用时,在变量前后没有区别	
    如果参与到赋值,计算,输出时,在变量前后有区别
        在变量前,先改变变量的值,在参与赋值,计算,输出 
        在变量后,先赋值,计算,输出,再改变变量的值 
    
    逗号运算符: ,
        格式:(式子1,式子2,式子3,.......式子n)
        先计算式子1,再计算式子2,依次类推,整个逗号表达式的值,就是最后一个式子n的值	
        int x=8,y=2,z;
        
        z=96+(x+=3,y-=4,x+y);
        printf("x=%d\n",x); 
        printf("y=%d\n",y); 
        printf("z=%d\n",z); 
        
    求字节运算符 sizeof	

if语句的使用

选择结构 if语句
单分支选择结构 单分支if语句
格式:
if(表达式/条件){
语句;
}
先判断条件是否成立,成立则执行语句,否则什么都不做(跳过)
if后面只有一条语句时,可以省略大括号,一般不建议省略
双分支选择结构 双分支if else 语句
格式:
if(表达式/条件){
语句1;
}else{
语句2;
}
先判断条件是否成立,成立执行语句1,否则执行语句2
else后面只有一条语句时,可以省略大括号,一般不建议省略
多分支选择结构 if else if 语句
格式:
if(条件1){
语句1;
}else if(条件2){
语句2;
}else if(条件3){
语句3;
}
……
else{
语句n;
}
先判断条件1是否成立,成立执行语句1,不成立继续判断条件2,成立执行语句2,不成立继续判断,以此类推,直到找到
成立的条件为止;如果所有条件都不成立,则执行最后一个else中的语句n
else不能独立出现,必须是if的一部分
else总是与它前面的,离他最近的且没有和其他else匹配的if搭配使用

练习题
输入成绩判断对应的等级 90-100 A 80-89 B 70-79 C 60-69 D 0-59 E

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int cj;
printf("请输入成绩:");
scanf("%d", &cj);
if (cj >= 90 && cj <= 100) {
printf("\n等级为A");
} else if (cj >= 80 && cj <= 89) {
printf("\n等级为B");
} else if (cj >= 70 && cj <= 79) {
printf("\n等级为C");
} else if (cj >= 60 && cj <= 69) {
printf("\n等级为D");
} else if (cj >= 0 && cj <= 59) {
printf("\n等级为E");
} else {
printf("输入成绩不合理\n");
}

实现简易计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
float a,b;
char ysf;
printf("请输入一个表达式(如:3+2):");
scanf("%f%c%f",&a,&ysf,&b);
if(ysf=='+'){
printf("%.2f %c %.2f = %.2f\n",a,ysf,b,a+b);
}else if(ysf=='-'){
printf("%.2f %c %.2f = %.2f\n",a,ysf,b,a-b);
}else if(ysf=='*'){
printf("%.2f %c %.2f = %.2f\n",a,ysf,b,a*b);
}else if(ysf=='/'){
if(b!=0){
printf("%.2f %c %.2f = %.2f\n",a,ysf,b,a/b);
}else{
printf("除数不能为零\n");
}
}

实例3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int cj;
printf("输入高考成绩:");
scanf("%d",&cj);
if(cj>=680){
printf("985,211欢迎你\n");
}else if(cj>=560){
printf("一本院校欢迎你\n");
}else if(cj>=470){
printf("二本院校欢迎你\n");
}else if(cj>=310){
printf("专科院校欢迎你\n");
}else{
printf("北京八维欢迎你\n");
}

实例4

1
2
3
4
5
6
7
8
int a,b;
printf("输入两个数字:");
scanf("%d%d",&a,&b);
if(a>=b){
printf("最大值是%d\n",a);
}else{
printf("最大值是%d\n",b);
}

实例5

1
2
3
4
5
6
7
8
int n;
printf("\n输入一个数字:");
scanf("%d",&n);
if(n%2==0){
printf("%d是偶数\n",n);
}else{
printf("%d是奇数\n",n);
}

实例6

1
2
3
4
5
6
7
8
9
int n;
printf("\n输入一个数字:");
scanf("%d",&n);
if(n%2==0){
printf("%d是偶数\n",n);
}
if(n%2!=0){
printf("%d是奇数\n",n);
}

选择结构switch语句

    格式:
            switch(表达式){
                case 常量表达式1:语句1;break; 
                case 常量表达式2:语句2;break; 
                case 常量表达式3:语句3;break; 
                ......
                default:语句n;break; 
            } 
        先计算switch表达式的值与哪一个case后常量表达式的值相同,则执行对应的case后的语句	
        如果switch表达式的值与任何一个case后常量表达式的值都不相同,则执行default后的语句 
        
        switch的注意事项
            switch后表达式可以是任意合法表达式,但是结果只能是整型或单字符型
            case后常量表达式的值可以是任意合法常量表达式,但是结果只能是整型或单字符型
            case与常量表达式之间必须有空格	
            case后常量表达式不能出现重值 
            break可有可无,一般都有 作用是跳出switch选择结构 
            default可有可无,一般都有 作用是 除case后的值以外的其他所有值 
            各个case与default之间的顺序可以是任意的 
            多个case可以执行同一语句 

两数交换
a=7
b=953

    空杯法
    temp=a; 
    a=b;
    b=temp; 

    存和法
    a=a+b; 7 + 953 = 960
    b=a-b; 960 - 953 = 7
    a=a-b; 960 - 7 = 953

输入三个数字a,b,c,按照从小到大的顺序输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int a,b,c,temp;
printf("输入三个数字:");
scanf("%d%d%d",&a,&b,&c);
if(a>b){
temp=a;
a=b;
b=temp;
}
if(a>c){
temp=a;
a=c;
c=temp;
}
if(b>c){
temp=b;
b=c;
c=temp;
}
printf("从小到大顺序是%d %d %d",a,b,c);

季节选择

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
	int yf;
printf("\n\t输入当前月份:");
scanf("%d",&yf);
switch(yf){
case 12:
case 1:
case 2:printf("\n\t冬季\n");break;
case 3:
case 4:
case 5:printf("\n\t春季\n");break;
case 6:
case 7:
case 8:printf("\n\t夏季\n");break;
case 9:
case 10:
case 11:printf("\n\t秋季\n");break;
}
```

星期选择
```C
int xq,n=1;
printf("\n\t输入当前星期:");
scanf("%d",&xq);
switch(xq){
case 2:printf("\n\t星期二,准备今天摸鱼\n");break;
case 3:printf("\n\t星期三,过了星期三,翻过一座山\n");break;
case 6:printf("\n\t星期六,欢乐时光开始了\n");break;
case 4:printf("\n\t星期四,KFC疯狂星期四,V我50看看实力\n");break;
case 7:printf("\n\t星期天,为什么会有星期一?\n");break;
default:printf("\n\t你是外星人吗?没有这个星期\n");break;
case 5:printf("\n\t星期五,过了星期五,还有一上午\n");break;
case 1:printf("\n\t星期一,努力工作,学习\n");break;
}

do while循环语句

    循环结构 do while语句
        直到型循环
        格式:
            do{
                循环体语句; 
            }while(表达式); 
        格式:
            表达式1;
            do{
                循环体语句; 
                表达式3; 
            }while(表达式2);
        先执行一次循环体,再判断循环条件,成立继续循环,不成立退出循环	

密码三次验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int mm,i;
i=1;
do{
printf("\n\t请输入密码:");
scanf("%d",&mm);
if(mm==123456){
printf("\n\t\t密码正确\n");
}else{
if(i==3){
printf("\n\t\t密码错误三次,账号已锁定\n");
}else{
printf("\n\t\t密码错误,请重新输入,还有%d次机会\n",3-i);
}
i++;
}
}while(mm!=123456&&i<=3);

while循环一般用在没有指定开始和结束的循环上,如读取一个文件一直到找到需要的东西在停止。

输入起始值与终值,输出指定范围内能被5和11整除的奇数,并求和与平均值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int qsz,zz,i,sum=0,jsq=0;
printf("输入起始值:");
scanf("%d",&qsz);
printf("输入终值:");
scanf("%d",&zz);
i=qsz;
do{
if(i%5==0&&i%11==0&&i%2!=0){
printf("%d\t",i);
sum+=i;
jsq++;
}
i++;
}while(i<=zz);
printf("\n指定范围内符合条件的数值和是%d\t平均值是%.2f\n",sum,1.0*sum/jsq);

for循环语句

    循环结构 for循环语句
        for循环语句 当型循环
        格式:
            for(表达式1;表达式2;表达式3){
                循环体语句;
            }

        for循环的注意事项
            for循环的三个表达式都可以省略,但表达式之间的;不能省略
            省略表达式1:此时循环没有初始值,需要在循环前添加初始值的语句
            省略表达式2:此时循环默认条件永远为1,这时需要在循环内添加可以退出循环的语句
            省略表达式3:此时循环没有增量,需要在循环内添加改变变量值的语句

    循环结构的三种语句都可以互相替换

输入十名评委的评分,求去掉最高分最低分后的平均分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int i;
float pf,sum=0,max,min;
for(i=1;i<=10;i++){
printf("\n\t输入第%d位评委的评分:",i);
scanf("%f",&pf);
sum+=pf;
if(i==1){
max=min=pf;
}
if(max<pf){
max=pf;
}
if(min>pf){
min=pf;
}
}
printf("\n\t去掉一个最高分%.2f分,去掉一个最低分%.2f\n",max,min);
printf("\n\t最终得分是%.2f分\n",(sum-max-min)/8);

输入项数n,求数列1/2+2/3+3/4+….+n/n+1的和

1
2
3
4
5
6
7
8
9
int i,n;
float sum=0;
printf("输入n的值:");
scanf("%d",&n);
for(i=1;i<=n;i++){
sum+=i/(i+1.0);
}
printf("数列前%d项和是%.2f\n",n,sum); */

输入数值n,求1!+2!+3!+……+n!

1
2
3
4
5
6
7
8
9
/*	int n, i, sum = 0, p = 1;
printf("请输入n的值:");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
p *= i;
sum+=p;
printf("%d的阶乘是%d\n",i,p);
}
printf("%d的阶乘和是%d\n", n, sum);*/

输入数值n,求n! n!=123*……*n

1
2
3
4
5
6
7
/*	int n,i,sum=0,p=1;
printf("请输入n的值:");
scanf("%d",&n);
for(i=1;i<=n;i++){
p*=i;
}
printf("%d的阶乘是%d\n",n,p);*/

输入起始值与终值,输出指定范围内能被13整除的所有偶数,输出内容每五个换一行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int qsz,zz,i,jsq=0;
printf("输入起始值:");
scanf("%d",&qsz);
printf("输入终值:");
scanf("%d",&zz);
for(i=qsz;i<=zz;i++){
if(i%13==0&&i%2==0){
printf("%d\t",i);
jsq++;
if(jsq%5==0){
printf("\n");
}
}
}