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

下载本文档

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

文档简介

1C语言程序设计

2学习资料参考《C语言教学大纲》参考《C语言考试样卷》参考《实验教学大纲》参考《C语言程序设计第2版》主教材以上资料在网站:/ccbs3主教材作者:宁爱军,张艳华出版社:人民邮电出版社出版日期:2016-02ISBN:978-7-115-41208-9版次:2联系电话mail:ccbs2011@网站:/ccbs/4注意:本教案中,带(*)的部分为:可以暂时先不必深究、可以在具备一定编程能力后再学习,或者不作为课程重点的内容。5学习目的通过分析问题、设计算法、编写和调试程序的步骤培养分析问题和算法设计的能力握分析问题培养较强的逻辑思维能力培养通过程序设计,解决实际问题的能力培养科学实验、调试和分析能力掌握C语言,可以应用于学习和工作的实际领域6第1章程序设计基础7主要内容程序设计语言程序设计的本质算法算法的表示结构化的程序设设计81.1程序设计语言程序是用来完成特定功能的一系列指令。通过向计算机发布指令,程序设计人员可以控制其执行某个操作或进行某种运算。一组指令构成一个程序,可以用来解决一个具体问题。9语言的分类1.机器语言:指令1010101100111101110011002.汇编语言:语句ADDAX,DX3.高级语言:语句c=a+b4.面向对象的程序设计语言:VB/VC/JAVA/C#10语言的分类(1)编译执行:将源程序翻译生成一个可执行的目标程序,该目标程序可以脱离编译环境和源程序独立存和执行(2)解释执行:将源程序逐句解释成二进制指令,解释一句执行一句,不生成可执行文件,它的执行速度比编译方式慢。11C语言简介C语言是书写UNIX操作系统的语言具体发展过程,参考教材P2C语言使用灵活特点,并具有强大生命力,已经广泛应用于科学计算、工程控制、网络通信、图像处理等领域。C语言具体特点,参考教材P312C语言组成C程序由函数构成。一个C程序至少由一个函数构成,而且至少包含一个名为main的主函数。【例1.1】#include<stdio.h>voidmain()//函数首部{ printf("IlikeProgramming!\n");//输出一串字符}13冯·诺依曼系统结构(1)计算机由控制器、运算器、存储器、输入设备和输出设备5个部分构成。(2)计算机采用二进制,指令和数据均以二进制数形式表示和存放。(3)计算机按照程序规定的顺序将指令从存储器中取出,并逐条执行。14程序设计的本质程序设计的本质是设计能够利用计算机的五个部件完成特定任务的指令序列。【例1.2】#include<stdio.h>voidmain(){ intprice,number,total; scanf("%d%d",&price,&number);//输入

total=price*number;//计算

printf("total=%d\n",total);//输出}说明:分析五部件在程序中的作用过程。15程序设计的过程分析和定义实际问题建立处理模型设计算法设计流程图编写程序调试程序和运行程序16算法的概念和特性算法:解决一个问题所采取的一系列步骤。NikiklausWirth提出一个公式:程序=数据结构+算法数据结构是指在程序中数据的类型和组织形式。17算法举例计算机程序的算法,必须是计算机能够运行的方法。【例1.3】求1+2+3+4+…+100。第一种算法:书写“1+2+3+4+5+6+…+100”的表达式第二种算法:

显然,第二种算法要简单得多18算法举例【例1.4】求5!=1*2*3*4*5。step1:p=1step2:i=2step3:p=p*istep4:i=i+1step5:如果i<=5,那么转入step3执行step6:输出p,算法结束跟踪上述算法的执行过程,理解变量的作用,程序设计时可用的部件和功能。19算法举例【例1.5】求1*2*3*…*100。step1:p=1step2:i=2step3:p=p*istep4:i=i+1step5:如果i<=100,那么转入step3执行step6:输出p,算法结束只需要在【例1.4】算法,将循环条件改为“i<=100”20算法举例【例1.6】求1*3*5*…*101。step1:p=1step2:i=1step3:p=p*istep4:i=i+2step5:如果i<=101,那么转入step3执行step6:输出p,算法结束只需要将i的初值改为1、每次循环增加2即可21算法的特性(1)有穷性(2)确定性(3)输入:算法可以有输入,也可以没有输入,即有0个或多个输入。(4)输出(5)可行性22算法的表示方法自然语言:Eg:如果A大于B,那么最大值为A,否则最大值为B。

伪代码:Eg:ifA大于B,then最大值为A,else最大值为B传统流程图N-S流程图23传统流程图24N-S流程图25结构化的程序设计方法1966年,Bohra和Jacopini提出了顺序结构、选择结构和循环结构三种基本结构,结构化程序设计方法使用三种基本结构组成算法26顺序结构顺序结构是指按照语句在程序中出现的先后次序执行27选择结构选择结构根据条件选择程序的执行顺序选择结构一28选择结构选择结构二29循环结构循环结构通过设定循环条件,在满足该条件时反复执行程序中的某部分语句,即反复执行循环体。循环结构一-当型循环结构30循环结构循环结构二-直到型循环结构31结构化程序设计方法(1)程序组织结构化:对任何程序都以顺序结构、选择结构、循环结构作为基本单元来组织(2)程序设计采用自顶向下、逐步细化、功能模块化的方法将实际问题一步步地分解成有层次又相对独立的子任务,对每个子任务又采用自顶向下、逐步细化的方法继续进行分解,直至分解到对应一个个功能既简单、明确、又独立的模块,每个模块的设计又可以分解为结构化程序设计的三种基本结32习题与作业要求P10填空题二、3(1)(2)算法设计。33第2章VisualC++6.0简介34主要内容VisualC++6.0简介VisualC++6.0的安装与启动VisualC++6.0的集成开发环境VisualC++6.0的帮助VisualC++6.0中的C语言程序设计35VisualC++6.0简介

