2 顺序结构程序设计
(教材第三章和第四章)
学习方法:
课前 按照 授课计划 上指明的进度 预习
上课认真听讲,课件可下载作为笔记
课下 参照教材 理解 课件上所讲的内容和相关知识点
完成作业 &上机调试作业要求
编程题 (写作文 )
编程过程:
写算法 -->再编程 -->上机调试
要求:上交,c文件,程序功能和重点语句加注释
读程序题 (阅读理解 )
完成过程:
本人读懂程序,给出结果?上机对比验证
要求:以注释形式写出程序的功能和输出结果例 1:读程序
#include <stdio.h>
int main()
{
int a = 135,b = 246,temp;
temp = a;
a = b;
b = temp;
printf(“a=%d,b=%d”,a,b);
return (0);
}
/*程序功能:交换两个变量的值 */
/*语义:在 内存 申请三个空间,用于存储 整型变量 a,b,temp的值,同时为 a,b赋初值 135,246*/
例 1中涉及的知识点
数据有 常量 与 变量 之分
不同的变量要用不同的 变量名 加以区分。另外,
要存储变量,就必须提前 申请内存空间,由于不同的数据类型的编码方式和所占空间不同,所以在申请时要提供变量的 数据类型。
在 C语言中,有三种基本数据类型,整数类型
(int),实数类型 (float和 double),字符类型
(char),分别用对应的词表示。
= 称为 赋值运算符,不是等号,即将右边的值赋给左边的变量。
例 1中涉及的知识点
int a = 135,b = 246,temp;
变量声明(变量定义)语句
该语句的 语义 是:向计算机系统申请三个 int类型的内存空间
(每个空间占 4个字节 ),它们分别被命名为 a,b,temp(变量名 ),用来存储相应变量的值,
这三个内存空间分别都对应不同的内存地址。我们根据变量名使用变量,计算机系统则根据内存地址对数据进行读写。
内存地址
0FFF0980
0FFF0981
0FFF0982
0FFF0983
0FFF0990
0FFF0991
0FFF0992
0FFF0993
0FFF0998
0FFF0999
0FFF099A
0FFF099B
135的
32位补码变量 a
变量 b
变量
temp
……
……
……
246的
32位补码例 2:求圆的周长和面积编写 C程序计算圆的周长和面积,并输出。
问题的分析
用户:请给我计算一下圆的周长和面积。
计算机:请问半径是多少?
用户,5.3。
计算机:圆的周长 =2*π*5.3=33.3;
圆的面积 =π*5.3*5.3=88.25
算法
1,要求用户输入半径
2,计算周长和面积
3,输出计算结果要求用户输入半径计算周长和面积输出计算结果开始结束请同学课下复习教材第 2章中的“怎样表示一个算法”
1、要求用户输入半径 -分析
输入的数据存放在哪?
内存
本例中需要申请几个什么类型的空间呢?
本例中需要申请三个空间,分别存储半径、周长和面积。
他们均应该是实数类型 float。
如何申请呢?
float r,cir,area;
该语句的含义是?
内存地址
0FFF0980
0FFF0981
0FFF0982
0FFF0983
0FFF0990
0FFF0991
0FFF0992
0FFF0993
0FFF0998
0FFF0999
0FFF099A
0FFF099B
变量
r
变量
cir
变量
area
……
……
……
float r,cir,area;
语义:向计算机系统申请三个
float类型 的内存空间 (每个空间占 4个字节 ),它们分别被命名为 r,cir,area(变量名 ),用来存储相应变量的 浮点数表示,这三个内存空间分别都对应不同的内存地址 。我们根据变量名使用变量,计算机系统则根据内存地址对数据进行读写。
1、要求用户输入半径 -分析
如何实现输入呢?
用 库函数 scanf()
具体格式为,scanf(“%f”,&r);
其语义为:从键盘上输入一个实数,存入变量
r所对应的内存地址。
使用 scanf()函数,前边要加上 #include<stdio.h>
,”内表示输入数据的格式,一般只有 格式说明符 。
&是 地址运算符 。
输入多个数据时,应提供多个 %开头的 格式说明符 和多个变量的地址(个数与类型应一致)。
2、计算周长和面积-分析
cir=2*3.14159*r;
area=3.14159*r*r;
上述两个 算术表达式 分别计算周长和面积;
C语言的算术表达式与数学的算术表达式既相似,
又有很大区别,例如:无 π.
常用的 算术运算符 分别表示为 +,-,*,/
2和 3.14159都是常量,但类型不同,前者为 整型常量,后者为 double类型的常量
3、输出结果
printf("area = %f\n",area);
printf("circumference = %f\n",cir);

