C语言程序设计结构
分三种
顺序结构:
一条一条指令执行。
int a,b;
a = 3;
b = 4;
分支结构(选择结构):
if语句
switch语句
循环结构:
for
while
do....while
goto
1.if语句
有三种基本形式:
(1)
if(表达式)
语句(指令)
表达式:进行选择的条件
任意c语言合法的表达式都可以
只要是合法的表达式就会有一个值。
我们需要判断这个表达式的值就ok
语句:
在满足条件下,要执行的语句或指令
单语句:一个;号的语句
复合语句:
{}/if/for/while....
执行顺序:
假如(if)"表达式"的值为非0(条件满足)
则执行下面的"语句"(指令)
例子:
int a =0; b=0;
if(3<2)
a =3 ;
b = 4;
printf("%d\n",a);//0
printf("%d\n",b);//4
没有语法问题,if只能够管一个;
所以不管"表达式"的值是否为真,
语句 b = 4一定会执行!!!!
编程建议大家,不管if后面有没有语句,先打一对{},以示主权,确定if的管辖范围
(2)
if(表达式)
语句1;
else
语句2;
else : 否则
执行顺序:
假如"表达式"的值为真(非0),则执行语句1,否则执行语句2
例子:
if(5>3)
a = 1;
b = 2;
else // error
a = 2;
b = 1;
编程建议;
不管if,else后面有没有语句,先打{}
if()
{
}
else
{
}
(3)if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式n-1)
语句n-1;
else
语句n;
=>
if(表达式)
{
语句1;
}
else
{
if(表达式2)
{
语句2;
}
else
.......
}
执行顺序:
判断"表达式1"的值,如果为真(非0),则执行语句1,否则,再判断
表达式2的值,如果为真(非0),则执行"语句2",否则。。。
练习:
1.请大家从键盘输入两个整数a,b 按从小到大的顺序依次输出!!!
#include<stdio.h>
int main()
{
int a,b;
printf("请输入两个整数:\n");//在终端上面显示"请输入两个整数:"
scanf("%d%d",&a,&b);
if(a<b)
{
printf("%d<%d",a,b);
}
else
{
printf("%d<%d",b,a);
}
return 0;
}
#include <stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n%d",a<b?a:b,a>b?a:b);
return 0;
}
2.从键盘输入三个整数a,b,c按从小到大的顺序依次输出
#include<stdio.h>
int main()
{
int a,b,c,t;
printf("请输入三个整数:\n");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
if(b>c)
{
t=c;
c=b;
b=t;
}
printf("%d<%d<%d\n",a,b,c);
return 0;
}
3.输入三个整数a,b,c,判断由这三个数为边是否能组成一个三角形
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{
printf("能");
}
else
{
printf("不能");
}
return 0;
}
4.从键盘输入一个字符:大写转小写,小写转大写,其他原样输出
#include <stdio.h>
int main()
{
char c;
scanf("%c",&c);
if(c<='Z'&&c>='A')
{
printf("%c",c+32);
}
else if(c<='z'&&c>='a')
{
printf("%c",c-32);
}
else
{
printf("%c",c);
}
}
有几个注意的点
(1)语句:
表达式语句: 表达式
b = 5 ===>表达式(赋值表达式)
b = 5; ===>赋值语句
if语句 分支语句
循环语句:
while
do。。。while
for
goto语句
return语句
....
(2)条件;
并列条件: 会一一判断他们
if(条件1)
{
}
if(条件2)
{
}
互斥条件: 有你没我,有我没你
if(条件1)
{
}
else
{
}
(3) if语句的嵌套
"条件里面又有条件"
在if语句中又包含一个或多个if称为if语句的嵌套
if(条件1)
{
if(条件2)
语句1
}
关键: else 匹配问题
else总是与它上面的,最近的,同级的,未匹配的if语句配对
if(条件1)
{
if()
语句1
else
语句2
}
else
{
if()
语句3
else
语句4
}
从键盘输入一个十六进制的字符[0-9 a-f A-F],输出其对应的数值
unsigned char ch;
int d;
scanf("%c",&ch);
if(ch == '0')
{
d = 0;
}
else if(ch == '1' )
{
d = 1;
}
else if(ch =='A' || ch =='a')
{
d =10;
}
......
上面的代码 好像在"列举"十六进制所有可能的字符
2.switch语句
switch(表达式)
{
case 常量\常量表达式1:
语句1
case 常量\常量表达式2:
语句2
default:
语句块n
}
switch语句:拿"表达式"的值,与case后面的"常量\常量表达式"作匹配,
一旦匹配成功,则从那个case后面开始执行,知道遇到break 或switch结束
如果没有一个匹配成功,则匹配default.
关于switch:
(1)switch 后面的"表达式"必须是一个可以列举的值,
必须为一个整数值:整型,字符型
(2)case后面的"常量表达式"也必须为一个整数的值
而且每个case后面的"常量表达式"的值也必须互不相同
(3)各个case和default出现的顺序是不会影响匹配结果
一旦匹配成功,就从该处往下执行
例子:
switch(a)
{
default: // default 永远是,所有的case都不匹配的时候,才匹配default
// 匹配的情况跟defalut的顺序无关
case 7:
case 5:
case 6:
case 1:
}
(4) "语句块"可以省略 意思就是说,多个case可以公用一个语句块
例子;
如:
switch(a)
{
case 1:
case 2:
case 3:
语句1
break;
}
(5) switch中的break 用来跳出它所属的switch语句
如:
switch(a)
{
case 1 :
a = 1;
case 2:
b = 2;
break;
case 3:
......
}
练习:
1.从键盘出入一个成绩(int),把这个成绩值对应的等级输出
'A':[90,100]
'B':[80,90)
'C':[70,80)
'D':[60,70)
'E':[0,60)
伪代码:
int score;
printf("请输入成绩:");
scanf("%d",&score);
switch(score/10)
{
case 10:
case 9:
A
break;
case 8:
B
break;
}
2.输入一个日期(year - month - day )求该日期到年末还有多少天?
//----> 数学问题(找到他的逻辑)--->用文字描述出来 ---> 写伪代码 ---> c语言代码
(1)先判断是否为闰年, 2月份为29/28
(2) 总的时间 - 已过的日期加起来
#include <stdio.h>
int main()
{
int year,month,day,n=0,ew;
printf("请输入年月日\n");
scanf("%d%d%d",&year,&month,&day);
if((year%4==0&&year%100!=0)||year%400==0)
{
ew=29; //闰年二月份的时间
}
else
{
ew=28; //不是闰年二月份的时间
}
switch(month)
{
case 1: n+=31; // n= n+31
case 2: n+=ew;
case 3: n+=31;
case 4: n+=30;
case 5: n+=31;
case 6: n+=30;
case 7: n+=31;
case 8: n+=31;
case 9: n+=30;
case 10: n+=31;
case 11: n+=30;
case 12: n+=31;
}
n=n-day;
printf("距离年末还有%d天\n",n);
return 0;
}
练习:
1.企业发放的奖金根据企业的当年利润所决定。
当利润 I 低于或等于100000元时,奖金可提成10%;
利润大于100000元,小于或等于200000元(100000 < I <= 200000)时,
低于100000元部分按10%提成,高于100000元的部分,可提成7.5%;
利润大于200000元,小于或等于400000元(200000 < I <= 400000)时,
低于200000元部分按上述方法提成,高于200000元的部分,可提成5%;
利润大于400000元,小于或等于600000元(400000 < I <= 600000)时,
低于400000元部分按上述方法提成,高于400000元的部分,可提成3%;
利润大于600000元,小于或等于1000000元(600000 < I <= 1000000)时,
低于600000元部分按上述方法提成,高于600000元的部分,可提成1.5%;
利润大于1000000元时,
低于1000000元部分按上述方法提成,高于1000000元的部分,可提成1%;
从键盘输入当年的利润 I,求应发的年终奖的奖金 P 。
要求:(任选其一)
(1) 用 if 语句 编程
(2) 用 switch 语句 编程
switch:
double I;
double p = 0;
scanf("%lf",&I);
switch((long)I/100000)
{
default:
case 10:
p += (I-1000000)*0.01;
I = 1000000;
case 9:
case 8:
case 7:
case 6:
p +=(I-600000)*0.015;
I = 600000;
......
......
}
2、 输入一个形式为 " 操作数 运算符 操作数" 的四则运算表达式,
输出运算的结果 ( + - * / )
如:
输入 5.2+4.8
输出 5.2+4.8 = 10.00 保留两位小数
char ch;
float a ,b;
scanf("%f%c%f",&a,&ch,&b);
switch(ch)
{
case '+':
printf("%f+%f = %.2f\n",a,b,a+b);
break;
case '-':
.......
}
3,C语言的if语句中,用作判断的表达式为? (C)
A,关系表达式 B,逻辑表达式 C,任意表达式 D,算数表达式
4,以下程序的运行结果是? (2)
main()
{
int a=2,b=-1,c=2;
if(a<b)
if(b<0) c=0;
else c+=1;
printf("%d",c);
}
5,以下程序的运行结果是? (3)
main()
{
int a=5,b=4,c=3,d=2;
if(a>b>c)
printf("%d\n",d);
else if((c-1>=d)==1)
printf("%d\n",d+1);
else
printf("%d\n",d+2);
}
6,以下程序的运行结果是? (SO)
void main()
{
int a=2;
switch(a)
{
default;
printf("S");
case 1:
printf("O");
}
}
7,以下程序的运行结果是? (不能确定)
if(a=b)
printf("a==b");
else
printf("a!=b);
8,如有int i=10,j=0;则执行完语句
if(j=0)i++;else i--;i的值为?
(9)
9,以下程序的运行结果是? (3)
#include<stdio.h>
main()
{
int x,y,z;
x=1;y=2;z=3;
if(x>y)
if(x>z) printf("%d",x);
else printf("%d",y);
printf("%d\n",z);
}
回顾;
c语言程序结构
顺序结构:一条一条从上而下执行
a = 2;
b = 3;
分支结构(选择结构):
a,if语句
if(表达式)
语句;
表达式:任何c语言中合法的表达式都可以
所谓的条件
语句: 单语句;
复合语句{}
if(表达式)
语句1;
else
语句2;
执行顺序:
if(如果)"表达式"的值为真(非0),那么执行语句1
否则执行语句2
if(表达式)
a =2;
b =3;
else //此处的else没有匹配到if(ERROR)
c = 4;
if(表达式1)
语句1;
else if(表达式2)
语句2;
....
else
语句n;
执行顺序:
先判断表达式1的值,如果为真 执行语句1;
否则判断表达式2的值,如果为真,执行语句2;
否则....
如果所有的表达式都不满足,则执行"语句n"
并列条件
if(a>100)
{
b = a;
}
if(a>50)
{
c = a;
}
互斥条件
if else
b, switch语句
switch(表达式)
{
case 常量表达式/常量 :
语句1;
case ...
default :
语句 n+1
}
表达式:是一个可以列举的整数值
常量表达式: 整型常量,字符型常量,
循环结构