VisualC++6.0是微软公司推出的C++开发工具是一款功能强大的可视化应用程序开发工具,它集成了输入程序源代码的文本编辑器、设计用户界面的资源管理器以及检查程序错误的集成调试器等工具36VisualC++6.0的安装与启动VisualC++6.0的安装与启动,参考教材P11请使用正版软件,并尊重软件的版权37VisualC++6.0的集成开发环境菜单栏输出窗口文件编辑区工作区窗口标题栏工具条38VisualC++6.0的帮助参考教材P1539VisualC++6.0中的C语言程序设计编写C语言程序一般需要经过以下四个步骤:(1)建立源程序文件,扩展名为.cpp。(2)编译源程序生成目标文件,扩展名为.obj。(3)组建、连接生成可执行程序,扩展名为.exe(4)调试、运行程序40VisualC++6.0中的C语言程序设计【例2.1】建立一个Workspace,在该Workspace内建立一个工程,在工程中编写C语言源程序。参考教材P16,具体编程步骤。上机实验此例题41VisualC++6.0中的C语言程序设计【例2.2】直接建立一个C源程序,由系统自动创建工作区与工程。参考教材P18,具体编程步骤。上机实验此例题42VisualC++6.0中的C语言程序设计【例2.3】打开一个已有的工程文件。打开文件的具体步骤,参考教材P19上机实验此例题43习题与作业要求P20选择题上机实验【例2.1,2.2,2.3】,掌握程序设计过程和步骤44第3章(1)

数据类型、运算符与表达式45主要内容C语言的数据类型变量、常量整型数据、实型、字符型、字符串算术运算符数据类型转换注意:(*)内容可不必深究,以后再回来仔细研究46C语言的数据类型为了便于分配存储空间和运算,将数据分为多种类型不同数据类型,存储长度、取值范围和允许的操作不同47变量变量:在程序执行过程中,其值可以改变的量变量占据内存中的一块存储单元,用来存放数据,存储单元内的数据可以改变变量名:给存储单元起的名字变量的值:在存储单元里存放的数据48变量名、变量值与存储单元间的关系49定义变量变量必须先定义后使用变量的定义格式为:数据类型变量名1[,变量名2][,变量名3]……[,变量名n];50定义变量【例3.1】定义变量。voidmain(){ inta,b;//定义两个整型变量a,b floatf1,f2;//定义两个单精度浮点型变量f1,f2 doubled1,d2;//定义两个双精度浮点型变量d1,d2 charc1,c2;//定义两个字符型变量c1,c2}按快捷键F10(StepOver)追踪执行程序在VC6.0的“Variables”窗口的“Locals”选项卡中观察变量51定义变量类型名类型定义关键字占据的字节数短整型shortint2字节基本整型int4字节长整型longint4字节单精度浮点型float4字节双精度浮点型double8字节长双精度浮点型longdouble8字节字符型char1字节52定义变量变量的命名必须遵守标识符的规则。标识符,是在C语言中对变量等对象命名的有效字符序列标识符只能由字母、数字和下划线三种字符组成,而且第一个字符必须为字母或下划线。变量的命名不能使用C语言保留字(即关键字)合法的变量名:max、min、a、b3、_total、Student、_1_2_3和w_3_q非法的变量名:3abc、M.D.John、!eer、abc?d、a>b、int、float、if和while53定义变量C语言的保留字(关键字)用途关键字数据类型char,short,int,unsigned,long,float,double,struct,union,void,enum,signed,const,volatile存储类别typedef,auto,register,static,extern流程控制break,case,continue,default,do,else,for,goto,if,return,switch,while运算符sizeof54变量赋初值赋初值就是让变量获得初值如果变量未赋初值,那么其值为无意义的数据。变量没有赋值就参与运算,会得到错误的结果55变量赋初值初始化:在定义变量的同时给变量赋初值【例3.2】变量初始化。voidmain(){ inta=3,b=4; floatf1=4.5,f2=9; doubled1=100.8,d2=10.09;}56变量赋初值在变量定义后,再赋值【例3.3】先定义变量,再赋值语句,给变量赋初值。voidmain(){ inta,b; floatf1,f2; doubled1,d2; a=3;b=4;//赋值

f1=4.5;f2=9; d1=100.8;d2=10.09;}57常量常量:在程序执行过程中,其值不能改变的量常量分为:字面常量符号常量Const常量58常量-字面常量字面常量是指在程序中直接书写的数据(1)整型常量:表示整数,如23、-2和0语句“z=x/2+y*3;”中的数字2和3(2)实型常量:表示实数,如0.23、-5.6和145.78语句“c=5.67*e-0.78/f;”中的数字5.67和0.78(3)字符型常量:表示单个字符,用一对单撇号“'

'”括起来。如'A'、'$'、'8'、'*'59常量-符号常量符号常量用一个标识符代表一个常量,它在使用之前必须先定义。形式为:#define标识符常量#define是一条预处理命令,称为宏定义,它把标识符定义为常量。在编译之前,编译系统自动将后续源程序中所有出现的标识符替换为对应常量。60常量-符号常量【例3.4】符号常量的定义和使用。#definePI3.14#defineR5#include<stdio.h>voidmain(){ floatarea,l; l=2*PI*R;//替换为l=2*3.14*5; area=PI*R*R;//替换为area=3.14*5*5; printf("l=%f,area=%f\n",l,area);//输出}(1)常量标识符最好采用大写字母,便于与变量区分(2)符号常量的值不能再被赋值(3)符号常量的命名要见名知意,便于理解61常量-const常量使用关键字const定义的常量叫const常量,它是只读常量。定义形式如下:const类型标识符变量标识符=初始化数据;类型标识符const变量标识符=初始化数据;const常量只能在定义时初始化,不能进行赋值,只能读数据。62常量-const常量【例3.5】const常量的定义和使用。#include<stdio.h>voidmain(){ constfloatPI=3.14;//float类型的常量

