第三章
主要内容
3.1 程序的三种基本结构
3.2 C语句概述
3.3 赋值表达式和赋值语句
3.4 数据输入输出的概念及在 C语言中的实现
主要内容
3.5 字符数据的输入输出
3.6 简单的格式输入与输出
3.7 较复杂的输入输出格式控制
3.8 顺序结构程序设计举例
3.1 程序的三种基本结构
一个良好的程序由以下三种基本结构组成:
(1) 顺序结构:各操作步骤顺序执行,是一种最简单的基本结构。
3.2 C语句概述
C程序源程序文件 1 源程序文件 2 源程序文件 n
预处理命令 函数 n函数 1数据声明函数首部 函数体数据声明 执行语句
C程序的结构:
3.2 C语句概述
一个 c程序可以有若干个源程序文件组成
一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成
一个函数有函数首部和函数体组成
函数体由数据声明和执行语句组成
C语句分为 5类 控制语句函数调用语句表达式语句空语句复合语句
3.2 C语句概述
(一 )控制语句 完成一定的控制功能
1 if() ~else 条件 语句 6 break 中止语句
2 for()~ 循环 语句 7 switch() 多分支选择语句
3 while()~循环 语句 8 return 返回语句
4 do ~while();循环 语句 9 goto 转向语句
5 continue 结束本次循环语句
3.2 C语句概述
(二 )函数调用语句由一个函数调用加一个分号构成
Printf(“This is a C statement.”);
3.2 C语句概述
(三 )表达式语句由一个表达式加一个分号构成
a = 3 ;
分号赋值表达式 表达式语句
3.2 C语句概述
(四 )空语句 只有一个分号的语句;(什么也不做)
用来做流程的转向点
用来作为循环语句中的循环体
3.2 C语句概述
(五)复合语句 用一对 {}括起来的语句
{ z=x+y;
t=z/100;
printf(“%f”,t);
}
注意,复合语句中最后一个语句中最后的分号不能忽略不写。
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
1.赋值运算符赋值符号,=,就是赋值运算符,它的作用是将一个数据赋给一个变量。
赋值语句是由赋值表达式加上一个分号构成例:,a=3”
把常量3赋给变量a说明,也可以将一个表达式的值赋给一个变量
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
2,复合的赋值运算符在赋值符,=,之前加上其他运算符,可以构成复合的运算符。
例,a+=3 等价于 a=a+3
先计算a加3,
再赋给a
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
可以这样理解:
① a += b (其中 a为变量,b为表达式 )
② a + = b(将有下划线的,a+”移到,=”右侧
) | ↑
③ a = a + b(在,=”左侧补上变量名 a
)
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
如果b是包含若干项的表达式,则相当于它有括号。
例,① x %= y + 3
② x %= (y + 3)
|__↑
③ x = x %(y + 3) (不要错写成
x = x % y + 3 )
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式说明:
凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。有关算术运箅的复合赋值运算符
*=,/=,%=
C语言采用这种复合运算符,一是为了简化程序,
使程序精练,二是为了提高编译效率,能产生质量较高的目标代码。
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
3.赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子。
一般形式为,变量 赋值运算符 表达式
赋值表达式的求解过程,先求赋值运算符右侧的,
表达式,的值,然后赋给赋值运算符左侧的变量。
赋值运算符左侧的标识符称为,左值,
出现在赋值运算符右侧的表达式称为,右值,
注意,并不是任何对象都可以作为左值的,表达式和常变量就不能作为左值。任何左值都可做右值。
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式说明,赋值运算符按照“自右而左
”
的结合顺序,因此,,a=(b=5)”和
,a=b=5”等价
赋值表达式中的“表达式”,又可以是一个赋值表达式。
例,a=(b=5) 相当于执行,b=5”和,a= b”
两 个赋值表达式
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式分析赋值表达式,(a=3*5)=4*3
赋值表达式为左值右值
说明,先执行括号内的运算,将 15赋给 a,然后执行 4*3的运算,得 12,再把 12赋给 a。最后 a的值为
12,整个表达式的值为 12。
注意,赋值表达式作为左值时应加括号
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式求解步骤如下,
① 先进行,a-=a *a,的运算,它相当于,
a=a-a *a,a的值为12- 144=- 132
② 再进行,a+=-132,的运算,相当于,
a =a+(-132),a的值为- 132-132= -264。
赋值表达式也可以包含复合的赋值运算符。
例,a+=a-=a*a
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
赋值表达式作为表达式的一种,不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中 。
例,printf(″%d″,a=b);
3.3 赋值表达式和赋值语句
3.3.2 赋值过程中的类型转换
如果赋值运算符两侧的类型一致,则直接进行赋值。
例,i=6 (假设 i已定义为 int型 )
如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。
类型转换是系统自动进行的。
3.3 赋值表达式和赋值语句
3.3.2 赋值过程中的类型转换
转换规则,
⑴ 将浮点型数据(包括单、双精度)赋给整型变量时
,先对浮点数取为整,然后赋予整型变量。
⑵ 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
⑶ 将一个 double型数据赋给 float变量时,截取其前面 7位有效数字,存放到 float变量的存储单元( 4个字节)中。但应注意数值范围不能溢出;将一个 float型数据赋给 double变量时,数值不变,有效位数扩展到
16位,在内存中以 8个字节存储。
转换规则,
⑷字符型数据赋给整型变量时,将字符的 ASCII码赋给整型变量。
⑸将一个占字节多的整型数据赋给一个占字节少的整型变量 /字符变量时,只将其低字节原封不动地送到该变量例,i=289; /* 已定义 i为整型变量 */
c=′a′; /* 已定义 c为字符变量 */
c=i; /* 将一个占 2字节的 int型数据赋给 char型变量 */
i=289
↓↓↓↓↓↓↓↓
c=33
⑹ 将有符号整数赋值给长度相同的无符号整型变量时,按字节原样赋值。
0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1
0 0 1 0 0 0 0 1
注意,要避免进行这种赋值,因为赋值后数值可能发生失真。如果一定要进行这种赋值,应当保证赋值后数值不会发生变化。
例 3.1有符号整数赋值给无符号整型变量,
数据会失真。
#include <stdio.h>
void main ( )
{unsigned a; /* 定义 a为无符号整型变量 */
int b; /* 定义 b为有符号整型变量 */
b=-1; b
a=b; a
printf("%u\n",a);
}
运行结果,4294967295
说明,由于 a是无符号整型变量,因此不能用 %d
输出格式符,而要用输出无符号数的,%u”格式符。
1 1 11 11 11 11 11 11 11
1 1 11 11 11 11 11 11 11
例,3.2 无符号整数赋值给有符号整型变量,注意数值范围。
#include <stdio.h>
void main ( )
{unsigned a;
int b;
a=65535; /* 两个字节 16位全为 1 */
b=a; /* b的数值范围为 -32768~ 32767
*/
printf("%d\n",b);
}
运行结果 -1
说明,执行,b=a”时,将 a的两个字节 (全 1)赋给 b,
由于是有符号的整型数,笫 1个二进位是 1表示此数是一个负数,16位全 1是 -1的补码。
转换规则:
⑺将无符号整数赋值给长度相同的有符号整型变量时,应注意不要超出有符号整型变量的数值范围,否则会出错。
3.3 赋值表达式和赋值语句
3.3.3 赋值语句
赋值语句是由赋值表达式加上一个分号构成。
赋值表达式的作用是将一个表达式的值赋给一个变量。
赋值表达式具有计算和赋值双重功能。程序中的计算功能主要是由赋值语句来完成。
C语言的赋值语句与其他高级语言的赋值语句之间的差异:
(1) C语言中的赋值号,=,是一个运算符,
在其他大多数语言中赋值号不是运算符。
(2) 要区别赋值表达式和赋值语句。其他多数高级语言没有,赋值表达式,这一概念 。
3.3 赋值表达式和赋值语句
3.3.4 变量赋初值
程序中对变量赋初值的方法有两种
⑴在定义变量的同时使变量初始化(更方便)
int a=3; / * 指定a为整型变量,初值为3 *
float f=3.56; / * f为浮点型变量,初值3,56 *
char c=′a′; / * 指定c为字符变量,初值为 ′a′ * /
⑵用赋值语句对变量赋值
int a; / * 指定a为整型变量 */
a=3; / * 赋值语句,将3赋给a */
3.4 数据输入输出的概念及在 C语言中的实现
(一 ).所谓输入输出是以计算机主机为主体而言的输出,从计算机向外部输出设备 (显示器,打印机 )
输出数据输入,从输入设备 (键盘,鼠标,扫描仪 )向计算机输入数据,
(二 ).C语言本身不提供输入输出语句,输入和输出操作是由 C函数库中的函数来实现的例如,
字符输入函数,getchar字符输出函数,putchar
格式输入函数,scanf 格式输出函数,printf
字符串输入函数,gets 字数串输出函数,puts
3.4 数据输入输出的概念及在 C语言中的实现
(三 ).在使用系统库函数时,要用预编译命令
,#include” 将有关的,头文件,包括到用户源文件中。
例如,在调用标准输入输出库函数时,文件开头应该有:
#include,stdio.h”
或,#include <stdio.h>
头文件
3.4 数据输入输出的概念及在 C语言中的实现
3.5 字符数据的输入输出
3.5.1 用 putchar函数输出一个字符
putchar函数(字符输出函数)的作用是向终端输出一个字符 。
一般形式为 putchar(c)
c可以是字符型变量或整型变量例 3.3 输出单个字符。
#include<stdio.h>
void main()
{
char a,b,c;
a=‘B’;b=‘O’;c=‘Y’;
putchar(a);putchar(b);putchar(c);putchar(‘ \
n’);
}
运行结果,BOY
putchar(a);putchar(?\n?);putchar(b);putchar(?\n?);putchar(c);putchar(?\n?);
运行结果,B
O
Y
3.5 字符数据的输入输出
3.5.2 用 getchar函数输入一个字符
getchar函数(字符输入函数)的作用是从计算机终端输入一个字符。
getchar
getchar()
函数的值就是从输入设备得到的字符例 3.4 输入单个字符。
#include<stdio.h>
void main()
{
char c;
c=getchar();
putchar(c);
putchar(‘ \n’);
}
运行程序:
从键盘输入字符 ‘ a’ 按
Enter键屏幕上将显示输出的字符
‘ a’
a↙
a
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
printf函数(格式输出函数)的作用是向终端(或系统隐含指定的输出设备)
输出若干个任意类型的数据 。
printf函数的一般格式为:
printf(格式控制,输出表列)
例:
printf(”%d,%c\n”,i,c)
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
printf函数的参数包括两部分:
(1)“格式控制”是用双撇号括起来的字符串,也称“
① 格式说明。格式说明由“%”和格式字符组成
,如%d、%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开
② 普通字符。普通字符即需要原样输出的字符
。例如上面 printf函数中双撇号内的逗号、空格和换行符。
(2),输出表列”是需要输出的一些数据,可以是常量
、变量或表达式。
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
printf函数的例子:
printf(“a=%d b=%d”,a,b)
| | |
| |
格式说明 输出表列若 a=3,b=4
输出为 a=3 b=4
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
基本的格式字符 有以下几种:
⑴ d格式符。按十进制整型数据的实际长度输出。
⑵ i格式符。作用与d格式符相同,按十进制整型数据的实际长度输出。一般习惯用 %d而少用 %i。
⑶ c格式符。用来输出一个字符。
一个值在0~255范围内的整数,也可以用
“%c”使之按字符形式输出例 3.5 字符数据的输出。
#include<stdio.h>
void main()
{char c='a';
int i=97;
printf("%c,%d\n",c,c);
printf("%c,%d\n",i,i);
}
运行结果:
a,97
⑷ s格式符,用来输出一个字符串。
例,printf ( ″ %s ″,″ CHI NA ″ ) ;
输出字符串“CHI NA”(不包括双引号)
⑸f格式符。用来输出实数(包括单、双精度)
,以小数形式输出,不指定整个字段的长度,由系统自动指定。一般的处理方法是:整数部分全部输出,并输出6位小数。
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据注意,在输出的数字中并非全部数字都是有效数字
。单精度实数的有效位数一般为 6-7位,双精度实数的有效位数一般为 15-16位。
例 3.6 输出实数时的有效位数。
#include<stdio.h>
void main()
{float x,y;
x=111111.111;y=222222.222;
printf("%f\n",x+y);
}
运行结果:
333333,328125
结果中只有前七位是有效数字。由于 x和 y是单精度变量,所以 x+y也只能保证 7位的精度,后面几位是没有意义的。
例 3.7 输出双精度数时的有效位数。
#include<stdio.h>
void main()
{double x,y;
x=11111111.11111111;
y=22222222.22222222;
printf("%f\n",x+y);
}
运行结果:
33333333.33333
x和 y是双精度变量,能提供 16位精度,但是由于用 %f格式输出,只能输出 6位小数,有两位被省掉了。
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
(6)e格式符,用格式说明 %e指定以指数形式输出实数。
例,printf( ″%e ″,123.456);输出如下
1.23460 e+002
6列 5列
C编译系统自动指定给出数字部分的小数位数为6位,指数部分占 5位
3.6 简单的格式输入与输出
3.6.2 用简单的 scanf函数输入数据
scanf函数作用:按照变量在内存的地址将变量值存进去。
一般格式,scanf(格式控制,地址表列)
同 printf函数是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址例 3.8 用 scanf函数输入数据。
#include<stdio.h>
void main()
{
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
printf(“%d,%d,%d \n”,a,b,c);
}
运行情况:
3 4 5 (输入 a,b,c的值,)
3,4,5 (输出 a,b,c的值)
a在内存中的地址
&是地址运算符输入数据时,在两个数据之间以一个或多个空格间隔,
也可以用 Enter键、
Tab键。
3.6 简单的格式输入与输出
3.6.2 用简单的 scanf函数输入数据
scanf函数的格式说明与 printf函数的相似,以%开始,以一个格式字符结束,中间可插入附加的字符。
例:
scanf(,%d%d%d”.&a,&b,&c);
/* 格式控制字符串中包含 3个格式说明符 %d */
scanf(”a=%db=%dc=%d”.&a,&b,&c);
/* 格式控制字符串中包含格式说明符以外的字符 */
3.6 简单的格式输入与输出
3.6.2 用简单的 scanf函数输入数据说明:
(1)scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。
(2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。
(3) 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。
(4)在输入数据时,空格,“回车”、“跳格”( Tab)键或遇非法输入,认为该数据结束。
(5) 对unsigned型变量所需的数据,可以用 %u或 %d格式输入。
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
除了上节所介绍的基本的格式控制外,还可以用下面一些格式符和附加字符。
⑴ %md 。m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,
则按实际位数输出。
例,printf (“%4d,%4d,a,b”);
若,a=123,d=12345,则输出结果为,
123,12345
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑵ %ld。 对于 int型数据占 2字节的系统,在输出长整型数据时要在格式字符 d前面加一个英文字毋 l。
例,
long a=135790; /* 定义 a为长整型变量 */
printf(“%ld,a); %d只适用于范围为 -
32768~ 32767的整型数据,超过此范围的整数,应该用
%ld输出说明,如果用的是 VC++ 6.0,
由于 int型和 long型数据都分配 4
个字节,因此用 %d可以输出 int
和 long型数据,不必要用 %ld。
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑶ %o 。以 8进制整数形式输出。由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。
例,int a=-1;
printf("%d,%o",a,a);
-1在内存单元中的存放形式(以补码形式存放)如下:
输出为,
-1,177777
1 111111111111111
用 %d输出的结果
1,111,111,111,111,111
| | | | | |
1 7 7 7 7 7
二进数 111就是 8进数 7。因此上面的数用 8进制数表示为 17777
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑷ %x 。以 16进制数形式输出整数。同样不会出现负的十六进制数。
例:
int a= -1;
printf(“%x,%o,%d”,a,a,a);
输出结果为
ffff,177777,-1
同样可以用,%1x”输出长整型数,也可以指定输出字段的宽度,如,%12x”。
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑸ %u 。用来输出无符号 (unsigned)型数据,以十进制整数形式输出。一个有符号整数( int型)也可以用 %u格式输出;反之,一个 unsigned型数据也可以用 %d格式输出。按相互赋值的规则处理。 unsigned型数据也可用
%o或 %x格式输出。
⑹ %m c。用来指定输出字符数据的宽度 m
如果有 printf(“%3c”,c);
则输出,a”,即c变量输出占3列,前2列补空格 。
例 3.9 无符号数据的输出。
#include<stdio.h>
void main()
{
unsigned int a=65535;int b=-2;
printf(“a=%d,%o,%x,%u \n”,a,a,a,a);
printf(“b=%d,%o,%x,%u \n”,b,b,b,b);
}
Turbo C 2.0环境下的运行结果,
a=-1,177777,ffff,65535
b=-2,177776,fffe,65534
VC++6.0环境下的运行结果,
a=65535,177777,ffff,65535
b =-2,37777777776,fffffffe,4294967294
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑺ %ms,指定输出的字符串占m列。如果字符串本身长度大于
m,则突破m的限制,将字符串全部输出。若串长小于m,则
% -ms,如果串长小于m,则在m列范围内,字符串向左靠,
% -m,ns,输出占m列,但只取字符串中左端n个字符。这n
%-m,ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则m自动取n值,即保证n
个字符正常输出。
⑻%m,nf,指定输出的实数共占m列,其中有n位小数。如果
%-m,nf 与%m,nf基本相同,只是使输出的数值向左端靠,右端补空格。
例 3.10 字符串的输出。
#include<stdio.h>
void main()
{
printf(“%3s,%7.2s,%.4s,% -5.3s\n”,
“CHINA”,“CHINA”,“CHINA”,
“CHINA”);
}
运行结果:
CHINA,CH,CHIN,CHI
例 3.11 输出实数时指定小数位数。
#include <stdio.h>
void main()
{
float f=123.456;
printf(“%f %10f %10.2f %.2f% -10.2f\ n”
,f,f,f,f,f);
}
运行结果:
123.456001 123.456001 123.46 123.46 123.46
例 3.12求 3个圆的周长,输出结果时上下按小数点对齐,
取两位小数。
#include <stdio.h>
#define PI 3.1415926
void main ( )
{double r1=1.53,r2=21.83,r3=123.71,s1,s2,s3;
s1=2.0*PI*r1;
s2=2.0*PI*r2;
s3=2.0*PI*r3;
printf("r1=%10.2f\nr2=%10.2f\nr3=%10.2f\n",r1,r2,r
3);
}
运行结果:
r1= 1.53
r2= 21.83
r3= 123.71
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑼ % m.ne和% -m.ne。 m、n和“-”字符的含义与前相同。
此处n指拟输出的数据的小数部分(又称尾数)的小数位数。
若f=123.456,则:
printf("%e %10e %10.2e %.2e %-10.2e",f,f,f,f,f);
输出如下:
1.234560e+002 1.234560e+002 1.23e+002 1.23e+002
13列 13列 10列 9列
1.23e+002
10列说明,
未指定n,自动使n=6,
超过给定的10列,乃突破10列的限制,按实际长度输出。
第 3个数据共占10列,小数部分占2列。
只指定n=2,未指定m,自动使m等于数据应占的长度。
第 5个数据应占10列,数值只有9列,由于是,%-10.2e,,
数值向左靠,右补一个空格。
(注:有的 C系统的输出格式与此略有不同 )
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
(10)%g,用来输出实数,
它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。
例,若f=123.468,则
printf( ″ %f %e %g ″,f,f,f);
输出如下:
123.468000 1.234680e+002 123.468
10列 13列 10列说明,
用%f格式输出占10列,用%e格式输出占13列,用%g
格式时,自动从上面两种格式中选择短者(今以%f格式为短)
故占10列,并按%f格式用小数形式输出,最后 3个小数位为无意义的0,不输出,因此输出 123.468,然后右补 3个空格。
%g格式用得较少。
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制说明:
除了 X,E,G外,其他各式字符必须用小写。
可以在 printf函数中的“格式控制”字符串中包含转义字符。
一个格式说明必须以,%”开头,以 9个格式字符之一为结束,中间可以插入附加格式字符。
想输出 %,则应该在格式控制字符串中用连续两个 %表示
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制格式字符 说明
d,i 用来输入有符号的十进制整数
u 用来输入无符号的十进制整数
o 用来输入无符号的八进制整数
x X 用来输入无符号的十六进制整数 (大小写作用相同 )
c 用来输入单个字符
s 用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志 ′\0 ′作为其最后一个字符
f 用来输入实数,可以用小数形式或指数形式输入
e E g G 与f作用相同,e与f,g可以互相替换 (大小写作用相同 )
表3,3 scanf格式字符
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制字符 说明
l 用于输入长整型数据(可用 %ld,%lo,%lx,%lu)以及
double型数据(用 %lf或 %le)
h
用于输入短整型数据(可用%hd,%ho,%hx)
域宽 指定输入数据所占宽度(列数),域宽应为正整数
* 表示本输入项在读入后不赋给相应的变量表3,4 scanf的附加格式说明字符
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制说明:
对 unsigned型变量所需要的数据,可以用 %u,%d或 %o
,%x格式输入。
可以指定输入数据所占的列数,系统自动按它截取所需数据。
如果在 %后有一个,*” 附加说明符,表示跳过它指定的列数。
输入数据时不能规定精度。
例 3.13 输入三角形的三边长,求三角形面积。
假设:三个边长 a,b,c能构成三角形。
已知面积公式:
area=
s=(a+b+c)/2
c)b ) ( sa ) ( ss ( s
开始输入三边长计算 s
计算面积结束
3.8 顺序结构程序设计举例
#include<stdio.h>
#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);}
数学函数库因为要用到其中的 sqrt
函数运行情况:
3.4,4.5,5.6↙
a= 3.400000,b=4.500000,
c=5.600000
area=7.649173
printf("a=%7.2f\nb=%7.2f\nc=%7.2f\narea=%7.2f\n",a,b,c,area);
运行情况:
3.4,4.5,5.6↙
a= 3.40,b=4.50,
c=5.60
area=7.65
例 3.14 从键盘输入一个大写字母,要求改用小写字母输出。
#include <stdio.h>
void main()
{ char c1,c2;
c1=getchar();
printf("%c,%d\n",c1,c1);
c2=c1+32;
printf("%c,%d\n",c2,c2);
}
运行情况:
A ↙
A,65
a,97
例 3.14 从键盘输入一个大写字母,要求改用小写字母输出。
#include <stdio.h>
void main()
{ char c1,c2;
c1=getchar();
printf("%c,%d\n",c1,c1);
c2=c1+32;
printf("%c,%d\n",c2,c2);
}
运行情况:
A ↙
A,65
a,97
3.8 顺序结构程序设计举例例 3.15 求a x2+bx+c=0方程的根。
a,b,c由键盘输入,设 >0。
众所周知,一元二次方程式的根为
x1= x2=
可以将上面的分式分为两项:
p=,q= x1=p+q,x2=p-q
acb 42?
a
acbb
2
42 a acbb 2 4
2
a
b
2
a
acb
2
42?
#include <stdio.h>
#include <math.h>
void main ( )
{
float 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("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
}
运行情况:
a=1,b=3,c=2 ↙
x1=-1.00
x2=-2.00
主要内容
3.1 程序的三种基本结构
3.2 C语句概述
3.3 赋值表达式和赋值语句
3.4 数据输入输出的概念及在 C语言中的实现
主要内容
3.5 字符数据的输入输出
3.6 简单的格式输入与输出
3.7 较复杂的输入输出格式控制
3.8 顺序结构程序设计举例
3.1 程序的三种基本结构
一个良好的程序由以下三种基本结构组成:
(1) 顺序结构:各操作步骤顺序执行,是一种最简单的基本结构。
3.2 C语句概述
C程序源程序文件 1 源程序文件 2 源程序文件 n
预处理命令 函数 n函数 1数据声明函数首部 函数体数据声明 执行语句
C程序的结构:
3.2 C语句概述
一个 c程序可以有若干个源程序文件组成
一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成
一个函数有函数首部和函数体组成
函数体由数据声明和执行语句组成
C语句分为 5类 控制语句函数调用语句表达式语句空语句复合语句
3.2 C语句概述
(一 )控制语句 完成一定的控制功能
1 if() ~else 条件 语句 6 break 中止语句
2 for()~ 循环 语句 7 switch() 多分支选择语句
3 while()~循环 语句 8 return 返回语句
4 do ~while();循环 语句 9 goto 转向语句
5 continue 结束本次循环语句
3.2 C语句概述
(二 )函数调用语句由一个函数调用加一个分号构成
Printf(“This is a C statement.”);
3.2 C语句概述
(三 )表达式语句由一个表达式加一个分号构成
a = 3 ;
分号赋值表达式 表达式语句
3.2 C语句概述
(四 )空语句 只有一个分号的语句;(什么也不做)
用来做流程的转向点
用来作为循环语句中的循环体
3.2 C语句概述
(五)复合语句 用一对 {}括起来的语句
{ z=x+y;
t=z/100;
printf(“%f”,t);
}
注意,复合语句中最后一个语句中最后的分号不能忽略不写。
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
1.赋值运算符赋值符号,=,就是赋值运算符,它的作用是将一个数据赋给一个变量。
赋值语句是由赋值表达式加上一个分号构成例:,a=3”
把常量3赋给变量a说明,也可以将一个表达式的值赋给一个变量
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
2,复合的赋值运算符在赋值符,=,之前加上其他运算符,可以构成复合的运算符。
例,a+=3 等价于 a=a+3
先计算a加3,
再赋给a
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
可以这样理解:
① a += b (其中 a为变量,b为表达式 )
② a + = b(将有下划线的,a+”移到,=”右侧
) | ↑
③ a = a + b(在,=”左侧补上变量名 a
)
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
如果b是包含若干项的表达式,则相当于它有括号。
例,① x %= y + 3
② x %= (y + 3)
|__↑
③ x = x %(y + 3) (不要错写成
x = x % y + 3 )
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式说明:
凡是二元(二目)运算符,都可以与赋值符一起组合成复合赋值符。有关算术运箅的复合赋值运算符
*=,/=,%=
C语言采用这种复合运算符,一是为了简化程序,
使程序精练,二是为了提高编译效率,能产生质量较高的目标代码。
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
3.赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子。
一般形式为,变量 赋值运算符 表达式
赋值表达式的求解过程,先求赋值运算符右侧的,
表达式,的值,然后赋给赋值运算符左侧的变量。
赋值运算符左侧的标识符称为,左值,
出现在赋值运算符右侧的表达式称为,右值,
注意,并不是任何对象都可以作为左值的,表达式和常变量就不能作为左值。任何左值都可做右值。
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式说明,赋值运算符按照“自右而左
”
的结合顺序,因此,,a=(b=5)”和
,a=b=5”等价
赋值表达式中的“表达式”,又可以是一个赋值表达式。
例,a=(b=5) 相当于执行,b=5”和,a= b”
两 个赋值表达式
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式分析赋值表达式,(a=3*5)=4*3
赋值表达式为左值右值
说明,先执行括号内的运算,将 15赋给 a,然后执行 4*3的运算,得 12,再把 12赋给 a。最后 a的值为
12,整个表达式的值为 12。
注意,赋值表达式作为左值时应加括号
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式求解步骤如下,
① 先进行,a-=a *a,的运算,它相当于,
a=a-a *a,a的值为12- 144=- 132
② 再进行,a+=-132,的运算,相当于,
a =a+(-132),a的值为- 132-132= -264。
赋值表达式也可以包含复合的赋值运算符。
例,a+=a-=a*a
3.3 赋值表达式和赋值语句
3.3.1 赋值表达式
赋值表达式作为表达式的一种,不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中 。
例,printf(″%d″,a=b);
3.3 赋值表达式和赋值语句
3.3.2 赋值过程中的类型转换
如果赋值运算符两侧的类型一致,则直接进行赋值。
例,i=6 (假设 i已定义为 int型 )
如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。
类型转换是系统自动进行的。
3.3 赋值表达式和赋值语句
3.3.2 赋值过程中的类型转换
转换规则,
⑴ 将浮点型数据(包括单、双精度)赋给整型变量时
,先对浮点数取为整,然后赋予整型变量。
⑵ 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
⑶ 将一个 double型数据赋给 float变量时,截取其前面 7位有效数字,存放到 float变量的存储单元( 4个字节)中。但应注意数值范围不能溢出;将一个 float型数据赋给 double变量时,数值不变,有效位数扩展到
16位,在内存中以 8个字节存储。
转换规则,
⑷字符型数据赋给整型变量时,将字符的 ASCII码赋给整型变量。
⑸将一个占字节多的整型数据赋给一个占字节少的整型变量 /字符变量时,只将其低字节原封不动地送到该变量例,i=289; /* 已定义 i为整型变量 */
c=′a′; /* 已定义 c为字符变量 */
c=i; /* 将一个占 2字节的 int型数据赋给 char型变量 */
i=289
↓↓↓↓↓↓↓↓
c=33
⑹ 将有符号整数赋值给长度相同的无符号整型变量时,按字节原样赋值。
0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1
0 0 1 0 0 0 0 1
注意,要避免进行这种赋值,因为赋值后数值可能发生失真。如果一定要进行这种赋值,应当保证赋值后数值不会发生变化。
例 3.1有符号整数赋值给无符号整型变量,
数据会失真。
#include <stdio.h>
void main ( )
{unsigned a; /* 定义 a为无符号整型变量 */
int b; /* 定义 b为有符号整型变量 */
b=-1; b
a=b; a
printf("%u\n",a);
}
运行结果,4294967295
说明,由于 a是无符号整型变量,因此不能用 %d
输出格式符,而要用输出无符号数的,%u”格式符。
1 1 11 11 11 11 11 11 11
1 1 11 11 11 11 11 11 11
例,3.2 无符号整数赋值给有符号整型变量,注意数值范围。
#include <stdio.h>
void main ( )
{unsigned a;
int b;
a=65535; /* 两个字节 16位全为 1 */
b=a; /* b的数值范围为 -32768~ 32767
*/
printf("%d\n",b);
}
运行结果 -1
说明,执行,b=a”时,将 a的两个字节 (全 1)赋给 b,
由于是有符号的整型数,笫 1个二进位是 1表示此数是一个负数,16位全 1是 -1的补码。
转换规则:
⑺将无符号整数赋值给长度相同的有符号整型变量时,应注意不要超出有符号整型变量的数值范围,否则会出错。
3.3 赋值表达式和赋值语句
3.3.3 赋值语句
赋值语句是由赋值表达式加上一个分号构成。
赋值表达式的作用是将一个表达式的值赋给一个变量。
赋值表达式具有计算和赋值双重功能。程序中的计算功能主要是由赋值语句来完成。
C语言的赋值语句与其他高级语言的赋值语句之间的差异:
(1) C语言中的赋值号,=,是一个运算符,
在其他大多数语言中赋值号不是运算符。
(2) 要区别赋值表达式和赋值语句。其他多数高级语言没有,赋值表达式,这一概念 。
3.3 赋值表达式和赋值语句
3.3.4 变量赋初值
程序中对变量赋初值的方法有两种
⑴在定义变量的同时使变量初始化(更方便)
int a=3; / * 指定a为整型变量,初值为3 *
float f=3.56; / * f为浮点型变量,初值3,56 *
char c=′a′; / * 指定c为字符变量,初值为 ′a′ * /
⑵用赋值语句对变量赋值
int a; / * 指定a为整型变量 */
a=3; / * 赋值语句,将3赋给a */
3.4 数据输入输出的概念及在 C语言中的实现
(一 ).所谓输入输出是以计算机主机为主体而言的输出,从计算机向外部输出设备 (显示器,打印机 )
输出数据输入,从输入设备 (键盘,鼠标,扫描仪 )向计算机输入数据,
(二 ).C语言本身不提供输入输出语句,输入和输出操作是由 C函数库中的函数来实现的例如,
字符输入函数,getchar字符输出函数,putchar
格式输入函数,scanf 格式输出函数,printf
字符串输入函数,gets 字数串输出函数,puts
3.4 数据输入输出的概念及在 C语言中的实现
(三 ).在使用系统库函数时,要用预编译命令
,#include” 将有关的,头文件,包括到用户源文件中。
例如,在调用标准输入输出库函数时,文件开头应该有:
#include,stdio.h”
或,#include <stdio.h>
头文件
3.4 数据输入输出的概念及在 C语言中的实现
3.5 字符数据的输入输出
3.5.1 用 putchar函数输出一个字符
putchar函数(字符输出函数)的作用是向终端输出一个字符 。
一般形式为 putchar(c)
c可以是字符型变量或整型变量例 3.3 输出单个字符。
#include<stdio.h>
void main()
{
char a,b,c;
a=‘B’;b=‘O’;c=‘Y’;
putchar(a);putchar(b);putchar(c);putchar(‘ \
n’);
}
运行结果,BOY
putchar(a);putchar(?\n?);putchar(b);putchar(?\n?);putchar(c);putchar(?\n?);
运行结果,B
O
Y
3.5 字符数据的输入输出
3.5.2 用 getchar函数输入一个字符
getchar函数(字符输入函数)的作用是从计算机终端输入一个字符。
getchar
getchar()
函数的值就是从输入设备得到的字符例 3.4 输入单个字符。
#include<stdio.h>
void main()
{
char c;
c=getchar();
putchar(c);
putchar(‘ \n’);
}
运行程序:
从键盘输入字符 ‘ a’ 按
Enter键屏幕上将显示输出的字符
‘ a’
a↙
a
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
printf函数(格式输出函数)的作用是向终端(或系统隐含指定的输出设备)
输出若干个任意类型的数据 。
printf函数的一般格式为:
printf(格式控制,输出表列)
例:
printf(”%d,%c\n”,i,c)
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
printf函数的参数包括两部分:
(1)“格式控制”是用双撇号括起来的字符串,也称“
① 格式说明。格式说明由“%”和格式字符组成
,如%d、%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开
② 普通字符。普通字符即需要原样输出的字符
。例如上面 printf函数中双撇号内的逗号、空格和换行符。
(2),输出表列”是需要输出的一些数据,可以是常量
、变量或表达式。
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
printf函数的例子:
printf(“a=%d b=%d”,a,b)
| | |
| |
格式说明 输出表列若 a=3,b=4
输出为 a=3 b=4
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
基本的格式字符 有以下几种:
⑴ d格式符。按十进制整型数据的实际长度输出。
⑵ i格式符。作用与d格式符相同,按十进制整型数据的实际长度输出。一般习惯用 %d而少用 %i。
⑶ c格式符。用来输出一个字符。
一个值在0~255范围内的整数,也可以用
“%c”使之按字符形式输出例 3.5 字符数据的输出。
#include<stdio.h>
void main()
{char c='a';
int i=97;
printf("%c,%d\n",c,c);
printf("%c,%d\n",i,i);
}
运行结果:
a,97
⑷ s格式符,用来输出一个字符串。
例,printf ( ″ %s ″,″ CHI NA ″ ) ;
输出字符串“CHI NA”(不包括双引号)
⑸f格式符。用来输出实数(包括单、双精度)
,以小数形式输出,不指定整个字段的长度,由系统自动指定。一般的处理方法是:整数部分全部输出,并输出6位小数。
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据注意,在输出的数字中并非全部数字都是有效数字
。单精度实数的有效位数一般为 6-7位,双精度实数的有效位数一般为 15-16位。
例 3.6 输出实数时的有效位数。
#include<stdio.h>
void main()
{float x,y;
x=111111.111;y=222222.222;
printf("%f\n",x+y);
}
运行结果:
333333,328125
结果中只有前七位是有效数字。由于 x和 y是单精度变量,所以 x+y也只能保证 7位的精度,后面几位是没有意义的。
例 3.7 输出双精度数时的有效位数。
#include<stdio.h>
void main()
{double x,y;
x=11111111.11111111;
y=22222222.22222222;
printf("%f\n",x+y);
}
运行结果:
33333333.33333
x和 y是双精度变量,能提供 16位精度,但是由于用 %f格式输出,只能输出 6位小数,有两位被省掉了。
3.6 简单的格式输入与输出
3.6.1 用简单的 printf函数输出数据
(6)e格式符,用格式说明 %e指定以指数形式输出实数。
例,printf( ″%e ″,123.456);输出如下
1.23460 e+002
6列 5列
C编译系统自动指定给出数字部分的小数位数为6位,指数部分占 5位
3.6 简单的格式输入与输出
3.6.2 用简单的 scanf函数输入数据
scanf函数作用:按照变量在内存的地址将变量值存进去。
一般格式,scanf(格式控制,地址表列)
同 printf函数是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址例 3.8 用 scanf函数输入数据。
#include<stdio.h>
void main()
{
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
printf(“%d,%d,%d \n”,a,b,c);
}
运行情况:
3 4 5 (输入 a,b,c的值,)
3,4,5 (输出 a,b,c的值)
a在内存中的地址
&是地址运算符输入数据时,在两个数据之间以一个或多个空格间隔,
也可以用 Enter键、
Tab键。
3.6 简单的格式输入与输出
3.6.2 用简单的 scanf函数输入数据
scanf函数的格式说明与 printf函数的相似,以%开始,以一个格式字符结束,中间可插入附加的字符。
例:
scanf(,%d%d%d”.&a,&b,&c);
/* 格式控制字符串中包含 3个格式说明符 %d */
scanf(”a=%db=%dc=%d”.&a,&b,&c);
/* 格式控制字符串中包含格式说明符以外的字符 */
3.6 简单的格式输入与输出
3.6.2 用简单的 scanf函数输入数据说明:
(1)scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。
(2) 如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。
(3) 在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。
(4)在输入数据时,空格,“回车”、“跳格”( Tab)键或遇非法输入,认为该数据结束。
(5) 对unsigned型变量所需的数据,可以用 %u或 %d格式输入。
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
除了上节所介绍的基本的格式控制外,还可以用下面一些格式符和附加字符。
⑴ %md 。m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,
则按实际位数输出。
例,printf (“%4d,%4d,a,b”);
若,a=123,d=12345,则输出结果为,
123,12345
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑵ %ld。 对于 int型数据占 2字节的系统,在输出长整型数据时要在格式字符 d前面加一个英文字毋 l。
例,
long a=135790; /* 定义 a为长整型变量 */
printf(“%ld,a); %d只适用于范围为 -
32768~ 32767的整型数据,超过此范围的整数,应该用
%ld输出说明,如果用的是 VC++ 6.0,
由于 int型和 long型数据都分配 4
个字节,因此用 %d可以输出 int
和 long型数据,不必要用 %ld。
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑶ %o 。以 8进制整数形式输出。由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。
例,int a=-1;
printf("%d,%o",a,a);
-1在内存单元中的存放形式(以补码形式存放)如下:
输出为,
-1,177777
1 111111111111111
用 %d输出的结果
1,111,111,111,111,111
| | | | | |
1 7 7 7 7 7
二进数 111就是 8进数 7。因此上面的数用 8进制数表示为 17777
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑷ %x 。以 16进制数形式输出整数。同样不会出现负的十六进制数。
例:
int a= -1;
printf(“%x,%o,%d”,a,a,a);
输出结果为
ffff,177777,-1
同样可以用,%1x”输出长整型数,也可以指定输出字段的宽度,如,%12x”。
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑸ %u 。用来输出无符号 (unsigned)型数据,以十进制整数形式输出。一个有符号整数( int型)也可以用 %u格式输出;反之,一个 unsigned型数据也可以用 %d格式输出。按相互赋值的规则处理。 unsigned型数据也可用
%o或 %x格式输出。
⑹ %m c。用来指定输出字符数据的宽度 m
如果有 printf(“%3c”,c);
则输出,a”,即c变量输出占3列,前2列补空格 。
例 3.9 无符号数据的输出。
#include<stdio.h>
void main()
{
unsigned int a=65535;int b=-2;
printf(“a=%d,%o,%x,%u \n”,a,a,a,a);
printf(“b=%d,%o,%x,%u \n”,b,b,b,b);
}
Turbo C 2.0环境下的运行结果,
a=-1,177777,ffff,65535
b=-2,177776,fffe,65534
VC++6.0环境下的运行结果,
a=65535,177777,ffff,65535
b =-2,37777777776,fffffffe,4294967294
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑺ %ms,指定输出的字符串占m列。如果字符串本身长度大于
m,则突破m的限制,将字符串全部输出。若串长小于m,则
% -ms,如果串长小于m,则在m列范围内,字符串向左靠,
% -m,ns,输出占m列,但只取字符串中左端n个字符。这n
%-m,ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则m自动取n值,即保证n
个字符正常输出。
⑻%m,nf,指定输出的实数共占m列,其中有n位小数。如果
%-m,nf 与%m,nf基本相同,只是使输出的数值向左端靠,右端补空格。
例 3.10 字符串的输出。
#include<stdio.h>
void main()
{
printf(“%3s,%7.2s,%.4s,% -5.3s\n”,
“CHINA”,“CHINA”,“CHINA”,
“CHINA”);
}
运行结果:
CHINA,CH,CHIN,CHI
例 3.11 输出实数时指定小数位数。
#include <stdio.h>
void main()
{
float f=123.456;
printf(“%f %10f %10.2f %.2f% -10.2f\ n”
,f,f,f,f,f);
}
运行结果:
123.456001 123.456001 123.46 123.46 123.46
例 3.12求 3个圆的周长,输出结果时上下按小数点对齐,
取两位小数。
#include <stdio.h>
#define PI 3.1415926
void main ( )
{double r1=1.53,r2=21.83,r3=123.71,s1,s2,s3;
s1=2.0*PI*r1;
s2=2.0*PI*r2;
s3=2.0*PI*r3;
printf("r1=%10.2f\nr2=%10.2f\nr3=%10.2f\n",r1,r2,r
3);
}
运行结果:
r1= 1.53
r2= 21.83
r3= 123.71
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
⑼ % m.ne和% -m.ne。 m、n和“-”字符的含义与前相同。
此处n指拟输出的数据的小数部分(又称尾数)的小数位数。
若f=123.456,则:
printf("%e %10e %10.2e %.2e %-10.2e",f,f,f,f,f);
输出如下:
1.234560e+002 1.234560e+002 1.23e+002 1.23e+002
13列 13列 10列 9列
1.23e+002
10列说明,
未指定n,自动使n=6,
超过给定的10列,乃突破10列的限制,按实际长度输出。
第 3个数据共占10列,小数部分占2列。
只指定n=2,未指定m,自动使m等于数据应占的长度。
第 5个数据应占10列,数值只有9列,由于是,%-10.2e,,
数值向左靠,右补一个空格。
(注:有的 C系统的输出格式与此略有不同 )
3.7 较复杂的格式输入与输出
3.7.1 输出数据格式控制
(10)%g,用来输出实数,
它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。
例,若f=123.468,则
printf( ″ %f %e %g ″,f,f,f);
输出如下:
123.468000 1.234680e+002 123.468
10列 13列 10列说明,
用%f格式输出占10列,用%e格式输出占13列,用%g
格式时,自动从上面两种格式中选择短者(今以%f格式为短)
故占10列,并按%f格式用小数形式输出,最后 3个小数位为无意义的0,不输出,因此输出 123.468,然后右补 3个空格。
%g格式用得较少。
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制说明:
除了 X,E,G外,其他各式字符必须用小写。
可以在 printf函数中的“格式控制”字符串中包含转义字符。
一个格式说明必须以,%”开头,以 9个格式字符之一为结束,中间可以插入附加格式字符。
想输出 %,则应该在格式控制字符串中用连续两个 %表示
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制格式字符 说明
d,i 用来输入有符号的十进制整数
u 用来输入无符号的十进制整数
o 用来输入无符号的八进制整数
x X 用来输入无符号的十六进制整数 (大小写作用相同 )
c 用来输入单个字符
s 用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志 ′\0 ′作为其最后一个字符
f 用来输入实数,可以用小数形式或指数形式输入
e E g G 与f作用相同,e与f,g可以互相替换 (大小写作用相同 )
表3,3 scanf格式字符
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制字符 说明
l 用于输入长整型数据(可用 %ld,%lo,%lx,%lu)以及
double型数据(用 %lf或 %le)
h
用于输入短整型数据(可用%hd,%ho,%hx)
域宽 指定输入数据所占宽度(列数),域宽应为正整数
* 表示本输入项在读入后不赋给相应的变量表3,4 scanf的附加格式说明字符
3.7 较复杂的格式输入与输出
3.7.2 输入数据格式控制说明:
对 unsigned型变量所需要的数据,可以用 %u,%d或 %o
,%x格式输入。
可以指定输入数据所占的列数,系统自动按它截取所需数据。
如果在 %后有一个,*” 附加说明符,表示跳过它指定的列数。
输入数据时不能规定精度。
例 3.13 输入三角形的三边长,求三角形面积。
假设:三个边长 a,b,c能构成三角形。
已知面积公式:
area=
s=(a+b+c)/2
c)b ) ( sa ) ( ss ( s
开始输入三边长计算 s
计算面积结束
3.8 顺序结构程序设计举例
#include<stdio.h>
#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);}
数学函数库因为要用到其中的 sqrt
函数运行情况:
3.4,4.5,5.6↙
a= 3.400000,b=4.500000,
c=5.600000
area=7.649173
printf("a=%7.2f\nb=%7.2f\nc=%7.2f\narea=%7.2f\n",a,b,c,area);
运行情况:
3.4,4.5,5.6↙
a= 3.40,b=4.50,
c=5.60
area=7.65
例 3.14 从键盘输入一个大写字母,要求改用小写字母输出。
#include <stdio.h>
void main()
{ char c1,c2;
c1=getchar();
printf("%c,%d\n",c1,c1);
c2=c1+32;
printf("%c,%d\n",c2,c2);
}
运行情况:
A ↙
A,65
a,97
例 3.14 从键盘输入一个大写字母,要求改用小写字母输出。
#include <stdio.h>
void main()
{ char c1,c2;
c1=getchar();
printf("%c,%d\n",c1,c1);
c2=c1+32;
printf("%c,%d\n",c2,c2);
}
运行情况:
A ↙
A,65
a,97
3.8 顺序结构程序设计举例例 3.15 求a x2+bx+c=0方程的根。
a,b,c由键盘输入,设 >0。
众所周知,一元二次方程式的根为
x1= x2=
可以将上面的分式分为两项:
p=,q= x1=p+q,x2=p-q
acb 42?
a
acbb
2
42 a acbb 2 4
2
a
b
2
a
acb
2
42?
#include <stdio.h>
#include <math.h>
void main ( )
{
float 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("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
}
运行情况:
a=1,b=3,c=2 ↙
x1=-1.00
x2=-2.00