1 三种基本结构
从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构。这三种基本结构可以组成所有的各种复杂程序。
2 C基本语句
C程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的。
C语句可分为以下五类:
-
表达式语句 :
表达式语句由表达式加上分号“;”组成。
其一般形式为: 表达式;
执行表达式语句就是计算表达式的值。
例如:
x=y+z; 赋值语句;
y+z; 加法运算语句,但计算结果不能保留,无实际意义;
i++; 自增1语句,i值增1。 -
函数调用语句 :
由函数名、实际参数加上分号“;”组成。
其一般形式为:
函数名(实际参数表);
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值 (在后面函数中再详细介绍) 。
例如:
printf("C Program");调用库函数,输出字符串。
- 控制语句 :
控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。可分成以下三类:
- 条件判断语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
- 复合语句
复合语句:把多个语句用括号{}括起来组成的一个语句称复合语句。
在程序中应把复合语句看成是单条语句,而不是多条语句。
{
x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
- 空语句
-
空语句:只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。
例如
while(getchar()!='\n')
{
;
}
本语句的功能是,只要从键盘输入的字符不是回车则重新输入。
这里的循环体为空语句。
在变量说明中,不允许连续给多个变量赋初值。
如下述说明是错误的:
int a=b=c=5
必须写为
int a=5,b=5,c=5;
而赋值语句允许连续赋值。
3 数据输入输出在C中实现
- 所谓输入输出是以计算机为主体而言的。
- 本章介绍的是向标准输出设备显示器输出数据的语句。
- 在C语言中,所有的数据输入/输出都是由库函数完成的。因此都是函数语句。
- 在使用C语言库函数时,要用预编译命令#include将有关“头文件”包括到源文件中。
使用标准输入输出库函数时要用到 “stdio.h”文件,因此源文件开头应有以下预编译命令:
#include< stdio.h >(系统自带)或#include ”stdio.h”(自己编写的)
stdio是standard input &outupt的意思。 - 考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加
#include< stdio.h >或#include ”stdio.h”
3.1 字符数据的输入输出
putchar 函数
(字符输出函数)
例:
#include<stdio.h>
void main()
{
char a='B',b='o',c='k';
putchar(a); putchar(b); putchar(b); putchar(c); putchar('\t');
putchar(a); putchar(b);
putchar('\n');
putchar(b); putchar(c);
}
getchar函数
(键盘输入函数)
当输入数字时,对应为字符,即输入8时,默认为‘8’;
只能输入一个字符
例:
//【例4.2】输入单个字符。
#include<stdio.h>
void main()
{
char c;
printf("input a character\n");
c = getchar();
putchar(c);
}
3.2 格式输入输出
printf函数
格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。
一般形式:
printf(“格式控制字符串”,输出表列)
“%d”表示按十进制整型输出;
“%ld”表示按十进制长整型输出;
“%c”表示按字符型输出等。
非格式字符串在输出时原样照印,在显示中起提示作用。
输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
//【例4.3】
void main()
{
int a=88,b=89;
printf("%d %d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
}
本例中四次输出了a,b的值,但由于格式控制串不同,输出的结果也不相同。第四行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a,b值之间加了一个逗号。第六行的格式串要求按字符型输出 a,b值。第七行中为了提示输出结果又增加了非格式字符串。
格式字符串
- 类型:类型字符用以表示输出数据的类型,其格式符和意义如下表所示:
2) 标志:标志字符为-、+、#、空格四种,其意义下表所示:
3) 输出最小宽度:用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
4) 精度:精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
5) 长度:长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。
void main()
{
int a=15;
float b=123.1234567;
double c=12345678.1234567;
char d='p';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}
使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请看下面两个例子:
//【例4.5】
void main()
{
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n %d\n",++i,--i,i++,i--,-i++,-i--);
}
//【例4.6】
void main()
{
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的 !!
scanf函数
(格式输入函数)即按用户指定的格式从键盘上把数据输入到指定的变量之中。
一般形式为:
scanf(“格式控制字符串”,地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。
例如:
&a, &b
分别表示变量a和变量b 的地址。
这个地址就是编译系统在内存中给a,b变量分配的地址。
但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。
【例4.7】
void main()
{
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
格式字符串
格式字符串的一般形式为:
%[*][输入数据宽度][长度]类型
其中有方括号[]的项为任选项。各项的意义如下:
- 类型:表示输入数据的类型,其格式符和意义如下表所示。
- “*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
如: scanf("%d %*d %d", &a, &b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。 - 宽度:用十进制整数指定输入的宽度(即字符数)。
如: scanf("%5d", &a);
输入:12345678
只把12345赋予变量a,其余部分被截去。
如:
scanf("%4d%4d", &a, &b);
输入:12345678
将把1234赋予a,而把5678赋予b。 - 长度:长度格式符为l和h,l表示输入长整型数据(如%ld) 和双精度浮点数(如%lf)。h表示输入短整型数据。
使用scanf函数还必须注意以下几点:
- scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
- scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
- 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
- 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
例如:
scanf("%c%c%c",&a,&b,&c);
输入为:
d e f
则把’d’赋予a, ’ ’ 赋予b,'e’赋予c。
只有当输入为:def 时,才能把’d’赋于a,'e’赋予b,'f’赋予c。
如果在格式控制中加入空格作为间隔,
如: scanf ("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。
【例4.8】
void main()
{
char a,b;
printf("input character a,b\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
}
由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。而输入改为MN时则可输出MN两字符。
【例4.9】
void main()
{
char a,b;
printf("input character a,b\n");
scanf("%c %c",&a,&b);
printf("\n%c%c\n",a,b);
}
本例表示scanf格式控制串"%c %c"之间有空格时,输入的数据之间可以有空格间隔。
- 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
例如:
scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“ , ”作间隔符,故输入时应为:
5,6,7
又如:
scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
则输入应为:
a=5,b=6,c=7
【例4.10】
void main()
{
int a;
printf("input a number\n");
scanf("%d",&a);
printf("%ld",a);
}
【例4.11】
void main()
{
long a;
printf("input a long integer\n");
scanf("%ld",&a);
printf("%ld",a);
}
由于输入数据类型为整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。
题目:输入三个小写字母,输出其ASCII码和对应的大写字母。
【例4.12】
void main()
{
char a,b,c;
printf("input character a,b,c\n");
scanf("%c %c %c",&a,&b,&c);
printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
}
题目:输出各种数据类型的字节长度。
【例4.13】
void main()
{
int a;
long b;
float f;
double d;
char c;
printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n", sizeof(a), sizeof(b), sizeof(f), sizeof(d), sizeof(c));
}
源程序如下:
#include<math.h>
void main()
{
float a,b,c,s,area;
scanf(“%f,%f,%f”,&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n”,a,b,c,s);
printf(“area=%7.2f\n”,area);
}
源程序如下:
#include<math.h>
void main()
{
double a, b, c, disc, x1, x2, p, q;
scanf(“a=%f,b=%f,c=%f”, &a, &b, &c);
disc = b*b - 4*a*c;
p = -b / (2*a);
q = sqrt(disc) / (2*a);
x1 = p+q;
x2 = p-q;
printf(“\nx1=%5.2f\nx2=%5.2f\n”, x1, x2);
}