intconstR=5;//int类型的常量

floatarea,l; PI=3.14159;//此语句有错误,const常量PI不能被赋值

l=2*PI*R; area=PI*R*R; printf("l=%f,area=%f\n",l,area);//输出}63整型数据-整型常量整型常量用来表示整数,如123、-234和0整型常量可以有八进制、十进制与十六进制的表示十进制整数123八进制(加前缀0),0173

为十进制的123十六进制(加前缀0x或0X)为0x53或0X53

为十进制的8364整型数据-整数类型数据范围整数类型比特(位)所能表示的数的范围有符号短整型[signed]short[int]16-32768~32767即-216~(216-1)无符号短整型unsignedshor[int]160~65535即0~(216-1)有符号基本整型[signed]int32-2147483648~2147483647即-231~(231-1)无符号基本整型unsignedint320~4294967295即0~(232-1)有符号长整型[signed]long[int]32-2147483648~2147483647即-231~(231-1)无符号长整型unsignedlong[int]320~4294967295即0~(232-1)方括号“[]”括起来的部分在定义变量时可以省略65整型数据的输出格式输出函数printf向屏幕输出数据,格式:printf(格式控制字符串,输出项列表)【例3.6】简单的格式输出举例。#include<stdio.h>voidmain(){ inta=3,b=4,c=5; printf("%d%d%d\n",a,b,c);

printf("a=%db=%dc=%d\n",a,b,c);}66整型数据的输出(1)格式字符串中包括格式说明符和普通字符。格式说明符由“%”和格式字符组成,如%d、%f和%c(2)格式说明符必须与数据类型一致,否则输出结果将会出错。67整型数据的输出整型数据格式说明符的含义格式说明符说明%d基本整型int,十进制输出%o基本整型int,八进制输出(暂不关注)%x基本整型int,十六进制输出(暂不关注)%u基本整型int,无符号输出(暂不关注)【例3.6】的程序是简单的整型变量输出方法,读者应该先掌握整型变量的最简单的输出方法。68整型数据的完整输出格式(*)printf格式说明符的完整形式:

%-0m.nl或h格式字符69整型数据的完整输出格式(*)符号含义%格式说明符的起始符号。-指定输出左对齐。0指定空位填0。m.n指定输出域宽及精度。m:指域宽,即输出项在输出设备上所占的列宽数。如果数据的列宽比m大,则忽略域宽m。n:指精度,表示输出的实型数据小数点后面的位数。不指定n时,默认的n为6。l或h输出长度修正。l:长整型,可以有%ld、%lo、%lx、%lu;而实型数据可以有%lf。h:将整型的格式字符修正为%hd、%ho、%hx和%hu,用于输出short类型的整数。70【例3.7】短整型、基本整型和长整型整数的输出(*)#include<stdio.h>voidmain(){shortintsa=123;inta=456,b=123,c=-123;longintla=789;printf("%hd,%d,%ld\n",sa,a,la);printf("%10hd,%10d,%10ld\n",sa,a,la); //每个输出域宽为10列,右对齐printf("%-10hd,%-10d,%-10ld\n",sa,a,la); //每个输出域宽为10列,左对齐printf("%010hd,%010d,%010ld\n",sa,a,la); //每个输出域宽为10列,右对齐,空白处补0printf("%2hd,%2d,%2ld\n",sa,a,la); //数据列宽大于域宽为2,忽略域宽2printf("%d,%o,%x\n",b,b,b);//十进制、八进制、十六进制和无符号输出printf("%d,%u,%d,%u\n",b,b,c,c); //%u无符号格式输出}71整型数据的输入格式输入函数scanf通过键盘为变量输入数据。格式为:

scanf(格式控制字符串,输入项地址列表)

【例3.8】向整型变量a、b和c输入数据。#include<stdio.h>voidmain(){ inta,b,c; scanf("%d%d%d",&a,&b,&c);//输入三个变量

printf("%d%d%d\n",a,b,c);//输出三个变量}72整型数据的输入说明:(1)输入的多个数据之间以一个或多个空格“”、Tab键或者回车键分隔。(2)输入的多个数据之间不能以逗号“,”等字符作为分隔。【例3.8】是整型变量的简单输入方法,初学者应该先熟练地掌握整型变量的输入方法。格式说明符必须与变量的类型严格对应。

73整型数据的输入(*)【例3.9】采用包含普通字符的格式向整型变量输入数据。#include<stdio.h>voidmain(){ inta,b,c; scanf("a=%d,b=%d,c=%d",&a,&b,&c);//输入三个变量

printf("%d%d%d\n",a,b,c);//输出三个变量}请思考语句“scanf("%d,%d,%d",&a,&b,&c);”该如何正确地输入三个整型数据。

74整型数据的格式说明符(*)格式说明符格式%d或者%i有符号十进制整型%ld或%Ld有符号十进制长整型%hd或%Hd有符号十进制短整型%ud无符号十进制整型%uld或%uLd无符号十进制长整型%uhd或%uHd无符号十进制短整型%o八进制整型%lx或者%Lx十六进制长整型75scanf的格式说明符的完整形式(*)%*ml或h格式字符符号含义%格式说明符的起始符号。*赋值抑制符,按照格式读入数据后不赋值给任何变量,虚读。m为域宽说明符,用于指定输入数据的宽度l或h长度修正说明符,在整型与实型中可以使用,加l(长整型及双精度型),加h(短整型)格式符号d:十进制整数,o:八进制整数,x:十六进制整数。f:浮点型实数,e:指数型实数。c:字符型数据。76整型数据的输入(*)【例3.10】向short、int、long整型变量输入数据。#include<stdio.h>voidmain(){ shortintha;inta;longintla; scanf("%hd%d%ld",&ha,&a,&la);//short、int、long变量的输入格式分别为%hd、%d和%ld printf("%hd%d%ld\n",ha,a,la);}77整型数据的输入(*)【例3.11】采用指定数据宽度的格式向整型变量输入数据。#include<stdio.h>voidmain(){ inta,b,c; scanf("%5d%5d%5d",&a,&b,&c); printf("%d%d%d\n",a,b,c);//输出三个变量}如果输入“123456789”,仍然是取得每5位赋给对应变量

