C语言程序设计第一章 C程序基础
——————————————————————————
——————————
济南大学第一章 C程序基础
1.1 C 语言程序的基本结构
1.2 C程序运行过程
1.3 编写简单的C语言程序
1.4 C语言基本语法成分
1.5 C语言数据类型
1.6 数据的输入与输出
1.7 算法
1.8 C语言的产生、发展及特点
——————————————————————————
1.1 C 语言程序的基本结构
C 语言的引出
认识C 语言程序
C语言程序的基本结构
C语言的引出用计算机解决实际问题 ——软件算法,为解决一个问题而采取的方法和步骤称为,算法,。
比如,家里来客人了要泡茶招待,没开水,茶壶和茶杯也没洗,你的处理过程如下:
方法一:
第 1步:洗茶壶和茶杯第 2步:烧水第 3步:泡茶方法二:
第 1步:烧水第 2步:洗茶壶和茶杯第 3步:泡茶对同一个问题可能有不同的解决方法和步骤,即 不同的算法 。
问题 ——算法 ——计算机语言( C语言) ——C语言程序认识 C语言程序说明:
⑴,main表示主函数,每个程序必须有一个 main函数。 程序总是从 main函数开始执行 。
⑵、函数体由一对大括号括起来;范围以,{”开始,,}”结束

⑶,printf是 C语言的 标准输出函数,,""”内的字符串按原样输出,,\n”是换行符,即输出完后回车换行。
⑷,每个语句必须以分号“;”结束 。
问题 1,在屏幕上输出一行信息,This is a C program,
main( )
{
printf("This is a C program!\n");
}
main( )
{
printf("***********\n");
printf(" very good \n");
printf("***********\n");
}
***********
very good
***********
main( ) /*主函数 */
{
int a,b,sum; /*定义变量 */
a=2; b=3;
sum=a+b;
printf("sum is %d\n",sum);
}
说明:
⑴,,/*… */”表示注释部分,以,/*”开始,以,*/”结束;注释部分 可以加在程序的任意位置,仅起帮助阅读程序的作用,
对编译和运行程序不产生任何影响 ;
⑵,,%d”用来规定输入输出时的数据类型和格式; %d表示
,十进制整数类型,,输出时代以一个十进制整数值,该值由
“,”后边的内容提供。
sum is 5
问题 2,计算两数之和,并输出结果。
main( )
{
float a,b,c,aver;
scanf("%f%f%f",&a,&b,&c);
aver=(a+b+c)/3;
printf("aver is %f\n",aver);
}
说明:
⑴,float用于声明实型变量
⑵,scanf是 C语言的 标准输入函数,,&”的含义是得到后面变量的地址。即将输入的数按前面指定的格式给后面指定的变量
⑶、,%f” 表示输出一个实数,默认 6位小数
3 4 5
aver is 4.000000
问题 3,计算三个数的平均数,并输出结果。
问题 4:求任意 2个整数中的较大数
main( )
{
int a,b,c;
scanf("%d%d",&a,&b);
if (a>b)
c=a;
else
c=b;
printf("max=%d\n",c);
}
用函数实现比较大小
int max(int x,int y);
main( )
{ int a,b,c;
scanf("%d%d",&a,&b);
c=max(a,b);
printf("max=%d\n",c);
}
int max(int x,int y)
{ int z;
if (x>y) z=x;
else z=y;
return(z);
}
函数声明
12 34
max=34
float average(float a1,float b1,float c1)
{
float aver1;
aver1=(a1+b1+c1)/3;
return(aver1);
}
main( )
{
float a,b,c,aver;
printf("please input a,b,c:");
scanf("%f%f%f",&a,&b,&c);
aver=average(a,b,c);
printf("the average is %4.1f \n",aver);
}
C语言程序的基本结构主函数 main( )
{
声明部分执行部分
}
其它函数
{
声明部分执行部分
}
1、一个C程序由一个或多个函数构成。程序中应至少包含一个 main函数。 函数是C语言的基本单位 (函数式语言) 。
2、一个C程序 总是从 main函数开始执行,而不论 main函数在整个程序中的位置如何;一般说来,又随着 main函数的结束而整个程序结束。
3、被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编写的函数。
4、C语言本身没有输入输出语句,输入和输出操作由库函数
scanf和 printf等函数来完成,C对输入输出实行函数化。
5、每个语句和数据定义的最后 必须有一个分号 ;分号是C语句的必要组成部分。
函数的构成:
一个函数由两部分构成:
1,函数首部,即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。
float average(float a1,float b1,float c1)
注意:一个函数名后面必须跟,( )”作为函数的标志,main( )
2,函数体,即函数首部下面,{ }”内的部分函数体内一般又分为两部分:
⑴,变量定义(数据声明)部分,定义在本函数中用到的变量或数组的数据类型;
⑵,执行部分,由若干语句组成,完成函数所规定的功能。
int max(int x,int y)
{
int z;
if (x>y) z=x;
else z=y;
return(z);
}
源程序的书写格式和程序风格:
1、函数首部后面不要加分号。
2、C程序的书写格式自由,一个语句可以写在多行上;一行内也可以写几个语句,但是都必须用,;,作为每个语句的结束标志。
3、为了清晰的表现出程序的结构,建议采用 锯齿形格式 。
4、可以用 /*······*/对C程序的任何部分作注释。
main( ) /*主函数 */
{
int a,b,sum; /*定义变量 */
a=2; b=3;
sum=a+b;
printf("sum is %d\n",sum);
}
if (a>b)
c=a;
else
c=b;
1.2 C 程序运行过程
源程序、目标程序和可执行程序
C程序的上机操作
1,程序,程序是一组计算机可以识别和执行的指令,每一条指令使计算机执行特定的操作。
2,源程序,程序可以用高级语言或汇编语言编写,用高级语言或汇编语言编写的程序称为源程序。 C源程序的扩展名为,.C”

