版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计
2023翻转课堂实用教程第1章什么是编程语言1.1二进制、八进制和十六进制1.2数据在内存中怎样存储1.3计算机的编码问题1.4数据、内存和程序的关系1.51.1什么是编程语言人与计算机怎样交流?人与人之间通过“自然语言”交流人与计算机之间怎么交流?编程语言常用编程语言及主要用途编程语言主要用途C/C++C/C++主要用于PC软件开发、Linux开发、游戏开发、单片机和嵌入式系统Java用于网站后台开发、Android
开发、PC软件开发,近年来又涉足了大数据领域(归功于Hadoop框架的流行)C#用于
Windows平台的软件开发,以及少量的网站后台开发。Python用于系统运维、网站后台开发、数据分析、人工智能、云计算等领域PHPPHP主要用来开发网站后台程序。JavaScript最初只能用于网站前端开发,近年来由于Node.js的流行,JavaScript在网站后台开发中也占有了一席之地Go语言主要用于服务器端的编程,对C/C++、Java都形成了不小的挑战。Objective-C和SwiftObjective-C和Swift都只能用于苹果产品的开发,包括Mac、MacBook、iPhone、iPad、iWatch等汇编语言在对效率和实时性要求极高的关键模块才会考虑汇编语言,例如操作系统内核、驱动、仪器仪表、工业控制等C语言什么样子?1C语言的格式和词汇(语法、语义)养成编程思维2例子1-1-1,代码如下:/*在屏幕上显示“我爱编程”*/#include<stdio.h>intmain(){printf(“我爱编程\n”);return0;}例子1-1-1,运行结果:我爱编程1.2二进制、八进制和十六进制八进制数一位八进制数可以表示三位二进制数23=8一位十六进制数可以表示四位二进制数24=16十六进制为什么使用八进制和十六进制?二进制数1111111111111111十六进制FFFF二进制数001111111111111111八进制177777方便、简单1.2.1二进制PK逢2进1二进制加法借1当2二进制减法0111100
-=011
-=1101100101
-=011
-=0110111111000-1不够减,向高位借1,当作2使用,2-1为1被低位借走1后,当前位就不够减了,还得再向高位借1,当作2使用,1+2-1-1为1被低位借走1后,当前位剩下0,0-0为0当前位本来就不够减,还被低位借走1,所以得向高位借1,借到之后当作2使用,2-1-1为01.2.2八进制PK逢8进1八进制加法借1当8八进制减法1.2.3十六进制PK逢16进1十六进制加法借1当16十六进制减法1.3数据在内存中怎样存储位和字节8个元器件看做一个单位,例如
1,用00000001表示1个元器件称为1比特(Bit)或1位8个元器件称为1字节(Byte)单位换算:1Byte=8Bit8×1024个元器件就是1024Byte,简写为1KB1KB=1024Byte=210Byte1MB=1024KB=220Byte1GB=1024MB=230Byte1TB=1024GB=240Byte1PB=1024TB=250Byte1EB=1024PB=260Byte存储单位数据的存储一个元器件有2种状态,0或者
1内存条是一个非常精密的部件,包含了上亿个电子元器件8个元器件有28=256种不同的组合16个元器件有216=65536种不同的组合1.4数据、内存和程序的关系数据和内存的关系从硬盘->内存由CPU处理数据调用过程存在内存,断电消失存在硬盘,永久保存数据存储想一下打开word应用程序之后,数据的调用和存储是怎样的?C语言什么样子?1C语言的格式和词汇(语法、语义)养成编程思维2例子1-1-1,代码如下:/*在屏幕上显示“我爱编程”*/#include<stdio.h>intmain(){printf(“我爱编程\n”);return0;}例子1-1-1,运行结果:我爱编程什么是虚拟内存?如果内存小,一部分数据就要放回硬盘,用时在调入内存硬盘的读写速度比内存慢很多,反复交换数据会消耗很多时间虚拟内存买大内存,一般4G以上1.5计算机的编码问题1.5.1ASCII编码-英文的字符集怎样将文字与二进制对应起来呢?字符集(CharacterSet)或者字符编码(CharacterEncoding)字符集为每个字符分配一个唯一的编号,类似于学生的学号,通过编号就能够找到对应的字符。ASCII是“AmericanStandardCodeforInformationInterchange”的缩写,中文是“美国信息交换标准代码”1.5.2GB2312编码和GBK编码对于中国的字符,使用两个字节存储,并且规定每个字节的最高位都是11、GB2312和GBK的编码中文版Windows都将GBK作为默认的中文编码方案2、GBK编码为了容纳更多的字符,并且要区分两个字节和四个字节3、GB18030编码GB2312-->GBK-->GB18030是中文编码的三套方案例如:字母和汉字在内存中存储的区别(1)对于字母A,它在内存中存储为
01000001;(2)对于汉字中,它在内存中存储为
11010110
11010000。用记事本程序创建一个txt文档、在cmd或者控制台程序(最常见的C语言程序)中显示汉字、用VisualStudio创建的源文件等,使用的都是GBK编码。例如:对于常用的中文字符,使用两个字节存储,并且规定第一个字节的最高位是1,第二个字节的高位最多只能有一个连续的0(第二个字节的最高位可以是1也可以是0,但是当它是0时,次高位就不能是0了)对于罕见的字符,使用四个字节存储,并且规定第一个和第三个字节的最高位是1,第二个和第四个字节的高位必须有两个连续的0。3、GB18030编码例如字母A的藏文存储对于藏文,A在内存中的存储为
10000001
00110010
11101111
00110000怎么判断占用了几个字节呢?字符处理软件在处理文本时,从左往右依次扫描每个字节:如果遇到的字节的最高位是0,那么就会断定该字符只占用了一个字节;如果遇到的字节的最高位是1,那么该字符可能占用了两个字节,也可能占用了四个字节,所以还要继续往后扫描才能确定;如果第二个字节的高位有两个连续的0,那么就会断定该字符占用了四个字节;如果第二个字节的高位没有连续的0,那么就会断定该字符占用了两个字节。当字符占用两个或者四个字节时,GB18030编码要检测两次,处理效率比GB2312和GBK都低1.5.3Unicode字符集一种变长的编码方案,使用1~6个字节来存储1、
UTF-8一种固定长度的编码方案,不管字符编号大小,始终使用4个字节来存储2、UTF-32介于UTF-8和UTF-32之间,使用2个或者4个字节来存储,长度既固定又可变3、UTF-16Unicode也称为统一码、万国码,是能统一所有国家的字符编码,定义了全球文字的唯一编号。需要UTF-8、UTF-16、UTF-32这几种编码方案将Unicode存储到计算机中UTF是UnicodeTransformationFormat的缩写,意思是“Unicode转换格式”1.UTF-8的编码规则是:(1)如果只有一个字节,那么最高的比特位为0,这样可以兼容ASCII;(2)如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为1,就使用几个字节编码,剩下的字节均以10开头。具体的表现形式为:(1)0xxxxxxx:单字节编码形式,这和ASCII编码完全一样,因此UTF-8是兼容ASCII的;(2)110xxxxx10xxxxxx:双字节编码形式(第一个字节有两个连续的1);(3)1110xxxx10xxxxxx10xxxxxx:三字节编码形式(第一个字节有三个连续的1);(4)11110xxx10xxxxxx10xxxxxx10xxxxxx:四字节编码形式(第一个字节有四个连续的1)。xxx就用来存储Unicode中的字符编号1.5.3Unicode字符集2.UTF-32UTF-32是固定长度的编码,始终占用4个字节,足以容纳所有的Unicode字符,所以直接存储Unicode编号即可,不需要任何编码转换。浪费了空间,提高了效率。3.UTF-16UFT-16使用2个或者4个字节来存储。对于Unicode编号范围在0~FFFF之间的字符,UTF-16使用两个字节存储,并且直接存储Unicode编号,不用进行编码转换。对于Unicode编号范围在10000~10FFFF之间的字符,UTF-16使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于D800~DBFF之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于DC00~DFFF之间的双字节存储。4.Unicode编码方案的比较只有UTF-8兼容ASCII,UTF-32和UTF-16都不兼容ASCII(1)
优点:UTF-8使用尽量少的字节来存储字符,节省存储空间,省流量。
缺点:效率低,不但在存储和读取时都要经过转换,而且在处理字符串时也非常麻烦。字符定位(2)优点:UTF-32效率高缺点:占用存储空间,网络传输时消耗流量多(3)优点:UTF-16平衡了存储空间和处理效率的矛盾启示:从Unicode字符集想到的(1)无论国家还是个人只有遵守统一的规则,才能有序地交流和发展;(2)做事情都要在遵守基本规则的基础上,进行创新和发展;(3)字符编码是非常严谨的工作,一点差错会导致严重的后果,因此,我们做事要具有工匠精神,精益求精。1.5.4课堂练习题已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,则用八进制表示的字符常量'\101'是______。字符A B)字符a C)字符e D)非法的常量2.设有说明语句:chara='\72';则变量aA)包含1个字符
B)包含2个字符 C)包含3个字符 D)说明不合法【微视频】进制转换及字符编码谢谢观看C语言程序设计
2023翻转课堂实用教程第2章C语言初印象解剖一个程序2.1C程序设计方法2.2C语言程序的运行过程2.32.1解剖一个程序案例2.1.1案例2.1.1请编写计算小明第8个月话费的程序:假定月话费=话费+网络流量*流量费,假设小明每月的话费是固定的29元,使用网络流量的费用是3.5元/M,如果小明第8个月使用了25.6M的流量,请计算出小明第8个月的总话费(要求从键盘接收第8个月的流量,结果显示在屏幕上)。案例2.1.1程序代码:#include<stdio.h>intmain(){ //sum总话费,telbill是基础话费、traffic是第8个月使用的流量 doublesum=0,telbill=29,traffic; //从键盘接收第8个月流量存入变量traffic中 scanf("%f",&traffic); sum=telbill+traffic*3.5; printf("小明第8个月总话费=%f",sum); return0;}案例2.1.1运行结果:25.6↙小明第8个月总话费=29.000000案例2.1.1代码讲解#include<stdio.h>intmain(){doublesum=0,telbill=29,traffic;
scanf("%f",&traffic);
sum=telbill+traffic*3.5;
printf("小明第8个月总话费=%f",sum);return0;}stdio.h是程序中scanf()和printf()函数所在的头文件每个C语言程序都需要有一个main()函数变量定义部分输入:从键盘接收数据计算:根据题意计算输出:把结果显示在屏幕上main()函数返回值为0,此句也可以不写(1)C程序的基本框架你需要编写的代码放在这里;#include<stdio.h>intmain(){
}(2)C程序的组成部分#include<stdio.h>intmain(){
}变量定义部分;输入部分(有些程序不需要主体计算或算法实现部分;输出部分;2.2C程序设计方法2.2.1问题分析PK分析以下几个方面:四个步骤:问题分析——》算法设计——》编写程序——》运行调试案例2.2.1:读入学生成绩,判断是否及格(大于等于60分为及格)功能:程序需要完成哪些功能?输入:如果程序有输入,分析程序需要接收什么样的数据,数据类型是什么,接收多少个等等?处理:对输入数据做什么处理?输出:如果有输出,输出什么类型、数据的格式等功能:判断成绩是否及格输入:学生成绩(一个整数)处理:成绩大于等于60分为及格,否则为没及格输出:及格输出“及格”,否则输出“没及格”案例2.2.1:问题分析2.2.2算法设计PK半结构化语言结构化图形(流程图)算法:设计解决问题的具体方案(步骤)。解决问题需要按照一定的步骤来完成一系列动作,这些解决问题的步骤(动作及动作间的顺序)称为算法。read学生成绩值if成绩>=60Print“及格”elsePrint“没及格”成绩>=60?开始读入学生成绩输出“没及格”输出“及格”结束NY2.2.3程序编写2.2.4运行调试PK程序编写运行调试2.2.5课堂练习课堂练习题2.4.1编写一个显示“我是中国人!”的简单程序。课堂练习题2.4.2编写一个计算两个数的和、差、乘积的程序。
要求:从键盘接收3个整数,计算它们的和、差、乘积,把结果显示在屏幕上。2.3C语言程序的运行过程编辑.c文件编译.obj文件连接.exe文件运行程序结果1、编辑源程序:C语言源程序的录入和修改,文件扩展名必须为“.c”。2、编译源程序:像翻译一样,将已编辑好的源程序翻译成二进制的目标代码,并产生以“.obj”为扩展名的目标程序。3、连接目标程序:编译后产生的目标程序和库函数进行连接才能运行,连接后,产生以“.exe”为扩展名的可执行程序。4、运行:可执行程序生成后,就可以在操作系统的支持下运行,输出结果。谢谢观看C语言程序设计
2023翻转课堂实用教程第3章变量、数据类型和表达式C语言的基本元素3.1C语言的运算符和表达式3.33.2C语言的数据类型3.1C语言的基本元素五类元素1)关键字2)标识符3)运算符5)标点符号有优先级与汉语标点符号含义一样4)分隔符系统预定义的由程序员按照命名规则自行定义的分隔符是用来分隔其他的词法符号1)关键字分类名称数据类型定义typedef数据类型char,double,enum,float,int,long,short,struct,union,unsigned,void,signed,volatile,auto,extern,register,static,const运算符sizeof语句break,case,continue,default,do,else,for,goto,if,return,switch,while基本关键字表(32)系统预定义的词法符号,有特定的含义,不允许用户重新定义2)标识符C语言的命名规则如下:字母(a-Z,A-Z),数字(0-9),下划线(_);开头不能是数字;不能和系统的关键字重名。用于定义宏名、变量名、函数名和自定义类型名等注意(1)标识符区分大小写;(2)标识符的有效长度取决于具体的C编译系统;(3)标识符的书写一般采用具有一定实际含义的单词,这样可提高程序的可读性;(4)标识符不能与C语言的关键字同名,也不能与自定义函数或C语言库函数同名。3)运算符算术运算符>
逻辑运算符>关系运算符
>
位运算符>赋值运算符>优先级的先后顺序:+,-,*,/>
&&,||,!
>>,>=,<,<=,==,!=>&,|,->=>递增递减运算符>地址运算符>逗号运算符>sizeof运算符
+=,-=>&>;>sizeof()4)分隔符5)标点符号名称空格符制表符换行符号注释键盘上的键或写法空格键tabEnter(回车)//单行注释/**/多行注释分隔符标点符号逗号、分号、冒号、花括号、圆括号一句话没结束:使用逗号“,”,一句话结束:使用分号“;”{}表示包含的意思()给定较高的优先顺序如(x+y)*5,先计算小括号里的3.2C语言数据类型数据类型分类1基本类型构造类型2指针类型3空类型43.2.1常量PK整型常量实型常量(实数或浮点数)(1)十进制整数:每个数字位是0~9,不能含有非十进制数;(2)八进制整数:最高位为0,每个数字位是0~7;
(3)十六进制整数:以0x或0X开头,每个数字位可以是0~9,A~F,其中A代表10,B代表11,C代表12,D代表13,E代表14,F代表15.(1)十进制数形式:必须有小数点,如0.123、.123、123.0、0.0。(2)指数形式:e或E之前必须有数字,指数必须为整数.如12.3e3、123E2、1.23e4属于合法的;
而
e-5、1.2E-3.5属于不合法的。在C语言中,实数只用十进制表示3.2.1常量PK字符常量符号常量(1)字符常量只能用单引号括起来,不能用双引号或其它括号。
如‘a’、‘b’、‘=’、‘+’、‘?’(2)字符常量只能是单个字符,不能是字符串。(3)字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。
如'5'和5是不同的。一般形式:#define标识符常量案例3-2-1已知圆的半径为1.5,求圆的面积。案例3-2-1运行结果:area=7.065#include"stdio.h"#definePI3.14//符号常量
main(){ doubler,area; area=PI*r*r; printf("area=%f",area); }符号常量注意事项1宏定义必须以#define开头,标识符和常量之间不加等于号,行末不加分号。宏定义#define应该放在函数外部,这样可以控制到程序结束。23符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。为什么要定义变量数据类型表3.2.2变量定义变量就是要说明变量的数据类型,确定数据的解释方式,让计算机和程序员不会产生歧义。数据是放在内存中的,变量是给这块内存起的名字说
明字符型短整型整型长整型单精度浮点型双精度浮点型无类型数据类型charshortintlongfloatdoublevoidC语言自带的例子:变量定义基本数据类型的长度表数据长度inta,b,c;floatm=7.9,n=15.45charh,q='#'例如:怎样更改变量的值?说
明字符型短整型整型长整型单精度浮点型双精度浮点型数据类型charshortintlongfloatdouble长
度124448类别名称类型名取值范围整型[有符号]整型int-2147483648~2147483647(-231~231-1)[有符号]短整型shot[int]-32768~32767(-215~215-1)[有符号]长整型long[int]-2147483648~2147483647(-231~231-1)无符号整型unsigned[int]0~4294967295(0
~232-1)无符号短整型unsignedshort[int]0~65535(0
~216-1)无符号长整型unsignedlong[int]0~4294967295(0
~232-1)字符型字符型char0~255实型(浮点型)单精度浮点型float约
(10-38~1038)双精度浮点型double约(10-308~10308)基本数据类型及取值范围表(1)整型变量的分类(2)整型变量的定义1.整型变量基本型:类型说明符为int,在内存中占4个字节。短整型:类型说明符为shortint或者short,在内存中占2个字节。长整型:类型说明符为longint或者long,在内存中占4个字节。无符号型:类型说明符为unsigned。整型变量的定义一般形式为:
类型说明符变量1[=值1],变量2[=值2],…;例如:inta,b;//a,b为整型变量longx,y;//x,y为长整型变量注意:类型说明符与变量名之间至少要有一个空格间隔在一个类型说明符后,可定义多个相同类型的变量,但变量间要用逗号间隔;最后一个变量名后必须用分号“;”结束[]内的为可选项,即为变量的初始化。案例3-2-2运行结果c=10案例3-2-2输出格式验证案例3-2-2程序代码main(){inta,b,c;a=4;b=6;c=a+b;printf("a+b=%d\n",c);}(1)实型变量的分类(2)实型变量的定义2.实型变量单精度:类型说明符为float,在内存中占4个字节。双精度:类型说明符为double,在内存中占8个字节。实型变量的定义一般形式为:
类型说明符变量1[=值1],变量2[=值2],…例如:floata,b,c;//a,b,c为单精度实型变量doublex,y,z;//x,y,z为双精度实型变量注意:实型变量由有限的存储单元组成,能提供的有效数字有限,这样就存在舍入误差;一个单精度实型变量只能保证7位有效数字,后面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。案例3-2-3运行结果area=19.625000案例3-2-3已知圆的半径,求圆的面积案例3-2-3程序代码main(){floatr=2.5,pi,area;pi=3.14;area=pi*r*r;printf("area=%f\n",area);}字符变量的定义3.字符变量字符变量的定义一般形式为:
类型说明符变量1[=值1],变量2[=值2],…例如:chara,b;//a,b为字符变量注意:字符变量用来存放字符常量,只能放一个字符;C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值;允许把字符变量按整型量输出,也允许把整型量按字符量输出。案例3-2-4运行结果A,65B,66案例3-2-4字符变量应用案例3-2-3程序代码main(){inta;
charm;
a='A';//字符赋值给整型变量
m=66;//整数赋值给字符变量
printf("%c,%d\n",a,a);
printf("%c,%d\n",m,m);}4.转义字符(控制字符)字符形式
含
义
ASCII代码值
\n换行,将当前位置移到下一行开头10\t水平制表(跳到下—个tab位置)9\b退格,将当前位置移到前一列8\r回车,将当前位置移到本行开头13\f换页,将当前位置移到下页开头12\\反斜杠字符“\”92\’单引号字符39\”双引号字符34\ddd1到3位8进制数所代表的字符
\xhh1到2位16进制数所代表的字符
转义字符及其含义(1)自动类型转换5.数据类型转换1+a+1.5是合法的吗?若参与运算量的类型不同,则先转换成同一类型,然后进行运算;转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算;所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算;char型和short型参与运算时,必须先转换成int型;在赋值运算中,两边的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。转换规则如下整型、实型、字符型可以混合运算,为什么?例如:
假设已指定i为整型变量,f为float型变量,d为double型变量,e为long型变量,表达式为:10+'a'+i*f-d/e,则表达式的运行次序是怎样的?运行次序:第一步运行:i*f第二步运行:d/e第三步运行:10+'a'第四步运行:10+'a'+i*f
第五步运行:10+'a'+i*f-d/e案例3-2-5运行结果案例3-2-5程序代码main(){inti=2;
floatf=1.5;
doubled=4.0;
longe=2;
printf("i*f=%f,i转化为float类型参与运算",i*f);
printf("d/e=%lf,e转化为double类型参与运算",d/e);
printf("10+'a'=%d,'a'转化为int类型参与运算",10+'a');
printf("10+'a'+i*f=%f,int转化为float类型",10+'a'+i*f);
printf("10+'a'+i*f-d/e=%lf,float转化为double类型",10+'a'+i*f-d/e);
}案例3-2-5自动类型转换i*f=3.000000,i转化为float类型参与运算d/e=2.000000,e转化为double类型参与运算10+'a'=107,'a'转化为int类型参与运算10+'a'+i*f=110.000000,int转化为float类型10+'a'+i*f-d/e=108.000000,float转化为double类型(2)强制类型转换5.数据类型转换一般形式:(类型说明符)(表达式)例如:
(double)a将变量a强制转换为double类型(int)(x+y)将x+y的值强制转换为int类型(float)(7%3)将7%3的值强制转换为float类型
(float)x/y将x强制转换成float类型后,再参与运算
注意:
表达式应该用括号括起来。进行强制类型转换时,得到的是一个所需类型的中间变量,原来变量的类型并未发生改变案例3-2-6强制类型转换main(){ floatf; f=7.8; printf("(int)f=%d,f=%f\n",(int)f,f);}案例3-2-6,运行结果(int)f=7,f=7.8000003.2.3课堂练习题1.D)default2.B)'\x43‘3.C)2.04.A)8,16,105.B)3,E6.A)构成C程序的基本单位是函数7.C).2E0 8.B)_2Test9.
D)double10.D)11133.3C语言的运算符和表达式1.算术运算符分类3.3.1算术运算符和算术表达式(1)加法“+”;(2)减法“–”,或负值运算符;(3)乘法“
”;(4)除法“/”,如7/2=3,整除结果为整数,舍去小数,只取商。(5)求模“%”,或称求余运算符,要求两侧均为整数,如9%2=1。2.算术运算符优先级从高到低顺序:()>
、/、%>+,–,单目运算符的优先级高于双目运算3.自增自减运算符(1)作用:自增运算使单个变量的值增1,自减运算使单个变量的值减1(2)运算规则:前置运算:运算符放在变量之前:++a、--a,先使变量的值增(或减)1,然后再以变化后的值参与其它运算,即先增减、后运算。后置运算:运算符放在变量之后:a++、a--,变量先参与其它运算,然后再使变量的值增(或减)1,即先运算、后增减。例如:3.3.1算术运算符和算术表达式inti=3,j;j=++i; i的值先加1后变成4,再赋给j,j的值为4j=i++; 先将i的值3赋给j,j的值为3,然后i加1后
变为4注意:(1)++和--只能用于变量,而不能用于常量或表达式。如:(i+j)++或5--合法吗?(2)++和--的结合方向是“自右至左”。如:i=4,则-i--相当于-(i--)结果为-4,而i的值为3。(3)运算符的组合原则是自左而右。如:a+++b等价于(a++)+b,而不是a+(++b)。(4)++和--常用于循环语句中,使循环控制变量加(或减)1,指针变量中,使指针上移(或下移)一个位置。案例3-3-1自增自减验证案例3-3-1程序代码:main(){ inti=3,j; j=i++; printf("i=%d,j=%d\n",i++,j); j=++i; printf("i=%d,j=%d\n",++i,j); j=--i; printf("i=%d,j=%d\n",i--,j); j=i--; printf("i=%d,j=%d\n",--i,j);}案例3-3-1,运行结果:i=4,j=3i=7,j=6i=6,j=6i=3,j=5例如:3.3.1算术运算符和算术表达式a*b/c-1.5+’a’注意:4.算术表达式(1)与数学表达式的书写形式的区别:C语言算术表达式的乘号(*)不能省略。例如:b2-4ac,应该写成b*b-4*a*c。C语言表达式中只能出现字符集允许的字符。例如:πr2应该写成PI*r*r。C语言算术表达式不允许有分子分母的形式。例如:(a+b)/(c+d)不等于a+b/c+d。C语言算术表达式只使用圆括号改变运算的优先顺序(不能用{}[])。(2)各运算符的“优先级”和“结合性”:在表达式求值时,按运算符的优先级高低次序执行,如:a-b*c等价于a-(b*c)。如果优先级别相同,则按规定的“结合方向”,如表达式:a-b+c结合性为“自左向右”,所以等价于(a-b)+c。C对于复杂表达式为了清晰起见可以加圆括号“()”强制规定计算顺序。1.赋值运算符3.3.2赋值运算符和赋值表达式符号:“=”为赋值运算符作用:将赋值运算符右边的表达式的值赋给其左边的变量。2.复合赋值运算符在赋值符“=”之前加上其它二目运算符可构成复合赋值符如:+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=X=y=12注意:在赋值号“=”的左边只能是变量,而不能是常量或表达式2=x?x+y=a+b?一般形式:变量
复合赋值符=表达式
变量=变量
运算符
表达式例如:a+=5等价于a=a+5x*=y+7等价于x=x*(y+7)r%=p等价于r=r%p(1)
定义赋值表达式由赋值运算符组成的表达式称为赋值表达式一般形式:变量=表达式(2)功能计算表达式的值再赋予左边的变量例如:x=5
x=7%2+(y=5)a=(b=6)或a=b=6a+=a*(a=5)
a+=a-=a*a如果a的初值为4,此赋值表达式的求解步骤?(1)赋值表达式加上一个分号则可构成赋值语句,即:变量=表达式;(2)赋值语句不是表达式,表达式可以用在其它语句或表达式中,而语句只能作为一个单独的语句使用;(3)C语言规定:可以在定义变量的同时给变量赋值,也叫给变量初始化。例如:intx=5;(4)赋值运算时,当赋值运算符两边数据类型不同时,系统自动进行类型转换,转换原则是:先将赋值号右边表达式类型转换为左边变量的类型,然后赋值。注意:构成3.3.3逗号运算符与逗号表达式用逗号“,”运算符,逗号运算符又称顺序求值运算符。
表达式一般形式:表达式1,表达式2,……,表达式n注意:(1)逗号表达式的求解过程为:先求解表达式1,再求解表达式2,依次类推。结合性自左向右。(2)表达式n的值就是整个逗号表达式的值。
(3)
逗号运算符的优先级是所有运算符中最低的。案例3-3-2逗号表达式使用案例3-3-2程序代码:main(){ inta=2,b=3,c=4,x,y; y=(x=a+b,b+c,x+c); printf("x=%d,y=%d\n",x,y);}案例3-3-2,运行结果:x=5,y=9构成3.3.4条件表达式条件运算符“?:”条件表达式的一般形式是:<表达式1>?<表达式2>:<表达式3>max=(a>b)?a:bif(a>b){m=a;}elsem=b;}m=(a>b)?a:b;等价于3.3.5运算符的优先级和结合性括号
单目运算符
算术运算符
关系运算符
逻辑运算符
三目运算符
赋值运算符
逗号运算符单目:
+-++--双目:
+-*/%算术运算符中:*、/、%的优先级比+、-高,++、--是单目运算符;关系运算符中:>、>=、<、<=的优先级比==、!=高;
逻辑运算符中:&&的优先级比||高,!是单目运算符()!-+++--(类型名)sizeof* /% + -<<=>>===!=&&||?:=+=-=*=/=%=,低高运算次序3.3.6课堂练习题(一)选择题A)(X<=Y)&&(Y<=Z) 2,1
C)32 A)a+=a-=(b=4)*(a=3)
D)(x%=k)-(k%=5)D)0D)a*b>0A)3 C)0 B)1 (二)填空题设x和y均为int型变量,且x=1,y=2,则以下表达式的值为【1.0】。1.0+x/y若x为int类型,请以最简单的形式写出与逻辑表达式!x等价的C语言关系表达式【(x!=0?0:1)】。表示"整数x的绝对值大于5"时值为"真"的C语言表达式是【x>5||x<-5】。语句:x++;?++x;x=x+1;?x=l+x;,执行后都使变量x中的值增1,请写出一条同一功能的赋值语句(不得与列举的相同)【x+=1;】。设y是int型变量,请写出判断y为奇效的关系表达【(Y%2)==1】。谢谢观看C语言程序设计
2023翻转课堂实用教程第4章输入输出函数格式化输入函数scanf()和格式化输出函数printf()4.1字符/字符串输入输出函数4.2
4.1格式化输入函数scanf()和
格式化输出函数printf()情形一情形二情形三从标准输入设备(一般是键盘)输入数据(包含整数、实数、字符等),并把结果输出到终端(一般是屏幕)上从标准输入设备输入字符或字符串,并把结果显示在终端上,建议使用字符输入函数getchar()和字符串输入函数gets()从文件中读取数据(包含整数、实数、字符等),并把结果输出到文件中使用格式化输入函数scanf()和格式化输出函数printf()使用字符输出函数putchar()和字符串输出函数puts()使用文件输入函数fscanf()和文件输出函数fprintf()选择使用哪个函数?放到文件一章讲解4.1.1格式化输入函数scanf()scanf(格式控制字符串,变量地址列表)函数格式:函数功能:通过标准输入设备(键盘、写字板等),按照格式控制字符串中的格式要求为变量地址列表中的变量输入数据变量地址列表串:变量地址列表由输入项组成,两个输入项之间用逗号分隔,输入项一般由地址符&和变量名组成,即:&变量名格式转换说明符功能描述%d输入一个十进制整数%u输入一个无符号十进制整数%f输入一个单精度实数%lf输入一个双精度实数%e,%E,%g,%G输入一个输入实数,可以用小数形式或指数形式输入%c输入一个字符%s输入一个字符串%o输入一个八进制整数%x,%X输入一个十六进制整数%*表示本输入项只是读入,但不赋给相应变量例子PK例如:从键盘接收整数或实数例如:从键盘输入数据方法inta=0,b=0,c=0;floatd=0,e=0;scanf("%d%d",&a,&b);//两个%d之间无空格,输入整数并赋值给变量a和bscanf("%d%d",&b,&c);//输入两个整数并分别赋值给b、cscanf("%dissmallerthan%d",&a,&b);scanf("%f,%f",&d,&e);//输入两个整数并分别赋值给d、e5.scanf("%f+%f",&d,&e);//输入两个整数并分
别赋值给d、e1.scanf("%d%d",&a,&b);//两个%d之间无空格,输入整数并赋值给变量a和b2.scanf("%d%d",&b,&c);//输入两个整数并分别赋值给c、d3.scanf("%dsmaller%d",&a,&b)4.scanf("%f,%f",&d,&e);//输入两个整数并分别赋值给c、d5.scanf("%f+%f",&d,&e);//输入两个整数并分别赋值给c、d输入函数scanf()注意(1)格式控制字符串中多个格式转换说明符之间没有逗号,输入数据时,通常使用空格键或者回车键来分隔数据;格式转换说明符之间有逗号,输入数据时,一定要用逗号来分隔数据。(2)格式转换说明符个数和类型必须与变量地址列表一一对应。(3)*(抑制字符):表示本输入项只是读入,但不赋给相应变量。(4)对于scanf(),输入数据的格式要和控制字符串的格式保持一致,但对输入数据之间的空格的处理比较宽松,并不要求空格数严格对应,多几个少几个无所谓,只要有空格就行。*抑制字符的用法案例4-1-1*(抑制字符)的用法案例4-1-1程序代码:main(){ inta,b; scanf("%d%*d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}案例4-1-1,运行结果:123456↙a=12,b=56第二个数对应*,没有赋值给变量例如:从键盘接收字符或字符串charm,n;charurl[30];//定义一个字符数组用来存储字符串scanf("%c%c",&m,&n);//输入一个字符,并赋值给变量letter2.scanf("%s",url);//输入一个字符串,并赋值给变量url例如:从键盘输入数据方法scanf("%c%c",&m&n);//输入两个字符,并赋值给变量letter2.scanf("%s",url);//输入一个字符串,并赋值给数组变
量url。注意:1.scanf()读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串,解决办法需要用到后面要讲的gets()函数。2.一个%c只能接收一个字符,"%c%c"格式控制时,在键盘输入两个连续的字符时不能有任何分隔符,否则,分隔符本身会被认为是一个字符4.1.2格式化输出函数printf()printf(<格式控制字符串>,<参数列表>)例如:printf(“i=%d,c=%c\n”,i,c)函数格式:函数功能:将输出列表中的各个表达式的值按照格式控制字符串中对应的格式输出到标准输出设备(显示屏)格式说明的一般形式:%[标志][输出最小宽度m][.精度n][长度]类型格式字符,其中方括号[]中的项为可选项:(1)类型格式字符符号作用符号作用d十进制有符号整数X、x无符号以十六进制表示的整数u十进制无符号整数o无符号以八进制表示的整数f浮点数e指数形式的浮点数c单个字符g浮点数,选用f或e格式中输出宽度较短的一种格式s字符串p指针的值(2)标志标志意义标志意义-结果左对齐,右边填空格0指定数字前的空格用0填补+输出符号(正号和负号)
#对c、s、d、u类无影响对o类,输出是时加前缀o
空格输出值为正值,冠以空格,为负值冠以负号对x类,输出是时加前缀0X对e、g、f类,当结果有小数时才给出小数点4.1.2格式化输出函数printf()用十进制整数来表示输出的最少位数。若实际位数多于宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。(3)最小输出宽度:(4)精度以“.”开头,后跟十进制整数若实际位数大于所定义的精度位数,则截去超过的部分。(5)长度长度格式符为h、l两种h表示按短整型量输出l表示按长整型量输出注意:(1)格式转换说明符个数和类型必须与输出列表一一对应
。(2)格式控制字符串中可以有转义字符和普通字符。转义字符根据具体作用实现操作,普通字符原样输出。(3)修饰符m(正整数):指定输出项所占的宽度,当指定宽度小于实际宽度时按实际宽度输出,当指定宽度大于实际宽度时在前面用空格补足。(4)修饰符.n(正整数):指定输出的实型数据的小数位数(四舍五入),系统默认小数位数为6。(5)修饰符0(数字):指定数字前的空格用0填补。(6)修饰符-:指定输出项的对齐方式,表示左对齐。案例案例4-1-2输出类型格式符使用案例4-1-2程序代码:main(){ floatc=12.44; inta=12,b=1234; printf("%.1f,%.2f,%.6f\n",c,c,c); printf("%4d,%4d\n",a,b); printf("%-4d,%-6d\n",a,b); printf("%04d,%06d\n",a,b);}案例4-1-2,运行结果:12.4,12.44,12.44000012,123412,12340012,001234
4.2字符/字符串输入输出函数4.2.1getchar函数getchar();函数格式:函数功能:从标准输入设备输入一个字符注意:(1)该函数没有参数,函数的返回值是从输入设备得到的字符。(2)从键盘上输入数据通过回车键结束,送入缓冲区,该函数从缓冲区中读入一个字符赋给字符变量。(3)该函数也可以接收回车符。案例4-2-1无参数函数使用案例4-2-1程序代码:main(){ charch1,ch2,ch; ch1=getchar(); ch2=getchar(); ch=getchar(); printf("ch1=%c,ch2=%c\n",ch1,ch2);printf("ch=%c\n",ch);}案例4-2-1,运行结果输入:x↙
y↙输出:ch1=x,ch2=ch=y为什么?4.2.2putchar函数putchar(ch);函数格式:函数功能:向标准输出设备输出一个字符注意:(1)输出字符型变量(2)输出字符型或者整型常量(3)输出转义字符案例4-2-2putchar(ch)函数使用案例4-2-2程序代码:main(){ putchar('\n'); putchar('\007');}案例4-2-2,运行结果字符型、整型、转义字符换行
响铃4.2.3getche()和getch()
函数getche()没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键1、getche()函数2、getch()
函数getch()没有缓冲区,输入一个字符后会立即读取,但它没有回显3、getchar()、getche()和getch()的比较案例4-2-3getche()和getch()函数使用案例4-2-3程序代码:main(){ charc=getch(); printf("c:%c\n",c); charc=getche(); printf("c:%c\n",c);}案例4-2-3,运行结果函数缓冲区头文件回显适用平台getchar()有stdio.h有Windows、Linux、MacOS等所有平台getche()无conio.h有Windowsgetch()无conio.h无Windows输入:@输出:c:@输入f↙输出:fd:f4.2.4输入字符串gets()是专用的字符串输入函数,它拥有scanf()不具备的特性1、gets()函数2、gets()和scanf()的主要区别案例4-2-4gets()函数使用案例4-2-4程序代码:main(){ charname[20]={0},add[20]={0}; gets(name); printf("name:%s\n",name); gets(add); printf("add:%s\n",add);}案例4-2-4,运行结果(1)scanf()读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。(2)gets()认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对gets()来说就是一个完整的字符串。也就是说,gets()能读取含有空格的字符串,而scanf()不能。xiaoming↙name:xiaomingcenter↙add:center从控制台读取数据函数的比较注意(1)scanf()、getchar()、gets()是标准函数,适用于所有平台;getche()和getch()不是标准函数,只能用于Windows。scanf()是通用的输入函数,它可以读取多种类型的数据。(2)getchar()、getche()和getch()是专用的字符输入函数,它们在缓冲区和回显方面与scanf()有着不同的特性,是scanf()不能替代的。(3)gets()是专用的字符串输入函数,与scanf()相比,gets()的主要优势是可以读取含有空格的字符串。(4)scanf()可以一次性读取多份类型相同或者不同的数据,getchar()、getche()、getch()和gets()每次只能读取一份特定类型的数据,不能一次性读取多份数据。4.2.5课堂练习题(一)选择题D)当输入数据时,必须指明变量地址,例如:scanf(“%f”,&f);B)10.0,22.0,33.0<回车>B)scanf("%d%d%d",&x,&y,&z);A)scanf("%d%d%d",&a,&b,d);D)a=4000L*10L;(二)填空题若想通过以下输入语句使a=5.0,b=4,c=3,则输入数据的形式应该是【5.0,4,c=3】。intb,c;floata;scanf("%f,%d,c=%d",&a,&b,&c);2.以下程序的输出结果是【2,1】。main(){inta=1,b=2;a=a+b;b=a-b;a=a-b;printf("%d,%d\n",a,b);}3.下列程序的输出结果是16.00,请填空。main(){inta=9,b=2;
floatx=【6.6】,y=1.1,z;
z=a/2+b*x/y+1/2;
printf("%5.2f\n",z);
}
谢谢观看C语言程序设计
2023翻转课堂实用教程第5章分支结构条件判断表达式5.1多分支结构5.45.2单分支结构5.3双分支结构
5.1条件判断表达式5.1.1关系表达式设计1、关系运算符注意:(1)前4种关系运算符的优先级别相同,后两种也相同,但前4种高于后2种。
(2)关系运算符的优先级低于算术运算符。
(3)关系运算符的优先级高于赋值运算符。
例如表达式a=b>c,应该先b和c进行比较,然后再将结果赋值给a。5.1.1关系表达式设计2、关系表达式例如定义:用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式等)连接起来的式子,称为关系表达式。结果描述:关系表达式的值有两个1和0;当关系表达式成立时,其值为1,当关系表达式不成立时,其值为0;C语言中以1代表“真”,以0代表“假”。已知a=1,b=2,c=3,则关系表达式a>b的结果为假,值为0。关系表达式a+b==c的结果为真,值为1。如何编写关系表达式?例1:怎样判断整型变量n为偶数?能被2整除的数据称为偶数,那么可以写成n%2==0。例2:如何判断成绩变量score为及格?成绩大于等于60分称为考试及格,那么可以写成score>=60。5.1.2逻辑表达式设计1、逻辑运算符注意:(1)“&&”和“||”是双目运算符,它要求有两个运算量,且结合方向为左结合,
如:a>b&&a<c。(2)“!”是单目运算符,它只要求有一个运算量,且结合方向为右结合,如!a。(3)!的优先级高于算术运算符,“&&”和“||”的优先级都低于算术运算符和关系运算符,高于赋值运算符,同时“&&”优先级又高于“||”。。
例如&&(逻辑与)||(逻辑或)!(逻辑非)(1)a>b&&c>d
等价于
(a>b)&&(c>d)(2)!b==c||d<a
等价于
((!b)==c)||(d<a)
(3)a+b>c&&x+y<b
等价于
((a+b)>c)&&((x+y)<b)!(非)
算术运算符关系运算符&&和||赋值运算符ABA&&BA||B!A000010非0011非00010非0非0110逻辑运算值5.1.2逻辑表达式设计1、逻辑表达式注意:(1)逻辑运算结果以数字1表示“真”,以数字0表示“假”。(2)在判断一个量是否为“真”时,以0表示“假”,以非0表示“真”(3)!的优先级高于算术运算符,“&&”和“||”的优先级都低于算术运算符和关系运算符,高于赋值运算符,同时“&&”优先级又高于“||”。
定义:用逻辑运算符将两个表达式连接起来的式子称为逻辑表达式。5.1.2逻辑表达式设计PK(1)逻辑“与”表达式(2)逻辑“或”表达式定义设A,B是两个表达式,如果一个表达式通过运算符的优先级别和结合方向最终可归结为A||B的形式,则称这个表达式为逻辑或表达式,简称“或”表达式。计算过程对于或表达式A||B,先计算A,当A值为非0时,不再计算B(此时说明或表达式的值一定为1);当A的值为0时,再计算B。例如表达式3>0||5>7定义设A,B是两个表达式,如果一个表达式通过运算符的优先级别和结合方向最终可归结为A||B的形式,则称这个表达式为逻辑或表达式,简称“或”表达式。计算过程对于或表达式A||B,先计算A,当A值为非0时,不再计算B(此时说明或表达式的值一定为1);当A的值为0时,再计算B。例如表达式4>0&&3>25.1.2逻辑表达式设计(3)逻辑“非”表达式定义计算过程例如设A是一个表达式,如果某个表达式通过运算符的优先级别和结合方向最终可归结为!A的形式,则称这个表达式为逻辑非表达式,简称“非”表达式。对于或表达式!A,先计算A,然后取反表达式!(5>0)注意:特殊情况-逻辑运算符不全都被执行(1)表达式a&&b&&c求解过程中,只有a为真时,才需要求b的值,只有a和b都为真时,才需要求c的值。(2)表达式a||b||c求解过程中,只有a为真时,就不需要求b和c的值,整个表达式的值一定为真。例如:设a=10,b=11,c=12,求下列表达式的值:a%2==0&&c%2==0
a+b<c&&b+c>a
a&&b||cb+c||b-c||a
!(a>b)&&!c||a>c如何编写表达式?例1:已知三条边分别为a,b,c,满足构成一个三角形,怎么书写表达式?例2:判断某一年变量year为闰年,怎么书写表达式?能被4整除,但不能被100整除称为闰年,或者能被400整除也称为闰年.结果:1结果:0结果:1
5.2
单分支结构5.2.1单分支结构知识点if(<表达式>)<语句>if语句格式:执行描述:先判断表达式是否为真,如果为真,那么执行语句,如果为假,那么跳过语句执行后面的程序。可以是复合语句流程图猜猜这里是什么?5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年自贡客运资格证试题完整版
- 吉首大学《期货与期权》2021-2022学年第一学期期末试卷
- 吉首大学《非参数统计》2021-2022学年第一学期期末试卷
- 吉林艺术学院《造型基础训练III》2021-2022学年第一学期期末试卷
- 吉林艺术学院《数字化建筑环境设计软件基础SketchUP》2021-2022学年第一学期期末试卷
- 期刊经营转让协议书范文模板
- 吉林师范大学《中国画技法研究》2021-2022学年第一学期期末试卷
- 吉林师范大学《虚拟现实设计与制作》2021-2022学年第一学期期末试卷
- 2024年大棚蔬菜分包协议书模板
- 2024年大葱采购协议书模板
- 2024年国家公务员考试《行测》真题卷(副省级)答案及解析
- 教育局职业院校教师培训实施方案
- 2024年新华社招聘应届毕业生及留学回国人员129人历年高频难、易错点500题模拟试题附带答案详解
- 江苏省南京市秦淮区2023-2024学年八年级上学期期中语文试题及答案
- 2024年个人车位租赁合同参考范文(三篇)
- (完整版)新概念英语第一册单词表(打印版)
- 签申工作准假证明中英文模板
- 员工履历表(标准样本)
- 2024年山东省济南市中考数学真题(含答案)
- 山东省青岛市黄岛区2023-2024学年六年级上学期期中语文试卷
- 二手门市销售合同范本
评论
0/150
提交评论