78整型数据的输入(*)【例3.12】含有抑制符的格式说明符输入整型数据。#include<stdio.h>voidmain(){ inta; scanf("%*d",&a); printf("%d\n",a);}含有抑制符的格式说明符“%*d”获得的输入“123”会被省略,变量a得不到任何输入

79整型数据的输入(*)【例3.13】采用含有抑制符的格式向整型变量输入数据。#include<stdio.h>voidmain(){ inta; scanf("%*d%d",&a); printf("%d\n",a);}80输入函数的实现原理(*)scanf函数在执行中遇到以下两种情况后结束格式参数中的格式项用完——正常结束。发生格式项与输入域不匹配时——非正常结束。例如从键盘输入的数据数目不足。81整型数据在内存中的存储方式(*)整数在存储单元中存储的是该数的补码。一个正数的补码和原码相同,正数的原码就是该数的二进制形式。正数的原码、反码和补码相同。负数的补码是该数绝对值的原码取反后加一。82整型数据的溢出(*)【例3.15】整型数据溢出举例。#include<stdio.h>voidmain(){ shorta,b;a=32767;

b=a+1;printf("a=%hdb=%hd\n",a,b);}83第3章(2)

数据类型、运算符与表达式84主要内容实型数据字符型数据字符串算术运算符数据类型的转换85实型数据

实数类型比特(位)数有效数字数值范围单精度浮点型float326~7正负3.4*10-38~3.4*1038双精度浮点型double6415~16正负1.7*10-308~1.7*10308长双精度浮点型longdouble6415~16正负1.7*10-308~1.7*1030886实型数据实型数据常量:默认为双精度浮点型(double):

12.345单精度浮点型(float)(后缀F或f): 12.345F或12.345f长双精度浮点型(longdouble)常量(后缀L或l):

12.345L或12.345l87实型数据实型数据有两种表示方式定点格式:直接用小数点分开整数与小数部分

21.67指数格式:用科学计数法将实数分为尾数和指数两部分,用E或e隔开

1234.5,写为1.2345E3

88实型数据【例3.16】实型变量举例。#include<stdio.h>voidmain(){ floata,b; doublec,d; longdoublee,f; a=1234.56789F; b=1.23456789E5; c=1234.56789; d=1.23456789E5; e=1234.56789; f=1.23456789E5;}89实型数据实型数据的输入和输出格式说明符含义%f定点格式输入单精度数,输出单、双精度数,默认小数点后6位,不够用0补充。%lf定点格式方式输入或输出双精度型实数。%g定点格式输出,去掉小数点后无效的0。%E或%e以指数形式输出。90实型数据的输出

使用格式输出函数printf来输出【例3.17】按照不同格式输出实型变量。#include<stdio.h>voidmain(){ floata=1234.56789,b=1.23456789E5; doublec=1234.56789,d=1.23456789E5;

printf("%f,%f\n",a,b); //%f格式输出的小数点后的位数默认为6位

printf("%g,%g\n",a,b); //%g格式的输出省略了后边不影响精度的0 printf("%e,%e\n",a,b);//%e格式的输出为指数形式

printf("%lf,%lf\n",c,d);//%lf格式的输出双精度浮点数}91实型数据的输出【例3.18】输出实型变量,设置输出宽度与小数点后显示的位数和对齐方式。#include<stdio.h>voidmain(){ floata=1234.56789; printf("%f,%10.1f,%-10.1f,\n",a,a,a);}注意:初学者掌握%f格式的输出即可。92实型数据的输入

【例3.19】输入多个实型数据。#include<stdio.h>voidmain(){ floata,b; doublec; scanf("%f%f%lf",&a,&b,&c); //输入双精度数必须用%lf格式

printf("%f%f%lf\n",a,b,c); //各格式说明符之间要用空格隔开,便于区分各个数}93实型数据的输入(*)【例3.20】使用指数形式输入多个实型数据。#include<stdio.h>voidmain(){ floata,b,c; scanf("%e%e%e",&a,&b,&c); printf("%f%f%f\n",a,b,c); //各格式说明符之间要用空格隔开,便于区分各数}94实型数据在内存中的存储方式

(*)实型数据按照指数形式存放实数+123.567的存储数的符号位小数部分指数的符号位指数+.123567+395实型数据的有效数字位数

【例3.21】实型数据的有效数字位数。#include<stdio.h>voidmain(){ floata; doubleb; a=1234567890.1234567; b=1234567890.1234567;

printf("%f%lf\n",a,b); printf("%.10f%.10lf\n",a,b);}96实型数据的有效数字位数【例3.22】实型数据的有效位数。#include<stdio.h>voidmain(){ floata; doubleb; a=1234567890.1234567; b=1234567890.1234567;

printf("%.10f%.10lf\n",a,b);

a=a+1000; b=b+1000;

printf("%.10f%.10lf\n",a,b);}分别+1000后的变量情况97字符型数据-常量字符型常量:字符型常量表示单个字符,用一对单撇号“''”将字符括起来。如'a'、'B'、'$'、'*'、'5'和'8'98字符型数据-转义字符在“\”后跟一个字符,代表特殊控制字符,称为转义字符字符形式功能\n换行\t横向跳格\v竖向跳格\b退格\r回车\f走纸换页\\反斜杠字符\\'单引号(撇号)'\ddd1到3位八进制数所代表的字符,如'\141'表示字符'a'。\xhh1到2位十六进制数所代表的字符,如'\x61'表示字符'a'。99字符型变量字符数据的类型名为char一个字符型变量占据一个字节的内存空间,它可以存放一个字符在内存中实际存放的是字符的ASCII码