3,目标程序,源程序经过“编译程序”翻译所得到的二进制代码称为目标程序。目标程序的扩展名为,.OBJ”。
4,可执行程序,目标程序与库函数连接,形成完整的可在操作系统下独立执行的程序称为可执行程序。可执行程序的扩展名为,.EXE”(在 DOS/Windows环境下 )。
源程序、目标程序和可执行程序一,C程序的运行过程
1,编辑,将源程序输入计算机内存中 → 修改源程序 → 将改正后的源程序保存为磁盘文件。 ——以 ASCII码 形式输入和存储
2,编译,先进行语法检查,并将无语法错误的源程序翻译成二进制的目标代码 ----扩展名为,obj
3,连接,将各模块的二进制目标代码与系统标准模块连接,得到一个可执行文件 ----扩展名为,exe
4,执行,执行经过编译和连接的可执行目标文件。
编辑键盘输入 源程序 磁盘文件 A.c 编译 A.obj 连接 A.exe 执行 结果
C程序的上机操作
1、启动 Turbo C
⑴、启动,DOS,Windows
⑵、工作窗口,
主菜单窗口、编辑窗口、信息窗口、功能键提示行
2、在编辑状态下输入或修改源文件
⑴、编辑新文件编辑新文件,File→New
保存文件,File→Save 或 F2
⑵、编辑已存在的文件打开文件,File→Load 或 F3
保存文件,File→Save 或 F2
另存文件,File→Write to
二,上机操作
3、编译源程序
Compile→Compile to OBJ 或 Alt+F9
编译时如提示错误,则按 F6键在源程序和错误提示之间进行切换,并修改;修改完毕再重新编译,直到无任何错误编译成功。
注意:编译完全正确并不代表程序完全正确,只能说明无语法错误,不一定代表算法正确或运行结果正确。
4、运行源程序
Run→Run 或 Ctrl+F9
查看结果,Run→User Screen 或 Alt+F5
5、退出
File→Quit 或 Alt+x
1.3 编写简单的 C语言程序问题 1:已知 a=5,b=10,试交换 a,b的值。
分析,交换两个变量的值,需要借助第三个变量。
C语言程序:
main( )
{
int a=5,b=10,temp; /*变量 a,b赋初值 */
temp=a;
a=b;
b=temp;
printf("a=%d,b=%d\n",a,b);
}
运行结果,a=10,b=5
思考,交换 a,b能否不借助于第 3个变量?
问题 2,试计算圆柱体的表面积。
分析,为了计算圆柱体的表面积,可以利用公式 2πr( r为半径)得到底面周长 d,利用公式 d× h计算侧面积 s1,利用
π× r2计算底面积 s2,则表面积 s=s1+2× s2。
可以按照以下 步骤,
① 设圆柱体的高为 h,半径为 r,表面积为 s;
② 输入 r,h的值;
③ 计算底面周长 d=2πr;
④ 计算侧面积 s1=dh;
⑤ 计算底面积 s2=πr2;
⑥ 计算表面积,s=s1+2× s2;
⑦ 输出 s的值。
main( )
{
float r,h,s,d,s1,s2;
printf("input r,h:\n");
scanf("%f%f",&r,&h);
d=2*3.14*r;
s1=d*h;
s2=3.14*r*r;
s=s1+2*s2;
printf("Total area is %.2f\n",s);
}
#include <stdio.h>
#define PI 3.1415926
void main( )
{
float r,h,s;
printf("input r,h:\n");
scanf("%f%f",&r,&h);
s=2*PI*r*h+2*PI*r*r;
printf("Total area is %.2f\n",s);
}
,”符号常量
1.4 C语言基本语法部分
C 语言字符集
标识符
关键字
运算符
其它符号字符 是 C语言最基本的元素,C语言字符集由字母、数字、空白、标点符号和特殊字符组成。
1,字母,A-Z,a-z
2,数字,0-9
3,标点符号、特殊字符,
4,空白符,空格,制表符( Tab,跳格健),换行符(空行)
的总称。
C语言字符集
! # %^ & + - * / = ~ < > \
|,,;,? ' " ( ) [ ] { }
标识符标识符,给程序中的实体所起的名字
1、标识符的 命名规则
①,以字母或下划线开头,由 字母,数字 和 下划线 组成的字符序列
②、不能与C语言的关键字重名
③、注意标识符的有效长度,TC和 BC31中为 32个字符
④、区分大小写字母,如 sum,Sum是不同的
2、定义标识符建议 遵循的原则
①,尽量不要使用下划线开头
②、尽量做到见名知义;如 sum,area
③,习惯上变量名、函数名用小写,而符号常量用大写
④,应尽量避免使用容易认错的字符。如,数字 1与字母 l和字母 I,数字 0与字母 o和 O,数字 2与字母 Z和 z
关键字关键字 是 C语言预先定义的、具有特定意义的标识符,也称为保留字。 C语言包括 32个关键字:
auto break case char const continue
default do double else enum extern
float for goto if int long
register return short signed sizeof static
struct switch typedef union unsigned void
volatile while
C语言的关键字都是 小写 。不能重新定义关键字,也不能把关键字定义为一般标识符。
运算符运算符,用于描述运算形式的符号,如 +,-;参与运算的对象
(即数据)称为 操作数 。将操作数用运算符连接起来的、符合
C语法规则的式子称为 表达式 。
C的运算符包括算术运算符、关系运算符、逻辑运算符、赋值运算符等 13种运算符。
需要注意的问题,
⑴,参加操作的数据类型;
⑵、要求运算量的个数,一元(单目)、二元(双目)或三元(三目)
⑶、优先级,如,3+5*6;
⑷、结合性( 左结合性,右结合性 ),如,3*5/6;
⑸、结果的取值及类型,所有表达式都具有确定的值一,算术运算符( + - * / %)
说明:
①、运算对象可以是整型或实型数据;
②,/,两个 整数相除 舍去小数部分,结果为整数;
如,5/2=2 -5/2=-2 1/3=0 1.0/3=0.3333
③,%:要求两侧的操作数必须为整数;如 7%3=1。运算结果的符号与被除数符号相同。
优先级和结合性:
①,*,/,%的优先级相同,+,-的优先级相同;但前三种高于后两种。
②,+ - * / %均为 左结合性 。
二,自增、自减运算符( ++ --)
一元运算符,优先级高于 *,/,%运算,结合方向 自右至左 。
形式:
⑴,前缀,++i,--i,在使用 i之前,先使 i的值加减 1
⑵,后缀,i++,i--,在使用 i之后,使 i的值加减 1
比较,int i=10;
x=i++;
y=i; x=10,i=11,y=11
int i=10;
x=++i;
y=i; x=11,i=11,y=11
i=3; j=5;
a=(++i)*j;
a=(i++)*j;
i=4 a=4*5=20
a=3*5=15 i=4
三,赋值运算符( =)
双目运算符,优先级 14,结合性为 自右至左。
形式:
1、简单赋值表达式,变量名 =表达式作用:先计算表达式的值,然后将表达式的值赋值给左边的变量。
结果,赋值表达式的值 和类型等于被赋值变量的值和类型。
如,x=3,i=i+1
2、多重赋值表达式:
变量名 1=变量名 2=…… =变量名 n=表达式作用:先计算表达式的值,然后将表达式的值赋值给各个指定的变量。
四,复合(自反)赋值运算符( +=,-=,*=,/=,%=,<<=
,>>=,&=,^=,|= )
a+=5;? a=a+5;
y*=x-2;? y=y*(x-2);
x%=y/3;? x=x%(y/3);
五,逗号运算符(,)
优先级最低,形式,表达式 1,表达式 2,……,表达式 n
从左至右依次求解表达式 1,表达式 2,……,表达式 n; 表达式
n的值 (和类型 )即为整个逗号表达式的值 (和类型 )。
i=1,j=2,k=3
i++,j+4,k-2
x=(a=3,b=5,c=b*4)
逗号表达式的值为 3
逗号表达式的值为 1
赋值表达式的值为 20
其它符号分隔符,在 C语言程序中,空格,逗号,回车 /换行 等,在各自不同的应用场合起着分隔符的作用。
例如:语句 int x,y; 中的空格和逗号都起着分隔符的作用,如果缺少了空格程序就会出错,缺少了逗号 x和 y就会被认为是一个变量。
花括号,,{”和,}”通常用于标识函数体或者一个语句块(即复合语句)。
注释符,,/*”和,*/”构成一组注释符。编译系统将 /*,.,*/之间的所有内容看作注释,编译时编译系统忽略注释。
1.5 C语言数据类型
C语言的数据类型
常量与变量
整型数据
实型数据
字符型数据
数值型数据间的混合运算
C语言的数据类型数据类型基本类型构造类型指针类型空类型 (void)
整型字符型 ( char)
实型(浮点型)
枚举型 ( enum)
数组类型结构体类型 ( struct)
共用体类型 ( union)
文件类型 ( FILE)
短整型( short)
整 型( int)
长整型( long)
单精度型( float)
双精度型( double)
常量与变量一、常量在程序运行过程中其 值不能被改变 的量称为 常量 。
C语言中的 常量区分为不同的类型,如 18,0,-3为整型常量,4.6,-1.23,0.0为实型常量,'a','x'为字符型常量。
用一个标识符代表一个常量的,称为 符号常量,即标识符形式的常量。其值不能被改变,也不能再被赋值。
定义形式,#define 符号常量名 常量表达式或字符串如,#define PRICE 30
#define LETTER abcdefg
习惯上,符号常量名用大写字母表示,变量名用小写字母表示,以示区别。
二、变量在程序运行过程中其 值可以被改变 的量称为 变量 。
每个变量都应该有一个名字,在内存中占据一定的存储单元,在该存储单元中存放变量的值。
3sum
变量名变量值存储单元每个变量在使用之前必须先进行定义(声明),C要求变量必须 先定义后使用 。
进行变量声明后,计算机系统会为声明的变量分配相应大小的存储空间,用以存放数据。
变量声明的格式:
数据类型 变量名列表;
如,int a,b,sum;
float x,y;
C语言允许在定义变量的同时给变量赋初值,即 变量的初始化 。
int a=3; float f=3.56;
char c='a'; int a,b,c=3;
int a=3,b=3,c=3; int a=b=c=3;
注意,初始化不是在编译阶段完成的,而是在执行时对相应变量赋初值的。
int a,b,c=5; int a,b,c;c=5;
三、变量赋初值整型数据一、整型常量
①、十进制形式,如 112,0,-3;
②、八进制形式,以数字 0开头,如 0123;
③、十六进制形式,以 0x开头,如 0x123
每种形式的整型常量又都可以表示成短常量和长常量。凡在整型常量后面紧跟 大写字母 L或 小写字母 l则表示此常量为长整型常量。
int x,y,z;
x=10; y=010; z=0x10;
printf("x=%d,y=%d,z=%d\n",x,y,z); x=10,y=8,z=16
二,整型变量
1、整型数据在内存中的存放形式:
以二进制补码的形式存放
int i;
i=10;
数据存放示意图:
i 10
数据在内存中的实际存放情况:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
-10 10的原码
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
按位取反1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
加 11 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0
2、整型变量的分类:
根据数值的范围可以分为三种:
①,基本型,以 int表示;占 2个字节
②,短整型,以 short int或 short表示;占 2个字节
③,长整型,以 long int或 long表示;占 4个字节为了充分利用变量的表数范围,可以将变量定义为,无符号,类型。即所有位都用于存放数值本身,不包含符号。
加上修饰符 unsigned以指定为“无符号数”,加上修饰符 signed以指定为“有符号数”;如果不指定,则隐含为有符号 (signed)。
归纳起来,有以下六种整型变量:
类 型 类型标识符 长度 取 值 范 围有符号 基本类型 [signed] int 16bit -32768 ~ 32767即 -215 ~ (215-1)
无符号 基本类型 unsigned int 16bit 0 ~ 65535即 0 ~ (216-1)
有符号 短整型 [signed] short [int] 16bit -32768 ~ 32767
无符号 短整型 unsigned short [int] 16bit 0 ~ 65535
有符号 长整型 [signed] long [int] 32bit -2147483648 ~ 2147483647即 -231 ~ (231-1)
无符号 长整型 unsigned long [int] 32bit 0 ~ 4294967295,即 0 ~ (232-1)
3、整型变量的定义:
int a,b,sum;
unsigned int i,j,area;
long x,y;
4、整型数据的溢出:
例如:
main( )
{
int a,b;
a=32767;
b=a+1;
printf("%d,%d",a,b);
}
32767,-32768
a,0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
b,1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
实型数据一、实型常量实数又称为 浮点数,实型常量有两种表示形式:
①,十进制数形式,由数字和小数点组成 (必须要有小数点,但小数点前后的 0可以省略 )。如 0.123,.123,123.0、
123.,0.等。
②,指数形式,如 123e3或 123E3都代表 123× 103。注意字母 e(或 E)之前必须有数字,且 e(或 E)后面的指数必须为整数
。如 e3,.e3,2.1e3.5,e等都不是合法的指数形式。
规范化的指数形式,在小数部分中,小数点左边有且只有一位非零的数字。如 1.234E-2。 一个实数在用指数形式输出时,是按规范化的指数形式输出的 。
二,实型变量
1、实型数据在内存中的存放形式:
实型数据是 按指数形式存储 (分 小数部分和指数部分 )。
如实数 314.159在内存中的存放形式如下:
+ 0.314159 3
数符 小数部分 指数部分
2、实型变量的分类,单精度 (float),双精度型 (double)和 长双精度 (long double)。
类型 长度 有效数字
float 32bit 6~ 7
double 64bit 15~ 16
long double 128bit 18~ 19
字符型数据一、字符常量
C的字符常量是用 单引号 (' ')括起来的一个字符。如 'a'、
'A','x','D','?','$'等。
转义字符,以,\”开头的字符序列。是控制字符,在屏幕上不能显示。
如,'\n'表示换行,'\\'表示反斜杠,'\''表示单引号,'\"'表示双引号。 '\ddd'表示 1到 3位八进制数所代表的字符,'\xhh'表示 1
到 2位十六进制数所代表的字符。
'\101','\x41',A
'\1','\01','001',?
'\x1','\x01',?
二、字符变量字符变量用来存放字符常量。但 只能存放一个字符 。
char ch1,ch2;
ch1='a'; ch2='\101';
三、字符数据在内存中的存储形式及使用方法字符数据在内存中以相应的 ASCII码存放,即以 二进制形式 存放,占 1个字节。
c1='a' 97
01100001
c2='b' 98
01100010
字符型数据和整型数据在一定范围内通用。
⑴ 字符数据用整数形式输出
void main( )
{ char ch;
ch=97;
printf("%c,%d\n",ch,ch);
}
a,97
⑵ 字符数据与整数进行算术运算
void main( )
{ char ch;
int x;
ch='A';
x=ch+32;
printf("%c,%d\n",ch,ch);
printf("%c,%d\n",x,x);
} A,65
a,97
如需要使用 ASCII码为 128--255之间的字符,需要将字符变量定义为 unsigned char。
四、字符串常量字符串常量由一对 双引号 ("")括起来的字符序列。如 "How
are you!","China","a","$123.45",""等。可以输出一个字符串,如,printf("Hello!");。
系统在存储字符串时自动在字符串末尾加一个结束标志 '\0'
,据此判断字符串是否结束。
'a' a "a" a \0
"China" C h i n a \0
注意,写字符串时不必加 '\0',它是系统自动加上的。
数值型数据间的混合运算一、自动类型转换
⑴,一般算术转换将短的数扩展为机器处理的长度,使运算符两端有相同的类型
double float
long
unsigned
int char,short低高
float x; int a; long b=21;
2.0+a 1.5+a*'A'
⑵,赋值转换进行赋值运算时,将赋值号右侧表达式的值的类型自动转换为其左侧变量的类型 a=3.2;
x=3+2;
a=b;
二、强制类型转换使用 强制类型转换运算符 将一个表达式的值转换成另一种类型。
形式,(类型标识符 )(表达式 )
(double)(a) (int)(x+y) (float)(5%3)
说明:
1、当表达式为单个变量时,可省略括号;如,(double)a (int)x+y
2、在强制类型转换时,原变量的值和类型不变,只是得到一个所需类型的中间变量。
main( )
{
float x=8.57;
int i;
i=(int)x;
printf("x=%f\n",x);
printf("i=%d\n",i);
}
x=8.570000
i=8
1.6 数据的输入与输出
printf函数
scanf函数
printf函数格式,printf(格式控制,输出表列 )
例,printf(“i=%d,c=%c\n”,i,c);
功能,在屏幕当前光标处按,格式控制,的格式输出常量、变量的内容、或表达式的结果。
“格式控制,是用双引号括起来的字符序列,包括 格式说明 和普通字符 两部分。 格式说明 由,%”和格式字符组成,如 %d、
%f等。 普通字符 (含转义字符)原样输出。
输出表列,由 0到多个具体参数组成,其中的参数可以是 常量,
变量 或 表达式 。
注意,格式控制符的个数与后面的参数个数应相等,且前后位置要一一对应。
格式字符 含 义
%d(或 %i) 输出带符号的十进制整数
%x(或 %X) 输出无符号十六进制整数 (不输出前导符 0x)
%o 输出无符号八进制整数 (不输出前导符 0)
%u 输出无符号十进制整数
%f 输出十进制实数 (隐含输出 6位小数 )
%e(或 %E) 以指数形式输出实数 (隐含输出 6位小数 )
%g(或 %G) 自动选用 %f或 %e格式中输出宽度较短的一种格式输出实数,不输出无意义的 0
%c 输出单个字符
%s 输出字符串
%% 输出 %
printf格式字符
int a=123,b=-1; float x=12.34; char ch=65;
printf("a=%d,b=%d",a,b); 输出结果,a=123,b=-1
printf("a=%X,b=%x",a,b); 输出结果,a=7B,b=ffff
printf("a=%o,b=%o",a,b); 输出结果,a=173,b=177777
printf("a=%u,b=%u",a,b); 输出结果,a=123,b=65535
printf("x=%f",x); 输出结果,x=12.340000
printf("x=%e",x); 输出结果,x=1.234000e+001
printf("x=%g",x); 输出结果,x=12.34
printf("%f%%",1.0/3); 输出结果,0.333333%
printf("ch=%c",ch); 输出结果,ch=A
printf("str=%s","I love China!"); 输出结果,str=I love China!
注意,格式字符与其对应的输出项的类型要保持一致,例如,
不应用 %f输出整数。
格式控制字符中,在,%”和其后的格式字符之间,还可以插入 附加的格式说明符 。
附加格式说明符 含 义字母 h 用于输出短整型数据,可加在格式符 d,o,x,u前面字母 l 用于输出长整型数据或 double型数据,可加在格式符 d、o,x,u,f,e(或 E),g(或 G)前面
m(正整数 ) 输出数据的最小宽度,如果数据的实际宽度超过 m,则按实际宽度输出;如果小于 m,则补空格
n(正整数 ) 对于实数,表示输出 n位小数;对于字符串,表示截取的字符个数
- (负号 ) 输出的数据或字符在域内向左对齐
int a=123; float x=12.345;
printf("a=%5d ",a); 输出结果,a=_ _123
printf("a=%2d",a); 输出结果,a=123
printf("a=%-5X",a); 输出结果,a=7B_ _ _
printf("x=%7.2f",x); 输出结果,x=_ _12.35
printf("x=%.2f",x); 输出结果,x=12.35
printf("x=%10.2e",x); 输出结果,x=_1.23e+001
printf("x=%2E",x); 输出结果,x=1.234500E+001
printf("str=%5.3s","Computer");输出结果,str=_ _Com
printf("str=%3s","Computer"); 输出结果,str=Computer
scanf函数格式,scanf(“格式控制”,地址表列 )
功能,从键盘读入字符序列,并按指定的格式转换成相应的数据,存储到地址表列所指定的内存单元中。
格式控制 同 printf函数。但 不能提示显示非格式字符串,即,
不能显示输入提示字符串。
,地址表列,由若干个地址组成,可以是 变量的地址 (由地址运算符 &和变量名组成 )或 字符串的首地址 。
对,%d%d%d”类型的输入,输入的两个数据间可用一个或多个 空格,回车键,tab键 间隔。不能用逗号作为两个数据的分隔符。
例,scanf(“%d%d%d”,&a,&b,&c);
scanf("%d,%f\n”,&a,&b); ×
main()
{
int a,b,c;
scanf(“%d %d %d”,&a,&b,&c);
printf(“%d,%d,%d\n”,a,b,c);
}
注意 &的用法 !
注意区分 变量的值 和 变量的地址 这两个概念。变量的地址由
C编译系统分配,用户不必关心具体地址是多少,是在定义它们时确定的,是在编译时由系统具体分配的。它们在内存中所占的单元可能是连续的,也可能不连续。
scanf(“%d,%f”,&a,&b);
地址表非格式字符格式说明格式说明格式字符 说明
d,i 用来输入有符号的十进制整数
u 用来输入无符号的十进制整数
o 用来输入无符号的八进制整数
x,X 用来输入无符号的十六进制整数 (大小写作用同 )
c 用来输入单个字符
s
用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。
结束标志’ \0’。
f 用来输入实数,可用小数形式或指数形式输入
e,E,g,G 与 f作用相同,e与 f,g可以互相替换 (大小写作用同 )
scanf格式控制符在 %和格式字符之间可插入附加的格式说明符:
字 符 说 明
l 用于输入长整型数据(可用 %ld,%lo,%lx)
h 用于输入短整型数据(可用 %hd,%ho,%hx)
m(正整数 ) 域宽,指定输入数据所占宽度(列数)
* 赋值抑制符,表示本输入项读入后不赋给任何变量
⑴,格式控制中若带 域宽,系统自动按域宽截取所需数据; scanf("%3d%3d",&a,&b);
123456↙
a=123,b=456
⑵,赋值抑制符 *,表示按格式说明读入数据后不送给任何变量 scanf("%2d%*3d%2d",&a,&b);
12345678↙
a=12,b=67
⑶ 输入实型数据时可以指定数据的宽度,但不能规定数据的 精度 。例如,scanf("%5.2f",&a); 是不合法的。
使用 scanf函数应注意的问题:
⑴,地址表列必须提供变量或字符串在内存中的 地址,不能写成变量名的形式;
int a,b;
scanf("%d%d",&a,&b);
⑵,如果在,格式控制,的字符串中除格式控制符之外还有其它字符,则在输入时应输入相同的字符;
scanf("%d,%d",&a,&b) 12,34↙
scanf("%d %d",&a,&b) 12 34↙
scanf("%d:%d:%d",&a,&b,&c) 12:34:56↙
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
a=12,b=34,c=56↙
⑶,在输入数据时,遇以下情况之一认为一个数据输入结束:
①、遇到 空格 或按 Tab键或 回车 键;
②,满足域宽,如 %3d,输入 3位即结束;
③,遇到非法字符 。
scanf("%d",&a); 12I12↙a=12
scanf("%d%d",&x,&y); 12,34↙x=12,y无正确数据
1.7 算法
算法的概念
简单算法举例
算法的特性
算法的表示方法
结构化程序设计方法算法的概念算法,为解决一个问题而采取的方法和步骤 。
对同一个问题可能有不同的解决方法和步骤,即 不同的算法 。在保证算法正确的基础上,还要考虑算法的质量,即 选择较优的算法 。
著名的计算机科学家 沃思( Wirth)提出一个公式:
算法 +数据结构 =程序数据结构,参与运算数据的类型和组织形式计算机算法的分类:
1、数值运算算法 ---用于求数值解,如求解多元方程
2、非数值运算算法 ---多用于事务管理领域,如图书管理简单算法举例例 1:从键盘输入三个数,求平均值
step1:输入三个数
step2:做加法运算
step3:除以 3
step4:输出结果
step1:定义变量 a,b,c,aver
step2:输入 a,b,c
step3,(a+b+c)/3?aver
step4:输出 aver
main( )
{
float a,b,c,aver;
scanf("%f%f%f",&a,&b,&c);
aver=(a+b+c)/3;
printf("aver is %f\n",aver);
}
例 2:求 1*2*3*4*5,即 5!
用文字描述算法:
step1:先求 1*2,得到结果 2
step2:用 step1得到的结果 2*3,得结果 6
step3:用 step2得到的结果 6*4,得结果 24
step4:用 step3得到的结果 24*5,得最后结果 120
step5,输出结果 120
用文字和符号来描述算法:
step1:说明两个变量 a和 b,代表相乘的两个数
step2,1?a,2?b (给出 a和 b的初始数值 )
step3,a*b?a (计算 a*b,并将结果保存在变量 a中 )
step4,b+1?b (将 b的值加 1)
step5,如果 b<=5,则返回到 step3执行,否则执行 step6
step6,输出 a的值算法的特性
1,有穷性一个算法包含 有限的 操作步骤
2,确定性算法中的每一个步骤是确定的,含义是唯一的
3,有零个或多个 输入
4,有一个或多个 输出
5,有效性算法中每一个步骤应能有效地执行,并得到确定的结果例如,b=0,则 a/b是不能有效执行的。
算法的表示方法一,自然语言表示法例如,求两数之和:
①、输入 a,b两数;
②、求和 sum=a+b;
③、输出两数之和 sum。
注意,每一个操作步骤必须是计算机所能实现的。
特点,通俗易懂,但文字冗长、易出现歧义,因此较少使用。
二,传统的程序流程图用 ANSI C规定的图形符号形象直观的描述算法。
名 称 符 号 含 义箭 头 流向或路径矩 形 处理功能圆 形 连接点平行四边形 输入或输出菱 形 判断圆弧矩形 流程的起点或终点尖头框 循环双边矩形框 调用子程序例:输入三个数 a,b,c,输出其中的最大者。
开始输入 a,b,c
a>b?
a>c?
T
b>c?
F
结束输出 c
F
输出 a
T
输出 b
T
输出 c
F
三种基本控制结构,
1,顺序结构,按语句书写的先后次序执行;
2,选择(分支)结构,根据指定条件的判断结果从若干组语句中选择一组执行;
3,循环结构,根据判断给定条件是否满足,决定是否重复执行程序中的某一段程序。
三,N-S流程图提供了描述三种基本逻辑结构的图形工具;与传统的程序流程图对比如下:
⑴,顺序结构
A模块
B模块
(a) 传统流程图
A模块
B模块
(b) N-S图
⑵,选择(分支)结构
(a) 传统流程图表示
A模块 B模块判断条件成立吗?
成立 不成立
(b) N-S图表示判断条件成立吗?
成立 不成立
A模块 B模块
⑶,循环结构,
①,当型循环结构 ( while)
不满足满足循环体循环条件满足吗?
(a) 流程图表示 (b) N-S图表示循环体循环条件满足吗?
②,直到型循环结构 ( do-while)
不满足满足循环体循环条件满足吗?
(a) 流程图表示
(b) N-S图表示循环体循环条件满足吗?
例,描述求 ax2+bx+c=0的根的算法。
开 始输入 a,b,c
d=b2-4ac
输出 x1,x2 输出两个虚根 x1,x2
结 束
a
dbx
21

a
dbx
22

a
bx
21
12 xx?
iadabx 221
iadabx 222
d≥0?
T
T F
Fd> 0?
结构化程序设计方法
1、自顶向下
2、逐步细化
3、模块化设计
4、结构化编码需要解决的问题 P
子问题 p1 子问题 p2 子问题 p3
p12p11 p32p31 p33
设计 设计 设计 设计 设计 设计编码 编码 编码 编码 编码 编码
1.8 C语言的产生、发展及特点
C语言的产生及发展
C语言的特点
C语言的产生及发展
C语言的产生和发展与 UNIX操作系统分不开。
1960 Algol 60 国际委员会
1963 CPL( Combined Programming Language) 伦敦大学、剑桥大学
1967 BCPL( Basic CPL) 剑桥大学 Matin Richads
1970 B 贝尔实验室 Ken Thompson
1972 C 贝尔实验室 D.M.Ritchie
1978-,The C Programming Language,→ ANSI C
语言简洁、紧凑,使用方便灵活
运算符丰富
数据结构丰富
结构化控制结构
语法限制不太严格,程序设计自由度大
既有高级语言的优点、又有低级语言的特点
目标代码质量高
可移植性强
C语言的特点作业
1、编写一个程序,能显示下面两行文字:
I am a student.
I love China.
2、编写程序,能显示如下图形:
*
* *
* * *
* * * *
3、编写程序,从键盘输入两个整数,输出此二数之和。
4、下列符号中,哪些可作为变量名?如果不可以,请分别说明原因。
a3B -b _b5_ int day e_2
OK? main i*j PI ¥ 123 3D64
5、指出下列哪些常量是合法的?如果非法,请分别说明原因。
-0,-0x2al e3 '\n' "x-y" '105'
2.E-5 3e+2.3 0x4DL '\12' '\x 3+5
6、计算下列表达式的值:
①,设 x=1.5,a=7,y=4.7
x+a%3*(int)(x+y)%2/4
②,设 a=3,b=2,x=5.5,y=2.5
(float)(a+b)/2+(int)x%(int)y
7、写出下面程序段的输出结果,int x=40,y=4,z=4;x=y==z;
printf("x=%d\n",x);
x=x==(y=z);
printf("x=%d\n",x);
8、写出下面表达式运算后 a的值(设 a=3,n=5):
①,a*=2+3 ②,a/=a+a
③,a%=(n%=3) ④,a+=a-=a*=a
9、编写一个程序,输出如下图形:
M
M M M
M M M M M
M M M M M M M
M M M M M
M M M
M
10、编写程序,输入梯形的上底、下底和高,计算并输出梯形的面积。精确到小数点后 2位,输入输出时要有文字说明。
T h e E n d