第四章 顺序与选择结构程序设计
4.1 C语句及赋值语句
4.1.1 C语句概述
C语句是用来向计算机系统发出操作指令的,组成C程序的执行部分,实现程序的功能。
1.表达式语句一般形式:
表达式;
如 x=x+1;
2.函数调用语句一般形式:
函数名(实际参数);
如 printf("hello world");
执行函数调用语句是调用函数体,把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求函数值。
3.控制语句
从执行方式上看,分为顺序、选择、循环这3种基本结构
条件判断语句:if语句、switch语句
循环执行语句:do while语句、while语句、for语句
转向语句:break语句、goto语句、continue语句、return语句
4.复合语句
把多条语句用“{}”括起来组成一条语句,每条语句用“;”结尾,称之为复合语句。在程序中把复合语句堪称单条语句。
5.空语句
只有一个“;”称为空语句,什么也不执行。
4.1.2 赋值语句
赋值语句是由赋值表达式加上分号组成的表达式语句,一般形式如下:
变量(复合) 赋值运算符 表达式;
1.由于在赋值运算符右边的表达式也可以是一个赋值表达式,就会形成嵌套,展开后的一般形式为:
变量(复合) 赋值运算符 变量(复合) 赋值运算符 … 变量(复合) 赋值运算符 表达式;
如 a=b=c=3;
等效于 c=3; b=c a=b;
2.C语言中的赋值号“=”或复合赋值号都是一个运算符。
3.注意在变量声明中给变量赋初值和赋值语句的区别,给变量赋初值是变量声明的一部分,如:int i=10,j=15;
4.赋值表达式和赋值语句概念不同,赋值表达式可以包含与其他表达式中,如:
if((x=y)<=0) z=y;
而赋值语句不能。
5.变量声明中,不允许连续给多个变量赋初值,正确应为:int a=5,b=5,c=5;
4.2 字符数据输入/输出
4.2.1 字符数据输出
为实现字符数据输出,C语言库函数stdio.h中提供了一个putchar函数,作用是向终端输出了一个字符,且每次只输出一个字符,一般形式如下:
putchar(c);
输出字符变量c的值,c可以是字符型变量或整型变量。
4.2.2 字符数据输入
为实现字符数据的输入,C语言库函数stdio.h中提供了一个getchar函数,作用是从终端输入一个字符,且每次只获取一个字符,一般形式如下:
getchar()
函数的返回值就是从输入设备得到的字符。
4.3格式输入/输出
4.3.1 格式输出函数
1.printf函数
作用是向终端输出若干个任意类型的数据,是一个标准库函数,其函数原型在头文件stdio.h中。一般形式如下:
printf(格式控制,输出表列)
其中格式控制是用双引号括起来的字符串,也称“转换控制字符串”,分为格式字符串和非格式字符串两种。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。非格式字符串也就是通常所说的普通字符,即在输出时原样输出。如:
printf("%d,%d",a,b);
“%d”是格式字符串;“,”是非格式字符串,即普通字符;a和b是输出列表。
2.格式控制
对不同类型的数据要使用不同的格式字符,常用以下几种:
(1)d格式字符,输出十进制整数
%d:按整型数据的实际长度输出
%md:m为指定的输出字段的宽度,如果数据位数小于m则在左端补以空格;若大于m则按实际位数输出
%ld:输出长整型数据
例4.4 格式输出函数应用
#include<stdio.h>
main()
{
int i,k;
long j;
i=36;
j=42767;
k=123;
printf("%d,%d\n",i,k);
printf("%4d,%2d\n",i,k);
printf("%ld",j);
}
(2)o格式字符,以八进制形式输出整数
%o:按整型数据的实际长度输出
%mo:m为指定的输出字段的宽度,如果数据位数小于m则在左端补以空格;若大于m则按实际位数输出
%lo:输出长整型数据
例4.5 八进制输出
#include<stdio.h>
main()
{
int i=32;
printf("%d,%o",i,i);
}
由于八进制数不带符号,故将内存单元中各位转换成八进制时将符号位也一起作为八进制数的一部分输出。
(3)x格式字符,以十六进制形式输出整数
%x:按整型数据的实际长度输出
%mx:m为指定的输出字段的宽度,如果数据位数小于m则在左端补以空格;若大于m则按实际位数输出
%lx:输出长整型数据
(4)u格式字符,以十进制形式输出无符号型数据
例4.7 无符号形式输出
#include<stdio.h>
main()
{
int i,j;
i=32768,j=32767;
printf("%d,%d\n",i,j);
printf("%u,%u",i,j);
}
(5)c格式字符,用来输出一个字符
当一个整数的范围在0~255之间,也可以用字符形式输出;同样,一个字符数据也可以整数形式输出。
(6)s格式符,用来输出一个字符串
%s:将字符串按实际长度输出
%ms:输出的字符串占m列,如字符串本身长度大于 m,则突破m的限制,将字符串全部输出,若字符串长度小于m,则左补空格
%-ms:如果字符串长度小于m,则在m列范围内,字符串向左靠,右补空格
%m.ns:输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的右侧,左补空格。若m<n,则m自动取n值
%-m.ns:输出长整型数据,输出占m列,但只取字符串中左端n个字符,这n个字符输出在m列的左侧,右补空格。若m<n,则m自动取n值
例4.9 字符串输出
#include<stdio.h>
main()
{
const char *str="helloworld";
printf("%s\n%10.5s\n%-10.2s\n%.3s",str,str,str,str);
}
(7)f格式字符,以小数形式输出实型数据
%f:不指定字符宽度,整数部分全部输出,小数部分输出6位。数据并不全是准确的,只有前7位是有效数字。双精度数同样可以用%输出
%m.nf:输出的数据占m列,其中有n位小数。如果数值长度大于m,则左端补空格
%-m.nf:输出的数据占m列,其中有n位小数。如果数值长度大于m,则右端补空格
例4.10 实型数据输出
#include<stdio.h>
main()
{
float i=2998.453257845;
double j=2998.453257845;
printf("%f\n%10.2f\n%-10.3f\n%f",i,i,i,j);
}
(8)e格式字符,以指数形式输出实型数据
%e:不指定输出数据所占宽度和小数位数
%m.ne:输出的数据占m位,其中有n位小数,如果数值长度大于m,则左端补空格
%-m.ne:输出的数据占m位,其中有n位小数,如果数值长度大于m,则右端补空格
输出的施主行驶中指数符号“+”算一位
例4.11 指数形式输出
#include<stdio.h>
main()
{
float i=2998.453257845;
double j=2998.453257845;
printf("%e\n%15.2e\n%-10.3e\n%e",i,i,i,j);
}
(9)g格式字符,输出实数,根据数字的大小自动选择f格式或e格式
printf格式字符总结:
表示输出类型的格式字符 | 格式字符意义 |
---|---|
d | 以十进制形式输出带符号整数(正号不输出符号) |
o | 以八进制形式输出无符号整数(不输出前缀0) |
x | 以十六进制形式输出无符号整数(不输出前缀0X) |
u | 以十进制形式输出无符号整数 |
c | 输出单个字符 |
s | 输出字符串 |
f | 以小数形式输出单、双精度实数 |
e | 以指数形式输出单、双精度实数 |
g | 以%f、%e中较短的输出宽度输出单、双精度实数 |
注:
(1)除了格式字符x、e、g在使用时可以大写外,其余格式字符必须小写
(2)在进行字符“%”输出时要注意,必须在格式控制中连写两个%才能得到预期效果,如想输出100%,则要写printf("%d%%",100);
4.3.2 格式输入函数
1.scanf函数的一般格式
scanf是一个标准库函数,其函数原型是在头文件stdio.h中。一般形式为:
scanf(格式控制,地址列表);
格式控制与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址列表中给出各变量的地址。地址是由地址运算符"&"后跟变量名组成的。例如:&a表示变量a的地址,这个地址就是编译系统在内存中给a变量分配的地址。
如scanf("%d,%d",&a,&b);
遵循格式控制的格式,两输入之间用逗号隔开
scanf("%d%d",&m,&n)
两输入之间可以用一个或多个空格间隔,也可以用Enter或Tab
2.格式控制
格式控制的一般形式如下:
% [ * ][域宽][长度]类型
其中[ ]为任选项
(1)一般形式中的“类型”,即scanf函数的格式字符
格式 | 字符意义 |
---|---|
d | 输入十进制整数 |
o | 输入八进制整数 |
x | 输入十六进制整数 |
u | 输入无符号十进制整数 |
c | 输入单个字符 |
s | 输入字符串 |
f、e、g | 输入实型数据(用小数或指数形式) |
(2)一般形式中“*”用来表示该输入项读入后不赋予相应的变量,即跳过该输入值,如:scanf("%d %*d %d",&a,&b);
当输入12 23 15时,把12赋各位a,23被跳过,15赋给b
(3)“域宽”就是指定输入数据所占宽度,域宽应为正整数。如scanf("%5d",&x);
当输入12345678时,把12345赋给变量x,其余部分被截去。又如scanf("%4d%4d",&x,&y);
当输入12345678时,把1234赋给x,5678赋给y
(4)“长度”格式字符为1和h,1表示输入长整型数据和双精度浮点数,h表示输入短整型数据。
注:scanf没有精度控制,"%10.2f"为非法;scanf要求给出变量地址,所以“&”必不可少
4.4 顺序程序设计举例
例4.16 输入一个小写字母,将其转换成大写字母后输出
#include<stdio.h>
main()
{
char ch;
ch=getchar();
printf("lowercase is %c\n",ch);
ch=ch-32;
printf("majuscule is %c\n",ch);
}
4.5 if语句
4.5.1 if语句的基本形式
1.if(表达式) 语句组
如果表达式为真,则执行其后的语句,否则不执行该语句
if(表达式)
语句组1
else
语句组2
如果表达式为真,则执行语句组1,否则执行语句组2
if(表达式1)
语句组1
else if(表达式2)
语句组2
……
else if(表达式m)
语句组m
else 语句组n
依据判断各表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个if语句之外继续执行程序,如果所有表达式均为假,则执行语句组n,然后继续执行后续程序
注:
- 3种形式的if语句中if后都有表达式,一般为逻辑表达式或关系表达式。在执行if语句时先对表达式进行求解,若表达式值为0,按“假”处理,若表达式为非0,按“真”处理,执行指定的语句。
- else语句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。
- if与else后面可以包含一条或多条内嵌的操作语句。如果有多条操作语句,要用“{}”将几条语句括起来组成一条复合语句。
- if语句可以嵌套使用,else总是与其上面最近的if配对。
4.5.2 if语句的嵌套形式
if( )
if()
语句组1
else
语句组2
else
if()
语句组3
else
语句组4
如果else和if数目不一样,要根据实现的功能加“{}”确定配对关系
if( )
{
if()
语句组1
}
else
语句组2
4.5.3 条件运算符
表达式1?表达式2:表达式3
- 条件运算符优先于赋值运算符,比关系运算符和算术运算符都低。
- 条件运算符的结合方式为“自右至左”。
- 条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。
例4.20 利用条件表达式判断一个数是否是5和7的整数倍
#include<stdio.h>
main()
{
int x;
printf("please input a number:\n");
scanf("%d",&x);
(x%5==0&&x%7==0)?printf("yes"):printf("no"); /*为真输出yes为假输出no*/
}
4.6 switch语句
switch(表达式)
{
case 常量表达式1:
语句1;
case 常量表达式2:
语句2;
……
case 常量表达式n:
语句n;
default:
语句n+1;
}
- 计算表达式的值,并逐个与其后的常量表达式的值进行比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,不再进行判断,继续进行所有case后的语句,如果表达式的值与所有case后的常量表达式的值均不相等,则执行default后的语句。
- 每个case后的常量表达式的值必须互不相同,如果执行完一个case想跳出switch结构在相应语句后加break即可。
4.7 选择结构程序举例
例4.24 加油站加油
a、b、c三种汽油;a、b两种优惠
#include <stdio.h>
main()
{
float x, m1, m2, m;
char y, z;
scanf("%f,%c,%c", &x, &y, &z); /*输入选择油的千克数、种类及服务*/
switch (y)
{
case 'a':
m1 = 3.25;
break;
case 'b':
m1 = 3.00;
break;
case 'c':
m1 = 2.75;
break;
}
switch (z)
{
case 'a':
m2 = 0;
break;
case 'm':
m2 = 0.05;
break;
case 'e':
m2 = 0.1;
break;
}
m = x * m1 - x * m1 * m2; /*计算应付的钱数*/
printf("the type of oil is:%c\n", y);
printf("the type of server is:%c\n", z);
printf("the money is:%.3f", m);
}