本文为大一新生为期末复习所整理
课本为C程序设计(第五版)谭浩强第三章
3.1顺序程序设计举例
【例3.1】
有人用温度计测量出华氏法表示的温度(如64'F),今要求把它转化为以摄氏法表示的温度(如17.8'C)
解题思路:C=5/9(F-32)
编写程序:
#include<stdio.h>
int main( )
{
float F,C;
F=64.0;
C=(5.0/9)*(F-32);
printf("F=%f\nC=%f\n",F,C);
return 0;
}
【例3.2】
计算存款利息。有一千元,想存一年。有三种方法可选:①活期,年利率位r1;②一年期定期,年利率为r2;③存两次半年期,年利率为r3.请分别计算出一年后按3种方法所得到的本息和。
解题思路:
关键是确定计算本息和的公式。
若存款额为p0,则:
活期存款一年后本息和为p1=p0(1+r1);
一年期定期存款,一年后本息和为p2=p0(1+r2);
两次半年定期存款,一年后本息和为p3=p0(1+r3/2)(1+r3/2).
编写程序:
#include <stdio.h>
int main ( )
{
float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3;
p1=p0*(1+r1);
p2=p0*(1+r2);
p3=p0*(1+r3/2)*(1+r3/2);
printf("p1=%f\np2=%f\np3=%f\n",p1,p2,p3);
return 0;
}
3.2数据的表现形式及其运算
3.2.1常量和变量
常量
在程序运行过程中,其值不能被改变的量成为常量。
常量的分类:
整型常量。如100,235,-236等都是整型常量
实型常量。有两种表示形式
十进制小数形式,由数字和小数点组成。如123.456,0.365,-12.36,0.0,12.0等。
指数形式,如12.34e3(代表12.34*),-346.87e-25(代表-346.87*),0.145E-25(代表0.145*)等。以字母e或E代表以十为底的指数。注意:e或E之前必须有数字,且e或E后面必须为整数。不能写作e4,12e.25。
【注意】:e或E左边有数右边为整!
字符常量。有两种形式的字符常量。
普通字符,用单撇号括起来的字符,如:'a','Z','3','?','#'。不能写成‘ab’或‘12’。
【注意】:单撇号只是界限符,字符常量只能是一个字符,不包括单撇号。
ASCII码,如字符‘a’的ASCII码是97,‘A’是65。
转义字符
\n 换行符
\r 一个回车
\' 一个'
\" 一个"
\\ 一个\
\t 一个制表位,实现对齐功能
【例】printf("张无忌赵敏周\r芷若小昭");
输出的是:芷若小昭敏周
字符串常量。如“boy”,"123"等。用双撇号把若干个字符括起来
【注意】:单撇号内只能包括一个字符,双撇号内可以包含一个字符串。
符号常量。用一个符号名代表一个常量。
用#define指令,指定用一个符号名称代表一个常量。如:
#define PI 3.1416 //注意行末没有分号
【说明】①PI就是3.1416
②#define 符号 常量(表达式)
③符号常量不占内存,习惯上符号常量常用大写表示
④使用符号常量的好处&1含义清楚。&2做到“一改全改”
变量
【注意】
先声明后使用;
变量三要素:变量名+值+数据类型(int num;num=90;);
变量在同一个作用域内不能重名(num1,num2······);
常变量
使用常变量:在定义变量时,前面加一个关键字const,如:
const int a=3;
定义a为一个整型变量,指定其值为3,而且在变量存在期间其值不能改变。
【常变量与常量的异同】
常变量具有变量的基本属性:有类型,占储存单元,只是不允许改变其值。
可以说是常变量是有名字的不变量,而常量是没有名字的不变量。
【符号常量与常变量】
#define Pi 3.1415926 //定义符号常量
const float pi=3.1415926; //定义常变量
定义常量的方法
#define
#define 常量名 常量值
【eg】
#include <stdio.h>
#define PI 3.14
const
const 数据类型 常量名=常量值;
【eg】
#include <stdio.h>
const double PI=3.14;
int main ( )
{
double area;
double r=1.2;
area=PI*r*r;
printf("面积:%.2f",area);
}
【说明】
const是一个关键字
PI是常量名,即一个常量,常量值为3.14
因为PI为常量,所以其值不可更改
const定义常量时,需要加分号。
【const与#define的区别】
const定义时带类型而define不带类型;
const编译时起作用,define预处理时起作用;
const不可重定义而define可通过undefine取消某个符号的定义;
标识符
在计算机高级语言中,用来对变量,符号常量名,函数,数组,类型等命名的有效字符序列统称为标识符
【标识符的命名规则与规范】
只能由数字,字母,下花线3种字符组成,且第一个字符必须为字母或下画线
数字不可以做开头
不可以使用关键字或保留字,但可以包含
严格区分大小写,长度无限制
标识符不能包含空格
见名知意
3.2.2数据类型
3.2.3整型数据
整型数据的分类
基本整型(int型)
短整型(short int)
长整型(long int)
双长整型(long long int)
整型变量的符号属性
【说明】无符号的取值范围都从零开始
3.2.4字符型数据
字符与字符代码
127个字符:
字母,数字,专门符号,空格符等
字符变量
字符变量是用类型符char定义字符变量
如:char c=‘?’;
定义c为字符型变量并使初值为字符‘?’。‘?’的ASCII代码是63,系统把整数63赋给变量c。
c是字符变量,实质上是一个字节的整型变量,由于常用来存放字符,所以称为字符变量。可以把0~127之间的整数赋给一个字符变量。
在输出字符变量的值时,可选择以十进制整数形式输出,或以字符形式输出。
如:printf(“%d %c\n”,c,c);
输出结果为63 ?
【说明】用%d格式输出十进制整数63,用%c格式输出字符‘?’。
字符型数据的存储空间和值的范围:
【说明】在使用有符号字符型变量时,允许存储的值为-128~127,但字符的代码不可能为负值,所以在存储字符时实际上只用到0~127这一部分,其第一位都是0.
3.2.5浮点型数据
float型(单精度浮点型)
double型(双精度浮点型)
long double型(长双精度)
3.3运算符与表达式
3.3.1算数运算符
&取余
取余前后必为整数
3.3.2自增(++),自减(--)运算符
【例】
3.3.3算术表达式和运算符的优先级和结合性
3.3.4不同类型数据间的混合运算
数据类型自动转换规则
【例3.3】
给定一个大写字母,要求用小写字母输出。
编写程序:
#include <stdio.h>
int main ( )
{
char c1,c2; //声明字符
c1=‘A’; //将字符‘A’的ASCII代码放到c1变量中
c2=c1+32; //得到字符‘a’的ASCII代码,放到c2变量中
printf("%c\n",c2); //输出c2的值,是一个字符
printf("%d\n",c2); //输出c2的值,是字符‘a’的ASCII代码
}
运行结果:
a
97
3.3.5强制类型转换运算符
将精度高的数据类型转化为精度小的数据类型,使用时要加上强制转化符(),但可能造成精度降低或溢出。
格式:(类型名)(表达式)
【注意】表达式应该用括号括起来。若写成(int)x+y,则只将x转换成整型,然后与y相加。
3.4C语句
3.4.1C语句的作用和分类
控制语句
九种控制语句
if( )···else···(条件语句)
for( )···(循环语句)
while( )···(循环语句)
do···while( )(循环语句)
continue(结束本次循环语句)
break(中止执行switch或循环语句)
switch(多分支选择语句)
return(从函数返回语句)
goto(转向语句)
【说明】
()表示括号中是一个判断条件,···表示内嵌的语句
例如:if( )···else···可写作if(x>y) z=x;else z=y;
函数调用语句
函数调用语句由一个函数调用加一个分号构成,如:
printf(“This is a C statement.”);
其中printf(“This is a C statement.”)是一个函数调用,加一个分号成为一个语句
表达式语句
由一个表达式加一个分号构成,如a=3;(a=3是语句,a=3;是语句表达式)
空语句
;
复合语句
可以用{}把一些语句和声明括起来成为复合语句(又称语句块)。
3.4.2最基本的语句--赋值语句
【例3.4】
给出三角形三边长,求三角形面积。
编写程序:
#include<stdio.h>
#include<math.h>
int main ( )
{
double a,b,c,s,area;//定义各变量,均为double型
a=3.67;
b=5.43;
c=6.21;
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=%f\tb=%f\tc=%f\n",a,b,c);
printf("area=%f\n",area);
return 0;
}
运行结果
a=3.670000 b=5.430000 c=6.210000
area=9.903431
赋值运算符
赋值符号“=”就是赋值运算符,作用是将一个数据赋给一个变量。
复合的赋值运算符
在赋值符=之前加上其他运算符,可以构成复合的运算符
例如:
a+=3等价于a=a+3
x*=y+8等价于x=x*(y+8)
x%=3等价于x=x%3
赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子
形式为:变量 赋值运算符 表达式
只能是左变量,右表达式
赋值表达式和赋值语句
赋值表达式:a=b
赋值语句:a=b;
变量赋初值
如:
int a=3;
float f=3.56;
char c=‘a’;
int a,b,c=5;
int a=3,b=3,c=3;
3.5数据的输入输出
3.5.1输入输出举例
【例3.5】
求ax*x+bx+c=0方程的根。a,b,c由键盘输入,设b*b-4ac>0.
编写程序:
#include<stdio.h>
#include<math.h>//程序中要调用求平方根函数sqrt
int main ( )
{
double a,b,c,disc,x1,x2,p,q;//disc用来存放判别式(b*b-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;
}
运行结果
1 3 2
x1=-1.00
x2=-2.00
【注意】
在输入数据时,1,3,2这3个数之间用空格分隔,最后按回车键
【说明】
用scanf函数输入a,b,c。&地址符
双撇号内用%lf格式声明,表示输入的是双精度型实数
%7.2f表示在输出x1,x2时,指定数据占七列,其中小数占两列。
3.5.2有关数据输入输出的概念
要在程序文件的开头用预处理指令#include把有关头文件放在本程序中。
#include<stdio.h>&#include"stdio.h"
3.5.3用printf函数输出数据
printf函数的一般格式
printf(格式控制,输出表列)
printf(“%d,%c\n”,i,c)
格式字符
d格式符:用来输出一个有符号的十进制整数
%5d表示输出数据占5列,输出的数据显示在此5列区域的右侧
如:printf(“%5d\n%5d\n”,12,-345);
输出结果为
12(12前三个空格)
-345(-345前面有一个空格)
c格式符:用来输出一个字符
如:short a=121;
printf(“%c”,a)
输出字符为y
s格式符:用来输出一个字符串
如:printf(“%s”,“CHINA”);
执行此函数时在显示屏上输出字符串“CHINA”(不包括双引号!)
f格式符:
用来输出实数(包括单,双精度,长双精度),以小数形式输出,有几种用法
基本型,用%f
实数中的整数部分全部输出,小数部分输出6位(不够后边补零)。
【例3.6】
用%f输出实数,只能得到六位小数
#include<stdio.h>
int main ( )
{
double a=1.0;
printf("%f\n",a/3);
return 0;
}
运行结果:
0.333333
指定数据宽度和小数位数
如:例3.6中:printf(“%20.15f\n”,a/3);
输出结果为: 0.333333333333333(0前有三个空格)
【说明】20:输出的数据占20列,15:含15位小数
【注意】float型数据的存储单元只能保证六位有效数字,double型数据能保证15位有效数字
【例3.7】
float型数据的有效位数
#include<stdio.h>
int main ( )
{
float a;
a=10000/3.0;
printf("%f\n",a);
return 0;
}
运行结果:
3333.333252
【注意】理论值为3333.3333333……但由于float只能保证6~7位有效数字,因此程序虽然输出了六位小数,但从左面数第七位数字以后的数字并不保证是绝对正确。
输出的数据向左对齐,用%-m.nf
在m.n的前面加一个负号,其作用与%m.n形式作用基本相同,但当数据长度不超过m时,数据向左靠,右端补空格。如:
第一次输出a时输出结果向左端考,右端空5列,第二次输出a时输出结果向右端靠,左端空5列;
e格式符:
指定以指数形式输出
其他格式符
i格式符:按十进制整型数据的实际长度输出
o格式符:以八进制整数形式输出
x格式符:以十六进制数形式输出整数
u格式符:用来输出无符号型数据(unsigned),以十进制整数形式输出
g格式符:用来输出浮点数
【说明】%6d:最少占六位,可以超出,但不够就补空格
3.5.4用scanf函数输入数据
scanf函数的一般形式
scanf(格式控制,地址表列)
地址表列是若干个地址组成的表列,可以是变量的地址,或字符串的首地址。
scanf函数中的格式声明
与printf函数中的格式声明相似
%d整数 %f小数 %c字符 %s字符串
使用scanf函数时注意事项
scanf函数中的格式控制后面应当是变量地址,而不是变量名!如:
scanf(“%f%f%f”,&a,&b,&c);
如果在格式控制字符串中除了格式声明以外还有其他字符,则在输入数据时对应的位置上应输入与这些字符相同的字符。如果有
scanf(“a=%f,b=%f,c=%f”,&a,&b,&c);
在输入数据时,应在对应的位置上输入同样的字符。即输入
a=1,b=3,c=2
如果输入
1 3 2
就错了,因为系统会把它和scanf函数中的格式字符串逐个字符对照检查的,只是在%f的位置上代以一个浮点数。
【注意】在“a=1”的后面输入一个逗号,它与scanf函数中的“格式控制”中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的。
在用“%c”格式声明输入字符时,空格字符和转义字符中的字符都作为有效字符输入,例如:
scanf(“%c%c%c”,&c1,&c2,&c3);
在执行此函数时应该连续输入3个字符,中间不要有空格。
如abc而不是a b c(系统会把第二个字符‘ ’,送给c2)
3.5.5字符输入输出函数
用putchar函数输出一个字符
【例3.8】
先后输出BOY三个字符
编写程序:
#include<stdio.h>
int main ( )
{
char a='B’,b='O',c='Y';
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
return 0;
}
运行结果
BOY
【思考】
#include<stdio.h>
int main ( )
{
int a=66,b=79,c=89;
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
return 0;
}
运行结果:BOY
【说明】
putchar(c)中的c可以是字符常量,整型常量,字符变量或整型变量(其值在ASCII代码范围内)
可以用putchar函数输出转义字符,例如
putchar('\'')(括号中的\'是转义字符,代表单撇号,输出单撇号字符;
用getchar函数输入一个字符
【例3.9】
从键盘输入BOY三个字符,然后把他们输出到屏幕。
编写程序:
#include<stdio.h>
int main ( )
{
char a,b,c;
a=getchar( );
b=getchar( );
c=getchar( );
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
return 0;
}
运行结果
BOY(连续输入BOY,再按空格)
BOY
【例3.9】可改写为
#include<stdio.h>
int main ( )
{
putchar(getchar( ));
putchar(getchar( ));
putchar(getchar( ));
putchar(‘\n’);
return 0;
}
运行结果
BOY
BOY
【例3.10】
改写例3.3程序,使之可以适用于任何大写字母,把它转化为小写字母,然后用putchar函数输出该小写字母。
【例3.3】
给定一个大写字母,要求用小写字母输出。
编写程序:
#include<stdio.h>
int main ( )
{
char c1,c2;
c1=getchar( );
c2=c1+32;
putchar(c2);
putchar('\n');
return 0;
}
运行结果:
B
b
除此之外,可用printf函数
#include<stdio.h>
int main ( )
{
char c1,c2;
c1=getchar( );
c2=c1+32;
printf("大写字母:%c\n小写字母:%c\n"c1,c2);
return 0;
}
运行结果:
N
大写字母:N
小写字母:n