字符‘a’---ASCII码为97ASCII码也可以看成是整数字符的ASCII码,参考教材P37.100字符型变量【例3.23】字符型变量。voidmain(){ charc1,c2,c3; c1='a';//常量字符

c2=97;//常量ASCII值

c3='\141';//八进制数转义字符}101字符型数据的输入和输出利用基本输入输出函数输入输出字符:getchar()函数putchar(c)函数102字符型数据的输入和输出【例3.24】输入一个字符,并输出该字符。#include<stdio.h>voidmain(){ charc; c=getchar();//输入字符,赋给变量c putchar(c);//将字符变量c输出

putchar('\n');//输出转义字符'\n',即输出一个换行}一条getchar()语句只能读入一个字符

103字符型数据的输入和输出【例3.25】输入与输出多个字符。#include<stdio.h>voidmain(){charc1,c2,c3;c1=getchar();c2=getchar(); c3=getchar();putchar(c1);putchar(c2);putchar(c3);putchar('\n');}104字符型数据的输入和输出【例3.26】使用putchar(getchar())输入与输出字符#include<stdio.h>voidmain(){ putchar(getchar()); putchar(getchar()); putchar(getchar()); putchar('\n');}105字符型数据的输入和输出利用格式输入输出函数输入输出字符数据 格式说明符为“%c”字符型数据在内存中以ASCII码存放.整型的格式说明符%d、%o和%x等可以输入和输出字符型数据106字符型数据的输入和输出【例3.27】字符型数据的格式输入与输出。#include<stdio.h>voidmain(){ charc; scanf("%c",&c); printf("%c%d%o%x\n",c,c,c,c);}107字符型数据的输入和输出【例3.28】字符型数据的运算。#include<stdio.h>voidmain(){ charc; scanf("%c",&c); printf("%c%d\n",c,c); c=c-32;//小写字母转换为大写字母

printf("%c%d\n",c,c);}108字符串字符串常量是用一对双撇号“""”括起来的零个或多个字符字符串中可以包括转义字符"Ilikeprogramming!\n""Abc\'def\"\141Tianjin\\!\n"109字符串【例3.29】常量字符串举例。#include<stdio.h>voidmain(){ printf("Ilikeprogramming!\n"); printf("Abc\'def\"\141Tianjin\\!\n");//其中包括转义字符}110C语言运算符表达式描述对数据、进行什么运算,由运算符和运算量组成.运算符表示进行的运算操作运算量和操作数表示运算对象111C语言运算符编号类名包含的运算符1算术运算符+-*/%++--2关系运算符><==>=<=!=3赋值运算符=4逻辑运算符!&&||5位运算符<<>>~|^&6条件运算符?:7逗号运算符,8指针运算符*

&9求字节运算符sizeof10强制类型转换运算符(类型)11分量运算符.–>12下标运算符[]13其他如函数调用运算符()112C语言运算符学习提示:(1)运算符的学习比较容易,但需要细致和耐心。(2)要学会通过编写小程序来验证运算结果,加深对运算符优先级、结合方向和结果类型的理解

113算术运算符运算符功能结合性双目(单目)注意事项+加右双目-减、取负左双目或单目*乘左双目/除左双目整数与整数相除时,结果为整型,舍去小数部分%求余(模)左双目参与运算的数必须是整型114算术运算符和表达式(1)加、减、乘、除、求余的优先级与数学的相同(2)希望先做的运算,使用“()”括起来

34*(a+b),5-(a+(r-6)%4)(3)整数除整数的结果为整数。

5/3得1,-5/3的-1,5/9得0115算术运算符和表达式数学表达式的C语言算术表达式为(a+b)*(a+b)/(a*(b+c))116算术运算符和表达式【例3.30】算术运算符的使用。#include<stdio.h>voidmain(){ printf("%d%d\n",5+3,5-3);//5+3得8,5-3得2 printf("%d\n",5*3);//5*3得15 printf("%d%d%d\n",5/3,-5/3,5/9);//整数除整数得整数

printf("%d%d\n",5%3,-5%3);//求余数}117自增自减运算符自增运算符(++)和自减运算符(--)的功能是将变量的值自加1或自减1运算符功能++i,--i相当于i=i+1,i=i-1先让i的值增1或减1,后引用变量i的值i++,i--相当于i=i+1,i=i-1先引用变量i的值,后让i的值增1或减1118自增自减运算符(1)单目运算符:运算对象只能为一个变量(2)不同的编译系统对于自增自减运算符的结合方向可能有不同的解释,有的自右向左,有的自左向右。119自增自减运算符【例3.31】++和—运算符的使用#include<stdio.h>voidmain(){ inti=6,j=6; i++; //i自加1 ++j; //j自加1

printf("i=%d,j=%d\n",i,j); i=6;j=6; i--; //i自减1 --j; //j自减1 printf("i=%d,j=%d\n",i,j);}学习提示:(1)复杂的自增自减运算符,晦涩难懂,程序可读性比较差。(2)初学者只需把++和--运算符当成自加1和自减1的运算即可。例如i++、i--120自增自减运算符(*)【例3.32】阅读并分析以下程序中表达式中s和i的值★。#include<stdio.h>voidmain(){ inti=6,s=0,t=0; s=s+i++; //相当于s=s+(i++),结果为s=6,i=7

printf("%d%d\n",s,i); i=6;s=0; s=++i; //结果为s=7,i=7 printf("%d%d\n",s,i); i=6;s=0; s=i--; //结果为s=6,i=5 printf("%d%d\n",s,i); i=6;s=0; s=s+i--; //相当于s=s+(i--),结果为s=6,i=5 printf("%d%d\n",s,i); i=6;s=0; s=s+--i; //相当于s=s+(--i),结果为s=5,i=5 printf("%d%d\n",s,i);}121自增自减运算符(*)【例3.32】阅读并分析以下程序中表达式中s和i的值★。#include<stdio.h>voidmain(){ inti=6,s=0,t=0; s=s+i++; //相当于s=s+(i++),结果为s=6,i=7

