江淮学院72学时全套讲义打印稿.ppt
1,概 述,说明:教育部关于大学生计算机能力的统一要求。目的:(1)掌握C语言的语法知识(2)掌握C语言程序设计方法(3)锻炼严密的逻辑思维能力,提高科学研究的素质与前导课程关系【大学计算机基础】计算机系统的硬件组成()2、8、10、16进制整数的转换()数据在计算机中的存放形式()计算机基本操作()WORD编辑()知识结构:(1)自然语言的知识结构(2)C语言的知识结构(3)教材的知识结构,2,自然语言的知识结构,C语言的知识结构,教材的知识结构,3,学习方法提要:(1)词类、句型、程序结构 分析、记忆(2)程序设计与调试 上机实验、总结(3)常用算法与标准程序段 分析、实验、记忆考试要求:(1)时间:期中考试、期末考试(2)范围:课堂教学的所有内容、作业中的习题(3)题型:单项选择题(10题20分)、填空题(10空20分)程序阅读题(4题20分)、程序填空题(2题10分)程序设计题(3题30分)教学要求:(1)课堂教学方式:讲解总结实例分析提问讨论(2)实验教学方式:(前)准备(中)自主(后)总结与记录(3)课堂纪律:按时不出声(4)作业通过实验来验证其正确性。,4,第1章 C语言概述,C语言概况 C程序概况 运行C程序的步骤与方法与(重点)补充 计算机程序 计算机程序 一串计算机能识别的、可执行的指令。【例】操作系统 专家编好大家使用的计算机程序 本班成绩统计程序 自己编写自己使用的计算机程序。计算机语言 计算机语言 写计算机程序所遵守的某种语法规则的集合(指令的集合)。【三个阶段】机器语言 又名二进制语言,用0和1组成指令(含操作和数据)符号语言 又名汇编语言,用指定的单词和数字组成指令 高级语言 用接近人类的自然语言和数学公式组成指令(语句)高级语言的发展 非结构化语言、结构化语言(如C)、面向对象的语言(如C+)1.1 C语言出现的历史背景【发展过程】60年+硬件处理 63年 简化 67年 简化 70年 扩充 72、73年 可移植 77年 标准化 ALGOL CPL BCPL B C 独立C 78年 标准化 83年 标准化 89 标准化 90年 标准化 99年 旧标准C 83ANSI C C89 ISO C(c89)C99(美国国家标准)(美国国家标准)(国际标准化组织)(国际标准化组织)【编译程序】Turbo C、Quick C、Microsoft C、BORLAND C、C+、VC+,5,1.2 C语言的特点【略】边学边理解1.3 简单C语言程序介绍【例1】从键盘上输入两个实数,输出他们的和。#include stdio.h/*将标准输入输出函数包含到本程序中*/void main()/*主函数的标记,main称为主函数名*/float a,b,s;/*定义实型变量a、b、s*/scanf(%f,%f,/*输出变量s中的实数*/*主函数的结束,前面的表示主函数的开始,后面的表示主函数的结束*/,6,【例2】从键盘上输入两个整数,求并输出他们中的大者和小者。#include int max(int x,int y)/*非主函数的标记,max是函数名、x和y是函数参数*/int z;/*定义本函数用到的变量z*/if(xy)/*如果x大于y*/z=x;/*将参数x中的整数送到变量z中*/else/*否则*/z=y;/*将参数y中的整数送到变量z中*/return(z);/*返回变量z中的整数,即参数x和y中的大者*/*本函数的结束标记*/int min(int x,int y)/*非主函数的标记,min是函数名、x和y是函数参数*/int z;if(xy)z=x;else z=y;return(z);void main()int a,b,s;/*定义整型变量a、b、s*/;scanf(%d,%d,/*输出变量s中的整数(两个整数中的小者)*/,7,关于C程序的初步小结:(1)组成C程序的符号都是键盘上符号,即ASCII代码字符集的字符(参看附录A P364)。其他符号(如汉字)只能出现在 中间或/*/中间。(2)总是有一个,并且只能有一个名为“main”的主函数;其他函数称为非主函数,可以没有,也可以有很多个。(3)任何C程序的结构都是下列几种之一:函数1 主函数 函数1 函数2 函数1.函数2 主函数 主函数.函数n(4)程序的执行总是从主函数体的第1条语句开始,到最后一条语句结束 非主函数的执行,只能利用函数调用来执行。(5)任何函数的基本结构都是这样的:函数名(函数参数1,函数参数2,.)【参数可以没有】函数中所使用的变量的定义;【可以没有】输入某些变量的值;【可以没有】对参数和变量的加工处理;【可以没有】输出某些变量的值;【可以没有】返回某些变量的值;【主函数没有、非主函数可以没有】【花括号及括住的部分称为函数体、前面称为函数头】(6)语句的最后一定有“分号”,一行可以写多条语句。一个语句可以写在多行上。最好的书写格式是缩格对齐方式,称为“结构化”书写格式。(7)输入、输出使用系统函数scanf()和printf()来完成,程序的开头要加#include 或#include stdio.h(我们常用)(8)注释是用“/*”和“*/”括住的任何一串符号。可以出现在程序的任何一处。,8,1.4 C程序的上机调试步骤与方法【用VC+6.0编译程序】【预备知识】调试窗口 VC的主窗口运行窗口 运行程序时会自动弹出一个窗口,接收输入数据,并显示输出结果。基本操作方法(后面用到处再介绍)编译、调试程序的过程是在Windows窗口下进行的,应掌握Windows的基本操作方法。例如,菜单驱动方法、工具按钮的使用、热键、对话框操作、文本框输入、鼠标操作等。编辑修改源程序和WORD操作类似。【调试程序的步骤(参看1.4.1节)】参看右图【调试程序的方法】,9,第一步:开机、启动VC+6.0【建议:在D盘根目录下建一个自己的文件夹】【方法】通电,启动WINDOWS;依次选取“开始”、“程序”、“Microsoft Visual C+6.0”再单击“Microsoft Visual C+6.0”菜单;将出现下列VC+主窗口。也可以直接双击桌面上的VC+6.0的图标。工作区 显示当前工作区的名称,以树状结构显示工程文件夹及其中的源程序名。编辑区 显示正在编辑调试的源程序。输出区 显示编辑区中的源程序在编译、连接时的错误信息。,10,常用菜单 File(文件)New(新建)创建源程序文件。Open(打开)调入已经建立的源程序文件。Close Workspace(关闭工作区)关闭当前工作区,结束某个程序的调试。Save(保存)保存编辑区的文件(存盘)。Edit(编辑)Cut(剪切)删除选中的阴影区并复制到剪贴板中。Copy(复制)将阴影区复制到剪贴板中。Paste(粘贴)将剪贴板中内容插入到光标处。【注】选定阴影区的方法是用鼠标拖曳。Build(创建)Compile(编译)【Ctrl+F7】对工作区的源程序进行编译生成OBJ文件。Build(创建)【F7】对工作区的源程序进行连接生成EXE文件。Execute(执行)【Ctrl+F5】运行编译连接后的可执行程序(EXE文件)。,11,第二步:建立新的源程序【方法】执行菜单命令“File|New”,在弹出的对话框中单击“Files”标签,显示结果如下图。选取“C+Source File”。在“Location”文本框中选取或输入源程序所在的路径。例如“D:CCW”在“File”文本框输入源程序文件名,扩展名选C。例如“P1.C”。单击“Ok”按钮。光标将出现在编辑区,可以输入源程序清单。注:建议文件名构成 姓名拼音章号_题号.C 如CCW6_5.C,12,第三步 调试旧的源程序【方法】执行菜单命令“File|Open”或工具按钮,将弹出如图所示的对话框。单击“查找范围”文本框右边的向下箭头按钮,选定存放源程序所在的文件夹。在下面的列表框中选定“源程序”文件。例如“P2.C”。单击“打开”按钮。源程序清单将出现在主窗口的编辑区,可以对其进行编辑修改与调试。,13,第四步 编辑源程序清单【方法】同WORD操作。【可以使用汉字,修改源程序时一定要回到英文输入】。第五步 存盘【方法】执行菜单命令“File|Save”或 按对应工具按钮。第六步 编译生成中间代码文件(.OBJ)【方法】执行菜单命令“Build|Compile”或热键“Ctrl+F7”或常用工具。此时将弹出一个对话框,单击“是”按钮。在输出区将显示编译后的结果。【说明】无错误:在输出区显示错误条数(0)、警告性错误条数(0);有错误:在输出区显示错误条数、警告性错误条数、以及出错的程序行数和原因。(有警告性错误可以连接!)第七步 连接生成可执行文件(.EXE)【方法】执行菜单命令“Build|Build”或按热键“F7”或按常用工具。在输出区将显示连接后的结果。【说明】无错误:在输出区显示错误条数(0)、警告性错误条数(0);有错误:在输出区显示错误条数、警告性错误条数、以及出错的原因。,14,第八步 运行目标程序【方法】单击菜单命令“Build|Execute”。或热键“Ctrl+F5”或常用工具。【说明】程序运行时,会自动弹出一个“运行窗口”。如果程序没有输入,则窗口中将显示程序运行的输出结果;如果程序有输入,则窗口中将有光标闪烁,等待输入。程序运行结束后,窗口中将显示“Press any Key to Continue”,按任何键将退出“运行窗口”,返回VC主窗口。第九步 调试下一个程序【经常忘了这一步,造成错误或死机!】【方法】执行菜单“File|Close Workspace”,将弹出一个对话框,单击“是”按钮。(1)如果接着调试新程序 从第二步开始;(2)如果接着调试旧程序 从第三步开始第十步:退出VC【方法】单击VC 主窗口右上角的关闭按钮。【异常情况的强迫关闭】按“Ctrl+Alt+Delete”键,弹出任务管理器,选中“应用程序”标签,再选取要关闭的“VC+6.0”,单击“结束任务”按钮。第十一步:关机。【方法】单击菜单命令“开始|关机”。【建议】备一个U盘,关机前复制本次实验的源程序文件(扩展名为C)到U盘备份。,15,第一章习题答疑,1.5 输出指定的三行符号。提示:一行符号的输出方法如下:printf(”符号符号n”);1.7 上机运行本章的3个例题。重点:熟悉C程序的调试步骤和每步的操作方法 可以制造错误,增加练习的机会。说明:从第4章开始的程序设计题目,格式要求如下:题目 修改后正确 程序清单 的程序清单 输入数据 错误原因的 输出结果 分析,16,第二章 程序的灵魂算法,算法概念 算法的表示结构化程序设计方法 程序数据结构算法2.1 算法的概念 算法解决某个问题的方法步骤(计算方法、数学方法、物理方法等)2.2 简单算法举例【例一】表决型的会议【算法】第1步 宣布会议开始 第2步 宣读某个决议草案 第3步 通过监票人和计票人名单 第4步 宣读投票注意事项 第5步 投票 第6步 计票 第7步 宣布投票结果 第8步 宣布会议结束,17,【例二】计算123.100【算法1】【算法2】【算法3】【算法4】令S为0 令S、K均为0 令S、K均为0 计算:计算:S=S+1 计算:S=S+K 计算:K=K+1 计算:S=S+2 计算:K=K+1 计算:S=S+K 输出S.判断:若k101转 判断:若k100 转 计算:S=S+100 否则输出S 否则输出S 输出S【分析:哪种算法好?讨论:算法的优劣】【例三】判别某年份是否闰年?【算法】输入年份到Y中;判断:若Y能被4除尽且不能被100除尽;或能被400除尽,是闰年 否则,不是闰年。【算法说明:1年是365天5小时48分46秒】2.3 算法的特点(1)有穷性(有始有终)反例,计算+(-2)+(-1)+0+123(2)确定性(无二义)反例,高个子坐后排,矮个子坐前排。(3)可操作性(可做到的)反例,向上跳半米,向上跳半米,到达月球。(4)没有或有若干个输入 例如,例二无输入、例三有输入(5)没有或有若干个输出 例如,例二、例三均有输出,18,2.4 算法的表示【例二的算法1】【例二的算法2】顺序结构 循环结构(1)用自然语言 前面对三个算法的描述。(2)用流程图【例一的算法】顺序结构.选择结构【例三的算法】.【注:流程图的国家标准】,Y,N,19,【说明】三种基本结构的流程图 顺序结构 选择(分支)结构 重复(循环)结构 单分支 双分支 当型 直到型(3)N-S图 顺序结构 选择(分支)结构 重复(循环)结构 单分支 双分支 当型 直到型(4)伪代码【例二算法二】BEGIN【例三】BEGIN S=0,K=0 INPUT Y DO S=S+K IF Y%4=0 AND Y%100!=0 OR Y%400=0 K=K+1 PRINT YES!UNTIL K100 ELSE PRINT S PRINT NO!END END,20,(5)用某种计算机语言来写(用C语言来写)【例二算法二】#include stdio.h【例三】#include stdio.h void main()void main()int s,k;int y;s=0;scanf(%d,2.5 结构化程序设计方法(1)自顶向下,逐步细化 第一步 将算法分成几个大的步骤,每步写出本步骤的局部功能。第二步 对上述步骤中的每一步进行细化。反复进行,直到每个步骤都对应一个基本结构(顺序、选择、循环)(2)模块化 将程序划分为相互独立的小程序(模块,也就是C语言中的函数)。每个模块的语句数目以50条左右为佳。(3)结构化编程 程序段的结构只有三种:顺序结构 选择结构(单分支、双分支、多分支)重复结构(当型循环、直到型循环、次数型循环)结构化程序设计语言必须保证每种结构的程序段都可使用一条语句实现。【说明】书写源程序清单时,建议采用“结构化书写方法”。具体说,每条语句都有规定的书写格式(缩格对齐),希望能遵守。,21,程序设计的技巧,程序设计的基本思路(1)输入(原始数据)(2)计算与加工(算法,可能产生一些中间结果数据)(3)输出(最终结果数据)数据结构设计的基本思路(1)原始数据的类型与存放处(2)中间结果的类型与存放处(3)最终结果的类型与存放处算法设计的思路(1)来源于其他专业知识(如判闰年)(2)来源于本课程的介绍(排序、查找、求最大数等)(3)临时构造(例如游泳池的最佳路线),22,第三章 数据类型、运算符和表达式,词类之一 常量 词类之二 变量 词类之三 运算符词类之四 表达式 各种词类的数据类型3.1 C语言的数据类型 数据类型:是指数据在计算机中存放的形式。不同类型的数据有不同的加工方法。C语言的数据类型分类 参看下表。,23,C语言的数据类型表 带符号整型(简称整型)带符号整型 带符号短整型(简称短整)带符号长整型(简称长整)整型 无符号整型(简称无符号整型)无符号整型 无符号短整型(简称无符号短整)无符号长整型(简称无符号长整)基本类型 单精度型 实型 双精度型 字符型 数据类型 数组型(字符串型)构造类型 结构型 共用型 指针型 空类型,24,3.2 常量与变量一、常量与符号常量(1)常量 直接写在程序清单中的数据,分为整型、实型、字符型、字符串。(2)符号常量 用名字来替代常量。【定义方法】#define 符号常量名 常量【注】符号常量名:用户任取的一个标识符。标识符:字母开头的字母、数字、下划线等组成,长度8或32。符号常量通常用大写字母组成,以便区别其他的对象,如变量名。符号常量性质是常量,不能象变量那样给其赋新值。二、变量(1)变量 利用数据定义语句在程序中定义的对象,用来存放数据。(2)变量名 标识符(通常用小写字母组成),在定义时确定的。(3)变量值 变量中存放的数据,通过输入、初始化、赋值获得。(4)变量数据类型 变量中能存放的数据类型,在定义时确定的。【注】变量名区分字母大小写的!如ccw、Ccw、CCw、CCW是不同变量名。标识符不能是关键字(C语句中使用的英语单词)C语言的关键字请参考附录B,P365(后续课程会一一介绍)。,25,3.3 整型数据一、整型常量及其表示方法【表示方法】有3种。十进制整数 通常形式的整数 例如+12、-12、12。八进制整数 以0开头的八进制整数 例如+012、-012、012。十六进制整数 以0 x开头的十六进制整数 例如+0 x12、-0 x12、0 x12。二、整型变量【作用】存放整型数据。【定义方法】存储类型符 数据类型符 变量名1=初值,变量名2=初值,.;其中:方括号中内容是可以省略的,变量名是标识符,初值是常量或常量表达式。数据类型符可以是下列任一种:整型 短整型 长整型 无符号整型 无符号短整型 无符号长整型类型符 int short long unsigned int unsigned short unsigned long字节数 4(2)2 4 4(2)2 4【功能】定义某种数据类型的变量,分配内存,并赋予初值。【注】int、unsigned int在VC中为4字节。三、整型常量的数据类型在VC中整型常量均为带符号长整型【注】在VC中整型常量后可以加字母L或l,如1L、12000L。,通用的数据定义语句,参看基础知识P1,参看基础知识P2-P10,26,3.4 浮点(实)型数据一、浮点型常量的表示方法【表示方法】(1)普通的十进制实数,带小数点。如0.0、-123.、.456(2)指数形式(在字母E或e的后面写上10的方次),如12.3E3、1e-5。二、浮点型变量【定义方法】存储类型符 数据类型符 变量名=初值,.;其中:数据类型符 可以是下列任一种:单精度浮点型 float 占4字节 范围:10-3710+38(7位有效数字)双精度浮点型 double 占8字节 范围:10-30710+308(16位有效数字)变量名 用户给出的标识符,初值是常量或常量表达式。【功能】定义某种数据类型的变量,并赋予初值。【注】浮点型常量不区分单、双精度。赋值时有效数字超出将截去多余数字。例如,赋予单精度实型变量时,1234.56789变成1234.568。3.5 字符型数据一、字符常量【表示方法】(1)可显示字符。用单引号()括住单个字符。如0、A、a。(2)所有字符(包括不可显示字符)。用单引号括住“转义字符”,常用转义字符参看右表。,通用的数据定义语句,27,二、字符型变量【定义方法】存储类型符 数据类型符 变量名=初值,.;其中:数据类型符只能是char,占用的内存字节数是1。变量名是标识符,初值是常量或常量表达式。【功能】定义字符型的变量,并赋予初值。【注】字符型数据在内存中实际存放的是对应字符的ASCII代码值(0127)。因此,字符型数据可以看成带符号或无符号的整型数据。而整型数据只要不超出范围(0127),也可以看成是字符型数据。【例】#include stdio.h【说明】整型、实型、字符型合称数值型 void main()int i;char c=97;i=A;printf(%c,%dn,c,i);/*程序是正确的,输出结果是:a,65*/三、字符串常量(简称字符串)【表示方法】双引号()括住的若干个字符(包括转义字符)。【例】、1、1.23、abc、n、nnxyz。【注】(1)字符串在内存的存放规则是:按顺序依次存放字符串中每个字符的ASCII 代码值,最后自动存放一个“0”,其值为0,称为字符串结束标记符。(2)字符串长度字符串中的字符数目。(3)字符串占用的内存字节数字符串长度1。(4)无字符的字符串称为空字符串,简称空串。空串长度为0,占用1个字节。(5)字符串与字符常量是不同的。a和a是不同的数据类型,占用字节数不同。(6)C中没有字符串变量,是用字符型数组来存放的,以后介绍。,介绍常用字符的ASCII代码AZ、az、09,通用的数据定义语句,28,3.6 变量赋初值【方法】在定义变量时,给出初值。【注】初值是常量或已经定义过的符号常量、或由它们组成的表达式(常量表达式),其数据类型与变量的数据类型要一致。【例】#define PI 3.14159 错误的 int i=10,j=-6+1,k;int i=10,j=i+1;float f=1.2345,s=0.0-0.1,x1,x2=PI+1;float f=1.2345,s=0.0-f;char c1=a,c2=A+1,c3;char c1=a,c2=c1+1;3.7 各种基本数据类型的数据之间混合运算【规则】double float 横向:必定先转换 纵向:沿箭头按需要转换 表达式计算时 long 就长不就短 unsigned int short、char【例】设有定义:char c=1;int i=2;long L=3L;float f=4.0;计算“c*i/L+f”的过程是:(1)c*i c转换成int型,和i相乘,运算结果是int型(2)(c*i)/L c*i转换成long型,和L相除,运算结果是long型(3)(c*i/L)+f(c*i/L)和f转换成double型,相加,运算结果是double型 最后对基本类型的数据给一个小结表。,此处用大写。因为小写字母l和数字1相似。,29,基本数据类型的小结,30,3.8 算术运算符与算术表达式 基本算术运算符(+-+-*/%)一、C的运算符 算术运算符 增1减1运算符(+-)关系运算符(=.)指针运算符(&*+-)注:掌握运算符必须掌握:运算符、对象数目、运算符的位置、对象的类型、运算规则、运算结果的类型、优先级、结合性。,31,二、算术运算符【说明】(1)优先级:单目 双目(3)模运算结果符号与被除数相同。*、/、%、例如,28 10 8(商为2)(2)除运算的结果与除数、被除数的数据类型有关。28-10 8(商为-2)两个都是整型,则为整除,只取商的整数部分。-28 10-8(商为-2)例如,28/102-28-10-8(商为2)28.0/10=2.8 28/10.0=2.8 28.0/10.0=2.8,32,三、强制运算符【优先级】单目算术、强制 双目算术【例】(float)(7%3)的结果是1.000000 7位有效数字(double)(5/2)的结果是2.000000000000000 16位有效数字(int)(3.7+2.2)的结果是5【注】其后无括号,仅对第一个数据起作用,如(int)3.7+2.2的结果是5.2四、自增自减运算符,33,【优先级】+、-、单目算术、强制 双目算术【例】#include stdio.h void main()int k=3;printf(%dn,+k);输出结果是4,k为4 printf(%dn,k+);输出结果是4,k为5【注】(1)注意理解后缀+、-的加减1的时间。i=3;k=i+;k为3、i为4 i=3;k=(i+)+(i+)+(i+)k=3+3+3=9、i=3+1+1+1=6 结论:后缀的+和-是所在的表达式全部计算结束后,再进行加减1的运算。(2)自左向右尽可能地选取多个运算符组成复合运算符。k=1;k+k+k 相当于(k+)+(k+)+k,结果是3,k为3。(3)+和-只能作用于变量,不能作用于表达式。k=1;+k相当+(+k),其中(+k)是正确的,但+(+k)是错误的。(4)注意TC中函数参数的计算顺序是自右向左的(VC中是自左向右)。k=1;printf(“%d,%d”,k,k+);输出结果是2,1(VC中是1,1)。五、算术表达式 表达式:用运算符将合适的运算对象连接起来的式子。表达式值:表达式的最终运算结果值。表达式类型(两种分类):表达式值的数据类型、最后一个运算符的类型。运算符的运算对象:常量、变量、表达式(常量、变量看成表达式特例)。表达式运算的转换规则:就长不就短。算术表达式:用算术运算符将合适的运算对象连接起来的式子。,34,3.9 赋值运算符与赋值表达式一、赋值运算符【注】(1)前一个运算对象只能是变量,后一个运算对象是表达式(或常量、变量)。(2)赋值时的转换规则是:就左不就右。当字节数少的值赋予字节数多的变量时,不会出错;反之,可能会出错。【例】int k;k=3.99;k为3。float f;f=3;f为3.000000 unsigned short u=65535;short k;k=u;k为-1 long L=32768;short s;s=L;s为-32768,复习:带符号整数与无符号整数,35,二、复合赋值运算符【优先级】+、-、+、-、强制 双目算术 赋值 就长不就短,转为双精度 所有赋值运算符的优先级相同。【注】后5个将在第12章“位运算”介绍。右边表达式自动加圆括号。【例】int k=3;k-=3;k为0。int k=3;float f=3.0;f*=3;f为9.000000 k*=1+2;int k=-5;k/=2;k为-2 相当于“k=k*(1+2);”long L=5;L%=8L;L为5L,常见的警告型错误:float f;f=1.0+2.0;,36,三、赋值表达式 赋值表达式:用赋值运算符连接变量和表达式组成的式子。赋值表达式的值:赋予左边变量的值。赋值表达式的类型:左边变量的数据类型。【注】(1)赋值表达式也是表达式,可以出现在赋值运算符的右边。例如,int k1=1,k2=2,k3;k3=k2=k1=5;k3=k2=k1=5相当于k3=(k2=(k1=5);结果k3、k2、k1均为5。注:定义变量时的初值只能是常量(或常量组成的表达式)下列定义语句是错误的:int k1=k2=k3=5;(2)赋值运算符的左边只能是变量,不能是表达式。例如,int k1=1,k2;k2=k1+2=3;k2=k1+2=3相当于k2=(k1+2)=3),赋值运算符的左边是表达式。【例】int a=2;计算表达式“a+=a-=a*a”和变量a的值。a+=a-=a*a相当于a+=(a-=a*a)。先算a-=a*a,相当于a=a-(a*a),表达式计算结果是-2,a是-2。再算a+=(-2),相当于a=a+(-2),表达式计算结果是-4,a是-4。3.10 逗号运算符与逗号表达式 一、逗号运算符 运算符是“,”;双目中缀、运算对象是表达式。运算规则是先计算左边的表达式,再计算右边的表达式。运算结果是右边表达式的值;类型是右边表达式的数据类型。结合性是自左向右的。,37,二、逗号表达式 逗号表达式:用逗号运算符连接两个表达式组成。逗号表达式的值:右边表达式的值。倒数第2 逗号表达式的类型:右边表达式的数据类型。倒数第1【注】不是所有的逗号都是逗号运算符。例如,int k=5,j=6;printf(%d,%d,k,j+1);【说明】运算符的优先级:+、-、+、-、强制 双目算术 赋值 逗号 各种赋值运算符是同级的、多个逗号运算符也是同级的。【例】3+5,4+2,3+1 逗号表达式值为4。int a,b,c;a=3,b=4,c=5 逗号表达式值为5,变量a、b、c值依次为3、4、5。int a,b,c;c=(a=3,b=4)赋值表达式值为4,变量a、b、c值依次为3、4、4。int x,a;x=(a=3,3*6)赋值表达式值为18,变量a、x值依次为3、18。int x,a;x=a=3,3*6;逗号表达式值为18,变量a、x值均为3。int a=3,b=4,c=5;printf(%d,%d,%dn,a,b,c);输出结果是3,4,5 printf(%d,%d,%dn,(a,b,c),b,c);输出结果是5,4,5【编程经验】不要自找麻烦,使用一些难以理解的表达式。(1)int n=5,a=12;a%=(n%=2)结果n为1、a为0、表达式为0。(2)int a=16;a+=a-=a*=a 结果a为0、表达式为0。,38,第三章习题答疑(一),3.3 十进制带符号整数转换成八、十六进制整数。通用验证程序清单如下:#include”stdio.h”void main()int x=?;printf(”%o%xn”,x,x);/*以八、十六进制输出*/其中:?是对应的带符号整数。输出结果是4字节八进制整数 十六进制整数,39,3.7 字符加密(用后4个字母)提示:每个字母+4即是后4个字母 不能是W、X、Y、Z。3.9 计算某个表达式的值。通用验证程序清单如下:#include”stdio.h”void main()每次换成新表达式?xx;xx=(表达式);/*计算表达式值存入xx*/printf(”%?n”,xx);其中:?表达式对应的数据类型符(需事先判断)?表达式为整型,则为d 表达式为实型,则为f,第三章习题答疑(二),40,3.10 写出程序运行的输出结果,上机验证。3.12 a=12,计算某表达式后,求变量a的值。通用验证程序清单如下:#include”stdio.h”void main()short a=12,n=5;表达式;printf(”%dn”,a);其中:表达式 每次换成新表达式 输出结果是变量a的值。,第三章习题答疑(三),41,第四章 最简单的C程序设计顺序程序设计,C语句 函数调用语句 数据定义语句表达式语句和赋值语句 分支语句(3个)复合语句和空语句 控制语句 循环语句(5个)字符输入输出函数 转向语句(1个)数据输入输出函数 返回语句(1个)顺序结构程序设计 函数调用语句 表达式语句(赋值语句)4.1 C语句概述 复合语句【说明】空语句(1)函数调用语句 函数名(实际参数1,实际参数2,.);(2)表达式语句 表达式;(3)复合语句 语句1;.语句K;其中可以出现任何语句,数据定义语句要集中写在前面。(4)空语句;,函数与函数调用的概念f(x,y)=x2+6y-7f(2,1)=22+61-7=3,42,4.2 赋值语句【格式】变量表达式;【注】表达式语句的一种。4.3 数据输入输出概念及其在C语言中的实现。一、程序中的输入输出要求#include stdio.h#include stdio.h void main()只能计算5+8的程序 void main()能计算任何两整数和的程序 int x1,x2,x;int x1,x2,x;x1=5,x2=8;输入两个整数存入x1,x2;x=x1+x2;x=x1+x2;看不到计算结果 输出变量x中的值;二、C语言中输入输出的实现【方法】利用系统函数中的输入输出函数。【注】(1)系统函数 系统已经编好的一段程序,能完成特定功能。(2)使用系统函数的方法 函数调用,即“函数名(实参1,.)”。(3)使用系统函数的程序开始必须写:#include 头文件名.h 其中的“头文件”中含有该系统函数的程序清单。(4)头函数有很多种,存放输入输出函数的头文件名是“stdio.h”。存放数学类函数的头文件名是“math.h”。,43,4.4 字符数据的输入输出一、字符输出函数【调用格式】putchar(ch)参数ch:字符型表达式(结果为0127的整型或字符型数据)【功能】在显示器上显示ch对应的单个字符。【例】#include stdio.h/*程序中使用了字符输出函数*/void main()putchar(ch1);putchar(n);putchar(ch2);char ch1;输出结果是:A int ch2;改为 B ch1=A,ch2=66;改为 putchar();putchar(ch1);putchar();putchar(ch1+1);putchar(ch2-1);输出结果是:A 输出结果是:BA二、字符输入函数【调用格式】getchar()【功能】从键盘上读取单个字符作为函数的返回值。【注】(1)通常的使用方法:字符(整)型变量getchar();(2)键盘上输入数据,输完后应跟一个“回车键”。注意回车键也是一个字符。【例】#include stdio.h/*程序中使用了字符输入函数*/void main()若输入A回车键B回车键 char c;则输出结果是:A 不能输入 c=getchar();putchar(c);若输入AB回车键 c=getchar();putchar(c);则输出结果是:AB【讨论】若一定要按第1种方法输入,程序怎么改!【说明】键盘缓冲区的概念。,44,4.5 格式输入输出函数一、格式输出函数【调用格式】printf(输出格式字符串,表达式1,表达式2,.)其中:“输出格式字符串”是由“输出格式字符”与“非格式字符”组成的一串字符。【功能】按自左向右(TC中自右向左)顺序计算各个表达式的值,然后按照自左向右的 顺序,依据“输出格式字符串”中的“输出格式字符”规定的格式输出表达式值。“输出格式字符串”中的“非格式字符”将原样原位置输出。【注】(1)输出格式字符及其对应的格式。参看下页的表格。(2)0255之间的整数可以使用“%c”格式输出(256个符号称扩展ASCII代码)。(3)单个字符可以使用“%d”、“%o”、“%x”、“%u”格式输出。(4)常用输出格式字符:带符号整数 无符号整数 长整数 无符号长整数 实数 字符 字符串%d%u%ld%lu%f%c%s(5)常用的非格式字符:,(数据间隔)n 回车换行【例】#include“stdio.h”/*使用系统函数printf()应有#include stdio.h*/void main()int i=1;short s=2;long l=3L;float f=4.0;double d=5.0;char c=A;printf(i=%d,s=%d,l=%ldn,i,s,l);输出结果:i=1,s=2,l=3 printf(f=%f,d=%5.2fn,f,d);输出结果:f=4.000000,d=5.00 printf(%c%cn%sn,c,c+32,string!);输出结果:Aa string!跳页,printf(%d%d,12,345);12345printf(%d,%d,12,345);12,345printf(%dn%d,12,345);12 345,128-255在VC中是乱码!,45,46,二、格式输入函数【格式】scanf(输入格式字符串,地址1,地址2,.)其中:“输入格式字符串”是由“输入格式字符”与“非格式字符”组成的一串字符。【功能】按照自左向右的顺序,依据“输入格式字符串”中的“输入格式字符”规定的格式 从键盘输入数据,按次序存入地址1,地址2,.对应的变量中。“输入格式字符串”中的“非格式字符”必须原样原位置输入。【注】(1)地址的写法:若输入:1,2,3回车键4 5回车A回车B回车键 则i=1,其他变量值不确定!且这些不能输入 跳页 用来接受回车换行符号,47,48,4.6 顺序结构程序设计例 程序设计方法:读3遍题目,了解已知什么?求什么?设计算法、提取数据结构。【例一】输入三角形边长,求面积。【程序设计】(1)算法:输入3个边长a、b、c;用下列公式计算面积s。,其中L=(a+b+c)/2;输出面积s。(2)数据结构:设计存放原始数据、中间数据、最终结果数据的变量名及类型。原始数据:a、b、c(实型);中间结果:L(实型);最终结果:s(实型)。【程序清单】#include stdio.h#include math.h/*其中用到开方的系统函数sqrt(表达式)*/void main()float a,b,c,L,s;/*由数据结构确定的数据定义语句*/scanf(“%f,%f,%f”,注:在VC中此处会出现警告性错误。双精度数存入单精度变量L。在VC中,这样的警告性错误不影响程序的正确运行!,49,【例二】输入a、b、c,求方程ax2+bx+c=0的两个实根(假定b2-4ac0)。【程序设计】(1)算法:输入a、b、c;用公式计算:db2-4ac,用公式计算 输出两个实根x1和x2。(2)数据结构:原始数据:a、b、c(实型);中间结果:d(实型);最终结果:x1、x2(实型)。【程序清单】#include stdio.h#include math.h