版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计第1章C语言与程序设计第1章C语言与程序设计本章主要内容:
C语言发展简史与特点
计算机解题过程
算法及其表示
常用算法策略介绍
结构化程序设计方法。第1章C语言与程序设计计算机系统的组成计算机系统由硬件和软件组成。硬件是组成计算机的物理设备,由运算器、控制器、存储器、输入设备和输出设备组成。软件是指程序及其相关文档,程序是计算任务的处理对象和处理规则的描述,文档是为了便于了解程序所需的阐明性资料。程序必须装入机器内部才能工作,文档一般是给人看的,不一定装入机器。程序是软件系统中不可或缺的重要组成部分,是用计算机语言编写的。学习计算机语言和程序设计技术,就是要学会用计算机语言编写解决实际问题的程序,这对于软件开发人员来说是重要的一步。
第1章C语言与程序设计学习计算机语言当然也包括C语言,主要是学习语法和语义两个方面。计算机语言的语法是严格定义的,不允许有语法错误。语法是一些规定,如各种语句及各种语法成分都有各自的规定。同时计算机语言的语义是唯一的,没有二义性的,各种语句及语法成分有各自的语义。只有掌握计算机语言的语法,理解语义,才能正确使用计算机语言编写出没有语法错误和逻辑错误的程序。第1章C语言与程序设计程序设计是给出解决特定问题程序的过程,包括问题分析、算法设计、程序源代码设计、测试、调试和维护。源代码可以用C语言编写,也可以用其他计算机语言编写。程序设计的目的是得到一个指令序列,提供给计算机来执行,使得问题得到解决。在程序设计过程中,往往需要不同方面、不同领域的专业知识,包括应用领域知识、特定算法知识和形式逻辑知识等。
C语言程序设计是一门实践性很强的课程。在学习过程中,不仅要掌握基本概念、语法和语义等内容,还需要注重实验环节,通过自己动手编写程序,在完成C语言程序的编辑、编译、调试和运行的过程中,加深对C语言的理解。1.1C语言发展简史
C语言是一种广泛使用的面向过程的计算机程序设计语言,既适合于系统程序设计,又适合于应用程序设计。C语言在操作系统、软件工程、图形学、数值分析等诸多领域得到了广泛的应用。早期的计算机语言,除了汇编语言之外,高级程序设计语言有FORTRAN语言、ALGOL语言和COBOL语言等。后来出现了大量的各种各样的高级语言,较有影响的有BASIC语言、PASCAL语言、C语言、C++语言和Java语言等。C语言的发展历程大致如下图所示。1.2C语言的特点C语言的特点可概括如下:
(1)C语言简洁、紧凑、灵活。C语言的核心内容很少,只有32个关键字,9种控制语句。
(2)表达方式简练、实用。C语言有一套强有力的运算符,达44种。
(3)具有丰富的数据类型。C语言具有现代语言的各种数据类型,如字符型、整型、实型、数组、指针、结构体和共用体等。
(4)具有低级语言的特点,使用地址访问内存。
(5)C语言是一种结构化语言,适合于大型程序的模块化设计。C语言提供了编写结构化程序的基本控制语句,例如if~else语句、switch语句、while语句和do~while语句等。C语言程序是函数的集合,函数是构成C语言程序的基本单位,每个函数具有独立的功能。1.2C语言的特点(6)各种版本的编译器都提供了预处理命令和预处理程序。
(7)可移植性好。程序从一个环境不经改动或稍加改动就可以移植到另一个完全不同的环境中运行。
(8)生成的目标代码质量高。由C源程序编译和连接得到的目标代码的运行效率比用汇编语言编写的也不过只低10%~20%,可充分发挥机器的效率。
(9)C语言语法限制不严,程序设计自由度大。1.3计算机解题过程
对于比较复杂的问题,需要使用软件工程的方法来解决,超出本书的范围。这里仅从学习C语言的角度简要认识计算机解题的过程。计算机的解题过程如右图所示,大致分为4个阶段,分别是分析问题、设计算法、编写程序和运行验证。1.4算法及其表示C语言解题时,在程序中有两方面的描述,即数据描述和处理步骤(算法)描述,后者处理前者的数据。因此,编写C语言程序之前,应该将问题所涉及的数据、已知条件和问题的解决步骤分析清楚。下面通过两个简单的实例来说明这一点
。【例1-1】求两个任意数的和与平均值。(1)数据描述问题中有4个数据,两个任意数、任意数之和以及平均值。在程序中定义4个浮点型变量存储这些数据,即:floata,b,sum,average;1.4算法及其表示(2)处理步骤描述
第1步:输入两个任意数,存储在变量a和b中。第2步:计算两数之和与平均值,存储在变量sum和average中。第3步:输出变量sum和average的值,得到问题所要求的结果。根据上述分析,程序设计如下:1.4算法及其表示#include<stdio.h>voidmain(){ floata,b,sum,average; /*定义变量*/scanf("%f,%f",&a,&b); /*输入两个实型数*/sum=a+b; /*求两个数的和*/average=(a+b)/2; /*求两个数的平均值*/printf("sum=%f,average=%f\n",sum,average); /*输出结果*/}1.4算法及其表示
【例1-2】某体育比赛,有10个裁判为参赛选手打分,参赛选手最后得分的计算方法是:去掉一个最高分和一个最低分后其它分数的平均值。求参赛选手的最后得分。(1)数据描述问题中的原始数据有10个,还有解题过程中需要计算的最高分、最低分和最后得分。在程序中可定义一个浮点数组s存储10个裁判分数、三个浮点变量max,min,score分别用来存储最高分、最低分和最后得分,另外还需要若干辅助变量。1.4算法及其表示(2)处理步骤描述第1步:输入10个裁判分数,存储在数组s中第2步:求10个数的最高分、最低分、累加和,存储在变量max、min和sum中。第3步:从sum中减去max和min并且除以8(=10-2)求得最后得分,存储在变量score中。第4步:输出变量score的值,则得到问题所要求的结果。对于第1步和第2步还需给出更详细的步骤,以便程序实现。根据上述分析,程序设计如下:1.4算法及其表示#include<stdio.h>voidmain(){ floats[10],max,min,sum,score; /*定义变量*/ inti; for(i=0;i<10;i++) /*输入10个数*/ scanf("%f",&s[i]); max=min=sum=s[0]; /*求最高分、最低分及和值*/ for(i=1;i<10;i++) { if(max<s[i])max=s[i]; if(min>s[i])min=s[i]; sum+=s[i]; } score=(sum-max-min)/8; /*求最后得分*/ printf("score=%.4f",score); /*输出结果*/}1.4.1算法的概念
算法是精确定义的一系列规则的集合,这些规则规定了解决特定问题的一系列操作,以便在有限的步骤内产生出问题的答案。例1-1和例1-2中的处理步骤就是一种用自然语言描述的算法。
【例1-3】求两个正整数m和n的最大公约数(即同时能够整除m和n的最大正整数)。欧几里得阐述了求两个数的最大公约数的过程——欧几里得算法。第1步:以n除m,并令r为所得余数(显然n>r≥0)。第2步:若r=0,算法结束,n即为m和n的最大公约数。第3步:置m←n,n←r,返回第1步继续。
算法中的符号←表示将该符号右边变量或表达式的值存储到左边的变量中。1.4.1算法的概念
对于同一个问题,可以有不同的解题方法,即可以有不同的算法。如【例1-2】求参赛选手的最后得分问题,可以先将10个数排序,求中间8个数的平均值,还可以有其它方法。为了有效地解题,不但要求算法正确,还要考虑算法的质量
。算法千变万化、简繁各异,但是算法必须具有以下特性。有穷性确定性可行性输入输出1.4.2算法的表示
算法的基本组成结构有三种,即顺序结构、分支结构和循环结构。或者说,任何一个算法,无论其多么简单或多么复杂,都可以由这三种基本结构组合而成。算法有多种表示方法,常用的表示方法有:
(1)自然语言描述;
(2)传统流程图;
(3)N—S流程图;
(4)伪代码;
(5)计算机语言描述。1.4.2算法的表示1.自然语言描述
例1-2和例1-3介绍的算法就是用自然语言描述的。自然语言可以是中文、英文、其他民族语言或数学表达式等。用自然语言描述算法通俗易懂,其缺点是文字有可能冗长,不太严格,容易产生歧义,表达分支和循环结构不方便等。
2.传统流程图流程图是用约定的图框和流程线表示运算或操作流程的图示形式。其优点是直观形象、易于理解。美国标准化协会ANSI规定的一些常用流程图符号如下图所示:
1.4.2算法的表示
传统流程图常用图形符号
1.4.2算法的表示
求最大公约数算法的传统流程如下图所示
1.4.2算法的表示3.N-S流程图
N-S流程图是一种结构化流程图,适合于表示结构化算法。N-S流程图完全取消了带箭头的流程线,全部算法写在一个矩形框内,框内还可以包含从属于它的框。基本图形符号如下所示:图中A和B为某种操作或功能模块,P为判断条件。
成立
不成立
BA
P
B
A当P成立
A
A当P成立顺序结构选择结构循环结构:while循环结构:do-while1.4.2算法的表示
求最大公约数算法的N-S流程如下图所示
方法1方法2输入m,nr←m处以n的余数当r≠0时执行m←n,n←rr←m处以n的余数输出n的值即为求的结果1.4.2算法的表示4.伪代码伪代码采用了类似程序设计语言的语句表示算法,但是伪代码不是一种程序设计语言,不涉及程序设计的细节。伪代码表示算法不用图形符号,比使用传统流程图和N-S流程图表示算法更方便、紧凑并且易懂,便于将算法转换为各种计算机语言的程序。求最大公约数算法的伪代码(伪C语言)表示如右方所示:算法开始输入m,n;do{r←以n除m的余数;m←n;n←r;}while(r≠0);输出m;算法结束1.5常用算法策略介绍
算法是解决问题的方法,不同领域有不同的方法。根据问题领域的不同,算法可以分为数值问题和非数值问题的算法。数值问题的算法解决传统的数学问题,例如求方程解的算法和求定积分算法等。与数值问题的算法相比,计算机科学对非数值问题的算法给予了更多的重视。计算机在非数值领域的应用十分广泛,不同的应用领域有不同的非数值问题算法,已远远超过了在数值问题方面的应用。
算法思想种类繁多,常用的算法思想有枚举法、递推法、递归法等。本节简要介绍这几种方法,程序设计中常常用到这些方法。1.5.1枚举法
枚举法又称为穷举法。该方法通过逐一考察问题的所有可能解,找出问题真正的解。枚举法要求问题的可能解必须是有限的,而且这些可能解是已知的。
【例1-4】给定一个正整数,确定它的整数立方根是否存在,若存在则找出这个立方根。
问题分析:一个正整数的整数立方根如果存在,一定在1和这个数之间,而这之间正整数的个数是有限的,所以可以设计一个基于枚举法的算法。
算法开始输入一个正整数给n;x←1;while(x≤n且x*x*x≠n){x←x+1;}if(x≤n)
找到n的整数立方根,输出x的值;else
输出n的整数立方根不存在信息;算法结束1.5.2递推法
递推法是从已知的初始条件或问题的最简单情况出发,逐次推出中间结果。在理想状态下,每递推一次,结果逐渐接近问题的最后解。
【例1-5】计算一个正整数N的阶乘。
问题分析:根据数学知识N!=1×2×3×…×N,为了求得N!,可以从1开始,求得1的阶乘后再求2的阶乘,再和3相乘得3的阶乘,依次类推,最后求得N的阶乘。算法开始输入一个正整数给n;t←1;i←1;while(i≤n){ t←t×i; i←i+1;}输出结果t算法结束1.5.3递归法
一个直接或间接调用过程(或函数)自身的算法称为递归算法,一个函数如果调用自身进行计算则称该函数为递归函数。一些问题的算法描述中,递归法往往比非递归法更加简洁易懂。
【例1-6】计算一个正整数N的阶乘。阶乘函数f的递归定义为:f(1)=1(1!=1,N=1时)f(N)=N×f(N-1)(N!=N×(N-1)!,如果N>1)
前一式子给出函数的初始值,初始值是非递归定义的。每个递归函数都应该给出非递归定义的初始值,否则这个函数无法计算出来。后一式子用较小自变量的函数值来表达较大自变量的函数值,在定义式的两边都引用了阶乘函数f,所以是一个递归定义。1.6结构化程序设计方法
编写程序如果没有一整套规范,就会造成程序可读性差、无法维护等问题。结构化程序设计方法有助于解决这个问题。对于过程性的计算机语言程序来说,使用结构化程序方法可以提高程序的可阅读性和可修改性,提高编写程序的效率,缩短修改程序的时间。结构化程序设计是由E.W.Dijikstra在1965年提出的,对程序设计及软件开发产生了深远的影响。结构化程序设计以功能模块和过程设计为主,其要点如下:
(1)自顶向下,逐步求精
(2)模块化
(3)结构化1.6结构化程序设计方法
结构化程序设计要求程序中的每个基本结构是单入口和单出口的;没有死循环,即没有一段程序无休止执行;没有死语句,即没有绝对不会被执行的语句。本章作业
习题一一、2,4,6
二、1,2,3(1)~(4)C语言程序设计第2章C语言基础知识第2章C语言基础知识本章主要内容:简单的C语言程序实例字符集、关键字和标识符数据类型常量和变量运算符、表达式、运算符优先级和结合性数据类型转换05六月2025332.1简单的C语言程序
【例2-1】一个经典C程序,输出“Hello,World”。
#include<stdio.h>voidmain(void){ printf("Hello,world\n");}将上述程序输入计算机并存储在一个文件中,再对源程序文件进行编译、连接生成可执行程序,最后运行生成的可执行程序,运行结果如下图所示。(演示)05六月2025342.1简单的C语言程序
【例2-2】计算两个整数之和并且输出结果。/*计算两个整数之和,并输出*/#include<stdio.h>voidmain(void){ intvalue1,value2,sum; /*定义变量*/ value1=30; /*为变量赋值*/ value2=45; sum=value1+value2; /*求和*/
printf("sum=%d\n",sum);/*输出结果*/}05六月2025352.1简单的C语言程序
【例2-3】编写程序,输出两个整数中的较大值。#include<stdio.h>/*定义函数,求两个整数中的较大值*/intmax(intx,inty){ intz; /*说明变量*/ if(x>y)z=x; /*将较大者赋值给z*/ elsez=y; returnz; /*返回z的值*/}05六月2025362.1简单的C语言程序voidmain(void){ inta,b,c; /*说明变量*/ printf("a,b="); /*输出提示信息*/ scanf("%d,%d",&a,&b); /*输入两个整数*/ c=max(a,b); /*调用函数*/ printf("max=%d\n",c); /*输出结果*/}05六月2025372.1简单的C语言程序对C程序的初步认识
1.C程序是由一个或多个函数组成的。一个C程序必须有一个名为main的函数,也可以有一个main函数和若干个其它函数;因此,函数是组成C程序的基本单位。2.一个函数由两部分组成,即函数头(函数首部)和函数体。例1-3中函数max的函数头是:intmax(intx,inty),其中的int是函数返回值类型,max是函数名,圆括号中的x和y是形式参数,x,y前面的int是参数的类型;函数头后面用花括号括起来的部分是函数体,一般包括说明部分(变量说明和函数声明)和执行部分。05六月2025382.1简单的C语言程序
3.C程序总是从main函数开始执行的。无论main()函数写在程序的什么位置,C程序总是从main函数开始执行的,main函数以外的函数只能被调用。人们习惯将main函数写在所有其它函数的前面。4.C程序书写格式自由。编写C程序时,一行内可以写一个语句,也可以写多个语句;一个语句也可以分写在多行上;每个语句和说明的最后必须有一个分号,分号是语句结束的标志。05六月2025392.1简单的C语言程序5.伴随C编译系统,C环境通常都提供了大量的库函数供用户使用。各种不同版本的C编译系统可能对应不同的库函数,包括输入输出操作也是由库函数scanf和printf等完成的。熟悉和掌握C语言库函数的使用,也是C语言学习的一个重要内容。6.可以用/*……*/对C程序的任何部分作注释,以增加程序的可读性另外:通过上面例题程序,引出:类型、常量、变量、运算符、表达式、语句等基本语法成分。05六月2025402.2关键字和标识符
从语法角度来看,计算机语言程序的最小单位是字符,即程序是由字符组成的。程序是符合语法规定的字符的有序序列。这些字符除了字母、数字和标点符号之外,还可以是制表符、回车符和换行符等。
计算机语言有若干语法元素,如关键字、标识符、常量、变量、运算符和表达式等,C语言也不例外。由语法元素构成语句,由语句构成程序。因此,C语言程序包含三个层次,它们是语法元素(也称为单词)、语句和程序。05六月2025412.2.1字符集C语言字符集包括以下的内容:(1)字母:大写字母A~Z、小写字母a~z。(2)数字:0~9。(3)下画线:_。(4)标点符号:,(逗号)、;(分号)、"(双引号)、'(单引号)等。(5)特殊字符:+(加号)、-(减号)、*(乘号)、/(除号)、%(百分号)、=(等于号)、()(圆括号)、[](方括号)、{}(花括号)、>(大于号)、<(小于号)、!(感叹号)、\(反斜杠)、|(竖线)、Tab(制表符)、
(空格符)等。制表符、空格符、回车符和换行符等是单词的分隔符。标点符号和特殊字符也是单词的分隔符,同时自身也可能是运算符。05六月2025422.2.2关键字
关键字又称保留字,是语言中被赋予特定含义的单词符号。ANSIC定义的核心关键字有32个,下表给出了ANSIC定义的关键字分类,其中选择语句、循环语句和控制转移关键字合起来又称为控制流关键字。
关键字用途int、char、float、double、long、short、signed、unsigned、struct、union、enum、void、auto、extern、register、static、typedef类型if、else、switch、case、default选择语句do、while、for循环语句break、continue、goto、return控制转移const、volatile、sizeof其他05六月2025432.2.3标识符
程序中,通常需要对函数、变量、符号常量、数据类型和数组等进行命名,这些名称统称为标识符。标识符是一个具有特定规则的字符序列,用来作为这些对象的名称。需要注意,C语言中大小写字符是有区别的。例如,2.1节中的变量名value1、value2、sum和函数名printf、max都是标识符。而max和Max不是同一个标识符。
标识符是符合以下语法规则的字符序列:(1)首字符必须是字母或下画线。(2)只能包含字符A~Z、a~z、0~9及_(下画线)。(3)标识符不能是关键字。(4)标识符不能跨行书写。05六月2025442.2.3标识符
例如,以下这些字符序列是合法的C语言标识符:
abcABCAbcbufferdata1_abcfilename而以下这些字符序列则是非法的C语言标识符:
+abc$xyz2apple%cat
通常遵循以下原则来使用标识符:(1)选择具有一定意义的英文单词做标识符。例如,用day表示日期、sum表示和等等。(2)适当地使用下画线。例如,用load_num表示调入数据等。(3)使用约定俗成的标识符。例如,temp表示中间变量,x、y和z表示需要计算的变量等。(4)标识符的长度不要过长。(5)用大小写区别命名。例如,loadnum和loadNum是两个不同的标识符,后者则相对易于阅读。程序中,变量通常使用小写字母开头的标识符,而符号常量往往使用大写字母的标识符。05六月2025452.3数据类型
程序处理的对象是数据。数据有许多种类,如123是一个整数,3.14是一个带小数点的浮点数,A是一个字符等等。不同种类的数据在计算机中的存储形式是不同的,处理方法也是不同的。为了描述不同种类的数据特征,引入了数据类型的概念。
数据类型决定了数据在计算机中的存储形式。如整数123,它的类型是整型(int),在内存中使用4个字节(32位)存储;又如字符A,是字符型(char)数据,在内存中使用1个字节(8位)存储,等等。C语言提供了如下的数据类型:(教材表2-3)05六月2025462.3.1C语言的数据类型数据类型基本类型构造类型指针类型空类型(void)基本整型(int)短整型(shortint)长整型(longint)无符号整型无符号基本整型(unsignedint)无符号短整型(unsignedshortint)无符号长整型(unsignedlongint)整型字符型(char)实型(浮点型)单精度实型(float)双精度实型(double)枚举类型(enum)数组类型共用体类型(union)结构体类型(struct)05六月2025472.3.1C语言的数据类型
数据类型决定此类数据的存储空间、表示形式、取值范围和可以参与的运算。例如,有符号整数类型的数据带有一个二进制的正负符号位,通常在最左边,负整数采用补码表示;浮点类型根据精度的不同使用不同的字节数表示,其尾数部分和指数部分有各自的编码方式。
需要注意的是,数据类型本身只是数据的一种抽象描述,只有用它定义的变量才分配存储空间。
一定要理解数据类型的概念,知道C语言中有哪些数据类型!
本章介绍基本数据类型:整型、浮点型和字符型。05六月2025482.3.2整数类型C语言的整数类型包括带符号和无符号两类。从使用的空间字节数来看,又分为整型、短整型和长整型。下表给出了16位机整数类型的存储字节数和表示范围
。类
型存储表
示
范
围shortint2字节-32768~32767(-215~215-1)unsignedshortint2字节0~65535(0~216-1)int2字节-32768~32767(-215~215-1)unsignedint2字节0~65535(0~216-1)longint4字节-2147483648~2147483647(-231~231-1)unsignedlongint4字节0~4294967295(0~232-1)a15a14a13a12a11a10a9a8a7a6a5a4a3a2a1a0intunsignedint符号位也是数值位例如:05六月2025492.3.2整数类型
下面以16位机上C语言为例,简单介绍整数类型的存储形式,带符号整数类型数据在存储单元中是以补码形式存储的。例如:87的存储形式为:-87的存储形式为:-1的存储形式为:87L的存储形式为:11111111111111110000000001010111111111111010100100000000010101110000000000000000(考虑:-87L和-1L的存储形式)05六月2025502.3.3浮点类型C语言用浮点类型来表示人们概念中的实数(含有小数)。C语言的浮点类型有单精度浮点型(float)、双精度浮点型(double)和长双精度浮点型(longdouble),常见的浮点类型如下表所示:类
型存储表
示
范
围精度float4字节±3.4×10-38~3.4×10387位数有效字double8字节±1.7×10-308~1.7×1030816位有效数字longdouble10字节±3.4×10-4932~3.4×10493219位有效数字
当精度要求不高时,一般使用单精度浮点型,如日常生活中的温度、速度、长度、面积和体积等都可以使用该类型;双精度浮点型提供了更高的精度,可以满足绝大多数的应用需求;对精度有极高的要求时,需要使用长双精度浮点型。05六月2025512.3.4字符类型
字符类型(char)主要用于文字或文本数据的处理,是C语言中的重要类型之一。目前,最常用的字符集是ASCII(美国信息交换标准码)字符集,参见附录A。它用7位二进制编码表示128个字符。ASCII码中,数字字符0~9用0110000~0111001码表示,大写字母A~Z用1000001~1011010码表示。
C语言允许把字符作为整数来使用,所以字符类型与整数类型一样,也分有符号和无符号两种类型,如下表所示:
类型存储表示范围char1字节-128~127(-27~27-1)unsignedchar1字节0~255(0~28-1)
字符类型的数据在内存中存储的是其ASCII码值。例如,字符'0'和'A'的存储形式如下:010000010011000005六月2025522.4常量和变量C语言中的数据有常量和变量两种形式。常量是在程序运行过程中其值不能改变的量。变量是在程序运行过程中,其值可以在其类型规定的范围内变化的量。每个常量和变量都属于某种类型。变量代表特定类型的存储空间(也称为存储单元),当变量的存储空间的内容发生变化时,变量的值随之改变。变量必须遵守“先定义,后使用”的原则,并且使用数据类型进行定义,一旦定义了变量就会为该变量分配相应的存储空间。
从使用的角度理解,程序中需要存储数据时,就要定义相应的变量。05六月2025532.4.1常量(数据的表示)
C语言的常量有整数常量、浮点数常量、字符常量和字符串常量。常量可以出现在表达式中,直接参与计算。例如,12、3.14、'A'、“Hello”都是(直接)常量的例子。
C语言也提供预处理命令#define定义符号常量,使用标识符作为符号常量的名称,符号常量可以像常量一样使用。以下的程序段定义了符号常量PI,代表圆周率3.14159,然后用PI计算圆的周长和面积。
#definePI3.14159doubleradius=10,circumference,area;circumference=2*PI*radius;/*圆的周长*/area=PI*radius*radius; /*圆的面积*/
一定要掌握各种常量在程序中的书写方法!05六月2025541.整数常量
整数常量有十进制、八进制和十六进制三种表示形式:
(1)十进制整数常量:由正负号(+或-)和数字0~9组成,首字符不能是0。例如,128、-98、0、100。
(2)八进制整数常量:以0开头,由数字0~7组成,首字符必须是0。例如,0127表示八进制数127,即(127)8,等于十进制数87。再如,0144,等于十进制数100。
(3)十六进制整数常量:以0x或0X开头,由0~9、a~z或A~Z组成。例如,0x1C表示十六进制数1C,即(1C)16
,等于十进制数28。再如,0x64,等于十进制数100。上述三种形式表示的整数是int型。若要表示long型常量时,需在整数后面加字母L或l。例如,87L是一个长整数常量。(提问:存储87和87L分别使用几个字节?)05六月2025552.浮点数常量
浮点数常量有十进制表示法和指数表示法,浮点数常量必须包含小数点或指数部分,可以带正、负符号。
(1)十进制表示法与数学表示相同,包含整数部分和小数部分,但是没有指数部分,例如:
987.-123.456.456。
(2)指数表示法包含尾数部分和指数部分,尾数部分可以是整数或十进制浮点数;指数部分是以字符E或e开头,后面跟一个可以带正、负符号的整数。例如:
-123E3表示-123×103987.654e-10表示987.654×10-10。
上述两种方法表示的浮点数是double型浮点数,若要表示float型或longdouble型浮点数时,需加后缀F或L。请指出下面常量的类型。
123.123123.L123L123.F05六月2025563.字符常量
字符常量是用单引号括起来的单个字符。例如,'A'、'g'、'?'、'6'都是字符常量。注意,其中的单引号不是字符常量的一部分,只起分隔作用,称为字符常量定界符。
对于无法显式地书写或无法从键盘直接输入的字符,。C语言提供了一种特殊的表示法——转义序列,通常称为转义符。转义符有字符转义符和数字转义符两种。字符转义符由反斜杠(\)加一个字母组成,如'\n'表示换行符。数字转义符又有8进制转义符和16进制转义符两种。例如:\n 换行 \'
单引号\t 水平制表 \“
双引号\v 垂直制表 \\ 反斜杠\b 退格 \ddd 码值为八进制ddd的字符\r 回车 \xhh 码值为十六进制hh的字符\f 走纸换页
请看下面的例子:05六月2025573.字符常量⑴换行字符:'\n'
或
'\12'
或'\xA'⑵回车字符:'\r'
或'\15'或
'\xD'⑶字母A:'A'
或'\101'
或'\x41'⑷字母a:'a'
或'\141'
或'\x61'字符数据在内存中存储字符的ASCII码值,占用1个字节(8位),如字符A的存储形式:a7a6a5a4a3a2a1a001000001
字符数据也可以理解成值为字符码值的整数,也就是说,字符数据可以作为整数使用;反过来,整数也可以作为字符使用,此时,把整数的低8位作为字符的ASCII码值。05六月2025584.字符串常量
字符串常量是用一对双引号引起来的零个或多个字符序列。例如,以下这些都是字符串常量:
"How
are
you","123.4","a","
",""
字符串中的字符数称为字符串的长度,零个字符的字符串称为空串。字符串存储在一块连续的内存中,自动在字符串的末尾加一个结束标志'\0'(空字符)。例如:
⑴字符串"a"的存储形式为:
'H'
'o'
'w'
'
'
'a'
'r'
'e'
'
'
'y'
'o'
'u'
'\0'
'a''\0'⑵字符串:"Howareyou"的存储形式为:注意:字符常量与长度为1的字符串常量的区别。如'a'与"a"的区别字符串结束标记05六月2025592.4.2变量(数据的存储)C语言的变量代表的是一块存储空间。在程序运行过程中,如果变量的存储空间的内容被改变,则意味着变量的值改变了。每一个变量必须在定义之后才能使用,可以使用各种数据类型来定义变量,并且用标识符作为变量名称。一个变量有三个要素:变量名,存储单元,变量的当前值。例如,以下的变量说明语句:
inta=10;定义整型变量a,并设置初值为10。下图可帮助理解。a10变量名存储空间变量的当前值变量名是a,存储单元(方框表示),变量值为10(写在方框内)。当给变量赋值后,存储单元中数据发生变化,变量的值也变化。05六月2025602.4.2变量
1.变量定义变量定义语句的一般形式如下:
数据类型变量名列表;
数据类型可以是表2-3中的变量类型,也可以是程序员自己定义的类型。变量名列表是由逗号(,)分隔开的若干变量或含有初始化值的变量。每一个变量名必须是一个合法的标识符,并且不能同名。例如:intx=10,y; /*定义整型变量x,y*/longz; /*定义长整型变量z*/charch; /*定义字符型变量ch*/
变量定义之后便有了相应的存储单元,就能够在程序中使用定义了的变量。如果变量没有声明就使用,编译程序就会给出出错信息。
(提问:定义变量的目的?)05六月2025612.4.2变量
2.变量初始化定义变量的同时为变量指定一个初值,称为变量的初始化。例如:inta=10;/*定义a为整型变量,初值为10*/floatb=10.23;/*定义b为实型变量,初值为10.23*/charc='A';/*定义c为字符型变量,初值为'A'*/也可以对变量名列表中的部分变量进行初始化。例如:inta,b,c=6;/*定义a,b,c为整型变量,c初值为6*/如果对几个变量赋以同一个初值,应写成:inta=6,b=6,c=6;/*定义a,b,c为整型变量,初值都为6*/而不能写成以下这样:inta=b=c=6;(×)因为不符合变量定义的语法格式!(请指出具体错误)05六月2025622.5运算符和表达式
使用运算符可以完成一些简单的数据运算,而复杂的数据运算只能通过程序控制实现。除了输入输出和控制语句,几乎所有的操作都可以使用运算符实现。
C语言运算符按其功能分类有:算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符、递增递减运算符等。
按参与运算的操作数个数来分有:单目运算符、双目运算符和三目运算符。用运算符将操作数(常量、变量和函数)按一定的规则连接起来,就构成了表达式。表达式的种类也很多,如算术表达式、关系表达式、逻辑表达式等等。表达式总是有值的,表达式的值是按照运算符的优先级和结合性(运算方向)规则求得的,因此,书写表达式时要注意运算符的优先等级和运算方向。05六月2025632.5运算符和表达式C语言的运算符有15个运算级别和两种运算方向。
15个运算级别依次用1~15表示,数字越小,运算级别越高。两种运算方向是自左至右(左结合性)和自右至左(右结合性)。
表达式的计算规则:运算级别不同时,先进行运算级别高的运算,再进行运算级别低的运算;运算级别相同时,运算顺序由结合方向决定。C语言的运算符详见附录B。与人们日常的表达式书写习惯一样,C语言的表达式是中缀表示法,即对于双目运算符而言,运算符写在两个操作数的中间,如a+b和a-b;一般的单目运算符则写在操作对象的左边,如-a、+b和++c;只有单目的自增和自减运算符可以写在操作数的右边,如a++和b--。05六月2025642.5.1算术运算符及其表达式1.算术运算符
C语言的算术运算符用来计算数值类型数据,是应用最为广泛的一类运算符,,包括加、减、乘、除和取正、负等,如下表所示:优先级运算符含
义举
例备
注2++自增++x或x++单目运算符,相当于x=x+1-
-自减-
-x或x-
-单目运算符,相当于x=x-1+取正值+(x+y)单目运算符-取负值-(x–y)单目运算符3*乘法x*y双目运算符/除法x/z双目运算符%取模(余数)x%y双目运算符4+加法x+y双目运算符-减法x–y双目运算符05六月2025652.5.1算术运算符及其表达式
算术运算符使用说明:
(1)-(取负)、++、--是单目运算符,*、/、%、+、-是双目运算符。例如:
-xi++--ix+y(2)+、-、*、/与数学中运算类似。除法运算符在用于两个整型数据运算时,其运算结果也是整数,余数部分被舍弃。例如:
5/2.0=2.55/2=2(不是2.5)
7/4=1-7/4=-17/-4=-1(3)求余运算符(%)的运算对象只能是整型数据,它的作用是求整数除法的余数,余数的符号与左操作数的符号相同。例如:
8%2=07%4=3-7%4=-37%-4=3-7%-4=-305六月2025662.5.1算术运算符及其表达式(4)自增(++)、自减(--)运算符自增、自减运算符的作用是使变量的值增1或减1,运算对象只能是变量,不能是常量或表达式,如果写成6++或(a+b)++都是错误的。自增、自减运算符是单目运算符,运算符可以写在变量的前面,也可以写在变量的后面,例如:①i++,i--注意:(i++)或(i--)是表达式
②
++i,--i
就变量的值而言,这两种写法都使变量的值增1(或减1),而对表达式的值来说结果是不一样的。第①种情况表达式值是变量i增1(或减1)之前的值;第②种情况表达式值是变量i增1(或减1)之后的值。设变量i的值为5,则表达式i++的值为5,而++i的值为6,变量i的值变为6。05六月2025672.5.1算术运算符及其表达式
2.算术表达式
算术表达式由算术运算符、操作数和圆括号组成。含有算术运算符,符合C语言表达式语法的式子称为算术表达式。这里的操作数可以是常量、变量和函数。允许用圆括号改变计算优先顺序,圆括号在表达式中是成对出现的,圆括号括起来的式子也可以作为操作数,圆括号是允许嵌套的。表达式((a+b)*c-d)/e就是一个含有多重圆括号嵌套的表达式,该表达式的计算过程如下:((a+b)*c-d)/e①②③④请列举一些数学公式,写成C语言表达式,注意圆括号的使用。05六月2025682.5.2赋值运算符及其表达式C语言的赋值运算符比较特殊,从语法上看是一个运算符,从语义上看是赋值。赋值运算符的优先级为14,仅比逗号运算符的优先级高,运算方向为自右至左。
1.赋值运算符
C语言中赋值运算符是“=”,变量通过赋值得到一个新的值。由赋值运算符(=)构成的赋值表达式的一般形式是:
v=e或变量=表达式
其中,v是变量(或存储单元),e是表达式。其语义是对赋值运算符右边的表达式e进行求值,将表达式e的值存储在赋值运算符左边的变量(或存储单元)v中。例如:
x=3y=4z=x+y赋值表达式也有值,赋值表达式的值就是赋值给变量的值。
c=(a=3)+(b=4)变量a,b,c的值依次为3,4,7。分析表达式:a=b=c=10的赋值过程。05六月2025692.5.2赋值运算符及其表达式2.复合赋值运算符算术运算符(+、-、*、/、%)和位运算符(&、|、^、<<、>>)与赋值运算符组合构成复合赋值运算符。复合赋值运算符有如下10个:
+=-=*=/=%=&=|=^=<<=>>=
用op代表上述算术运算符或位运算符,一个由复合赋值运算符构成的赋值表达式的一般形式是:
vop=e等价于:
v=vope例如:i+=2等价于i=i+2i%=2等价于i=i%2 i*=a+2等价于i=i*(a+2),而不是i=i*a+2i>>=3等价于i=i>>305六月2025702.5.3其他运算符
1.逗号运算符(,)由逗号运算符构成的表达式,其一般形式为:
表达式1,表达式2,表达式3,…,表达式n
其作用是从左至右依次求解各个表达式,最后一个表达式的值就是整个逗号表达式的值。例如:
a=2*3,b=3*4,c=5+25
上述逗号表达式求解后,变量a,b,c的值依次为6,12,30,整个逗号表达式的值为30。又如:
x=(a=2*3,b=3*4,c=5+25
)
赋值给x的是圆括号中逗号表达式的值3005六月2025712.5.3其他运算符
2.条件运算符(?:)条件运算符是C语言中唯一的三目运算符。由条件运算符构成的表达式的一般形式为:
表达式l?表达式2:表达式3
求解过程是:如果表达式1为真(非0),则表达式2的值就是整个表达式的值,否则表达式3的值是整个表达式的值。条件运算符的运算优先级高于赋值运算符和逗号运算符。例如,假设:a=3,b=4,则表达式
a>b?a:b
的值为4。05六月2025722.5.3其他运算符3.求字节数运算符(sizeof)
求字节数运算符sizeof是一个单目运算符,书写形式上有点像函数。该运算符的操作数可以是数据类型、变量名或表达式。通过该运算符可以求得指定类型、变量或表达式值所属类型数据使用的存储单元字节数。求字节数运算符sizeof构成的表达式的一般形式为:
sizeof(类型符或变量名)
例如:sizeof(char)的值是1;
sizeof(float)的值是4;
sizeof(3.14)的值是8;设有变量说明:intx;
sizeof(x)的值是4;(演示例题程序:例2-5~例2-9)05六月2025732.6数据类型转换不同类型的数据可以进行混合运算。C语言规定,不同类型的数据混合运算时,先将各种类型数据转换成同一类型数据,然后再运算求值。数据类型转换有三种情况:1.自动转换(隐式转换)转换规则如右图所示:规范化转换:表达式中有short,char类型,在运算前先转换成int型,unsignedshort类型先转换成unsignedint型,float类型先转换成double型,这种转换称为规范化(横向箭头)。longunsigneddoublefloatintchar,short高低保值转换:运算符两端操作类型不一致,在运算前先将类型等级较低的数据转换成等级较高的,称为保值转换(纵向箭头)。分析下面表达式计算过程中,数据类型转换情况。('a'-32)-32L+(1.23f+2.34)05六月2025742.6数据类型转换2.赋值类型转换(隐式转换)赋值运算时,如果赋值运算符右侧表达式值的类型与左侧变量的类型不一致,则将右侧表达式的值自动转换成左侧变量的类型,并将值存储在左侧变量中。例如:charc;inti;floatf;c='a'-32;i=123.456;f=3.14*10*10;3.强制类型转换(显式转换)有时根据实际需求,需要将某种类型转换成另外一种类型,如取整数和四舍五入等。C语言提供了强制类型转换,其语法形式如下:
(类型名)表达式
将表达式的值强制转换成类型名指定类型的数据。例如:(int)3.1415转换结果为整数3(double)(10+20)转换结果为30.005六月202575本章作业
习题二所有习题(一、二、三)05六月202576C语言程序设计第3章程序控制结构第3章程序控制结构本章主要内容:
C语句概述关系运算和逻辑运算顺序结构程序设计选择结构程序设计循环结构程序设计
一定要掌握C语言的基本语句,如赋值语句,函数调用语句,分支语句和循环语句,并能灵活使用这些语句设计各种结构的程序。
第3章程序控制结构
实际问题的求解算法往往是复杂的,包括顺序的计算步骤,以及许多不同计算路径和一些重复的计算过程。这些计算路径的选择和计算过程的重复,需要某些条件的判断,因此,算法的流程是重要的。算法即问题的求解过程,最终要用计算机程序语言(如C语言)的程序来描述,也可以说需要用程序语言的语句实现。编写程序的过程中,算法的流程控制映射为程序的控制结构。在C语言中,程序的控制结构分为顺序结构、选择结构和循环结构,任何复杂的程序都是由这三种基本结构组成的。通过本章的学习,理解并掌握C语言中的语句类型和实现三种结构程序的语句的使用方法。3.1C语言语句概述C语言语句可以看作计算机系统的操作指令,用来完成一定的操作任务。C语言语句可以分为以下5种。
1.表达式语句表达式语句由表达式加上分号“;”组成。其一般形式为:
表达式;例如:
x=y+z; /*赋值表达式加分号,赋值语句*/a=520; /*赋值表达式加分号,赋值语句*/y+z; /*合法语句,但无实际意义*/i++;++i; /*增1语句,i值增1*/
分号是C语言中语句的标志,一个语句必须以分号结束,没有分号,则不是语句。3.1C语言语句
2.函数调用语句由函数调用加上分号“;”组成。其一般形式为:
函数名(参数列表);
例如:
printf("\n");
调用库函数printf(),输出换行字符。
3.控制语句
C语言有9个控制语句,用于完成选择、重复和跳转操作等控制功能,以实现程序的各种控制结构。可分为三类:⑴分支语句:if、switch语句。⑵循环语句:for、while、do-while语句。⑶跳转语句:break、continue、goto、return语句。3.1C语言语句4.复合语句复合语句是用花括号将若干语句组合在一起,又称为分程序,逻辑上是一条语句。复合语句的一般形式:
{语句1语句2
…
语句n}
例如:
{ i++; printf("%d\n",i);}5.空语句只有一个分号的语句称为空语句。它的一般形式是:
;空语句是什么也不做的语句。
if、while、for和do-while控制的语句只能是一条且必须有一条,所以这些语句的内嵌语句一般是复合语句或空语句。
3.2顺序结构程序设计
顺序结构程序相对比较简单。这种程序中主要使用赋值语句及数据的输入和输出语句(函数)。程序运行时,依书写顺序,每条语句执行一次。本节主要介绍赋值语句字符输入输出函数格式输入输入函数
3.2.1赋值语句
赋值语句是一个应用十分普遍且简单的语句。赋值语句的一般形式为:
赋值表达式;赋值语句是一种表达式语句,在赋值表达式的后面加上一个分号,就构成了赋值语句。例如: c=a+b*8 i++ j+=5是赋值表达式,而
c=a+b*8; i++; j+=5;是赋值语句。3.2.2数据输入输出
一个完整的程序,通常要求具备输入和输出功能。数据离开主机称为“输出”,数据进入主机称为“输入”。如下图所示:C语言本身没有输入输出语句,输入输出操作是通过调用库函数来实现的。使用输入输出函数时,应在程序的开头写上命令:#include<stdio.h>最基本的输入输出函数有4个:(1)字符输入/输出函数getchar()和putchar();(2)格式输入/输出函数scanf()和printf()。主机CPU内存外设:如显示器、打印机、键盘、扫描仪、磁盘输出输入3.2.2数据输入输出字符输入/输出函数比较简单,在此一并给出这两个函数调用的一般形式: getchar(
) putchar(字符型或整型数据)getchar()函数的功能是从终端设备(键盘)读取(输入)一个字符,函数的值即为读取的字符,可以将函数的值赋给一个字符变量,从而将这个字符保存起来,在程序中的使用形式一般为:
charch;…ch=getchar(
);
3.2.2数据输入输出
putchar()函数的功能是向终端(显示器)输出一个字符。其中,函数的参数(圆括号中的数据)可以是字符常量、变量或表达式,也可以是转义字符,还可以是整数。请看下面的程序:【例3-1】在屏幕上输出“BOY”。(演示)
#include<stdio.h>voidmain(){ chara,b,c;
a='B';b='O';c='Y';
putchar(a);putchar(b);putchar(c);}程序运行结果:BOY3.2.2数据输入输出【例3-2】输出换行字符。
(演示)
#include<stdio.h>voidmain(){ chara,b,c; a='B’;b='O’;c='Y’;;
putchar(a);putchar('\n'); putchar(b);putchar('\n'); putchar(c);putchar('\n');}程序运行结果:BOY3.2.2数据输入输出例3-3键盘输入一个小写字母,输出对应的大写字母。#include<stdio.h>voidmain(){ charc;
c=getchar(); c=c+32; putchar(c);}程序运行情况:a(键盘输入)A(程序输出)3.2.3格式输入输出1.格式输出函数(printf函数)printf函数可以输出整型、浮点型、字符型和字符串数据。功能是按指定的格式输出数据。printf函数的一般形式为:
printf(格式控制串,输出项表)例如:printf("x=%d,y=%d\n"
,x,y)①格式控制串通常有格式说明和普通字符两种内容。格式说明由%和格式字符组成,如%d、%f等,它指定所在位置输出数据的格式,实际输出的数据在输出项表中给出。普通字符是希望原样输出的字符,其作用是说明、标注,使输出数据的意义更明确。如x=、y=、换行字符\n等。②输出项表是用逗号分隔开的若干个表达式(当然,也可以是常量或变量),表达式的值将在对应的格式说明处输出,表达式的类型应与格式说明要求的数据类型对应一致。请看下面的程序格式控制串输出项表3.2.3格式输入输出#include<stdio.h>voidmain(){
inta=123,b=456,c;/*定义整型变量a,b,c并初始化a,b*/
c=a;a=b;b=c;
/*将变量a和b的值交换*/
printf("a=%d,b=%d\n",a,b);}程序的输出结果是:a=456,b=123分析:printf()函数中的格式控制串是:"a=%d,b=%d\n",其含义是先输出“a=”,然后在第一个格式说明“%d”处按十进制整数格式输出第一个表达式的值,再输出“,b=”后,在第二个格式说明“%d”处按十进制整数格式输出第二个表达式的值,最后输出换行字符“\n”。格式说明与表达式的对应关系如下图所示:
printf("a=%d,b=%d\n",a,b);3.2.3格式输入输出③格式说明及其作用如下表所示:(详见教材表3-1)3.2.3格式输入输出④格式说明中还可以使用格式修饰符,其一般形式为:
“%m.n格式字符”如:printf("x=%5d,y=%7.2f",x,y);格式修饰符及其作用如下表所示:(详见教材表3-2)例3-4分析下面程序的输出3.2.3格式输入输出#include<stdio.h>voidmain(){shortints=-1;inti=-1;unsignedu=65535;floatf=123.456;charc='a';printf("s=%hd,s=%ho,s=%hx,s=%hu\n",s,s,s,s);printf("i=%d,i=%o,i=%x,i=%u\n",i,i,i,i);printf("u=%d,u=%o,u=%x,u=%u\n",u,u,u,u);
pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨季衣物真空压缩管理手册
- 人教小学四年级数学下册《连减的简便运算》教学设计
- 2026年银行投行业务运营专员银行招聘考试笔试试题(含答案)
- 2026年烟草生产车间特种设备安全监管烟草公司招聘考试笔试试题(含答案)
- 市直部门预算工作自查报告
- 2026 年秋季开学:生态文明教育课堂渗透培训
- 2026年秋季小学开学第一课 网络素养与信息安全主题班会
- 2026年秋季小学英语开学第一课 新学期学习规划课件
- 2026年秋季幼儿园开学第一课 食品安全与健康饮食
- 医疗废物管理考试试题有答案
- 2026年医师定期考核中医试题(附答案)
- T∕AOPA 0085-2025 T∕CMSA 0057-2025 低空飞行管理运行平台气象信息服务指南
- 2026江安宜江通公交客运有限公司员工招聘60人笔试历年常考点试题专练附带答案详解
- (2026年)如何早期识别儿童危重症
- 2026年水利工程安全与质量控制题库及答案
- 霍尼韦尔Forge平台战略竞争力分析市场调研报告
- 雨课堂学堂在线学堂云《人工智能与创新(南开)》单元测试考核答案
- 2026上半年四川成都职业技术学院编制外(考试)招聘30人笔试参考试题及答案解析
- 2025年汇能控股集团有限公司卓正煤化工招聘144人备考题库及一套参考答案详解
- 建筑修缮考试题库及答案
- 湖北邮政集团招聘笔试题库2026
评论
0/150
提交评论