printf("area = %f\ncircumference = %f\n ",area,cir);
printf()中的多个参数之间用 逗号 分隔;
“” 内表示输入数据的格式,其中有三种类型的符号:
直接按原样输出的 普通字符,如,area =
以 \开头的 转义字符,如,\n表示回车
格式说明符,如 %d,%c,%f等,格式说明符的个数应该与变量的个数和类型一致
注意,()里的两个 area含义不同。
问题解决:
#include <stdio.h>
/*程序功能:根据输入的半径,输出圆的面积和周长 */
void main()
{
float r,area,cir; /* 定义实数变量 */
scanf(“%f”,&r); /* 从键盘输入变量 r的值 */
cir =2 *3.14* r; /* 计算周长 */
area= 3.14* r * r; /* 计算面积 */
printf("area = %f\ncircumference = %f\n ",area,cir);
/* 输出面积和周长 */
}
更完善的程序:
#include <stdio.h>
#define PI 3.14159
/*程序功能:根据输入的半径,输出圆的面积和周长 */
void main()
{
float r,area,cir; /* 定义实数变量 */
printf(“Please input r:”);
scanf(“%f”,&r); /* 从键盘输入变量 r的值 */
cir =2 *PI* r; /* 计算周长 */
area= PI * r * r; /* 计算面积 */
printf("area = %f\ncircumference = %f\n ",area,cir);
/* 输出面积和周长 */
}
另一种 编译预处理命令,称为 宏替换,或 宏定义 )
定义一个 符号常量,则在编译前,将下边所有,” 以外的 PI替换 成
3.14159
习惯:常量名大写显示提示信息,实现更好的人机交互练习:求两个整数的商与余数
算法:
输入两个整数 a,b
计算整数的 quotient,remains
输出结果 quotient,remains
#include <stdio.h>
void main()
{
int a,b; /* 定义两个整型变量 */
int quotient,remains; /* 定义两个变量存放结果 */
printf(“please input two integer:”);
scanf(“%d%d”,&a,&b);
quotient=a/b;/*求商 */
remains=a%b; /*求余数 */
printf(“%d/%d=%d…%d \n",a,b,quotient,remains);
}
输入多个变量时,要用多个格式说明符,格式说明符与变量的类型与个数应一致
多个格式说明符中间用什么符号分隔,
输入数据时就用什么符号分隔你要输入的数据
如果没有分隔符,则默认可以使用 回车、空格或 Tab键分隔数据。
整数运算的结果仍为整数
%是 求模运算符,只能用于 整数 之间的运算,其结果的符号永远与被除数相同
VC中的调试技巧
-如何查找逻辑错误?
观察程序的执行顺序和变量的变化:
编译并连接后,点击工具栏上的“小手”工具,设置断点 。选择 build->debug->go,进入调试状态,此时,
程序运行停止在设置断点的那一行 (可见行的最左端有一黄色箭头,表明程序运行的当前位置 ),与此同时,
可以看到下边的窗口显示当前状态涉及到的变量的值。
点击 build->step over,则程序执行当前这条语句,下边变量的值可能会随程序的运行而改变,多次单击
step over,则程序按顺序 单步执行,可以观察整个程序的执行顺序和变量的变化过程,如果想中途退出,
请选择 build->debug->stop debugging 。
二者结合可以帮你定位逻辑错误:当执行完一条语句后,当前变量的值并没有得到正确结果,则说明刚才那条语句的语义导致了错误。改正后,重新调试。
例 3:大小写转换
(P87例 4.11)
如何转换?
将小写字母的 ASCII码减 32即得大写字母的
ASCII码。
算法:
输入小写字母 lower
计算其对应的大写字母 upper
输出 upper.
输入计算输出开始结束
#include <stdio.h>
void main()
{
char lower,upper;
printf(“please input an lowercase:”);
scanf(“%c”,&lower);
upper=lower-32;
/* char与 int数据间可进行算术运算 */
printf(“lower:%c?upper:%c\n",lower,upper);
}
i f( l,%d r:%d\n",l er,er);
数据类型的 自动转换 和 强制转换
当表达式中的数据类型不一致时
数据类型的 自动转换
方向,char?int?float?double
数据类型的 强制转换
在表达式前加 (数据类型 )
例,s=(float)1/2
s=(float)(1/2) 的结果呢?
赋值时也存在类型的 强制转换 的问题
例,upper=lower-32; int a=4.5;
当赋值号的右边的数据类型的数据范围大于左边数据类型的范围时,会有警告-,可能会丢失数据”
关键是:
不要让这种转换导致计算上的错误!
另外两个库函数:
字符输入 /输出函数
#include <stdio.h>
void main()
{
char lower,upper;
printf(“please input an lowercase:”);
lower=getchar(); /*从键盘上输入一个字符,
并赋值给 lower */
upper=lower-32;
printf(“after transform,it is,);
putchar(upper); /*将 upper输出 */
}
一般用法:字符型变量 =getchar( );
含义是从键盘上敲入一个字符,然后把它赋给字符型变量。
另一种用法,getchar();功能相当于
,按任意健继续,,一般用于程序最后,
以便查看前边的结果。
格式,putchar( 字符 );
功能,向终端输出一个字符。
参数可以是字符型常 (变 )量或整型常
(变 )量。例如,putchar(c );
putchar(‘a’); putchar( ‘\n’ );
putchar(97);
练习:根据三边长求三角形的面积计算公式为:
c ) / 2b(ascsbsassa r e a 其中,))()((
输入计算输出开始结束练习题答案
#include <stdio.h>
#include <math.h>
/*要用数据函数 sqrt,此处必须包含与之相对应的头文件 */
/*程序功能:根据三边长求三角形的面积 */
void main()
{
float a,b,c,s,area; /* 定义实数变量 */
printf(“Please input a,b,c:”);
scanf(“%f,%f,%f”,&a,& b,& c); /* 从键盘输入变量的值
*/
s=(a+b+c)/2;
area= sqrt(s*(s-a)*(s-b)*(s-c)); /* 计算面积 */
printf("area = %f\n",area);/* 输出面积 */
}
复杂的数学计算如何实现?
直接调用 C语言的 库函数 即可。
别忘了加 #include <math.h>
请记住几个常用的函数:
函数名 功 能 函数名 功 能
sqrt(x) 计算 x的平方根,x应大于等于 0 exp(x) 计算 ex的值
fabs(x) 计算 x的绝对值 pow(x,y) 计算 xy的值
log(x) 计算 lnx的值 sin(x) 计算 sinx的值,x为弧度值
log10(x) 计算 lgx的值 cos(x) 计算 cosx的值,x为弧度值本讲要求
要求 学会与例题难度相仿的简单程序设计
要求读懂简单程序的功能,并能够正确读出程序的输出结果
掌握涉及到的语法知识本讲中涉及的语法总汇
(复习时可参考教材第三章)
基本数据类型,int float double char
常量与变量的概念,三种基本类型常量和符号常量的写法,变量的定义(声明)及赋值。
关键字与标识符的概念,标识符的命名规则
运算符与表达式
几个常用输入 /输出函数和数学函数的用法涉及到的语法知识
-数据类型数据类型基本类型构造类型指针类型空类型整型实型 ( 浮点型 )
字符型枚举类型数组类型结构体类型共用体类型单精度实型双精度实型基本整型长整型短整型无符号整型基本数据类型
int
整数,VC中占 4个字节。 TC中是 2个字节
float
单精度浮点数,一般是 4个字节长
double
双精度浮点数,一般是 8个字节长
char
字符,一般是 1个字节长
用来表示 256个 ASCII字符,或者 0~255的整数注意:字符类型与整数类型在一定范围内可互相转换。即将字符的 ASCII码等同于一个整数。
数据类型修饰符
short
short int的简写,短整数,一般 2个字节长。可简写为 short
long
long int,长整数,一般是 4个字节长。通常简写为 long
long double,长双精度(高精度)浮点数,一般是 10个字节长。
signed
用来修饰 char,int,short和 long,说明他们是 有符号 的整数(正整数,0和负整数)。一般缺省都是有符号的,所以这个修饰符通常省略
unsigned
用来修饰 char,int,short和 long,说明他们是 无符号 的整数(正整数和 0)
请大家课下亲自计算一下每种数据类型能够表达的数据范围 !!!
并思考或实验:若计算的数据超出范围会怎样?可参考例 3.3和例 3.4
C语言承认的基本数据类型
char
short int
int
long int
signed(或 unsigned) +
float
double
long double
数据类型与内存空间
不同的编译器可能有不同的结果
用 sizeof()求得,不要靠经验。
#include <stdio.h>
main()
{
printf("Data type Number of bytes\n");
printf("------------ ---------------------\n");
printf("char %d\n",sizeof(char));
printf("int %d\n",sizeof(int));
printf("short int %d\n",sizeof(short));
printf("long int %d\n",sizeof(long));
printf("float %d\n",sizeof(float));
printf("double %d\n",sizeof(double));
}
sizeof(3)和 sizeof(3.0)的结果又是什么呢?
分别是 int和 double类型的所占内存的字节数,在 VC上是
4和 8,
涉及到的语法知识
-变量
使用变量的基本原则
变量必须先定义,后使用,为什么?
所有变量必须在第一条可执行语句前定义
变量的类型要根据实际情况 (数据类型及范围 )设定,
否则导致 类型溢出 和 舍入误差 。
一条声明语句可声明多个同类型的变量
声明变量,是初始化变量的最好时机
不被初始化的变量,其值为危险的随机数
例:
unsigned int x,y,sum = 0;
char esc = 'a';
float eps = 1.5;
类型溢出
short a=32767+1;
printf(“%d”,a);
舍入误差
float b=0.123456789;
printf(“%f”,b);
涉及到的语法知识
-常数 与 常量十进制,以非 0数字开头,如,123,-9,0
八进制,以 0数字开头,如,0123,011,067
十六进制,以 0x数字开头,如,0x123,0xff
整型常量十进制,必须带小数点,如,123.0,.9,0.0,-10.
指数形式,E或 e前面必须有数值,后边必须是整数,如,1.23E3,.9e-2,5e2,-8E-4
实型常量普通字符,如,’ a’,’2’,’H’,’&’,’#’,表示字符的 ASCII码值转义字符,如,’ \n’,’\167’,’\x1f’,’\\’,’\’’
字符常量常量字符串常量,用 双引号 引起来,系统最后自动加 ’ \0’ 。 如
:,Hello”,”a”
枚举常量 ( 枚举元素 )
思考,‘ 3’ 与
3有何不同,
,a”与 ‘ a’有何不同?
还有一种常量称为 符号常量
例:
#define PI 3.14159
格式:
#define 符号常量名 常量涉及到的语法知识
-标识符 与 关键字
标识符
标识符是变量,函数,标号等的名字或标记
两类:
系统定义的标识符,例如,printf,scanf,main等
用户自己定义的,自己定义标识符时要考虑如下问题:
只能用字母,数字和下划线,并且第一个字母只能是字母或下划线;
不能与 关键字 (系统保留的特殊词汇 )相同 ;
区分大小写,即 R和 r是两个不同变量。
为便于阅读和理解,对象的取名尽可能直观,最好不要用系统定义的标识符,更不能用 C语言的关键字。
关键字
C语言中有特殊含义的词 (在 VC中变蓝的词 ),共 32个
我们已经学的有,short long int float double char
void include
涉及到的语法知识
-输入输出
C语言中的输入输出由库函数实现
printf()和 scanf(),getchar()和 putchar()
的更多用法请自学,可参考教材 4.4和 4.5
节 。 最好的自学方法是 进行实验,观察各种表示的输入、输出结果运算符的 优先级 和 结合性
我们学过的运算符有:
() & sizeof() * / % + - =
单目 运算符 双目 运算符
优先级,出现多种运算符时谁先运算
()高于 & sizeof(),然后是 * / %,+ -次之,最后是 =
结合性,出现多个同级运算符时从哪边开始运算
一般从左向右 (例如:算术运算符 ),也有一些从右向左
(例如:赋值运算符 a=b=3;)。还有一些运算符,用到时再讲。
作业 11、习题 4.9:
输入一个华氏温度 F,按照公式 C=5/9(F-32),
计算摄氏温度,输入输出要有提示,结果取 2
位小数。
2、上机验证每个数据类型占几个字节。#include <stdio.h>
main()
{
printf("Data type Number of bytes\n");
printf("------------ ---------------------\n");
printf("char %d\n",sizeof(char));
printf("int %d\n",sizeof(int));
printf("short int %d\n",sizeof(short));
printf("long int %d\n",sizeof(long));
printf("float %d\n",sizeof(float));
printf("double %d\n",sizeof(double));
}
作业 2:
1、假设存款的利率 rate为 2.75%,根据输入的存款本金 capital和存期 year,计算本息之和 money。 即
money=capital*(1+rate)year
完成作业步骤:先写算法,再写程序,人工检查一遍再上机调试,应该多输出几种数据测试程序,最后按格式上交。
选做,计算 int,float,double,char四种数据类型所能表示的数据范围。
提示:用 sizeof()和 pow()等已知知识。
作业 1讲评
#include<stdio.h>
void main()/*常见错误如下 */
{
int F;
float C;
C=(float)(5/(9*(F-32)));
printf("Please intput F:\n");
scanf("%d\n",F);
printf("%d\n",C);
}
常见错误:
语句顺序错。
强制转换错。
数学公式错
输入输出的格式错。
作业 1正确答案
#include<stdio.h>
void main()
{
int F;
float C;
printf("Please intput F:\n");
scanf("%f\n",&F);
C=(float) 5/9*(F-32);/*或 C=5.0/9*(F-32); */
printf("%f\n",C);
}
作业 2讲评 -求利息
#include<stdio.h>
#include<math.h>
#define RATE 0.0275
void main()
{
double year,capital,money;
printf("please input year,capital:");
scanf ("%lf,%lf",&year,&capital);
money=capital*pow(1+RATE,year);
printf("money=%lf",money);
}/*部分同学在红色标记的地方出错,请自己对照 */
#include <math.h>
#include <stdio.h>
void main()
{
int i;
long double term=1,fraction=1;
long double min,max; /*定义两个变量分别最小值、最大值 */
min=-pow(2,8* sizeof(char));
max=pow(2,8* sizeof(char))-1;
printf("char所能表示的范围,%.0lf~%.0lf\n",min,max);
min=-pow(2,8* sizeof(short));
max=pow(2,8* sizeof(short))-1;
printf("short所能表示的范围,%.0lf~%.0lf\n",min,max);
min=-pow(2,8* sizeof(int));
max=pow(2,8* sizeof(int))-1;
printf("int所能表示的范围,%.0lf~%.0lf\n",min,max);
选做题答案
for(i=1;i<=23;i++)/*float共 32位,用 23位存尾数 */
{
term=term/2;
fraction+=term;
} /*求 float类型所表达的尾部部分的值,fraction=2^-1+2^-2+...+2^-23*/
min=-fraction*pow(2,pow(2,7)-1);/*用 7位存阶码 */
max=fraction*pow(2,pow(2,7)-1);
printf("float所能表示的范围,%e~%e\n",min,max);
for(i=1,term=1,fraction=1; i<=52;i++)/*double共 64位,用 52位存尾数 */
{
term=term/2;
fraction+=term;
} /*求 double类型所表达的尾部部分的值,,fraction=2^-1+2^-2+...+2^-52*/
min=-fraction*pow(2,pow(2,10)-1);/*用 10位存阶码 */
max=fraction*pow(2,pow(2,10)-1);
printf("double所能表示的范围,%e~%e\n",min,max);
} /*main结束 */