printf("%d%d\n",s,i); i=6;s=0; s=++i; //结果为s=7,i=7 printf("%d%d\n",s,i); i=6;s=0; s=i--; //结果为s=6,i=5 printf("%d%d\n",s,i); i=6;s=0; s=s+i--; //相当于s=s+(i--),结果为s=6,i=5 printf("%d%d\n",s,i); i=6;s=0; s=s+--i; //相当于s=s+(--i),结果为s=5,i=5 printf("%d%d\n",s,i);}122自增自减运算符(*)【例3.33】分析++和--的运算次序★。#include<stdio.h>voidmain(){ inti=3,j=1,s=0; s=(i++)+(i++)+(i++); printf("%d%d\n",s,i); //结果s=9,i=6 i=3; s=(++i)+(++i)+(++i); printf("%d%d\n",s,i); //结果s=16,i=6 i=3;j=1;s=0; s=i+++j; printf("%d%d\n",s,i); //结果s=4,i=4 i=3; printf("%d%d\n",i,i++); //结果为33 i=3; printf("%d%d\n",i,++i); //结果为44}123赋值运算符和赋值表达式赋值运算符=连接的式子称为赋值表达式功能:计算右边表达式的值赋给左边的变量 变量=表达式当右边的表达式值与左边变量不一致时,将右边的值转换为左边变量的类型。实数转换为整型数时,截去小数部分,保留整数部分整数转换为实型时,在小数点后补0124赋值运算符和赋值表达式【例3.34】赋值运算符构成赋值语句。#include<stdio.h>voidmain(){ inta; floatb; a=3.14*2*2; //右边的实数转换为整数时,截去小数部分

b=3.14*2*2;

printf("a=%d,b=%f\n",a,b);}125赋值运算符和赋值表达式【例3.35】赋值运算符构成赋值语句。#include<stdio.h>voidmain(){ inta,b,c; a=b=c=5;//相当于a=(b=(c=5))

printf("a=%d,b=%d,c=%d\n",a,b,c); a=(b=3)+(c=4); printf("a=%d,b=%d,c=%d\n",a,b,c);}赋值运算符具有右结合性

a=b=c=8相当于a=(b=(c=8))赋值表达式值为右边表达式的值126复合赋值符在赋值符“=”之前加上其它二目运算符构成复合赋值符+=、-=、*=、/=、%=、<<=、>>=、&=、^=和|=一般形式为: 变量双目运算符=表达式相当于:变量=变量运算符表达式

127复合赋值符例如:

a+=15相当于a=a+15 x*=y+8相当于x=x*(y+8) r%=h相当于r=r%h学习提示:(1)复合赋值表达式的左边必须是变量。(2)将复合赋值符右侧的表达式看作一个整体。(3)复合赋值运算符有利于编译处理,能提高编译效率并产生质量较高的目标代码

128复合赋值符【例3.36】复合赋值运算符构成赋值语句。#include<stdio.h>voidmain(){ inta=1,b=2,c=3; a+=5; //相当于a=a+5 b*=6+a; //相当于b=b*(6+a) c/=2; //相当于c=c/2

printf("a=%d,b=%d,c=%d\n",a,b,c); a=12;

a+=a-=a*a;//相当于a=a+(a=(a-a*a)) printf("a=%d\n",a);}129逗号运算符和表达式逗号“,”称为逗号运算符

把两个表达式连接起来组成一个表达式,称为逗号表达式一般形式为: 表达式1,表达式2130逗号运算符和表达式(1)求值过程:从左向右求表达式值(2)整个逗号表达式的值为最右边的表达式n的值

3+5,6+8的值为14(3)逗号运算符在所有运算符中级别最低(4)逗号表达式可以拓展为以下形式: 表达式1,表达式2,……,表达式n131逗号运算符和表达式【例3.37】逗号表达式的使用。#include<stdio.h>voidmain(){ inta=5,b=7,c=9,y; y=(a-b),(b+c);//相当于(y=(a-b)),(b+c);

printf("y=%d\n",y);}132逗号运算符和表达式【例3.38】逗号表达式的应用。#include<stdio.h>voidmain(){ inta=2,b=4,c=6,x,y; x=(a-b,b+c);//x的取值为b+c; y=a-b,b+c;//相当于“(y=a-b),b+c”,y的取值为a-b printf("x=%d,y=%d\n",x,y); x=(a+b,a+c,b+c,a-b,a-c,b-c);//x取值为b-c y=a+b,a+c,b+c,a-b,a-c,b-c;//y的取值为a+b

printf("x=%d,y=%d\n",x,y);}133数据类型的转换不同类型的数据在进行混合运算时,要先进行类型转换转换的方法有两种:自动转换强制转换134隐式类型转换当不同类型的数据进行混合运算时,编译系统自动将数据转换为同一数据类型。(1)转换按数据的字节长度编程、精度变高。如int

long数据类型的长度和精度从低到高依次为

char、short、int、long、float、double(2)float必须转换成double(3)char和short必须先转换成int类型。(4)在赋值运算中,两边量数据类型不同时,右边数据的类型将转换为左边变量的类型。135隐式类型转换【例3.39】不同数据类型的混合运算。#include<stdio.h>voidmain(){ inta=5; floatb=3.14,c; chard='b'; c=b*a*a+'a'-d+3.5*'b';//不同类型数据的混合运算

printf("c=%f\n",c);}136强制类型转换运算符可以使用强制类型转换运算符,进行数据类型转换。一般形式为:

(类型名)(表达式)例如:

(float)a把a转换为实型

(int)(x+y)把x+y的结果转换为整型

(int)x+y相当于((int)x)+y137强制类型转换运算符(1)把表达式的运算结果强制转换成类型名所指的类型。(2)优先级高于算术运算符。(3)强制类型转换只将结果临时转换,而不改变变量的数据类型。138强制类型转换运算符【例3.40】强制类型转换举例。#include<stdio.h>voidmain(){ floata=3.6,b=3.7; intc,d,e; c=(int)a+(int)b;//相当于3+3 d=(int)(a+b);//相当于3.6+3.7取整

e=(int)a+b; //相当于3+3.7取整

printf("c=%d,d=%d,e=%d\n",c,d,e);}139作业与实验要求P48-50选择题、填空题和编程题阅读教材中有关内容上机实验部分例题容注意(*)的内容,可以不立刻深究,可待有一定编程能力后,再研读、掌握P51-52课上或课后,单元测试全批全改140第4章顺序结构程序设计141主要内容C语句注释顺序结构程序设计常见的编程错误及其调试142C语句C程序主要由两部分组成:数据描述(声明部分)数据操作(语句)语句包括:

1.控制语句:如

ifelse

2.函数调用语句:如printf("Hello.\n");143C语句3.表达式语句:如 a=12;

4.空语句:如

;5.复合语句:花括号“{}”把多条语句括起来,构成复合语句。如:

{ t=a; a=b; b=t; }144C程序的注释程序的注释仅用于描述程序的相关信息。注释主要有两种形式:单行注释多行注释area=PI*r*r;//计算圆的面积

//以下部分计算面积floatr/*半径*/,area;/*面积*/r=6;area=PI*r*r; /*计算圆的面积,r为半径*/145顺序结构程序设计顺序结构是结构化程序设计中最简单的控制结构,它一般包括输入、处理和输出三个过程146顺序结构程序设计程序设计的过程,一般包括以下步骤:(1)分析问题:(2)设计算法:(3)编写程序:147顺序结构程序设计【例4.1】编写程序,输入三角形的三条边长a、b和c,求三角形的面积。1.分析根据数学知识,在已知三角形的三条边时可以使用海伦公式来求其面积。

148顺序结构程序设计2.算法设计要计算三角形面积需要先输入三角形的三条边长,然后利用海伦公式计算面积。

149顺序结构程序设计3.编程(1)建立“E:\C\”文件夹(2)打开VisualC6,建立文件150顺序结构程序设计(3)编写源程序151顺序结构程序设计#include<stdio.h>#include<math.h>//因为使用数学函数sqrt(),所以必须包含math.hvoidmain(){ floata,b,c;//a,b,c为三角形的三条边长

floats,area;//s为三角形周长的一半,area为三角形面积

printf("\nPleaseInputa,b,c:");//提示输入三角形三条边长

scanf("%f%f%f",&a,&b,&c);//输入三条边长

s=(a+b+c)/2; //计算周长的一半s area=sqrt(s*(s-a)*(s-b)*(s-c));//计算三角形面积area printf("area=%f\n",area); //输出三角形面积area}152顺序结构程序设计(4)编译 执行“Build(组建)

Compile(编译)” 或者按下按钮 或者按下“Ctrl+F7”组合键(4)组建 执行“Build(组建)

Build(组建)” 或者按下按钮 者按下“F7”键

153顺序结构程序设计(5)运行

执行“Build(组建)

Execute(运行)”命令 或者按下按钮 或者按下“Ctrl+F5”组合键154顺序结构程序设计4.思考:余弦定理为155学习提示(1)按照分析问题、设计算法、编写程序的步骤解决问题。(2)变量必须先定义后使用,根据问题的性质确定变量类型。(3)不同类型的数据采用对应的输入输出格式符(4)变量的命名应该有实际意义,程序可读性强(5)注意编写注释,增加程序的可读性156顺序结构程序设计【例4.2】求解鸡兔同笼问题。已知笼子中鸡和兔的头数总共为h,脚数总共为f,问鸡和兔各有多少只?1.分析:157顺序结构程序设计2.算法设计3.编写程序#include<stdio.h>voidmain(){ inth,f;//h为总共头数,f为脚的总数

floatx,y;//x为鸡的只数,y为兔子的只数

printf("PleaseInputh,f:"); scanf("%d%d",&h,&f);//分别输入头和脚的数目

x=(4*h-f)/2;//计算鸡的只数

y=(f-2*h)/2;//计算兔子的只数

printf("x=%f,y=%f\n",x,y);}158顺序结构程序设计【例4.3】输入一个三位整数,将其个位、十位和百位数反序后,得到一个新的整数并输出。例如,输入整数234,输出整数432。1.分析

要将整数的数位反序,首先必须求得其个位、十位和百位数,然后再计算得到反序后的数。159顺序结构程序设计2.算法设计3.编写程序#include"stdio.h"voidmain(){ intm,n,a,b,c; printf("Pleaseinput三位整数:"); scanf("%d",&m); a=m%10; //求个位数 b=m/10%10; //求十位数 c=m/100%10; //求百位数 n=a*100+b*10+c; //反序后的数 printf("%d对调后是%d\n",m,n);}160常见的编程错误及其调试实际编程中错误经常会发生在编写程序的过程中,错误是很难避免的发现并纠正错误的过程称为调试,Debug主要包括语法错误运行时错误逻辑错误161语法错误语法错误有:(1)忘记定义变量。(2)语句后缺少分号“;”。(3)忘记包含所需要的库函数头文件。(4)忘记乘法运算符*。例如语句“a=3b;”。(5)忘记字符串两边的一对双引号。例如语句“printf("c=%d,c);”。(6)花括号“{}”不配对。(7)小括号“()”不配对。例如语句“s=(a+b+c/2;”162语法错误提示:编译器找出所有可能的错误,一个错误可能产生多条错误提示信息修改程序时,首先修改位置靠前的错误,重新编译程序后再查看错误信息,继续调试鼠标双击错误信息行,对应的语句行将会反显为蓝底白字,其左侧将出现提示图标。163语法错误【例4.4】输入英里数,将其转换为公里数并输出。1.算法设计2.编写程序1 voidmain()2 { doublekms3 printf("Pleaseinputmiles:");4 scanf("%lf",&miles);5 kms=1.609miles;6 printf("%lfmiles=%lfkms,miles,kms);7 }164语法错误语法错误调试过程,参考教材P64165语法错误3.修改后的程序1 #include<stdio.h>//增加了此行2 voidmain()3 { doublekms,miles;

//增加了miles变量定义和语句结束的“;”4 printf("Pleaseinputmiles:");5 scanf("%lf",&miles);6 kms=1.609*miles; //增加了“*”7 printf("%lfmiles=%lfkms",miles,kms);

//格式字符串增加了右侧双引号8 }166运行时错误运行时错误:在程序编译时未能找出,而在程序执行时被计算机检测到的错误当程序试图执行一个非法操作时会导致运行时错误如,被0除

167运行时错误【例4.5】被0除错误程序举例。voidmain(){ inta,b,c; a=10; b=5/9;//b为0 c=a/b;//除法的分母为0,导致运行时错误

printf("c=%d",c);}168未检测到的错误未检测到的错误是指有一些错误在编译和运行时都不会被计算机检测出,但是却会导致程序运行结果不正确。169未检测到的错误(1)printf()或scanf()语句中变量类型与使用格式说明符号不一致#include<stdio.h>voidmain(){ inta; a=12345; printf("%f\n",a);}变量a为int类型,而printf()语句中错误地使用“%f”格式

170未检测到的错误(2)赋给int类型变量的数超出变量的取值范围。#include<stdio.h>voidmain(){ inta; a=2147483648;//超过了int类型的取值范围-2147483648~2147483647 printf("%d\n",a);}171未检测到的错误(3)scanf()语句中忘记使用变量的取地址符号“&”。 scanf("%d%d",a,b);程序在运行时输入的数据不能赋给对应的变量

172未检测到的错误(4)运行程序时输入数据的方式与scanf()语句的格式要求不一致,导致数据不能正确赋给变量#include<stdio.h>voidmain(){ inta,b; scanf("%d,%d",&a,&b); printf("%d,%d\n",a,b);}173未检测到的错误(5)整数除法可能导致的结果错误。C=5/9*(F-32);因为5/9的值为0,因此不论F的值为多少,变量C的值永远为0

174逻辑错误逻辑错误:由于不正确的算法导致的错误逻辑错误只是得不到期望的结果,它通常不会导致运行时错误制定完善的测试方案,设计尽可能包括所有可能情况的测试用例,将运行的结果与预测的结果比对175程序调试方法(1)执行“Debug(调试)

StepOver(单步跳过)”命令,或者按下“F10”键(2)在“Auto(自动)”标签176程序调试方法(3)在“Locals(本地)”标签中显示变量当前值177程序调试方法(4)在“Watch1-4”标签中,可以在“Name”列输入变量名或表达式其他,调试程序的操作可以参考教材P61178作业与实验要求P62

编程题,分析编程题,设计算法,编写程序,上机调试程序特别注意:掌握程序的调试方法。课上或课后,P64-65单元测试全批全改179第5章选择结构程序设计180主要内容关系运算与逻辑运算选择结构算法设计if语句switch语句选择结构的嵌套条件运算符181关系运算与逻辑运算关系运算用于比较两个数据的关系逻辑运算用于对多个条件进行组合判断182关系运算符和关系表达式关系运算符用于比较两个操作数的关系用关系运算符连接两个表达式称为关系表达式,如:a>b如果关系成立,值为真,否则为假关系表达式的值“真”为整数1,“假”为整数0

关系运算的操作数可以是数值、字符等类型183关系运算符和关系表达式运算符运算关系表达式(假设:a=5,b=6,c=7)优先级>大于a>b值为0a+b>c值为1高<小于3+a<6值为0'A'<'a'值为1>=大于等于a*b>c值为1'A'>='a'值为0<=小于等于12+c<=100值为1==等于a==b值为0a+2==c值为1低!=不等于a!=b值为1a+11=b值为0184关系运算符和关系表达式(1)两个字符按照ASCII码值大小比较。如:'A'---65,'a'---97'A'<'a'值为真,即整数1。(2)(>,<,>=,<=)优先级别相同,(==,!=)的优先级相同。前四种优先级高于后两种。(3)关系运算符的优先级低于算术运算符。(4)关系运算符的优先级高于赋值运算符“=”。185关系运算符-优先级①a>b+c,相当于a>(b+c)。因为算术运算符优先级高于关系运算符。②a==b>c,相当于a==(b>c)。因为运算符“>”的优先级高于运算符“==”。③a=b>c,相当于a=(b>c)。因为关系运算符的优先级高于赋值运算符“=”。

186关系运算符和关系表达式【例5.1】编写以下程序,查看结果。#include<stdio.h>voidmain(){ inta,b,c; intd,e,f;

a=4,b=5,c=6; d=a>b; e=a<b<c; f=c>b>a; printf("%d%d%d\n",d,e,f);}187逻辑运算符和逻辑表达式逻辑运算符用于对操作数进行逻辑运算用逻辑运算符连接关系表达式或逻辑值称为逻辑表达式188逻辑运算符和逻辑表达式运算符含义说明举例(a=10)值&&与(并且)两个操作数都为真时,结果才为真。1<=a&&a<151||或(或者)两个操作数都为假时,结果才为假。a<=1||a>=200!非(取反)操作数为真,结果为假,反之亦然。!(a<4)1ab!aa&&ba||b11011100010110100100逻辑运算的操作数以0表示假,以非0表示真。逻辑运算的值“真”用整数1

温馨提示

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

评论

0/150

提交评论