2024年2月4日发(作者:)
第1章 C语言程序概述
本章的学习目的是掌握C语言程序的基本结构和上机操作过程,使读者对C语言程序有一个概貌的了解,为后面的学习打下基础。
1.1 C语言程序的基本结构
1.1.1 实例
下面简要介绍几个简单的程序例子,说明C语言的组成特点。
【例1.1】在屏幕上输出一串字符:This is a c program
#include
void main()
{
printf (“This is a c program”);
}
程序输出结果:
This is a c program
说明:
1. main():主函数。C语言程序由函数构成,但有且只有一个主函数。
2. { }:C语言程序必须至少有一对{},代表程序的开始、结束,里面内容称之为函数体。
3. Printf():标准输出函数,将程序运行结果显示到输出设备上(显示器)。
4. #include
【例1.2】已知a=10,b=30,求两数之和sum。
#include
void main() /*主函数,程序从此开始运行*/
{ /*函数体开始*/
int a,b,sum; /*定义语句*/
a=10; /*赋值语句*/
b=30; /*赋值语句*/
sum=a+b; /*赋值语句*/
printf("sum=%dn",sum); /*输出语句*/
} /*函数体结束*/
·1·
程序输出结果:
sum=30
说明:
1. int a,b,sum;语句:说明a、b和sum为三个整型变量,可以通过赋值操作改变变量的值。
2. a=10;语句:将整数10送到a的存储单元中。sum=a+b;语句:先取a和b两个存储单元中的数据在运算器中相加,然后将结果保存在sum变量单元中。
3. printf("sum=%dn",sum);语句:该函数的参数包括两部分,sum是要输出的数据,"%d"是数据输出的格式控制符字符串,控制符%d的作用是按整数格式输出sum的值。“sum=”是输出数据的提示说明,原样输出。
4. “/*......*/”:注释,目的是为了增加程序的可读性。注释可以插入到程序中任何位置,对程序的执行没有任何影响,编译时将被过滤掉。
【例1.3】从键盘输入两个整数,输出最大值。
#include
int max(int x,int y) /*定义函数*/
{ int z;
if(x>y)
z=x;
else
z=y;
return z; /* 返回函数值*/
}
void main()
{
int a,b,c;
printf(“输入两个整数a b:”);
scanf(“%d %d”,&a,&b); /*标准输入函数*/
c=max(a,b); /* 调用max()函数*/
printf("%d %d中的最大值为:%dn",a,b,c); /* 输出结果 */
}
程序运行结果:
输入两个整数a b:15 17
15 17中的最大值为:17
说明:
1. 本程序由两个函数组成:主函数main()和自定义函数max()。
2. 程序从main()函数开始执行;printf()函数,输出显示一个字符串,具有提示信息的作用;scanf()函数,从键盘的输入数据,分别给变量a和变量b赋值,使得变量a和b从键盘上获取值;执行c=max(a,b);时程序转移到max()函数,遇到return语句返回主函数继续执行。
·2·
1.1.2 c语言程序的基本结构
以上实例可以看出C语言程序的基本结构:
1. C语言程序是由函数构成的,函数是C程序的基本单位。
2. 一个函数由两部分组成:
函数头:即函数的第一行;
函数体:即函数头下面,用大括弧{ …}扩起来的部分。
3. 函数体由语句构成,语句以分号;结束。
4. 一个c程序可以由一个或多各函数组成,但必须有一个且只能有一个main()函数,主函数。一个C程序总是从main函数开始执行的,而不论main函数在整个程序中的位置。
5. 每行通常写一条语句。有些短语句也可以一行写多条;长语句也可以一条写成多行。
6. 在程序中尽量使用注释信息,增强程序的可读性。注释信息是用注释符标识的,注释符开头用/*,结束用*/,其间的字符为注释信息。
1.2 c语言程序的运行
1.2.1 c语言程序运行过程
由高级语言编写的程序称为源程序,计算机不能直接识别和执行,必须由语言处理程序将其翻译成由0和1构成的二进制指令代码。按照c语言规则编写的程序,要想得到最终结果,要经过以下几个步骤:
1.编辑源程序
编辑是指使用文本编辑工具软件输入和修改C语言源程序,最后以文本文件的形式存放在磁盘上,文件名由用户自己选定,扩展名一般为“.c”。编辑器可以是任何一种文本编辑软件,比如Turbo C和VC++专用编辑系统,也可以是写字板、记事本等字处理软件。
2.编译源程序
编译是将C源程序翻译成二进制目标程序。编译是由编译程序来完成,编译程序对源程序自动进行句法和语法检查,当发现错误时,就将错误的类型和程序中出错的位置显示出来,以帮助用户修改源程序。如果未发现句法和语法错误,就自动形成目标程序,其扩展名为“.obj”。
3.连接程序
编译后的目标文件尽管是二进制代码文件,但计算机还不能直接执行该程序,必须使用C语言处理系统提供的连接程序,生成扩展名为EXE的可执行文件。程序中各函数间的调用结合是由连接程序完成的,系统提供的输出函数和用户定义的函数都要进行连接。如果连接过程中出现错误信息,也必须回到第一步重新修改源程序,并重新开始编译和连接,直到生成可执行文件。
4.运行程序
·3·
运行程序,并检查运行结果。如果是算法错误,只能回到第一步修改源程序,再重新编译连接和运行,直到得到正确的结果。
1.2.2 c语言开发环境VC++6.0简介
1.启动VC++
单击[开始]菜单,选择[程序][Microsoft Visual Stddio 6.0][Microsoft Visual
C++6.0]。
2.创建C++程序环境
① 在“文件”菜单下选择“新建(New)”命令,打开“新建”对话框,如图1-1所示。
图1.1 新建项目界面
② 在“工程(Projects)”选项卡中指定下列选项:
z 选中Projects Win32 Console Application工程类型。
z 在“工程(Project Name)”栏中输入工程名称。如输入:Hello
z 单击“位置(Location)”栏后的z 选中
z 在,可指定应用程序存放的位置(或默认)
(Create New Workspace)(默认)
(Platforms)中,选中 Win32(默认)
z 设置完成后,单击“确定(OK)”按钮,打开AppWizard对话框。
③ 在应用向导(AppWizard)对话框中,选中An empty project。然会单击“完成(finish)”按钮,显示“新建工程信息”(New Project Information)对话框,内容如下:
Empty console application.
No files will be created or add to the project.
·4·
单击“确定(OK)”按钮。则系统自动创建了一个Hello类。
④ 源程序编写。点击“文件”菜单中“新建”命令,则弹出如图1-2所示的“新建”窗口。
图1.2 新建文件界面
在弹出的“新建(New)”窗口的“文件(File)”对话框中,选中“C++ Source File”,在“文件(File Name)”栏中输入新建的C++源文件名,如Hello,确认添加工程检查框被选中(默认),然后单击“确定(finish)”按钮,建立一个空的文件。
3.编辑源程序
在图1-3所示的程序编辑窗口中输入程序,编辑好的程序称为源程序,C++源程序的扩展名为.cpp。
(程序编辑窗口)
(编译信息输出窗口)
图1.3 程序编辑界面
4.程序编译
选择编译工具栏中的编译按钮5.连接程序
选择编译工具栏中的“构建”按钮编译和连接。
6.运行程序。
或选择编译工具栏中的“执行”按钮
·5·进行编译,编译信息显示在输出窗口中。如有错误,则必须经修改源程序再重新编译,否则无法进行下一步。
进行连接。如有错误,则必须修改源程序再重新。
1.3 实 训
实训1
【内容】上机操作
【目的】掌握运行C语言程序各个环节
【题目】运行例1.1、例1.2和例1.3
实训2
【内容】简单程序设计
【目的】编写C语言程序
【题目】参照例1.1,编写一个输出下面字符程序:
******************************
This is a C program!
******************************
实训3
【内容】简单程序设计
【目的】编写C语言程序
【题目】参照例1.2,编写程序计算s=a+b,x=a-b,y=a*b,z=a/b的值。
习 题
一、填空题:
1.C语言程序是由若干个___________组成,一个_________是由若干个_________组成。__________是C程序的基本单位。
2.C语言程序中函数是由若干条___________组成的,_______是组成函数的最小元素。
3.main()函数是C语言的________函数,它可以放置在程序的_________位置上,一个C程序中有且只能有_________个main()函数。程序总是从____________开始执行。
4.C语言程序的注释是以_________开头,以________结束的。注释对程序______不起任何作用。
5.C语言程序的扩展名是______,编译后生成的目标文件的扩展名是__________,连接后生成的是____________文件。
二、判断题:
1.C语言程序可以由多个文件组成,每个文件中都可以有一个main()函数。
2.C语言程序中对主函数main()放置的位置没有一定要求,放在文件头或文件尾或文件中间都可以。
3.C语言程序一行只能写一个语句。
·6·
4.C程序书写时要求每行必须以分号结束。
5.C语言可以不用编译就能被计算机识别执行。
·7·
第2章 数据的类型与基本操作
本章介绍的是用C语言编程必须掌握的一些基础知识,包括最基本的数据类型、常量和变量、算术运算符及算术表达式、赋值运算符和赋值表达式及自增自减运算等。
2.1 一个C程序实例
【例2.1】求矩形的面积。
【程序代码】
#include
void main()
{
int a,b;
float area;
a=2;
b=4;
area=a*b;
printf("%fn",area);
}
【运行结果】
8.000000
【程序分析】
1.该程序中用到的数据有a,b,area,2,4,对数据进行的运算有*(乘法运算)和=(赋值运算)。
2.计算机处理时,要完成以下工作:
⑴ 在内存中给矩形的两条边a,b和面积area开辟存储空间,存放它们的值。a,b,area被称作变量,到底应该留多大的空间来存放它们的值?
⑵ 数据2,4与a,b,area不同,它们是在编写程序时就给出了确定的值,在运算过程中不会改变,这样的数据叫常量。计算机又是如何处理常量?
以上的问题都涉及到C语言中数据的处理操作。
在C语言中,数据是程序中必要组成部分,是程序处理的对象。现实中的数据是有类型差异的,如姓名由一串字符组成、年龄是数字符号组成的整数、而身高包含整数和小数两部分。C语言为不同类型的数据使用了不同的格式存储,占用内存单元的字节数也不同。编写高级语言程序虽然不需要了解数据在内存中的具体存储方法,但一定要知道类型的意思,因为处理不同类型的数据所使用的语句命令是有区别的。
·8·
C语言提供如图2-1所示的数据类型。数据包含常量和变量,它们都属于上述某种数据类型,本章主要介绍基本数据类型,其它数据类型将在以后的章节中逐步介绍。
整型
基本数据类型 字符型 单精度实型
实型(浮点型)
数组类型 双精度实型
结构体类型
数据类型 构造类型 共用体类型
枚举型
指针类型
无值型
图2-1 C语言的数据类型
2.2 基本数据类型
基本数据类型是C语言内部预先定义的数据类型,也是实际中最常用的数据类型,如字符型、整型、单精度实型和双精度实型等。C语言处理系统内部为使用基本数据类型的操作提供了非常方便的使用环境。
2.2.1 整数类型
C语言提供了多种整数类型数据,以适应不同场合的需求,其中经常用到的是整形和长整型这两种数据类型。两种整型数据的区别在于采用不同位数的二进制编码表示,所以要占用不同的存储空间,表示不同的数值范围。
1515整型在计算机内存中占据2字节的存储空间,表示的数值范围为-2~2-1(-32768~32767),如图2-2所示。C语言约定其数据类型标识符为int。
87015
符号位
图2-2整型数据的存储格式
长整型在计算机内存中占据4字节的存储空间,表示的数值范围为-2~2-1(-2147483648~2147483647),如图2-3所示。C语言约定其数据类型标识符为long。
0
35
符号位
3131·9·
图2-3长整型数据的存储格式
在这里需要说明一下,不同的编译系统或计算机系统对整型数所占用的字节数有不同的规定。上面int型占2个字节指的是在一般的计算机系统。而在VC6.0中int型和long型都占4字节。
2.2.2 实数类型
实型数据又称实数或浮点数,指带有小数部分的非整数数值,比如像356.12和3.4×106这类数据。它们在计算机内部也是以二进制的形式存储和表示的,虽然在程序一个实数可以用小数形式表示,也可以用指数形式表示,但在内存中实数一律都是以指数形式来存放的。而且不论数值大小,即把一个实型数据分为小数和指数两个部分,其中小数部分的位数愈多,数的有效位愈多,数的精度就愈高,指数部分的位数愈多,数的表示范围就愈大。
C语言提供了两种表示实数的类型:单精度型和双精度型,类型标识符分别为float和double。在一般的计算机系统中,float型在计算机内存中占据4字节的存储空间,double型占据8个字节的存储空间。在VC6.0中单精度实数(float类型)的数值范围在-10~10之间,并提供7位有效数字位;绝对值小于10的数被处理成零值。双精度实数(double类型)的数值范围约在-10~10之间,并提供15~16位有效数字位,具体精确到多少位与机器有关;绝对值小于10-308308308-383838的数被处理成零值。因此,double类型的数据要比float型数据精确得多。
2.2.3 字符类型
字符型数据包括两种:单个字符和字符串,例如’a’是字符,而“abc”是字符串。在计算机中字符是以ASCII码的形式存储的,一个字符占1个字节的存储空间。如字符‘A’的ASCII码用二进制表示是01000001,对应的十进制数值为65,而字符‘B’的ASCII码用二进制数表示是01000010,对应的十进制数值为66。字符类型的标识符为char。
2.3 常量和变量
2.3.1 常量
在程序执行过程中,其值不能被改变的量称为常量,许多数学计算公式中都有数值常数,他们都属于常量。C语言提供的常量有:整型常量、实型常量、字符常量、字符串常量和符号常量。
1. 整型常量
整型常量即整数。有三种表示形式:
十进制整数:如正整数12、负整数-46和0。
·10·
八进制整数:以数字“0”开头,后面是由0到7八个数字组成的数字串。如010,024等分别表示十进制数8和20,负数的表示在前面加负号即可,如:-010。
十六进制整数:以数字“0”和字母“x”开头,后面是由数字0到9和字母A到F(字母不区分大小写)组成的。如0x12,0x1AB0等,分别表示十进制数18和6832。负数的表示在前面加负号即可。C语言不支持二进制形式。
2. 实型常量
实型常量即实数,有两种表示方法:
(1)小数形式。由数字和小数点组成,如0.25、-123.0、.5、-12.50。注意,当小数部分为零时小数点不能省略。
4-3(2)指数形式。如1.75e4表示1.75×10,-2.25e-3表示-2.25×10。其中,字母e可以用大写,字母e前面必须有数字,字母e后面必须是整数。
小数形式直观易读,指数形式更适合表示绝对值较大或更小的数值,如1.75e12和1.75e-6。无论程序中使用哪种表示形式,在计算机内部实型数据都是以浮点形式存储的。
3. 字符常量
字符常量是用一对单撇字符(西文中的单引号)括起来的一个字符,如’a'、'? '、'5'。需要说明一下,在C语言中一个字符只占一个字节的内存,一般情况下一个汉字占用两个字节存储空间,因此一个汉字不能按一个字符处理,应该按字符串处理,'汉'是非法的字符常数。
另外,在C语言中还有一些字符比较特殊,不可视或无法通过键盘输入,如换行符、回车符等,解决的办法是由一个以反斜杠 “”后跟规定字符构成,常用的转义字符的定义见表2-1。程序编译过程中转义字符是作为一个字符处理的,存储时占用1个字节。
表2-1 常用转义字符及其作用
字符形式
n
t
0
'
"
含义
换行,将当前位置移到下一行开头
水平制表(跳到下一个tab位置)
空字符
反斜杠字符
单引号字符(撇号)
双引号字符
由于字符常量在计算机中是以ASCII码形式存储的,因此它可以参与各种运算。例如:
‘B’-‘A’ 字符B的ASCII码值66减去字符A的ASCII码值65
‘A’+1 字符A的ASCII码值65加上1等于字符B的ASCII值
‘b’-32 字符b的ASCII码值98减去32等于66,是字符B的ASCII码值,用于大小写字母的转换
‘9’-‘0’ 字符9的ASCII码值57减去字符0的ASCII码值48等于数值9,需要分清整数9和字符9的区别
‘c’<‘d’ 比较两个字符的ASCII码值
4. 字符串常量
字符串常量简称字符串,是用一对双撇号字符(西文双引号)括起来的一串字符,字符
·11·
的个数称为字符串的长度。如"This is a Computer"、"a"、"C程序"都是字符串常量。在字符串结尾,计算机自动加上字符’0’,表示该字符串的结束。因此,字符串常量的存储单元要比实际的字符串的个数多一个。如”a”占两个字节;"This is a Computer"字符数为18,但占19个字节;字符个数为0的空串””,实际上也存了一个字符’0’。由于字符’0’的ASCII值为0,因此可作为检查字符串是否结束的标志。因此尽管’a’与"a"都含有一个字符,但在C程序中单撇号与双撇号不能混用,它们具有不同的含义。
5. 符号常量
在C语言程序中,可对常量进行命名,即用符号代替常量。该符号叫符号常量。符号常量一般用大写字母表示,以便与其它标识相区别。符号常量要先定义后使用,定义的方法有两种。
1.使用编译预处理命令define
#define NUM 0
#define PI 3.14159
2.使用常量说明符const
const float pi=3.14159
其中一个#define命令只能定义一个符号常量,且用一行书写,不用分号结尾。符号常量一旦定义,就可在程序中代替常量使用,增强了程序的可读性和程序的可维护性。
2.3.2 变量
变量是指在程序运行过程中其值可以改变的量。程序中用到的所有变量都必须有一个名字作为标识,在内存中占据一定的存储单元,在该存储单元中存放变量的值。变量具有保持值的性质,但是当给变量赋新值时,新值会取代旧值,这就是变量的值发生变化的原因。
1. 变量的定义
C语言的基本变量类型有整型变量、实型变量和字符型变量。在程序中使用变量必须先定义,定义一个变量就是要确定其名字(标识符)与类型,变量的类型决定了存储数据的格式与占用内存字节大小。变量的名字由用户定义,它必须符合标识符的命名规则且变量名区分大小写。变量定义后通过变量名字读写变量地址中的数据。
简单变量定义的方法是在类型标识符后跟一个变量或变量表,变量之间用逗号隔开,然后以分号结尾。下面是一些定义变量的例子:
int a,b,c; /*定义了3个整型变量,中间用逗号隔开*/
float x; /*定义了单精度实型变量x*/
double c; /*定义了双精度实型变量c*/
char ch; /*定义了字符型变量ch*/
2. 变量的初始化
上述的变量定义只是指定了变量名字和数据类型,并没有给它们赋初值,给变量赋初值的过程称为变量的初始化。例如:
int a=625,b=-325;/*定义a和两个整型变量,初始值分别为625和-325*/
float x=3.15; /*定义实型变量x,初始值为3.15*/
·12·
int x,y=0; /*只给一个变量y设置初始值*/
int u=v=8; /*给u,v设置同一个初始值8*/
char ch=’a’; /*定义了字符型变量ch,其值为字符a*/
值得注意的是,没有赋初值的变量并不意味着该变量中没有数值,而只表明该变量中没有确定的值,于是引用这样的变量就可能产生莫名其妙的结果,有可能会导致运算错误。
3. 字符型数据与整型数据的关系
字符型变量用来存放单个字符(包括转义字符),字符变量的类型说明符为char。
字符变量在内存中占一个字节,存放的是该字符的ASCII码整型值。存放字符'a'的内存地址中,实际存放的是其对应的ASCII码97,如果以二进制表示,就是01100001。可以看出,字符数据在内存中的存储形式与整数的存储形式相同。因此,在C语言中字符型数据和整型数据之间可以通用,一个字符型数据可以按整型数据的方法来处理。按整型数据处理时,直接将ASCII码整数值进行算术运算。
有关字符的ASCII值,不必一一记注它们,但应该了解一些规律性的东西。标准ASCII码有128个字符,其中码值0~31为控制字符(或不可显示字符),它们有特殊的用途,如回车换行,文件结束标志,字符串结束标志等。32为空格符编码,被认为是可显示字符中码值最小的字符。10个阿拉伯数字0~9的码值是连续的。26个英文字母分为大小写,26个大写字母A~Z是连续的,26个小写字母a~z是连续的。上面这些字符的ASCII码值大小顺序如下:
空格<数字<大写字母<小写字母
由于大写字母与小写字母之间有6个其它字符,所以字母大小转换要通过±32来实现。
C语言中没有专门的字符串变量,在数组和指针章节中介绍字符串的处理方法。
2.4 运算符和表达式
C语言的运算符极其丰富,正是因为这些丰富多样的运算符,才使C语言表现出简洁、灵活的特色。运算符与运算对象(变量、常量、函数、表达式)组合起来,构成C语言的表达式。C语言的运算符很多,所以由运算符构成的表达式种类也很多。本节仅介绍其中常用的算术运算和赋值运算,其它运算在以后的章节中陆续介绍。
C语言的各种运算符都有不同的优先级和结合性规则。所谓优先级就是数学上大家熟知的“先算乘除,后算加减”,但对于多个同一优先级别的加减或乘除运算符来说,是从左向右计算,还是从右向左计算,这就是运算符的结合性问题。例如乘除运算符为左结合性,计算表达式3/4*4时,先算除法,后算乘法。C语言中有些运算符具有右结合性,如赋值运算符“=”,计算表达式a=b=5时,是先完成最右边的赋值操作。
2.4.1 算术运算符与算术表达式
1. 算术运算符
C语言的算术运算符主要包括加(+)、减(-)、乘(*)、除(/)和求模(%)五种,其
·13·
中加减乘除四种运算符就是数学中的四则运算,求模运算就是求余数,如10%4的值等于2。加减运算符优先级别相同,并具有左结合性。乘、除和求模三种运算符的优先级别相同,也具有左结合性。乘除和求模运算的优先级别高于加减运算符,即先算乘除,后算加减。因为这些运算符需要两个运算对象,故又称为双目运算符。
在程序中进行除法运算时,两个整型数相除的结果为整型,如表达式5/2的运算结果为2,结果只取整数部分。要得到结果为2.5,需要将操作数改为实型常数,如5.0/2.0。如果参与运算的两个数中有一个为实数,则运算结果为实数。对于求模运算符%,两个操作数必须是整型,实型数不能进行求模运算。求模运算在判断一个整数能否被另一个数整除时很方便。例如:当x%y结果为0时,说明x能被y整除,否则不能整除。
在C语言的算术表达式中不允许使用方括号和花括号,只能使用圆括号。圆括号是C语言中优先级别最高的运算符,圆括号必须成对使用,当使用了多层圆括号时,先完成最里层的运算处理,最后处理最外层括号。
2. 算术表达式
用算术运算符和一对圆括号将操作数(常数、变量、函数等)连接起来,符合C语言语法的表达式称为算术表达式。算术表达式使用时要注意书写形式。
数学表达式 错误的程序表达式 正确的程序表达式
b-4ac b*b-4ac
2 b*b-4*a*c
b2-4ac (b*b-4*a*c)/2*a (b*b-4*a*c)/(2*a)
2aa+b a+b/a-b (a+b)/(a-b)
a−b可见,算术表达式采用的是线性书写形式,运算量和运算符都要写在一条横线上。有些运算还要涉及诸如求绝对值和平方根这样的问题,对这类数学运算,C语言已将它们定义成标准库函数,例如求a 的绝对值使用的是fabs(a);求b的平方根使用的是sqrt(b)等,这些函数存放在数学库”math.h”中,在使用时用户只需直接调用即可。
2.4.2 赋值运算符与赋值表达式
在C语言中,赋值号“=”是一个运算符,称为赋值运算符。由赋值运算符组成的表达式称为赋值表达式,其形式如下:
变量名=表达式
赋值号左边必须是一个变量名,赋值号右边允许是常数、变量和表达式。赋值运算符的功能是先求出右边表达式的值,然后将此值赋给左边变量。下面结合示例说明赋值运算符的特点。
1. 赋值运算符的优先级别很低,在所有的运算符中仅高于逗号运算符,低于其它所有运算符。因此,对于如下表达式:
y=a*b+2*c
由于所有其它运算符的优先级都比赋值运算符高,所以先计算右边表达式的值,再将此值赋给变量y。因此y=a*b+2*c与y=(a*b+2*c)两个赋值表达式是等价的,不用担心先把a
·14·
的值赋给变量y。
2.赋值运算符不同于数学中的等号,等号没有方向,而赋值号具有方向性。如a=b和b=a在数学意义上是等价的,但作为程序表达式将产生不同的操作结果。完成a=b操作后,变量a单元中的值为原来变量b的值,原来a的值被覆盖,而变量b的值不变。
3.在C语言中,“=”作为一个运算符,由它组成赋值表达式,C语言规定左边变量得到的值作为赋值表达式的值。所以表达式a=5的值等于5。
4.赋值运算符具有右结合性,因此a=b=5也是合法的,与a=(b=5)等价,最后a和b的值均等于5。
2.4.3 数据类型转换
在C语言中不同类型的数据之间是不能直接进行运算的,在运算之前必须将操作的数据转换成同一种类型,然后才能完成运算。由于变量可能具有不同的类型,因此难以避免在一个程序表达式中出现不同类型的操作数。C语言系统遇到不同类型数据之间运算问题时,能够自动将操作数转换成同种类型。
1. 自动类型转换
在表达式中,当运算符两边的运算对象类型相同时,可以直接进行运算,并且运算结果和运算对象具有同一数据类型。如4/5的运算结果为整数零,4.0/5.0的运算结果为实型数0.8。
但是当两个不同类型的数据进行运算时,C语言会自动把它们转换成同一数据类型再进行计算,自动转换时系统都是将类型级别较低的操作数转换成另一个较高级别的类型,然后进行计算,计算结果的数据类型为级别较高的类型。例如在4/5.0表达式计算时,先将整数4转换成实型4.0,然后进行除法运算,计算结果为类型级别更高的实型数0.8。各种类型自动转换级别如图2-4所示。
doublefloat
long
int char
图2-4自动转换示意图
2. 强制类型转换
C语言中允许使用类型说明符关键字对操作数据进行强制类型转换,强制类型转换表达式的形式如下:
(类型名)(表达式)
其中(类型名)称为强制类型转换运算符,利用强制类型转换运算符可以将一个表达式的值转换成指定的类型,这种转换是根据人为要求进行的。如:
(int)4.678 把4.678转换成整数4
(double)(10%3) 把10%3所得结果1转换成双精度数
若整型变量a=3,b=4,则表达式(float)a/(float)b的结果为0.75,如要将表达式改成
·15·
(float)(a/b),则运算结果为0.0。
在强制类型转换时需注意的是取整类型转换,它不是按四舍五入处理的,如若当a=2.8时,(int)a的结果为整数部分2。
2.4.4 几个特殊的运算符
1. 复合的赋值表达式
在赋值运算符之前加上其它运算符可以构成复合赋值运算符,复合赋值运算符的优先级与赋值运算符的优先级相同,也具有右结合性。常用的有+=、-=、*=、/=、%=等。下面举例说明它们的用法。如:
a+=x-y 相当于 a=a+(x-y)
a-=x-y 相当于 a=a-(x-y)
a*=x-y 相当于 a=a*(x-y)
a/=x*y 相对于 a=a/(x*y)
2. 自增运算符(++)和自减运算符(--)
自增运算符(++)和自减运算符(--),它们是单目运算符,运算对象必须是变量,不能为表达式或常量。其原因是该运算符的功能是使变量的值增1或减1,而常量是不能改变值的。++和--运算符可以作为变量的前缀,又可以作为变量的后缀,但作用是有区别的。如:++i、i++、--i、i--都是合法的表达式。无论作为变量的前缀还是作为变量的后缀,相对于变量本身来说自增1或自减1都具有相同的效果,但作为表达式来说却有着不同的值。其使用规则为:
++i,--i 变量在使用之前先自增1,自减1
i++,i-- 变量在使用之后再自增1,自减1
例:阅读下面程序,观察其运行结果。
【例2.2】
#include
void main()
{ int a=3,b=4,c,d;
c=a++;
d=++b;
printf("a=%d,b=%d,c=%d,d=%dn",a,b,c,d);
}
输出结果为:a=4,b=5;c=3;d=5
由此可见语句c=a++;与下面两条语句等价:
c=a;
a=a+1;
即先使用a原来的值3赋给c,再将a的值增1变为4。
而语句d=++b;与下面两条语句等价:
b=b+1;
·16·
d=b;
即先将b的值加1,然后使用新值5赋给d,结果d的值等于5。
另外++和--运算符具有右结合性,如表达式-a++相当于-(a++),不是(-a)++,而(-a)是表达式不能作为++运算符的操作数。
3. 逗号运算符
逗号运算符又称为顺序求值运算符,它是将多个表达式用逗号运算符“,”连接起来,组成逗号表达式。逗号表达式的一般形式为:
表达式1,表达式2,……,表达式n
逗号运算符的结合性为从左到右,因此逗号表达式将从左到右进行运算。即先计算表达式1,然后计算表达式2,依次进行,最后计算表达式n。最后一个表达式的值就是此逗号表达式的值。
如:i=3,i++,++I,i+5
这个逗号表达式的值是10,i的值为5。
逗号表达式主要用于以后的for循环语句中。逗号运算符在C语言所有运算符中优先级别最低。
2.5 本章小结
本章介绍的主要内容有:
1.C语言的基本数据类型,其中主要介绍的数据类型有整型(int,long),实型(float,double)和字符型。在编写C程序时应根据数据的实际情况选择相应的数据类型。
2.常量和变量。常量是指在程序执行过程中,其值不能被改变的量。C语言提供的常量有:整型常量、实型常量、字符常量、字符串常量和符号常量。变量是指在程序运行过程中其值可以改变的量。程序中用到的所有变量都必须有一个名字作为标识,在内存中占据一定的存储单元,在该存储单元中存放变量的值。但使用变量时必须要遵守的规则就是:先定义后使用。
3.算术运算与数学中的算术运算类似,但要注意算术表达式的书写规则和运算规则。
4.“=”是赋值运算符。由赋值运算符组成的表达式称为赋值表达式。要注意的是赋值号左边必须是一个变量名,赋值号右边允许是常数、变量和表达式。赋值语句具有先计算后赋值的功能。
5.当运算符两边的数据类型不同时,在运算之前会自动转换成相同的类型,转换的原则是由低级向高级转换。此外还可以使用强制类型转换。
6.自增运算符(++)和自减运算符(--)的运算对象必须是变量,它的功能是使变量的值增1或减1,但当++和--作为变量的前缀或后缀时的作用是有区别的。此外还分别介绍了逗号运算符和复合的赋值表达式。
·17·
2.6 实 训
实 训 1
【实训内容】基本数据类型。
【实训目的】熟悉数据类型及类型转换。
【实训题目】运行下面程序,记录输出结果,并对结果进行分析。
#include "stdio.h"
void main()
{
int m,n;
float y;
y=9.6;
m=y;
n=(int)y;
printf("y=%f,m=%d,n=%dn",y,m,n);
}
实 训 2
【实训内容】算术运算。
【实训目的】熟悉算术运算及算术表达式。
【实训题目】编程计算y=3x2+2x-4的值(假设x=3)
#include
void main()
{
int x=3,y;
y=3*x*x+2*x-4;
printf("n y=%dn",y);
}
实 训 3
【实训内容】赋值运算。
·18·
【实训目的】熟悉赋值运算符及赋值表达式。
【实训题目】执行下面程序,记录输出结果,并对结果进行分析。
#include
void main()
{
int a=12,n=5;
a+=a;
printf("%dn",a);
a*=2+3;
printf("%dn",a);
a%=(n%2);
printf("%dn",a);
}
实 训 4
【实训内容】自增自减运算。
【实训目的】掌握自增自减运算。
【实训题目】执行下面程序,记录输出结果,并对结果进行分析。
#include
void main()
{
int i,j,m,n;
i=8;j=10;
m=i++;
n=j++;
printf("%d,%d,%d,%dn",i,j,m,n);
}
习题
2.1根据下列数学式子,写出相应的C语言表达式。
ab ⑴
xy ⑵
1a−x2(ax+4a)
⑶
eb/asin(π/6)y+cos(600)
⑷
(b-1)x+a%4
·19·
2.2 请分析当执行下面语句后,变量a的值是多少?。
float m=65.78;
int a=9;
a=m;
2.3执行下面程序段后,变量z的值是多少?
int x=5,y=3;
float z;
z=(float)(x/y);
2.4 写出下面程序的运行结果,并分析原因;
#include “stdio.h”
void main()
{ int i,j,k;
float x=5.8,y=3.7,f=8.56;
i=(int)(x+y);j=(int)x+y;k=(int)f%3;
printf("n i=%d,j=%d,k=%d,x=%fn",i,j,k,x);
}
2.5写出下面程序的运行结果。
#include “stdio.h”
void main()
{ int a=4,b=6;
b=a+b;
a=b-a;
b=b-a;
printf("a=%d,b=%dn",a,b);
}
·20·
第3章 顺序结构程序设计
程序设计的基本目标是用算法对问题的原始数据进行处理,从而获得所期望的效果。算法就是解决问题的方法和步骤。算法的实现过程是由一系列操作组成的,这些操作之间的执行次序就是程序的控制结构。计算机科学家Bohm和Jacopini证明了这样的事实:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。所以,这三种结构就被称为程序设计的三种基本结构,也是结构化程序设计必须采用的结构。从本章开始将陆续对这三种结构的程序设计思想及流程进行讲述。通过本章学习的主要目的是掌握数据的输入输出函数,编写顺序结构程序,解决简单问题。
3.1 一个顺序结构程序实例
【例3.1】 编写程序,计算梯形面积。
【解题思路】
首先定义程序所需要的变量:a,b,h,area;之后是输入输入梯形的上底、下底和高这些数据给变量a,b,h;然后依据公式area=(a+b)*h/2计算矩形面积;最后输出梯形面积area。
【程序代码】
#include "stdio.h"
void main()
{ float a,b,h,area; /*变量定义*/
printf("n 请输入梯形的上底,下底和高:"); /*输出提示信息*/
scanf("%f,%f,%f",&a,&b,&h); /*输入数据*/
area=(a+b)*h/2; /*计算梯形面积*/
printf("梯形的面积为:%7.2fnn",area); /*输出结果*/
}
执行这个程序,可以看到当输入数据为:2,4,6时,程序的输出结果为:18。
这个程序的结构非常简单。在main()函数中包含5条语句,第一条是变量定义语句,声明了4个变量均为float型;第二条是输出语句,提示用户输入数据;第三条是输入语句,用于接收用户从键盘键入的数据保存到变量a,b,h中;第四条是赋值语句,用于计算梯形面积并保存结果到变量area中;第五条是输出语句,把梯形面积输出到显示屏上。
从程序的结构来看,本程序是典型的顺序结构程序。顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的,其流程如图3-1所示。图中的S1和S2表示两个处理步骤,这些处理步骤可以是一个非转移操作或多个非转移操作系列,甚至可以是空操作,也可以是三种基本结构中的任一结构。整个顺序结构只有一个入口点a和一个出口点b。这种结构的特点是:程序从入口点a开始,按顺序执行所有操作,直到出口点b处,所以称为顺序结构。它是程序设计三种基本结构中最简单的一种。
·21·
a
S1
S2
b
图3-1顺序结构流程
不管程序是如何简单或复杂,计算机程序对数据处理的过程通常都可分成三个部分,即输入数据、数据运算和输出数据。计算机通过输入操作接收数据,然后对数据进行加工处理,再将处理完的数据在屏幕上或在打印机上输出。
本章主要介绍数据的输入输出操作。
3.2 数据的输入输出
从计算机输入设备向内存(变量地址)传送数据的过程称为输入,将主机中的数据传送到计算机输出设备的过程称为输出。C语言本身不提供输入输出语句,而是使用标准库函数实现数据输入输出操作。使用标准库函数时,必须用编译预处理命令#include将相应的头文件包括到用户的程序中,输入输出函数的头文件名为stdio.h。
本节主要介绍scanf和printf函数的用法,以及专门用于单个字符的输入输出函数。
3.2.1 printf输出函数
printf函数是C语言系统提供的标准输出函数,功能是在终端(显示器终端)上按指定格式输出各种类型的数据。printf函数的调用形式如下:
printf(格式控制,输出项表)
如果在函数后面加上分号“;”,就构成了输出语句。
例如:printf("a=%d,b=%fn",a,b);
在这条输出语句中,printf是函数名,用双引号括起来的字符串部分"a=%d,b=%fn"是输出格式控制,决定了输出数据的内容和格式。a,b为输出项。
下面对printf函数进行说明:
1.格式控制
·22·
格式控制字符串可以包含三类字符:
(1)格式符,由%开头后跟格式符。其中格式符由C语言约定,作用是将输出的数据转换为指定的格式输出。C语言约定的常用格式符及功能说明如下表3-1所示。在某些系统中,可能不允许使用大写字母的格式符,因此为了使程序具有通用性,在写程序时应尽量不用大写字母的格式符。
表3-1 常用格式符
格式符
D
F
C
S
Ld
O
X
E
Printf()
输出十进制整数
输出单、双精度实数
输出一个字符
输出字符串
输出长整型数据
以八进制形式输出整数
以十六进制形式输出整数
以指数形式输出实数
Scanf()
输入十进制整数
输入单、双精度实数
输入一个字符
输入字符串
输入长整型数据
以八进制形式输入整数
以十六进制形式输入整数
以指数形式输入实数
(2)普通字符,在格式控制字符串中除了格式符和转达义字符外,需要原样输出的文字或字符(包括空格)。
(3)转义字符,为了输出结果清晰,便于阅读,需要在格式控制字符串中加上诸如回车换行‘n’等这样的转义字符来控制输出结果的显示格式。
2.输出项表
输出项表可以是要输出的任意合法的常量、变量或表达式,各输出项之间必须用逗号隔开。此外,printf函数可以没有输出项,函数的调用形式将为printf(格式控制),输出结果就是格式控制中的固定字符串。如:printf("OK!");将输出字符串:OK!。
【例3.2】通过以下程序段,分析printf()。
int a=10,b=9;
printf("%d %dn",a,b);
printf("a=%dn",a,b);
printf("a=%d,b=%dn",a,b);
输出结果为:
10 9
a=10
a=10,b=9
说明:printf()的输出格式为自由格式,可在两个数之间留逗号或空格,但要求格式字符与输出数据之间的个数、类型及顺序须一一对应。输出时除了格式符位置上用对应输出数据代替外,其它字符都原样输出。但当格式说明与输出项的类型不一一对应匹配,则不能正确输出,编译时也不会报错。若格式说明个数少于输出项个数,则多余的输出项不予输出;
·23·
若格式说明个数多于输出项个数,则将输出一些毫无意义的数字乱码。
char ch=’a’;
printf("%c, %dn",ch,ch);
printf("%%c",ch);
输出结果为:
a,97
%c
在用printf()输出字符时,%c用于输出字符本身,%d则输出字符的ASCII码值。如果要输出%符号,可以在格式控制中用%%表示,将输出一个%符号。
float y=456.789;
printf("%f,%en",y,y);
输出结果为:
456.789001,4.567890e+002
从输出结果可以看到,实数输出时系统默认的小数位数为6位。为了满足不同的输出要求,printf()允许指定输出数据的宽度以及对齐方式。附加的输出格式说明见表3-2。
表3-2 附加的输出格式符
格式符 说 明
m
-m
m.n
-m.n
按m宽度输出,右对齐,m为正整数
按m宽度输出,左对齐,m为正整数
整个实型数宽度占m位,其中小数占n位;
对字符串,输出宽度占m位,只截取串中前n个字符,右对齐
整个实型数宽度占m位,其中小数占n位;
对字符串,输出宽度占m位,只截取串中前n个字符,左对齐
【例3.3】通过下面程序,观察printf()的输出结果。
#include
main()
{ int a=12;
float b=1.5;
printf("a=%5dta=%-5dn",a,a);
printf("b=%ftb=%9.3ftb=%-9.3fn",b,b,b);
printf("b=%etb=%15.2etb=%-15.2en",b,b,b);
}
输出结果为:
a= 12 a=12
b=1.500000 b= 1.500 b=1.500
b=1.500000e+000 b= 1.50e+000 b=1.50e+000
·24·
3.2.2 scanf输入函数
scanf是C语言提供的标准输入函数,其功能是从输入设备(通常为键盘设备)获取数据,并送到变量的内存地址中。
调用scanf函数的一般格式为:
scanf(格式控制,输入项表)
例如,若a为整型变量,b为实型变量,下面语句用来为a和b输入数据。
scanf("%d%f",&a,&b);
使用scanf函数,必须提供两种参数,即输入格式控制和输入项表。
⒈ 格式控制
scanf()函数的格式控制字符串中的格式字符见表3-1所示。
但需说明的是格式控制字符串中一般不使用普通字符,输入多个数据中间用空格(或跳格和回车符)作为输入数据的间隔。也有许多用户愿意在格式控制符中间加逗号,输入数据时用逗号作为数据的间隔。
⒉ 输入项表
输入项表中的各项之间用逗号间隔,输入项必须是变量的地址,这就需在变量名字前加取地址运算符&。输入项的个数要与格式说明符的个数相同且输入项与对应的格式说明符的类型必须按顺序对应。
在下列几个例子中说明输入数据的方法和注意的问题
【举例1】 用空格间隔数据
scanf("%d %f",&a,&b);
输入数据为:120 1.5<回车> (输入数据之间用空格符分隔)
%d和%f中间的空格符可以不用,效果是一样的。
【举例2】用逗号间隔数据
scanf("%d,%f",&a,&b);
输入数据为:120,1.5<回车> (输入数据之间用逗号分隔)
【举例3】用其它字符间隔数据
scanf("%d#%d?%d",&a,&b,&c);
输入数据为:12#34?56<回车>
则a=12,b=34,c=56
【举例4】输入数据带有提示信息
下面语句:
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
实际上不能起到提示作用,反而带来麻烦,输入数据时必须记住格式控制字符串内容。
输入数据必须为:a=12,b=34,c=56
要达到提示输入数据的作用,应该在输入语句之前输出字符串信息,如:
printf("为a,b,c输入三个整型数据,用逗号间隔。n");
scanf("%d,%d,%d",&a,&b,&c);
·25·
运行情况如下:
为a,b,c输入三个整型数据,用逗号间隔。 (提示信息)
12,34,56<回车> (输入数据)
【举例5】 当指定输入数据宽度(占用列数)时,系统自动截取所需数据。如:
scanf("%3d%3d",&a,&b);
如果输入数据为:12345678
则a=123,b=456。
如果输入数据为:5 8
则a=5,b=8。空格作为数据的间隔,指定宽度不起作用。
【举例6】 *格式字符,表示要跳过指定列数。如:
scanf("%2d %*3d %2d",&a,&b);
如果输入数据为:12 345 67
则a=12,b=67。
3. 关于scanf()函数的几点说明:
(1) 输入项参数必须是变量的地址,不能使用变量。虽然下面语句:
scanf("%d",a);
在编译时能通过,但不能正确接收数据。
(2) 格式符类型与输入项按顺序结合,类型要一一对应。如果类型不匹配,编译程序不作类型检查,接收的数据会发生错误。
(3) 如果输入项与格式说明符个数不同时,scanf函数将提前结束。
(4) 输入实型数据时,不能限定输入数据的宽度与小数位数,如scanf("%7.2f",&x);
(5) 输入数据字符序列中,空格、跳格和回车符都是一个数据项结束的标志。
C语言数据的格式输入方法多种多样,不要死记硬背,只要掌握一两种合适的方法就可以了,遇到麻烦时再查参考书。
3.3.3 字符输入输出函数
在C程序中,经常需要对字符数据进行输入和输出操作。字符的输入输出除了可以使用scanf()和printf()函数外,还可以使用专门用于字符输入输出的函数getchar()和putchar()函数。
1. putchar()函数
一般格式为:putchar(c)
putchar()是字符输出函数,作用是在屏幕上输出一个字符,它的参数c是待输出的字符。如果参数为一个整型数据,将输出对应ASCII码值的字符。
【例3.4】字符输出函数的用法
#include
main()
{ char ch='A';
putchar(ch);putchar(32);putchar(ch+32);putchar('n');
·26·
putchar(ch+1);putchar('n');
}
运行结果为:
A a
B
2. getchar()函数
一般格式为:getchar()
getchar()是字符输入函数,此函数没有参数,作用是接收键盘上输入的一个字符。
【例3.5】字符输入函数的用法
#include
main()
{ char ch1,ch2;
int a;
ch1=getchar();
ch2=getchar();
scanf("%d",&a);
printf("%c%c,%dn",ch1,ch2,a);
}
输入数据:
as123
输出数据:
as,123
getchar()只能接收一个字符。当只有一个getchar()函数时,输入一个字符并按回车键后,字符才能被接收。如果有两个连续的getchar()函数,两个字符必须连续输完再按回车键,或继续输入其它数据。就一个getchar()函数而言,输入一个字符后必须按回车键,但回车键仍保留在键盘缓冲区中。
对于前面的程序例子,如果按下面方式输入数据:
a
s
当输入第2个字符并按回车键后,程序就不再接收下一个整数了。因为ch1接收了字符'a',ch2接收的字符为回车符,s就作为整型变量a的值,但数据非法,因此结束了数据输入。上机实习当中可以反复试验。
3.3 顺序结构应用实例
【例3.6】设变量m=8、n=10,编写程序实现两个变量的值互换。
【解题思路】
变量是存放数据的容器,现在要交换两个容器中的内容,就需要借助第三个容器来实现,
·27·
因此就需要第三个变量t。
【程序代码】
#include "stdio.h"
void main()
{ int m,n,t;
m=8;
n=10;
printf("没交换之前的数据:m=%d,n=%dn",m,n);
t=m;
m=n;
n=t;
printf("交换后的数据为:m=%d,n=%dnn",m,n);
}
【运行结果】
没交换之前的数据:m=8,n=10
交换后的数据为:m=10,n=8
针对上面程序,思考下面问题:
1.把程序中的交换过程用语句m=n;n=m;代替,程序的运行结果会怎样?
2.如果是交换任意两个变量的值,程序该如何修改?
【例3.7】从键盘输入一个字符,求出其前后相邻的两个字符,然后按由大到小的顺序输出这三个字符及对应的ASCII码。
【解题思路】
输入字符的前面一个字符,其ASCII码比此字符小1。同样,后一个字符的ASCII码比此字符大1,对字符型变量进行算术运算时,使用的正是它们的ASCII码,所以直接将输入的字符加1或减1,就可以得到它前后的相邻字符。输出时,使用格式控制符%c可输出字符本身,而使用%d则可输出字符对应的ASCII码。
【程序代码】
#include
void main()
{
char c,cf,cb;
printf("n please input a character: ");
c=getchar();
cf=c-1;
cb=c+1;
printf("%c %c %cn",cf,c,cb);
printf("%d %d %dn",cf,c,cb);
}
【运行结果】
please input a character:m
·28·
1 m n
108 109 110
3.4 本章小结
本章介绍的主要内容有:
1.在C语言中任何简单或复杂的程序都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。其中顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的,它是程序设计三种基本结构中最简单的一种。
2.C语言的输入和输出由专门的函数来完成,主要用到的输出函数是printf()和输入函数scanf()。利用它们可以完成各种数据的输入输出操作,而且还可以控制输入输出格式。
3.使用printf()函数时,格式字符与输出数据之间个数、类型及顺序须一一对应。在输出时除了格式符位置上用对应输出数据代替外,其它字符被原样输出。
4.使用scanf()函数时,输入项为变量的地址,所以在变量之前须加取地址运算符&。另外在通过键盘输入数据时,要注意输入数据时需注意的问题。
5.getchar()和putchar()函数只能用于单个字符的输入和输出。
3.5 实 训
实 训 1
【实训内容】printf()函数的使用。
【实训目的】灵活运用printf()函数输出各种数据。
【实训题目】运行下面程序,输入指定的两组数据,记录程序的输出结果。
#include "stdio.h"
void main()
{
float x,y;
scanf("%f,%f",&x,&y);
printf("%8.2f,%8.2f,%.4f,%.4f,%3f,%3fn",x,y,x,y,x,y);
}
1. 输入数据为:13.45,25.68
2. 输入数据为:13.7896,25.6875
实 训 2
·29·
【实训内容】scanf()函数的使用。
【实训目的】灵活运用scanf()函数进行数据输入。
【实训题目】
#include "stdio.h"
void main()
{
int a,b,c;
printf("please enter a,b,c: ");
scanf("%d,%d,%d",&a,&b,&c);
printf("a=%d,b=%d,c=%dn",a,b,c);
}
1. 程序执行时,为了使a,b,c分别取值6,7,8,应如何操作?
2. 将程序中的scanf()函数格式改为:scanf("%d%d%d",&a,&b,&c);又应如何操作?
实 训 3
【实训内容】字符输入输出函数编写顺序结构程序。
【实训目的】灵活运用getchar()和putchar()函数编写顺序结构程序,完成单字符的输入与输出,。
【实训题目】试编程实现:当从键盘输入一个大写字母,要求改用小写字母输出。
【编程点拔】从键盘输入一个大写字母,可以用getchar()来实现,另外大写字母与小写字母的ASCII码值相差32,在输出时用%c输出字符,%d输出该字符对应的ASCII码值。请试着在空白处补全代码。
#include
main()
{ char c1,c2;
}
习题
3.1 写出下面程序运行结果。
·30·
main()
{ int x=10,y=3;
printf("%dn",y=x/y);
}
3.2 若有以下程序段:
int c1=1,c2=2,c3;;
c3=c1/c2;
printf("%dn",c3);
执行后的输出结果是:
3.3 若有以下定义,请写出以下程序段中输出语句执行后的输出结果。
int i=-200,j=2500;
printf("(1)%d,%d",i,j);
printf("(2)i=%d,j=%dn",i,j);
printf("(3)i=%dnj=%dn",i,j);
3.4 变量i,j,k已定义为int型并均有初值0,用以下语句进行输入时:
scanf("%d",&i);
scanf("%d",&j);
scanf("%d",&k);
从键盘输入:12.3<回车>,则变量i,j,k的值分别是多少?
3.5 以下程序段要求通过scanf语句给变量赋值,然后输出变量的值。写出运行时给k输入100,给a输入15.81,给x输入1.89356时的三种可能的输入形式:
int k;float a;double x;
scanf("%d%f%lf",&k,&a,&x);
printf("k=%d,a=%f,x=%fn",k,a,x);
3.6 以下程序输入3个整数值给变量x,y,z,然后按如下形式交换它们的值,请填空把程序补充完整。
#include "stdio.h"
main()
{
_______________________;
int t;
printf("请输入三个整数给x,y,z: ");
scanf("%d,%d,%d",______________);
_____________________;
x=y;
y=z;
______________________;
printf("x=%d,y=%d,z=%dn",x,y,z);
·31·
}
3.7 求三个整型数的平均值v=(a+b+c)/3,在变量定义时给出初始化值a=3,b=4,c=7,并输出两位小数。
3.8 输入一个摄氏温度,要求输出华氏温度。公式为f=5/9*c+32。要求使用scanf函数输入数据。
·32·
第4章 选择结构程序
C语言提供了可以进行逻辑判断的若干选择语句,由这些选择语句可以构成程序中的选择结构,通常又称为分支结构,它将根据逻辑判断的结果决定程序的不同流程。本章的主要内容是关系和逻辑运算,实现选择结构的语句,选择结构程序设计方法。
4.1 一个选择结构程序实例
【例4.1】输入任意两个整数a和b,输出其中值小的数。
【程序代码】
#include "stdio.h"
void main()
{ int a,b,min;
scanf("%d,%d",&a,&b); /*输入数据*/
if(a>b) /*进行比较*/
min=b; /*把值小的数赋给min*/
else
min=a; /*把值小的数赋给min*/
printf("两个整数中值小的数为:%dn",min); /*输出min*/
}
程序执行时,当从键盘输入两个整数98和89时,程序的输出结果为:
两个整数中值小的数为:89
【程序分析】
任意两个整数a和b要区分出大小,就要进行比较。程序中用变量min存放两数中值小的数,如果a大于b,就把b赋值给min,反之就把a赋值给min,最后输出变量min。
很明显,程序在a和b进行比较时产生了两条分支,要么选择min=b;语句执行,要么选择min=a;语句执行。进行的选择判断是依据条件a>b是否成立,这就是选择结构。其执行流程如图4-1所示。
YNa>b?
min=b
min=a
·33·
图4-1选择结构示例
选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择三种形式。双选择是典型的选择结构形式,如上图所示,它有两个分支,根据条件的成立与否来决定程序的执行方向。值得注意的是,在这两个分支中只能选择一条且必须选择一条执行,但不论选择了哪一条分支执行,最后流程都一定到达结构的出口。
4.2 关系运算与逻辑运算
关系表达式和逻辑表达式的运算结果都会得到一个逻辑值。逻辑值只有两个,分别用“真”和“假”来表示。在C语言中,没有专门的“逻辑值”,而是用非0表示“真”,用0表示“假”。因此,对于任意一个表达式,如果值为0,就代表一个“假”值;如果值是非零,无论是正数还是负数,都代表一个“真”值。
4.2.1 关系运算符与关系表达式
关系运算是逻辑运算中比较简单的一种。所谓关系运算实际上是“比较运算”,即进行两个数的比较,判断比较的结果是否符合指定的条件。
1. 关系运算符
C语言提供了6种关系运算符,它们分别是:
< 小于
<= 小于等于
> 大于
>= 大于等于
== 等于
!= 不等于
注意:在书写关系运算符>=、<=、==、!=时,中间不允许有空格,否则会产生语法错误。
另外,关系运算符是双目运算符,具有自左至右的结合性。以上关系运算符中,前四种关系运算符(<、<=、>=、>)的优先级别相同,后两种(==、!=)优先级相同,且前四种的优先级高于后两种。关系运算符的优先级低于算术运算符,高于赋值运算符。
2. 关系表达式
由关系运算符构成的表达式,称为关系表达式。关系运算符两边的运算对象可以是C语言中任意合法的表达式。
关系表达式的形式为:
表达式1 关系运算符 表达式2
例如:a>=b、(a=3)>(b=4) 、a>c==c等都是合法的关系表达式。
关系运算的值为“逻辑值”,只有两种可能:整数0或者整数1。
·34·
下面用例子来说明关系运算符的特点。
(1)若a=3,b=5
a<=b的值为1,a>b的值为0
a=b的值为0
a!=b的值为1,a==b的值为0
三组运算符中,每组中两个运算符是对立的,应用时可以灵活选择。
(2)若a=100,则表达式a>’a’的值为1,字符参加关系运算时,使用字符的ASCII码值。两个字符串进行关系运算(比较大小)时,从两个字符串左边开始,逐个字符比较。如果前面的字符相同,就比较右边下一个字符,一旦某个字符不同",按其ASCII码值的大小决定两个字符串的大小。如果所有字符都相同,则两个字符串相等。如:
"abcd"<"aby" (第3个字符’c’<’y’)
"abcd">"abc" (第4个字符’d’>’ ‘)
"abc d"<"wa" (第1个字符’a’<’w’)
"abcd"=="abcd" (完全相同)
(3)由于关系运算符优先级低于算术运算符,所以关系表达式c>a+b等价于c>(a+b)。
(4)由于关系运算符优先级高于赋值运算符,所以关系表达式c=a>b等价于c=(a>b)。
(5)若a=6,b=5,c=4,数学表达式a>b>c是成立的,但在程序中关系表达式a>b>c等价于(a>b)>c,其中a>b条件成立值为1,但1不大于c,因此整个关系表达式不成立。
a>b并且b>c逻辑条件必须使用下面的逻辑运算符来完成。
4.2.2 逻辑运算符与逻辑表达式
1. 逻辑运算符
逻辑运算符是对逻辑量进行操作的运算符。逻辑量只有两个值,“真”和“假”,它们分别用1和0表示。C语言有三种逻辑运算符:逻辑与(&&)、逻辑或(||)和逻辑非(!)。逻辑与和逻辑或运算为双目运算符,具有左结合性。逻辑非为单目运算符,具有右结合性。
三种逻辑运算符的优先级,!运算符优先级最高,&&运算符次之,||运算符优先级最低。其中!运算符优先级最特别,仅次于括号和成员运算符,高于所有算术运算符和关系运算符。&&和||运算符优先级低于算术运算符和关系运算符,高于赋值运算符。
2. 逻辑表达式
逻辑表达式是由逻辑运算符把操作对象(可以是关系表达式或逻辑表达式)连起来所构成的式子。其形式为:
表达式1 && 表达式2
表达式1 || 表达式2
! 表达式
逻辑表达式的运算结果或者为1即“真”,或者为0即“假”。其运算规则为:
逻辑与(&&):当两边的表达式的值均为非0时,逻辑表达式的值才为1,其余情况均为0。
逻辑或(||):当两边表达式的值均为0时,逻辑表达式的值为0,其余情况均为1。
·35·
逻辑非(!):当表达式的值为非0时,逻辑表达式的值为0,反之当表达式的值为0时,逻辑表达式的值为1。
下面通过一些示例说明逻辑表达式的用法。
(1)数学表达式a
a
(2)判断整数m是否能被3、5或7整除的逻辑表达式:
m%3==0 || m%5==0 || m%7==0
(3)判断整数m不能同时被3、5和7整除的逻辑表达式为:
m%3!=0 && m%5!=0 && m%7!=0
或m%3 && m%5 && m%7
(4)判断整数m不能被5整除,但能被7整除的逻辑表达式为:
m%5!=0 && m%7==0
或 !(m%5==0) && m%7==0
4.3 由if语句构成的选择结构
4.3.1 if语句
if语句的一般形式为:
if(表达式)语句
其中,if是C语言的关键字,在其后一对圆括号中是表达式,表达式之后只能是一条语句,称为if子句。如果该子句中含有多个语句(两个以上),则必须用复合语句,即用花括号把一组语句括起来,因为复合语句可以看成是“一条语句”。 还有就是if后面的表达式必须使用圆括号,括号后面不要随意加分号。一个分号也被看作是一条什么也不做的语句,称为空语句。
执行if语句时,首先计算表达式的值,如果表达式为非0(即为“真”),则执行语句,否则直接执行if语句后的下一条语句。其执行过程如图4-2所示。
YN表达式
语句
图4-2
【例4.2】计算函数值y=|x|+1(不使用绝对值函数)
【解题思路】
·36·
首先从键盘上输入数据x,然后对x进行判断。当x小于0时,让x=-x,之后做y=x+1操作,最后输出y。
【程序代码】
#include
void main()
{ float x,y;
scanf("%f",&x);
if(x<0)
x=-x;
y=x+1;
printf("y=%fn",y);
}
【运行结果】
执行程序时,给变量x输入10,程序输出结果为:
y=11.000000
【例4.3】输入三个数,按从大到小顺序输出。
【解题思路】
两个变量交换数据时,需要通过第三个变量完成。在交换数据之前需进行比较,然后让变量a中存放最大数,变量b中存放中间数,变量c中存放三者中最小数,最后输出a,b,c。
【程序代码】
#include "stdio.h"
void main()
{float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a
{t=a;a=b;b=t;} /*如果a比b小,则进行交换,把大的数放入a中*/
if(a {t=a;a=c;c=t;} /*至此a,b,c中最大的数已放入a中*/ if(b {t=b;b=c;c=t;} /*至此a,b,c中的数已按由大到小的顺序放好*/ printf("%5.2f,%5.2f,%5.2fn",a,b,c); } 【运行结果】 执行程序时,当输入:3,7,1 程序输出结果为:7.00, 3.00, 1.00 在此程序中无论给a,b,c输入什么数,最后总是把最大数放在a中,把最小数放在c中。 注意,该程序if子句中的花括号“{}”不能省略,它构成复合语句。 ·37· 4.3.2 if~else语句 if~else语句的一般形式为: if(表达式) 语句1 else 语句2 if~else语句的执行过程是:计算表达式的值,若表达式的值为非0(即“真”),则选择执行语句1,否则执行语句2。其执行过程如图4-3所示。 表达式 语句1语句2 图4-3选择结构流程图 【例4.4】输入两个整数a和b,若a大于等于b,则求其积;否则求其商。 【解题思路】 本题的判断条件只有两种结果:a大于等于b和小于b,因此使用if~else语句实现。 【程序代码】 #include "stdio.h" void main() { int a,b,c; scanf("%d %d",&a,&b); if(a>=b) {c=a*b; printf("%d*%d=%dn",a,b,c);} else {c=b/a; printf("%d/%d=%dn",b,a,c);} } 【运行结果】 执行程序,输入:5 60 输出结果为:60/5=12 使用if~else语句时,应注意以下问题: (1)if~else语句中的else子句可以省略,没有else子句时就是简单的if语句。 ·38· (2)else子句不是独立的一语句,它只是if语句的一部分,须与if配对使用。 (3)若if子句或else子句只有一条语句时,则此语句的分号不可以省略。但是包含多个语句时,必须要用“{}”括起来组成复合语句。 (4)C程序没有行的概念,因此if-else语句可以写在一行,也可以分多行书写。 (5)在使用if~else语句时,除了在语句位置处加分号之外,其余的诸如if(表达式)后和else后是不允许随意加分号的。 (6)书写程序时,为了提高程序的可读性,if与else要对齐,而子句均向右缩进。 4.3.3 if~else if~形式 前面两个语句都是单条件的分支语句,if~else~if语句为多条件分支语句,适合在多种情况下选择。语句的一般形式为: if(表达式1) 语句1 else if(表达式2) 语句2 ……………………… else if(表达式n) 语句n else 语句n+1 其执行过程是依次计算并判断表达式i(i为1~n),当表达式i的值为非0时,选择执行其后的语句;当表达式i的值为0时,执行语句n+1。 【例4.5】计算下面分段函数值 0 当x<0 y= x 当0<=x<=10 2 x+1 当x>10 【解题思路】 x为任意的整数,有三种取值可能,只有通过多次条件判断才能确定其具体取值情况,以便求出y值,因此采用if~else~if语句实现。 【程序代码】 #include void main() { int x; scanf("%d",&x); if(x<0) printf("y=0n"); else if(x>=0&&x<=10) ·39· printf("y=%dn",x); else printf("y=%dn",x*x+1); } 该语句的特点是,如果逻辑表达式1成立,执行语句1后不再继续判断后面其它逻辑表达式,只有前面逻辑表达式不成立时才继续判断后面的逻辑表达式。本程序例子中,只有x<0不成立时,才判断下一个逻辑表达式。 4.3.4 if的嵌套 如果if或else子句仍然是一个if语句,称此种情况为if语句的嵌套。内嵌的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。本章只对嵌套在if子句中的作语法说明,其它的不在赘述。 语句的一般形式: if(表达式1) if(表达式2) 语句1 else 语句2 else 语句3 在执行过程中,若表达式1的值为非0时,执行内嵌的if~else语句;当表达式1的值为0时,执行语句3。 【例4.6】对学生成绩评等级,80分为优良,60分为及格,小于60分为不及格。假定是百分制成绩0~100,共分三个等级。 【程序代码】 #include main() { int x; scanf("%d",&x); if(x>=60) /* 第一个if子句 */ if(x>=80) /* 第二个if子句 */ printf("成绩优良n"); else /* 第一个else子句,与第二个if子句配对 */ printf("成绩及格n"); else /* 第二个else子句,与第一个if子句配对 */ printf("成绩不及格n"); } 编译程序解决else子句与if子句配对问题的方法是:当出现一个else子句时,便向前查找if子句,与最近的一个if子句组成一条语句。如果再次出现else子句,便继续向前查找if子句,直到发现还没有配成对的if子句为止。在上面例子中有两个else子句,前面的else子句与第二个if子句配对,后面的else子句与第一个if子句配对。 使用左缩进方法表现if的嵌套层次关系只是增加了程序的可读性,对于程序的编译过 ·40· 程并不起任何作用。 编写选择结构程序时,要注意下面事项: (1)不要急于编写程序代码,先设计好算法,理顺逻辑关系,并画出程序流程图。 (2)if子句和else子句必须是一条单语句或复合语句。 (3)编出程序后,要选择不同数据针对所有分支进行数据检验,保证各分支都是正确的。 (4)写子句时使用左缩进方法,便于调试程序中的逻辑错误。 (5)使用调式命令单步跟踪语句执行的顺序,并观察变量或表达式的值。 4.3.5 条件表达式 前面介绍的是使用C语言中的if语句来构成程序中的选择结构。C语言另外还提供了一种特殊的运算符---条件运算符,由此构成的表达式也可以形成简单的选择结构,这种选择结构能以表达式的形式内嵌在允许出现表达式的地方,使得可以根据不同的条件使用不同的数据参与运算。 条件表达式的形式如下: 表达式1 ? 表达式2 : 表达式3 条件表达式的运算符为? :,是C语言中唯一的三目运算符。 条件表达式的运算过程为,如果表达式1为非零值(真),则计算表达式2的值,并作为整个条件表达式的值。如果表达式1的值为零(假),则计算表达式3的值,并作为整个条件表达式的值。 例如: a>b?a:b 该表达式的值等于a和b中的最大数。 下面if语句: if(a>b) m=a; else m=b; 等价于下面赋值语句: m=a>b?a:b; 条件表达式的优先级仅高于赋值运算符和逗号运算符,低于其它所有运算符。下面表达式: a>b?a:b+1 当a=9,b=10时,表达式的值等于11,可见表达式等价于a>b?a:(b+1)。 条件表达式具有右结合性,下面条件表达式: a>b?a:c>d?c:d 相当于 a>b?a:(c>d?c:d) 条件表达式值的类型由表达式2和表达式3来决定,如3>2?2.5:5的值为实型2.5,3<2?2.5:5的值为实型数5.0。 ·41· 4.4 switch语句和break语句 switch语句是又一个描述多分支结构的语句,在某些特殊问题中,使用switch语句处理多种情况更为方便,其一般形式为: switch(测试表达式) { case常量表达式1:语句1; case常量表达式2:语句2; ……………………… case常量表达式n:语句n; default: 语句n+1; } 执行过程: (1)先计算测试表达式的值。 (2)用测试表达式的值顺次同case后常量表达式的值进行比较。 (3)若找到值相等的常量表达式,则执行该常量表达式冒号后的语句(这是入口)。注意,该语句执行后,程序会依次执行其后的所有冒号后面的语句。 (4)若找不到匹配的常量表达式的值,则执行default后面的语句。 对switch语句的说明: switch后面测试表达式的值类型只能是整型数据或字符型数据。 常量表达式通常是整型常量或字符常量。 case与常量表达式之间必须用空格隔开。 每个case后面的常量应不相同。 switch的语句体必须用“{}”括起来。 当case后包含多个语句时,可以不用花括号括起来,系统会自动识别并顺序执行所有语句。 【例4.7】输入考试成绩等级,输出百分制分数段。 【程序代码】 #include void main() { char ch; printf("输入成绩等级:"); scanf("%c",&ch); switch(ch) { case ‘A’: ·42· printf("成绩优秀:90---100n"); case ‘B’: printf("成绩良好:80---89n"); case ‘C’: printf("成绩中等:70---79n"); case ‘D’: printf("成绩及格:60---69n"); case ‘E’: printf("成绩不及格:0---59n"); default : printf("输入非法字符n"); } } 【运行结果】 程序运行时,只能输入5个大写字母,否则认为是非法字符。程序输出结果为: 输入成绩等级:C 成绩中等:70---79 成绩及格:60---69 成绩不及格:0---59 输入非法字符 显然,程序的输出结果并不是预期的结果,原因是当输入“C”时,执行输出“成绩中等:70---79”的输出语句并以此为入口,开始往下执行,直到switch语句的结束符“}”为止,因此程序不能实现分支结构的功能。 为了得到预期的输出结果,解决方法是在switch语句中使用break语句。break语句又称间断语句,可以将break语句放在case标号之后的任何位置,通常是在case之后的语句最后加上break语句。每当执行到break语句时,立即跳出switch语句体。switch语句通常总是和break语句联合使用,使得switch语句真正起到分支的作用。 现用break语句修改例4.7的程序。 #include void main() { char ch; printf("输入成绩等级:"); scanf("%c",&ch); switch(ch) { case 'A': printf("成绩优秀:90---100n"); break; case 'B': printf("成绩良好:80---89n"); ·43· break; case 'C': printf("成绩中等:70---79n"); break; case 'D': printf("成绩及格:60---69n"); break; case 'E': printf("成绩不及格:0---59n"); break; default : printf("输入非法字符n"); } } 【运行结果】 重新执行程序,输入C,程序输出结果为: 输入成绩等级:C 成绩中等:70---79 4.5 选择结构应用实例 【例4.8】计算分段函数 x+1 当 -10<=x<0 y= 2x+1 当0<=x<=10 3x+1 当10 【程序代码】 #include void main() { float x,y; scanf("%f",&x); if(x>=0) /* 下面的if子句只有一条语句,可以不用花括号 */ if(x<=10) y=2*x+1; else y=3*x+1; else y=x+1; printf("y=%fn",y); ·44· } 【运行结果】 若输入-5,输出y=-4.000000 若输入5,输出y=11.000000 若输入15,输出y=46.000000 若输入x值为25或-15,输出y值是多少?,读者自己计算。 很显然上面程序没有考虑到输入数据的所有情况,当输入值小于-10或大于20时不应该计算,要输出字符说明信息。下面是重新设计程序。 【程序代码】 #include void main() { float x,y; scanf("%f",&x); if(x<-10||x>20) printf("不计算!n"); else { if(x>=0) if(x>10) 一 y=3*x+1; 条 else 语 一条语句 两条语句,用花括号 y=2*x+1; 句 else y=x+1; printf("y=%fn",y); } } 【例4.9】编写简易计算器程序,完成任意两个数的+、-、*、/运算。 【解题思路】 1.首先输入两个运算量a和b,再输入运算符ysf。 2.根据输入的运算符决定执行运算的类型。本题运算符有+、-、*、/ 4种,可用多分支结构解决。当ysf的值不是+、-、*、/ 时,给出提示,退出程序。 【程序代码】 #include "stdio.h" #include "stdlib.h" void main() { float a,b,z; char ysf; printf("n 请输入两个运算量:"); scanf("%f,%f",&a,&b); ·45· getchar(); /*用来接收前面操作的回车符,以便ysf能正确取值*/ printf("n 请选择运算符+、-、*、/:"); ysf=getchar(); switch(ysf) { case ‘+’:z=a+b;break; case ‘-’:z=a-b;break; case ‘*’:z=a*b;break; case ‘/’:z=a/b;break; default:printf("%c 不是运算符。n",ysf); exit(0); /*函数exit(0)用于退出程序*/ } printf("%0.2f %c %0.2f=%0.2fnn",a,ysf,b,z); } 【运行结果】 执行程序时,根据屏幕提示,从键盘输入10和30,运算符输入+,输出结果为: 请输入两个运算量:10,30 请选择运算符+、-、*、/:+ 10.00 + 30.00=40.00 4.6 本章小结 本章介绍的主要内容有: 1.选择结构。选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。选择结构有单选择、双选择和多选择三种形式。一般情况下双选择用简单的if语句或if~else语句实现,两个以上的多选择情况用if~else~if语句或switch语句实现,有时也会用if语句的嵌套来实现。 2.关系运算与逻辑运算。这两种运算的运算结果都会得到一个逻辑值“真”或“假”。它们通常情况下是用来进行比较判断的。 3.if语句。if语句可以不带else子句,但else子句不能离开if独立使用。if子句和else子句语法上必须是一个语句,若需要执行多个语句时,必须用“{}”括起来构成复合语句。复合语句语法上被看成是一个语句。 4.switch语句和break语句。switch语句是又一个描述多分支结构的语句,但在switch语句利用break语句来实现多分支结构。 ·46· 4.7 实 训 实 训 1 【实训内容】if语句的使用。 【实训目的】掌握简单if语句的使用。 【实训题目】分析下面程序,写出程序的功能,并上机验证。 【程序1】 #include "stdio.h" void main() { float x,y,z; printf("please enter x,y,z: "); scanf("%f,%f,%f",&x,&y,&z); if(x if(x printf("%5.2fn",x); } 此程序功能为:____________________________________________________ 【程序2】 #include "stdio.h" void main() { float x,y,z,max; printf("please enter x,y,z: "); scanf("%f,%f,%f",&x,&y,&z); max=x; if(max if(max printf("%5.2fn",max); } 此程序功能为:____________________________________________________ 实 训 2 【实训内容】if嵌套的使用。 ·47· 【实训目的】掌握if嵌套的使用。 【实训题目】输入某年的年份,判断此年是不是闰年。 【解题思路】闰年的判断方法是:若该年份能被400整除,或能被4整除而不能被100整除,此年为闰年。在程序中,以变量leap代表是否闰年。如果是闰年,令leap=1;非闰年,leap=0。最后根据leap是否为1,输出是否为闰年的信息。 【程序代码】 #include "stdio.h" void main() { int year,leap; scanf("%d",&year); if(year%4==0) {if(year%100==0) {if(year%400==0) leap=1; else leap=0;} else leap=1;} else leap=0; if(leap) printf("%d is",year); else printf("%d is not",year); printf(" a leap yearn"); } 上机执行时输入2001年和2004年试试,验证结果。 实 训 3 【实训内容】switch语句的使用。 【实训目的】掌握switch语句的使用。 【实训题目】从键盘上输入一个整数放在a中,当输入的值为1时,屏幕上显示A,输入的值为2时,屏幕上显示B,输入的值为3时,屏幕上显示C,输入其它值时屏幕上显示D。利用switch语句实现。 #include "stdio.h" void main() { ·48· int a; scanf("%d",&a); switch(a) { case 1: printf("n A");break; case 2: printf("n B");break; case 3: __________________________; default: printf("n D");break; } } 习题 4.1根据下面条件写出程序表达式。 ⑴三角形两边之和大于第三边,两边之差小于第三边。 ⑵a和b不同时为零。 ⑶a等于零或b等于零,但不同时等于零。 ⑷字符ch为大写字母或小写字母 4.2设a=3,b=9,c=4,计算下列表达式的值 ⑴ a+b>c && b==c ⑵ a+b>c && a+c>b && b+c>a ⑶ a+b>c && a-b ⑷ !(ab 4.3编写程序,完成如下功能:输入一个整数,如果这个整数既能被5又能被7整除,则输出“yes”,否则输出“no”。请按照给定提示,在相应位置处写上完整的C语句。 #include "stdio.h" main() { /*定义一个整型变量*/ /*用scanf输入一个整数*/ /*如果这个整数既能被5又能被7整除,整除即两数相除余数为0,注意用逻辑与*/ /*输出yes*/ /*否则*/ /*输出no*/ } ·49·
本文发布于:2024-02-04 09:25:53,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170700995353084.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |