C程序结构
C语句的分类
- 控制语句
- 函数调用语句
- 表达式语句
- 空语句
- 复合语句
(1)控制语句:控制语句用于完成一定的控制功能,C共有9种控制语句
- if()…else…(条件语句)
- for()…(循环语句)
- while()…(循环语句)
- do…while ()(循环语句)
- continue(结束本次循环语句)
- break(中止执行switch或循环语句)
- switch(多分支选择语句)
- return(从函数返回语句)
- goto(转向语句,在结构化程序中基本不用goto语句) ()表示括号中是一个判别条件 …表示内嵌的语句
(2)函数调用语句:函数调用语句由一个函数调用加一个分号构成。
printf("This is a C statement. "); //其中printf("This is a C statement. ")是一个函数调用,加一个分号成为一个语句。
(3)表达式语句:表达式语句由一个表达式加一个分号构成,最典型的是由赋值表达式构成一个赋值语句。
a=3 是一个赋值表达式,而 a=3; 是一个赋值语句
(4)空语句:只有一个分号的语句即为空语句。
- 可用来作为流程的转向点(流程从程序其他地方转到此语句处)
- 也可用来作为循环语句中的循环体(循环体是空语句,表示循环体什么也不做)
(5)复合语句:可以用{}把一些语句和声明括起来成为复合语句(又称语句块)。
{
float pi=3.14159, r=2.5, area; //定义变量
area=pi*r*r;
printf("area=%f",area);
}
复合语句常用在if语句或循环中,此时程序需要连续执行一组语句。复合语句中最后一个语句末尾的分号不能忽略不写。
最基本的语句——赋值语句
1、赋值运算符"="
"="的作用是将一个数据赋给一个变量(也可以将一个表达式的值赋给一个变量)。
例如:a=3的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。
2、复合赋值运算符
在赋值符"="之前加上其他运算符,可以构成复合的运算符。
a+=3 等价于a=a+3
- x*=y+8 等价于x=x*(y+8)
- x%=3 等价于x=x%3
凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。
有关算术运算的复合赋值运算符有+=,-=,*=,/=,%=.
注意:如果赋值符右边是包含若干项的表达式,则相当于它有括号。例如, x%=y+3等价于x=x%(y+3),切勿错写为x=x%y+3。
3、赋值表达式 :变量 赋值运算符 表达式
赋值表达式的作用是将一个表达式的值赋给一个变量,因此赋值表达式具有计算和赋值的双重功能。
对赋值表达式求解的过程是:
①求赋值运算符右侧的“表达式”的值,
②赋给赋值运算符左侧的变量。既然是一个表达式,就应该有一个值,表达式的值等于赋值后左侧变量的值。 赋值运算符左侧应该是一个可修改值的“左值”(left value,简写为lvalue)。 能出现在赋值运算符右侧的表达式称为“右值”(right value,简写为rvalue)。【并不是任何形式的数据都可以作为左值的,左值应当为存储空间并可以被赋值。变量可以作为左值,而算术表达式a+b就不能作为左值,常量也不能作为左值。】
a=(b=5):括号内的b=5是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”,就是执行b=5和a=b两个赋值表达式。因此a的值等于5,整个赋值表达式的值也等于5。赋值运算符按照“自右而左”的结合顺序,因此,(b=5)外面的括号可以不要,即a=(b=5)和a=b=5等价,都是先求b=5的值(得5),然后再赋给a。
- a=b=c=5 表达式值为5,a,b,c值均为5
- a=5+(c=6) 表达式值为11,a值为11,c值为6
- a=(b=4)+(c=6) 表达式值为10,a值为10,b等于4,c等于6
- a=(b=10)/(c=2) 表达式值为5,a等于5,b等于10,c等于2
- a=(b=3*4) 表达式值为12,a,b值均为12
赋值表达式使得赋值操作不仅可以出现在赋值语句中,而且可以出现在其他语句中(如输出语句、循环语句等) 如: printf("%d", a=b); 如果b的值为3,则输出a的值(也是表达式a=b的值)为3。在一个printf函数中完成了赋值和输出双重功能。
4、赋值过程中的类型转换
如果赋值运算符两侧的类型一致,则直接进行赋值。
如果赋值运算符两侧的类型不一致,但都是基本类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的,转换的规则是:
- 将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋予整型变量。
- 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
- 将一个double型数据赋给float变量时,先将双精度数转换为单精度,即只取6~7位有效数字,存储到float型变量的4个字节中。应注意双精度数值的大小不能超出float型变量的数值范围;将一个float型数据赋给double型变量时,数值不变,在内存中以8个字节存储,有效位数扩展到15位。
- 字符型数据赋给整型变量时,将字符的ASCII代码赋给整型变量。
- 将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,只将其低字节原封不动地送到被赋值的变量(即发生“截断”)。
5、赋值表达式和赋值语句
C语言的赋值语句属于表达式语句,由一个赋值表达式加一个分号组成。 在一个表达式中可以包含另一个表达式。
区分赋值表达式和赋值语句:
- 赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号。
- 在一个表达式中可以包含一个或多个赋值表达式,但绝不能包含赋值语句。
if ((a=b)>0)max=a; /*先进行赋值运算(将b的值赋给a),然后判断a是否大于0,
如大于0,执行max=a。 请注意,在if语句中的a=b不是赋值语句,而是赋值表达式。*/
6、变量赋初值
可以用赋值语句对变量赋值,也可以在定义变量时对变量赋以初值。
int a=3; //指定a为整型变量,初值为3;相当于int a; a=3;
- float f=3.56; //指定f为浮点型变量,初值为3.56
- char c=′a′; //指定c为字符变量,初值为′a′
- int a,b,c=5; //指定a,b,c为整型变量,但只对c初始化,c的初值为5,相当于int a,b,c; c=5;
对几个变量赋予同一个初值,必须注意:
数据的输入输出
1、输入输出举例
求ax²+bx+c=0方程的根。a,b,c由键盘输入,设b²-4ac>0。
#include <stdio.h>
#include<math.h> //程序中要调用求平方根函数sqrt
int main()
{ double a,b,c,disc,x1,x2,p,q; //disc用来存放判别式(bb-4ac)的值
scanf("%lf%lf%lf",&a,&b,&c); //输入双精度型变量的值要用格式声明″%lf″
disc=b*b-4*a*c;
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;x2=p-q; //求出方程的两个根
printf("x1=%7.2f\nx2=%7.2f\n",x1,x2); //输出方程的两个根
return 0;
}
运行结果:
程序分析:
scanf函数用于输入a,b,c的值。 函数中括号内变量a,b,c的前面,要用地址符&。&a表示变量a在内存中的地址。 双引号内用%lf格式声明,表示输入的是双精度型实数。 格式声明为“%lf%lf%lf”,要求输入3个双精度实数。程序运行时,输入“1 3 2”,两个数之间用空格分开。输入的虽是整数,但由于指定用%lf格式输入,因此系统会先把这3个整数转换成实数1.0,3.0,2.0,然后赋给变量a,b,c。
在printf函数中,在格式符f的前面加了“7.2”,表示在输出x1和x2时,指定数据占7列,其中小数占2列。优点: ①可以根据实际需要来输出小数的位数; ②如果输出多个数据,可使输出数据整齐美观。
2、有关输入输出的概念
3、用printf函数输出数据
用来向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。
一般格式:printf(格式控制,输出表列)
(1) “格式控制”是用双引号括起来的一个字符串,称为格式控制字符串,简称格式字符串。包括:
① 格式声明。格式声明由“%”和格式字符组成。作用是将输出的数据转换为指定的格式后输出。
② 普通字符。普通字符即需要在输出时原样输出的字符。
(2) 输出表列是程序需要输出的一些数据,可以是常量、变量或表达式。
·printf函数——格式声明(% 附加字符 格式字符)
注意:
- printf函数输出时,务必注意输出对象的类型应与上述格式说明匹配,否则将会出现错误。
- 除了X,E,G外,其他格式字符必须用小写字母,如%d不能写成%D。
- 可以在printf函数中的格式控制字符串内包含转义字符,如\n,\t,\b,\r,\f和\377等。
- 一个格式声明以“%”开头,以格式字符之一为结束,中间可以插入附加格式字符(也称修饰符)。
- 如果想输出字符“%”,应该在“格式控制字符串”中用连续两个“%”表示,如:printf(″%f%%\n″,1.0/3);
补充:
·printf函数举例
①用%f输出实数,只能得到6位小数。
#include <stdio.h>
int main()
{ double a=1.0;
printf("%f\n",a/3);
return 0;
}
运行结果:
程序分析:
虽然a是双精度型,a/3的结果也是双精度型,但是用%f格式声明只能输出6位小数。
②在“%”和格式控制符之间插进数字,表示输出项的最大域宽。
#include<stdio.h>
int main()
{
float r=5.7,s;
s=3.1416*r*r;
printf("R=%10.3f,S=%10.3f。\n",r,s);
return 0;
}
运行结果:
程序分析:
R与S的输出数值都为10列,并且小时部分占3位,并且输出为右对齐
③在“%”和格式控制符之间加入"-" 号,控制输出为左对齐,否则为右对齐。
#include<stdio.h>
int main()
{
float r=5.7,s;
s=3.1416*r*r;
printf("R=%-10.3f,S=%-10.3f。\n",r,s);
return 0;
}
运行结果:
程序分析:
程序输出为左对齐,R与S的输出数值都为10列,并且小时部分占3位。
4、用scanf函数输入数据
格式化输入函数,从标准输入设备为变量输入数据。在scanf()函数中设计数据的输入格式,执行该函数时,即按照所设计的格式输入数据。
一般格式:scanf(格式控制,地址表列)
(1) “格式控制”是用双引号括起来的一个字符串,含义同printf函数。包括:
① 格式声明。以%开始,以一个格式字符结束,中间可以插入附加的字符。
② 普通字符。
(2) 地址表列是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。
·scanf函数——格式声明(% 附加字符 格式字符)
注意:
- scanf函数中的格式控制后面应当是变量地址,而不是变量名。 应与上述格式说明匹配,否则将会出现错误。
- 如果在格式控制字符串中除了格式声明以外还有其他字符,则在输入数据时在对应的位置上应输入与这些字符相同的字符。
- 在用“%c”格式声明输入字符时,空格字符和“转义字符”中的字符都作为有效字符输入。
- 在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数值的字符),认为该数据结束。
- “格式化字符串”中的格式控制符之间可以不使用任何分隔符号,也常用逗号分隔。 当不使用任何分隔符时,输入的数据之间可以使用空格分隔,也可以使用回车符分隔; 使用“,”分隔时,输入数据时各个数据之间要使用“,”分隔。
·scanf函数举例
使用逗号“,”分隔数据示例。
#include<stdio.h>
int main()
{
int a,b,c;
printf("Input a,b:");
scanf("%d,%d",&a,&b);
c=a+b;
printf("%d+%d=%d\n",a,b,c);
return 0;
}
运行结果:
程序分析:
%d之间用”,”分隔,输入数据时,两个数据之间只能以”,”分隔。全部数据输入结束后按回车键。
5、putchar函数输出字符
调用格式: putchar(ch)
功能:向标准输出设备输出一个字符。
说明:
- ch为一个字符变量名或字符常量,putchar(ch)函数是将ch的值显示在屏幕上。
- 用putchar函数既可以输出可显示字符,也可以输出控制字符和转义字符。
- putchar(ch)中的ch可以是字符常量、整型常量、字符变量或整型变量(其值在字符的ASCII代码范围内)。
·putchar函数举例
先后输出BOY三个字符。
解题思路: 定义3个字符变量,分别赋以初值′B′,′O′,′Y′,然后用putchar函数输出这3个字符变量的值。
#include <stdio.h>
int main()
{
char a='B',b='O',c='Y'; //定义3个字符变量并初始化
putchar(a); //向显示器输出字符B
putchar(b); //向显示器输出字符O
putchar(c); //向显示器输出字符Y
putchar ('\n'); //向显示器输出一个换行符
return 0;
}
运行结果:
程序分析:
以上程序也等价于
#include <stdio.h>
int main()
{
int a=66,b=79,c=89;
putchar(a);
putchar(b);
putchar(c);
putchar ('\n');
return 0;
}
6、getchar函数输入字符
调用格式:getchar()
功能:从键盘输入的字符串中读入一个字符
说明:
- 函数没有参数。
- 函数的值就是从输入设备得到的字符。 只能接收一个字符。
- 如果想输入多个字符就要用多个函数。 不仅可以从输入设备获得一个可显示的字符,而且可以获得控制字符。
- 用getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以作为表达式的一部分。如:putchar(getchar());将接收到的字符输出。
·getchar函数举例
①从键盘输入BOY 3个字符,然后把它们输出到屏幕。
解题思路:用3个getchar函数先后从键盘向计算机输入BOY 3个字符,然后用putchar函数输出。
#include <stdio.h>
int main()
{ char a,b,c; //定义字符变量a,b,c
a=getchar(); //从键盘输入一个字符,送给字符变量a
b=getchar(); //从键盘输入一个字符,送给字符变量b
c=getchar(); //从键盘输入一个字符,送给字符变量c
putchar(a); //将变量a的值输出
putchar(b); //将变量b的值输出
putchar(c); //将变量c的值输出
putchar('\n');//换行
return 0;
}
运行结果:
②从键盘输入一个大写字母,在显示屏上显示对应的小写字母
解题思路:用getchar函数从键盘读入一个大写字母,把它转换为小写字母,然后用putchar函数输出该小写字母。
#include <stdio.h>
int main ()
{
char c1,c2;
c1=getchar(); //从键盘读入一个大写字母,赋给字符变量c1
c2=c1+32; //得到对应的小写字母的ASCII代码,放在字符变量c2中
printf("大写字母: %c\n小写字母: %c\n",c1,c2); //输出c1,c2的值
return 0;
}
运行结果: