C语言程序设计教程_第1页
C语言程序设计教程_第2页
C语言程序设计教程_第3页
C语言程序设计教程_第4页
C语言程序设计教程_第5页
已阅读5页,还剩592页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章C语言基本概念目录/Contents计算机语言和程序算法、算法表示、算法优化C语言编程C程序的结构常量定义标识符问题的提出为什么要学习计算机语言?需求:人与计算机交流需要人和计算机双方都能接受和理解的语言。特点:规则和严谨,缺少灵活性。辗转相除法求最大公约数问题的提出什么是计算机程序?概念:被连续执行的一条条指令的集合称为计算机程序。功能:为完成某种工作,人们将其解题步骤用指令的形式描述出来,并把这些指令存放在计算机内存中,然后向计算机发出命令,计算机就会自动逐条顺序执行指令,执行完全部指令就能得到想要的结果。。问题的提出什么是程序?

程序是用特殊的编程语言写出来的表达如何解决问题的过程或步骤。它不是用编程语言和计算机交谈的,而是描述要求它如何做事情的过程或方法。编程语言的欢迎度为什么是C语言C语言仍然是编写操作系统的不二之选工业界最受欢迎的语言存在大量的函数库有些地方对程序的运行效率有苛求-设备驱动程序,高性能、实时中间件,嵌入式领域,并发程序设计等要继承和维护早期的C语言系统交流、笔试、面试时最常见的语言程序设计步骤程序要做什么?可执行文件扩展名为.exe的文件

需求分析(Analysis)设计(Design)编码(Write)编辑(Edit)编译(Compile)连接(Link)运行(Run)调试(Debug)程序怎么做?扩展名为.c的文件(对C语言而言)语法分析差错,翻译生成扩展名为.obj的文件设计算法编写程序源代码把自己的意图写入源代码编辑源程序编译和连接调试程序

直到改正了所有的编译错误和运行错误运行程序C程序开发步骤C程序编译环境VisualC++6.0Windows平台上最流行的C/C++集成开发环境之一Dev-C++,)是一个Windows环境下C&C++开发工具功能没有VisualC++6.0强大,但是体积小,轻便C程序编译环境-VisualC++C程序编译环境-VisualC++C程序编译环境-VisualC++C程序编译环境-VisualC++C程序编译环境-Dev-C++C程序编译环境-Dev-C++C程序编译环境-Dev-C++算法的概念算法:是计算机解决问题的核心和灵魂。1.概念:解决一个特定问题而采取的方法和步骤。

利用计算机解决问题就是告诉计算机如何进行计算的步骤,计算机所做的所有事情都叫计算。2.生活中的算法:乐谱、菜谱、订票、安检。例1:如何交换A瓶中的白酒和B瓶中的红酒?算法描述步骤:①准备一个空瓶C;②A倒入C;③B倒入A;④C倒入B。算法举例如何交换变量a=5,b=10的值?算法举例例2:计算正整数M、N(M>N)的最大公约数。算法描述步骤:①用N除M得整数R,R必须小于N;②若R=0,算法结束,输出结果为N;否则继续步骤③;③将M更新为N,N更新为R,并返回①继续进行算法的特征◆

有穷性:执行有限个操作后终止。◆确定性:算法中每一步的含义必须是明确的,不存在二义性。◆有效性:算法中每一步操作必须能有效执行,不能执行的操作是无效的。◆有零个或多个输入:执行算法时,从外界获得必要信息。◆有一个或多个输出:算法的解(结果)就是输出。

算法的性能评价时间复杂度:通常以算法中基本操作重复执行的频度n作为时间度量标准。 T(n)=O(f(n))空间复杂度:算法执行时存储空间需求的度量。S(n)=O(f(n))如何设计一个好的算法◆正确性:合法的输入数据都能得到满足要求的结果。◆可读性:算法应该易于阅读和理解。◆健壮性:当输入数据非法时,能作出反应或进行相应处理。◆高效和低存储空间:对于相同规模的问题,执行时间短,占用空间少。小结是计算机解决问题的核心和灵魂,设计正确的算法是计算机解决问题的前提。算法的表示方法算法的表示方法:◆自然语言◆流程图◆N-S图◆伪代码◆自然语言例1:求三个整数(a,b,c)中的最小数的算法?①比较前两个数;②将①中较小数与第三个数进行比较;③步骤②中较小数即为所求的数。◆流程图例2:用流程图表示两个数的交换的算法。算法的表示方法◆N-S图例3:用N-S图表示求三个数最大数的算法。算法的表示方法算法的表示方法◆伪代码ProcSumInputn0=>sumwhilei<=n{

i+sum=>sumi+1=>i}PrintsumEnd流程图和N-S图基本图素开始与结束框输入/输出图框处理框图分支图框

N-S盒

流程图循环图框流程图和N-S图基本图素举例【例1.1】求ax2+bx+c=0之根(a<>0)◆自然语言表示①输入方程的3个系数a,b,c;②计算delta=b2-4ac,根据计算结果做出求解结果的判断和处理。若delta<0,执行⑥,若delta=0,执行⑤,否则delta>0,执行③。③根据求根公式计算两个实根x1,x2;④输出x1,x2;转⑦⑤输出两个相等实根;转⑦⑥打印“无实根”;⑦结束。◆流程图表示算法举例◆N-S图表示:举例【例1.2】输入年份,判断是否闰年。举例举例算法的优化【例1.4】将任意大小的三个数a,b,c按从大到小的顺序排序。问题的提出算法设计算法流程改进的设计算法流程◆判断次数:5次、3次◆输出语句个数:6:1算法比较◆算法是解题步骤,其设计取决于人的创造;◆实际问题需要首先对问题进行分析->抽象->建模,才能设计算法;◆算法有5个特征,设计时必须满足;◆基于计算机的问题求解和数学方法有很大不同,需要计算思维;◆算法需要用工程化的方法表达;◆算法有很大的优化空间,体现人的智慧而不是机器的智慧。算法小结结构化程序设计方法◆程序设计采用什么方法呢?结构化程序设计方法的主要内容:①为了使程序具有良好的结构,编程时只采用三种基本结构;②采用自顶向下的程序设计方法;③用流程图表示算法。结构化程序设计方法特征①以三种基本结构的组合来描述程序。②整个程序采用模块化结构。③限制使用转移语句。在迫不得已的情况下,也要十分谨慎,并且只能在一个结构内部跳转,不允许从一个结构跳到另一个结构。这样可缩小程序的静态结构和动态执行过程中之间的差异,避免人们误解程序的功能。④以控制结构为单位,每个结构只有一个入口、一个出口,各单位之间接口简单,逻辑清晰。⑤采用结构化程序设计语言编写程序,并采用一定的书写格式使程序结构清晰,易于阅读。⑥培养良好的程序设计风格。结构化程序设计方法总体思想采用模块化结构,自顶向下,逐步求精

模块化程序设计问题分析和求解:采用自上而下、逐步求精的设计方法。程序完成:采用自底向上、逐步集成的设计方法,将自顶向下分解的模块单独设计、调试、测试完成后,再组装成高级模块或更复杂模块,实现对复杂问题的自动化计算。方程根的算法可以分解成三个小问题:输入问题、求根问题、输出问题。这三个小问题就是求方程根的三个功能模块:输入模块M1、求根计算模块M2和输出模块M3。其中M1模块负责输入方程的系数,M2模块根据算法解方程求根,M3模块负责将所得结果显示或打印出来。分解出来的三个模块从总体上为顺序结构。结构化程序设计方法举例【例1.5】求一元二次方程ax2+bx+c=0的根。图1-22

M2模块的细化图图1-23

M22模块流程图结构化程序设计方法举例结构化程序设计方法举例图1-24求一元二次方程根的整体流程图C语言编程【例1.6】要求在屏幕上输出以下一行信息。

Hello,World!解题思路:

在主函数中用printf函数原样输出以上文字。#include<stdio.h>intmain(){

printf(”Hello,World!\n”);return0;}函数的名字,表示主函数C程序必须有一个main函数主函数类型C语言编程#include<stdio.h>intmain(){

printf(”Hello,World!\n”);return0;}

函数体输出函数输出语句C语言编程#include<stdio.h>intmain(){

printf(”Hello,World!\n”);return0;}

换行符当main函数执行结束前将整数0作为函数值表示语句结束用到函数库中的输入输出函数时C语言编程C语言编程C语言允许用两种注释方式://:单行注释可单独占一行可出现在一行中其他内容的右侧/*……*/:块式注释可包含多行C语言程序的结构特点C语言程序的结构特点:1.一个程序由一个或多个源程序文件组成小程序往往只包括一个源程序文件例1.6只有一个函数有的程序有两个以上函数只包括一个源程序文件一个源程序文件中可以包括三个部分:预处理指令全局声明函数定义#include<stdio.h>等在函数之外进行的数据声明每个函数用来实现一定的功能C语言程序的结构特点C语言程序的结构特点2.函数是C程序的主要组成部分一个C程序是由一个或多个函数组成的必须包含一个main函数(只能有一个)每个函数都用来实现一个或几个特定功能被调用的函数可以是库函数,也可以是自己编制设计的函数C语言程序的结构特点C语言程序的结构特点:3.一个函数包括两个部分:函数首部intmax(intx,

inty)函数类型函数名参数类型参数名函数的第1行C语言程序的结构特点3.一个函数包括两个部分:函数首部intmax(intx,

inty)若函数无参,在括弧中写void或空括弧intmain(void)或intmain()C语言程序的结构特点3.一个函数包括两个部分:函数体声明部分定义在本函数中所用到的变量对本函数所调用函数进行声明执行部分:由若干个语句组成,指定在函数中所进行的操作可以没有声明部分C语言程序的结构特点3.一个函数包括两个部分:函数体voiddump(){}可以是空函数C语言程序的结构特点4.程序总是从main函数开始执行5.C程序对计算机的操作由C语句完成C程序书写格式是比较自由的一行内可以写几个语句一个语句可以分写在多行上为清晰起见,习惯上每行只写一个语句C语言程序的结构特点6.数据声明和语句最后必须有分号7.C语言本身不提供输入输出语句8.程序应当包含注释,增加可读性程序设计的任务1.问题分析对于接手的任务要进行认真的分析研究所给定的条件分析最后应达到的目标选择解题的方法找出解决问题的规律1.问题分析2.设计算法

设计出解题的方法和具体步骤程序设计的任务1.问题分析2.设计算法3.编写程序4.对源程序进行编辑、编译和连接5.运行程序,分析结果结果错了,程序肯定错结果对了,程序未必对程序设计的任务1.问题分析2.设计算法3.编写程序4.对源程序进行编辑、编译和连接5.运行程序,分析结果6.编写程序文档程序设计的任务变量、表达式和赋值floatF; /*F表示华氏温度*/floatC; /*C表示摄氏温度*/intage; /*age表示人的年龄*/floatweight; /*weight表示人的体重*/F=50.0;age=18;weight=65.0;变量【例1.7】给定圆的半径,计算这个圆的面积和周长。/*circle.c*//*计算一个圆的面积和周长*/#include<stdio.h>

intmain(void){ floatradius=3.0,area,perimeter; /*变量radius、area和perimeter分别表示圆的半径、面积和周长*/ area=3.1415926*radius*radius; perimeter=2*3.1415926*radius; printf("area:%.2fperimeter:%.2f",area,perimeter);/*格式符%.2f表示保留小数点后两位有效数字或精确到0.01*/ return0; }变量、表达式和赋值表达式表达式从键盘读取输入scanf("%d",&a);scanf("%f",&radius);【例1.8】下面的程序是计算圆的面积和周长的改进版,允许用户自行输入圆的半径。/*Computestheareaandperimeterofacirclefrominputprovidedbytheuser*/#include<stdio.h>#definePI3.1415926intmain(void){ floatradius,area,perimeter; scanf("%f",&radius);/*从键盘输入圆的半径*/ area=3.1415926*radius*radius; perimeter=2*3.1415926*radius; printf("area:%.2fperimeter:%.2f",area,perimeter); return0; }scanf()从键盘读取输入常量定义宏常量【例1.9】下面的程序提示用户输入球的半径,然后输出球的体积。/*ball.c*//*Computesthevolumeofaballfrominputprovidedbytheuser*/#include<stdio.h>#definePI3.1415926 /*定义宏常量PI,它代表圆周率*/#defineSCALE_FACTOR(4.0/3.0)/*定义宏SCALE_FACTOR,它代表因子(4.0/3.0)*/intmain(void){ floatradius,volume;

scanf("%f",&radius); volume=SCALE_FACTOR*PI*radius*radius*radius;

printf("volume:%.2f\n",volume); return0; }常量定义2.const常量【例1.10】

下面的程序是例1.10的改进版,使用const常量定义圆周率

,给定圆的半径,求圆的面积和周长。/*circle3.c*//*Computesthecircleareaandperimeterofacircle*/#include<stdio.h>intmain(void){ constdoublePI=3.1415926;/*定义double型的const常量*/ doubleradius=3.0,area,perimeter; area=PI*radius*radius; perimeter=2*PI*radius; printf("area:%.2fperimeter:%.2f",area,perimeter); return0; }标识符C语言中,标识符只能是字母、数字和下画线组成的字符序列,但标识符必须以字母或下画线开头。合法的标识符举例:namenext_numberstr_2_num_address不合法的标识符举例:2numbernext-number-address第二章数据类型与表达式目录/Contents标识符命名,数据类型常量和变量,整型和实型变量的定义和赋值计算数据类型占用内存空间的大小算术运算符增1和减1运算符表达式与赋值中的自动类型转换强制类型转换运算符常用的标准数学函数标识符标识符(identifier):组成程序元素的名字。组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线长度:取决于语言系统不能使用关键字或特定字区分大小写良好习惯简洁、见名知意和匈牙利命名法例:判断下列标识符号合法性sumSumM.D.JohndayDate3daysstudent_name#33lotus_1_2_3chara>b_above$123C程序的元素/CTokensConstantsIndentifierskeywordsSpecialsymbolse.g.[]{}OperatorC程序组成元素关键字(Keyword)又称保留字(CReservedWord)在C语言中有特殊含义的词标识符(Identifier)系统预定义标识符(C标准标识符)有特殊含义但可能被重新定义的词(但不推荐这样做!!)用户自定义标识符变量,函数名,……C程序常见元素举例C程序常见元素举例运算符(Operator)详见附录C

分隔符(Separator)空格、回车/换行、逗号等其他符号{和}标识函数体或语句块/*和*/是程序注释的定界符常量(Constant)数据类型问题的提出:数据为什么区分类型?★数据的存储形式★合法的取值范围★占用内存空间的大小★可参与的运算种类数据类型基本数据类型◆int整数,在目前绝大多数机器上占4个字节TC2.0,2个字节◆float单精度浮点数,4个字节◆double双精度浮点数,8个字节◆char字符,1个字节表示256个ASCII字符,或0~255的整数数据类型的修饰符◆shortshort

int,简写为short,短整数,2个字节◆longlong

int,简写为long,长整数,4个字节long

double,长双精度(高精度)浮点数,10个字节◆unsigned用来修饰char、int、short和long无符号整数(正整数和0)数据类型的取值范围数据类型占据的内存大小☆同种数据类型在不同平台上其占字节数不尽相同如int在16位、32位和64位系统上分别占2、4和8个字节☆不要对变量所占的内存空间字节数想当然要用sizeof计算变量或者数据类型的长度☆不用sizeof的危害在平台间移植时会出现问题,导致数据丢失或者溢出☆C语言的关键字、运算符,并非函数名计算类型占用的字节数☆两种语法形式

sizeof(类型)结果为类型占用的字节数

sizeof(表达式)结果为表达式值所属类型占用的字节数一般都使用sizeof(变量名)

sizeof的使用程序设计语言的规则①常量②变量③运算符④表达式⑤函数⑥控制结构⑦数据结构实质:把自然语言描述问题的方式转化为某种计算机语言的方式表达给计算机。常量与变量【例题2.1】计算任意大小圆柱体的表面积和体积。计算公式:①S=2r2+2rh②V=r2h问题:①如何定义问题中参与运算的物理量?②参与运算的物理量如何输入及保存?③

输入的数据如何参与运算?④

计算结果存放在哪里?常量与变量★程序处理的数据形式常量(constant)在程序中不能改变其值的量变量(variable)其值在程序执行过程中是可以改变的常量☆在程序中不能改变其值的量☆包括:整型(如

0,20,-2,

123L,123u,

022,0x12)默认为int实型(如2.4,1.5e-5,2.75F,2.75L)默认为double字符型(char如‘a',‘8','$','\n')用\开头的字符为转义字符,代表1个字符字符串(string如"USA",“2",“6c")枚举型长整型无符号整型八进制十六进制单精度实型长双精度实型十进制小数指数形式十进制90编译程序根据变量定义为其分配指定字节的内存单元…...地址abc4字节4字节4字节地址地址…...内存(在VC++中)1-3

随机数变量定义:声明程序中要使用的变量名,设定每个变量将存储什么类型的数据。变量的使用:先定义,后使用数据类型变量1[,变量2,…,变量n];变量初始化:定义时赋初值

inta=1,b=-3,c;例:inta,b,c;决定分配字节数和数的表示范围合法标识符变量91变量的声明结果会是什么?使用变量的基本原则变量必须先声明,后使用所有变量必须在第一条可执行语句前声明声明的顺序无关紧要一条声明语句可声明若干个同类型的变量★声明变量是初始化变量的最好时机不被初始化的变量,其值为随机数

92定义:用单引号括起来的单个普通字符或转义字符.

字符常量的值:该字符的ASCII码值<转义字符及其含义:转义字符含义\n\v\r\a\’\ddd\t\b\f\\\”\xhh转义字符含义换行垂直制表回车响铃单引号3位8进制数代表的字符水平制表退格换页反斜线双引号2位16进制数代表的字符如‘\101’-----------‘A’‘\012’-----------’\n’‘\376’-----------’’‘\x61’-----------’a’‘\60’-----------’0’‘\483’----------(

)如‘A’——65,‘a’——97,

‘0’——48,‘\n’——10如‘a’‘A’‘?’‘\n’‘\101’转义字符:反斜线后面跟一个字符或一个代码值表示【例2.2】转义字符举例#include"stdio.h"main(){printf("\101\x42C\n");printf("Isay:\"Howareyou?\"\n");printf("\\CProgram\\\n");printf("Turbo\'C\'");}运行结果:(屏幕显示)ABCIsay:”Howareyou?”\CProgram\Turbo‘C’字符常量93字符型变量char字符变量存放字符ASCII码字符变量例:charch;charsex=‘M’;

通过调用标准库函数来实现#include<stdio.h>

字符输出函数putchar(ch)输出一个字符ch,ch为字符变量名

字符输入函数getchar()无参数函数值为从输入设备接收的字符字符的输入输出字符的输入输出PressakeyandthenpressEnter:B↙b96字符常量与字符串常量不同定义:用双引号(”

”)括起来的字符序列存储:每个字符串尾自动加一个’\0’作为字符串结束标志hello\0例字符串“hello”在内存中aa\0例’a’”a”例:空串””空字符’’\0例:charch;ch=“A”;字符串常量常量小结Constants/常量数值常量字符常量整型实型单字符字符串98【例2.3】/*charoperation*/#definePRICE12.5#include"stdio.h"main(){intnum=3;floattotal;charch1,ch2=‘D’;total=num*PRICE;ch1=ch2-‘A’+‘a’;printf(“total=%f,ch1=%c\n”,total,ch1);}宏定义变量定义输出结果运行结果:total=37.500000,ch1=d例题变量小结◆变量必须先定义,再赋值,后使用;◆正确理解变量的内涵①变量名:代表内存中的存储单元,变量通过变量名来标识,变量名与内存中的存储单元相对应,程序通过变量名来存、取存储单元中的内容。②变量的地址:系统分配给变量的存储单元的起始地址。③变量的类型:决定存储单元的大小和数据的存储方式。④变量的值:变量对应的存储单元存放的具体的值。100表达式由运算符和相应的操作数及用于描述运算先后次序的括号构成。注意:常量、变量、函数调用也是表达式。表达式是有值的。赋值表达式也有值的:赋值运算后变量的值。运算符与操作数操作数:运算符的运算对象叫操作数。a+b*c运算符分为单目运算符、双目运算符、三目运算符。单目运算符:正、负数双目运算符:算术运算符、关系运算符、逻辑运算符等表达式及其值算术运算符与表达式【例2.4】W+Z操作数(Operand)运算符(Operator)操作数(Operand)何谓运算符和操作数?何谓表达式?☆基本算术运算符:+、-

、*、/、%%运算☆执行两个操作数的相除运算后返回余数☆规则:操作数必须是整数【例2.5】-11%5=-1一个整数一个整数-115-2-10-1余数商结果是-11/5的余数%运算%运算【例2.5】-11%5=-1一个整数一个整数-115-2-10-1余数商结果是-11/5的余数%运算【例2.6】11%-5=1一个整数一个整数11-5-2101余数商结果是11/-5的余数【例2.7】11.0%5=?一个实数一个整数无效!

注意!%运算107任意两个整数相除结果为整数。后面的小数被舍弃掉了。87654/10=(8765)87654/100=(876)如果/两边有一个或两个操作数为浮点数,则结果为浮点数。设问:x/10=?87654/10.0=(38765.4)87654.0/100=(876.54)/的运算108计算下列算式的结果。12345/10=(1234)12345/100=(123)12345/1000=(12)12345/10000=(1)规律:一个数除以任意位上的权重,该位上的数变为个位数。复习:x%10=(得到这个数的个位数)12345/10%10=()12345/100%10=()12345/1000%10=()12345/10000%10=()实战与提高109问题:如何利用/、%运算符,计算任意数x的个位、十位、百位、千位、万位数?个位数:x%10十位数:x/10%10百位数:x/100%10千位数:x/1000%10万位数:x/10000%10实战与提高110应用:判断数学中的特别数水仙花数:是指一个n位数(n>=3),它的每个位上的数字的n次幂之和等于它本身。153=13+53+33回文数:一个任意自然数x,若将x的各位数字反向排列所得自然数x1与x相等,则称x为回文数。x=1234321实战与提高111C标准数学函数的使用:在程序前端加入数学函数库头文件#include<math.h>C标准数学函数功能cos(x)计算cos(x)的值sin(x)计算cos(x)的值fabs(x)计算x的绝对值exp(x)计算ex的值log(x)计算ln(x)的值log10(x)计算lg(x)的值sqrt(x)计算x的平方根的值sqr(x)计算x的平方的值C标准数学函数112练习:写出下列数学式子的C语言表达式。①(x+sinx)e2x②③(1+log(x))2实战与提高算术表达式☆当算术表达式包含两个或两个以上的算术运算符时

◘首先要确定运算顺序

◘所有的运算符都有一个优先级

优先级(OrderofPrecedence)High: *、/、% Low: +、-不同优先级时的运算顺序:从高到低相同优先级时的运算顺序:算术运算符为左结合(从左到右)算术表达式【例2.8】?48.52.5+6–

–44.52.5+6–2*2=4.5算术表达式巧妙使用圆括号改变运算顺序从内往外运算【例2.9】(9–(3+2))*3=?算术表达式【例2.9】

(9–(3+2))*3=??

–5412

(9–(3+2))*3=12赋值运算符和表达式★三种赋值形式:★简单赋值★多重赋值★复合赋值赋值运算符和表达式119例a=3;d=func();c=d+2;x+1=2(?)赋值运算符和表达式★多重赋值:变量1=

变量2=

表达式;★简单赋值运算符:--符号:=

--格式:变量

=

表达式;

--作用:将一个数据(常量或表达式)赋给一个变量120例:a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)//表达式值为5,a,b,c值为5//b=5;a=5//表达式值11,c=6,a=11//表达式值10,a=10,b=4,c=6//表达式值5,a=5,b=10,c=2结合方向:自右向左优先级:14左侧必须是变量,不能是常量或表达式赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型赋值表达式的值与变量值相等,且可嵌套赋值运算符和表达式121常用的赋值表达式:利用变量的原有值进行计算,并将结果重新赋值给该变量。i=i+1;i=i-1;j=j*2;k=k/10;n=n%10;复合赋值运算符:变量xop=表达式相当于变量原值与右操作数进行计算,结果更新变量的值:变量x=变量xop表达式+=-=*=/=%=例如:k/=10(相当于k=k/10);m%=5(相当于m=m%5);x*=z+3;i+=j-=2;相当于i+=(j-=2);i=j=k=1;上式i=?复合赋值运算符和表达式复合赋值运算符和表达式已知inta=3;执行a+=a-=a*a后,变量a的值?a+=a-=a*aa+=a-=9a+=-6

a=-123-6-12执行a+=a-=a*=a后,变量a的值?a+=a-=a*=aa+=a-=9a+=0

a=03900★自增运算符++

★练习:m=(++i)*5;n=(j++)*4;if(m++==5){}m=(?);★自减运算符--:

step1step2++ii=i+1表达式的值=ii++表达式的值=ii=i+1自增自减运算符step1step2--ii=i-1表达式的值=ii--表达式的值=ii=i-1【例2.10】j=++i-3i5similartoi=i+1;j=i–3;j??36前缀自增/自减运算符后缀自增/自减运算符【例2.11】j=i++-3i5similartoj=i–3;i=i+1;j??26【例2.12】inta=3;printf("%d",-a++);a3similartoprintf("%d",-a);a=a+1;4后缀自增/自减运算符良好的程序设计风格应提倡:◆在一行语句中,一个变量只能出现一次增1或者减1运算◆过多的增1和减1运算混合,不仅可读性差,而且因为编译器实现的方法不同,导致不同编译器产生不同的运行结果自增自减运算符128隐式转换运算转换规则:不同类型数据运算时先自动转换成同一类型什么情况下发生运算转换------不同类型数据混合运算时赋值转换------把一个值赋给与其类型不同的变量时输出转换------输出时转换成指定的输出格式函数调用转换------实参与形参类型不一致时转换不同类型数据间的转换取值范围小的类型赋值给取值范围大的类型是安全的,反之是不安全的若大类型的值在小类型能容纳的范围之内,则平安无事。但是浮点数转为整数,会丢失小数部分,而非四舍五入反之转换后的结果必然是错误的,具体结果与机器和实现方式有关避免如此使用,好的编译器会发出警告不同类型数据间的转换130doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例charch;inti;floatf;doubled;ch/i+f*d-(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+‘a’+i*f-d/l例inti;floatf;doubled;longl;不同类型数据间的转换不同类型数据间的转换【例2.13】下面程序演示不同数据类型之间的转换。#include<stdio.h>intmain(){inti=12;floatf=3.14;doubled=1.2;i=f;f=i;d=f;printf(“i=%d\n”,i);printf(“f=%f\n”,f);printf(“d=%f\n”,d);}i=3f=3.000000d=3.000000132有些场合不能实现自动转换,如

floatx=15.4;intd=4; x%d存在语法错误强制转换形式:(类型名)(表达式)强制转换得到所需类型的中间变量,原变量类型和值不变不同类型数据间的转换Example:

intx=10; floaty; y=(float)x;

(float)10

10.000000x10y??10.000000不改变x【例2.14】

inttotal,number; floataverage; … average=total/number;

15/2

7total15number2average??7.000000两个整数运算的结果还是整数,不是浮点数不同类型数据间的转换【例2.14】

inttotal,number; floataverage; … average=(float)total/number;

15.000000/2

7.500000total15number2average??7.500000不同类型数据间的转换【例2.15】

下面程序演示类型转换运算符的使用。1

#include<stdio.h>2

intmain()3

{4

inta=3;5

printf("a/2=%d\n",a/2);6

printf("(float)a/2=%f\n",(float)a/2);7

printf("(float)(a/2)=%f\n",(float)(a/2));8

printf("a=%d\n",a);9

return0;10

}程序的运行结果如下:a/2=1(float)a/2=1.500000(float)(a/2)=1.000000a=3不同类型数据间的转换小结优先级函数、下标:()[].->自增等:正负++--!~*&sizeof(类型)乘除模:*/%加减:+-位:<<>>关系:<<=>>=关系:==!=位:&位:

^位:|逻辑:&&逻辑:

||条件:?:赋值:=+=-=*=/=%=&=^=|=<<=>>=逗号:,左结合性右结合性左结合性左结合性左结合性左结合性左结合性左结合性左结合性左结合性左结合性左结合性右结合性右结合性左结合性137/*Rootsofquadraticequation*/#include<math.h>#include"stdio.h"#defineEPS1.0e-8main(){ floata,b,c,deta,p,q; printf("Entercoefa,b,andc:\n"); scanf("%f%f%f",&a,&b,&c); if(fabs(a)<EPS)//Thedegreeis1 { if(fabs(b)<EPS&&fabs(c)>=EPS) printf("Equationhasnoroot.\n"); elseprintf("Therootis:%7.2f\n",-c/b); }【例2.16】求方程的根。设例题 else { deta=b*b-4*a*c; if(deta>=0) { p=b/(2.0*a);q=sqrt(deta)/(2.0*a); printf("Therootsare:%7.2fand%7.2f\n",p+q,p-q); } else { p=b/(2.0*a);q=sqrt(-deta)/(2.0*a); printf("Therootsare:%+7.2f%+7.2fiand%+7.2f%+7.2fi\n",p,q,p,-q); } }}例题第三章格式化输入输出目录/Contents数据格式化输入函数scanf()数据格式化输出函数printf()数据的输入与输出C语言无I/O语句,I/O操作由函数实现,如printf、scanf函数,这些函数定义在库函数<stdio.h>中#include<stdio.h>变量可以从键盘获得数据吗?C语言如何从键盘获取数据?可以,通过scanf函数格式:scanf(“格式控制符”,变量地址);功能:从键盘按格式读取数据,并赋给变量。取地址运算符:&scanf(“%d”,&a);0x22fe48a问题的提出格式

scanf(格式控制字符串,输出项表列);

scanf(“i=%f,j=%d",&a,&b);可以输入若干任意类型的数据

函数名输入数据地址表列普通字符格式说明格式化输入scanf()非格式字符输入数据以,分隔没有时可以空格、Tab或回车分隔未加修饰的转换字符在输入流中被匹配的字符对应参数的类型c任何字符,包括空白chard可选的有符号十进制整数inti可选的有符号十进制整数、八进制整数或十六进制整数intu可选的有符号十进制整数unsignedo可选的有符号八进制整数,不需要前导0unsignedx,X可选的有符号十六进制整数,不允许前导0x或0Xunsignede,E,f,g,G可选的有符号浮点数floatpprintf()中的%p所产生的通常是无符号十六进制整数voidscanf()的格式转换字符m表示数据占用的宽度l加在d、o、x、u前:输入长整型加在f、e前:输入双精度型L加在f、e前:输入longdouble型scanf()的格式修饰符#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题1:当要求程序输出结果为:a=12,b=34时,用户应该如何输入数据?

1234↙a=12,b=34↙a=12,b=34↙输入数据的格式控制#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题2:当限定用户输入数据以逗号为分隔符,即输入数据格式为:12,34↙时,应修改程序中的哪条语句?怎样修改?,

输入数据的格式控制#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题3:语句scanf("%d%d",&a,&b);修改为scanf("a=%d,b=%d",&a,&b);时,用户应该如何输入数据?a=12,b=34↙输入数据的格式控制#include<stdio.h>main(){

inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题4:如果程序第5行语句输入项修改为a,b,那么结果又会如何呢?

a,b输入数据的格式控制【例3.1】

编写程序,按如下数据输入格式从键盘输入一个整数乘法表达式:整数1*整数2然后计算并输出该表达式的计算结果,输出格式如下:整数1*整数2=计算结果C格式符问题及解决办法#include<stdio.h>main(){

inti,j;

charop; printf("Pleaseentertheexpressioni*j\n"); scanf("%d%c%d",&i,&op,&j); printf("%d%c%d=%d\n",i,op,j,i*j);}Pleaseentertheexpressioni*j

第1次测试12*3↙124199288=4199300C格式符问题及解决办法C格式符问题及解决方法#include<stdio.h>main(){

inti,j;

charop; printf("Pleaseentertheexpressioni*j\n"); scanf("%d%c%d",&i,&op,&j); printf("%d%c%d=%d\n",i,op,j,i*j);}Pleaseentertheexpressioni*j

第2次测试123↙123=36C格式符问题及解决办法#include<stdio.h>main(){

inti,j;

charop; printf("Pleaseentertheexpressioni*j\n"); scanf("%d%c%d",&i,&op,&j); printf("%d%c%d=%d\n",i,op,j,i*j);}Pleaseentertheexpressioni*j

第3次测试12*3↙12*3=36#include<stdio.h>main(){

inta;

charb;

floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");scanf("%c",&b);printf("character:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c); }Pleaseinputaninteger:希望得到的运行结果12↙Pleaseinputancharacter

:a↙Pleaseinputafloatnumber:3.5↙integer:12character

:afloatnumber:3.500000#include<stdio.h>main(){

inta;

charb;

floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");scanf("%c",&b);printf("character:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c); }Pleaseinputaninteger:实际得到的结果好像很奇怪呀!12↙Pleaseinputancharacter

:a↙Pleaseinputafloatnumber:3.5↙integer:12floatnumber:3.500000#include<stdio.h>main(){

inta;

charb;

floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");

getchar();/*将存于缓冲区中的回车字符读入,避免被后面的变量作为有效字符读入*/scanf("%c",&b);printf("character:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c); }Pleaseinputaninteger:程序修改后得到的运行结果12↙Pleaseinputancharacter

:a↙Pleaseinputafloatnumber:3.5↙integer:12character

:afloatnumber:3.500000#include<stdio.h>main(){

inta;

charb;

floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");scanf(“%c”,&b);/*第2种解决方案:在%c前加一个空格*/printf("character:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c); }#include<stdio.h>main(){

inti,j,mul;

charop; printf("Pleaseentertheexpressioni*j\n"); scanf("%d%c%d",&i,&op,&j); printf("%d%c%d=%d\n",i,op,j,i*j);}12*3↙12*3↙12↙*↙3↙C格式符问题及解决办法scanf("%d,%f\n",&a,&b);scanf("%d,%f",a,b);scanf("%7.2f",&a);几点忠告不要拘泥于细节不要死记硬背在使用中慢慢掌握注意!格式输入函数常见错误格式化输出printf()

格式printf(格式控制字符串,输出项表列);printf("a=%db=%f",a,b);

可以输出若干任意类型的数据

函数名可选输出表列普通字符格式说明转换字符对应的参数如何显示c作为字符d,i作为十进制整数u作为无符号十进制整数o作为无符号八进制整数x,X作为无符号十六进制整数e,E作为指数形式的浮点数,如1.234e+3f作为带小数点的浮点数,如3.1415g,G以e(E)或f格式,都是较短的s作为串p相应的参数是指向void的指针,按十六进制数显示它的值n相应的参数是指向一个整数的指针,该整数是至今成功写到流或缓冲区中的字符个数,对参数不做转换%使用%%把%写入输出流,没有相应的参数被转换printf()的转换字符printf()格式修饰符m表示数据占用的最小宽度数据宽度大于m,按实际宽度输出数据宽度小于m时,补空格n对实数表示输出n位小数对字符串表示最多输出的字符个数l长整型整数,加在d、o、x、u前Llongdouble型数,加在f、e、g前-

改变输出内容的对齐方式默认为右对齐格式化输出printf()【例3.2】

下面程序演示格式化显示数字举例。#include<stdio.h>intmain(){ inti=1234; doublex=0.123456789; printf("|%d|%6d|%7o|%-9x|%-#9x|\n",i,i,i,i,i); printf("|%10.5f|%-12.5e|\n",x,x); return0;}程序的运行结果如下:|1234|1234|2322|4d2|0x4d2||0.12346|1.23457e-001|格式化输出printf()float的格式:%f

一般格式:

%[<最小域宽>.<小数位数>]fExample:printf("Valueis:%10.4f",32.6784728);Valueis:32.678510characters4digits【例3.3】

下面程序演示格式化显示字符和串举例。#include<stdio.h>intmain(){ charch='W'; chars[]="Bluemoon!"; printf("|%c|%2c|%-3c|\n",ch,ch,ch); printf("|%s|%3s|%.6s|%-11.8s|\n",s,s,s,s); return0;}格式化输出printf()程序运行结果如下:|W|W|W||Bluemoon!|Bluemoon!|Bluem|Bluemoo|【例3.4】

编写一个程序,对用户录入的产品信息进行格式化。程序运行后需得到如下运行结果:Enteritemnumber:456Enterunitprice:12.3Enterpurchasedate(mm/dd/yyyy):6/24/2019ItemUnitPurchasePriceDate456$12.306/24/2019格式化输入输出#include<stdio.h>intmain(void){intitem_number,month,day,year;floatunit_price;printf("Enteritemnumber:");scanf("%d",&item_number);printf("Enterunitprice:");scanf("%f",&unit_price);printf("Enterpurchasedate(mm/dd/yyyy):");scanf("%d/%d/%d",&month,&day,&year);printf("\nItem\t\tUnit\t\tPurchase\n");printf("\t\tPrice\t\tDate\n");printf("%d\t\t$%7.2f\t%d/%d/%d\n",item_number,unit_price,month,day,year);return0;}小结:scanf扫描键盘,读取数据,好像电脑的眼。printf向显示器写数据,好像电脑的嘴格式化输入输出第四章选择结构目录/Contents关系运算条件运算逻辑运算单分支控制的if语句双分支控制的if-else语句多路选择的switch语句switch语句中的break语句关系运算符关系运算符描述举例值关系运算符<小于3<51(true)>大于2>11(true)<=小于等于7<=81(true)>=大于等于5>=60(false)等式运算符==相等3==40(false)!=不等2!=61(true)注意:应避免对实数作相等或不等的判断如1.0/3.0*3.0==1.0结果为可改写为:fabs(1.0/3.0*3.0-1.0)<1e-6例注意区分“=”与“==”,常把==误写为=inta;......if(a=1)printf(“aequaltob”);elseprintf(“anotequaltob”);1==a延伸:用b+c==a不用a==b+c关系运算符逻辑运算符描述举例值逻辑运算符!逻辑非a=0,!a1(true)&&逻辑与a=1,b=1,a&&b1(true)||逻辑或a=0,b=0,a|

|b0(false)逻辑运算符声明和初始化:intx=7,y=7;doublea=0.0,b=5.5;表达式等价表达式值!(x-y)+1(!(x-y))+12!x-y+1((!x)-y)+1-6!!(a+3.0)!(!(a+3.0))1!a*!!b(!a)*(!(!b))1逻辑非运算符举例逻辑运算符aba&&ba||bFFFFFTFTTFFTTTTT声明和初始化:inta=1,b=1,c=3;doublex=0.0,y=2.0;表达式等价表达式值a&&b&&c(a&&b)&&c1x||a&&b-3x||(a&&(b–3))1a<b&&x<y(a<b)&&(x<y)0a<b||x<y(a<b)||(x<y)1二元逻辑运算符的真值表二元逻辑运算符的优先级和结合性举例逻辑运算符判断ch是大写英文字母(ch>='A')&&(ch<='Z')判断某一年year是否是闰年的条件是满足下列二者之一能被4整除,但不能被100整除;能被400整除;

year%4==

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论