资源预览内容
第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
第9页 / 共51页
第10页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计算概论(Introduction to Computing) 主讲人:马思伟北京大学数字媒体研究所http:/www.idm.pku.edu.cn/第七讲第七讲 程序结构程序结构2 2 2 2 2复习o程序的基本框架n编译预处理:#include,#definen自定义函数的声明n主函数:main()n自定义函数的定义o程序的基本元素n标识符和关键字p标识符是以字母,下划线(_)开始的一个字符序列,后面可以跟字母,下划线,数字p关键字:具有专门的意义和用途,不能当作一般的标识符使用n数据类型、常量和变量p基本数据类型:整型、短整型、长整型、单精度浮点型、双精度浮点型、字符型、空类型p常量:直接使用;#define定义p变量:内存空间n运算符和表达式p算术、关系、逻辑、位运算、赋值、条件运算n语句和控制流3 3 3 3 3数据类型、常量和变量4 4 4 4 4表达式中的数据类型转换o两种方式n强制转换,使用(DataType)强制转换,例inta,b=1;floatc=4.3;a=b+(int)c;赋值表达式也会进行强制转换a=b+c;n自动转换,表达式运算中低精度变量自动向高精度转换p区别上面的a=b+(int)c;与a=b+c;p区别c=5/2;与c=5.0/2;a=5.0/2;与a=5/2;5 5 5 5 5字符数据类型o字符类型数据与整数(0-255),区别charc1=0;赋初值为字符0charc1=0;o字符类型数据的运算charc2=A;printf(“%c”,c2+1);o特殊类型字符反斜线(Backslash)退格(Backspace)b回车(Carriagereturn)r进纸符(Formfeed)f制表符(Formfeed)t换行(Newline)n单引号(Singlequote)6 6 6 6 6自加自减运算o区别+在变量前后nj=+i;表示先将i的值加1,再赋给j,如果i的值是5,则j的值是6。(先给变量加1,再使用变量)nj=i+;表示先将i的值赋给j,再把i的值加1,如果i的值是5,则j的值是5。(先使用变量,再给变量加1)7 7 7 7 7课堂练习o以下程序的输出结果是()。main()inta=4,b=5;floatc=a/b;printf(“%fn”,c);A不确定值B0.8C0.000000D0o以下程序的输出结果是()。main()inta=4,b=5;floatc=(float)a/b;printf(“%fn”,c);A不确定值B0.800000C0.000000D0o7.当执行完以下语句后,变量a的值为(),d的值为(),e的值为()。a=6;b=+a;c=-a;d=a+;e=a-;o答案:C;B;6,6,78 8 8 8 8运算符与表达式o关系表达式:使用关系运算符和括号将操作数连接起来的表达式称为关系表达式:n(大于),=(大于等于),y,(x+1)=4,(-3+a-b*5)1)&(x=20)n|(逻辑或):当2个操作数有一个为非0或真时,结果为1(真),否则为0(假),如:(x20)n!(逻辑非):将一个非0或为真的操作数变为0,或将0或为假的操作数变为1,如:!(xy)n逻辑运算&和|连接的表达式是自左向右求值的,一旦知道结果的真、假值,求值马上停止:(a+1c)&(b+11),若(a+1c)为0,则表达式的值为0(a+1c)|(b+11),若(a+1=,y)?x:y1212121212运算符与表达式o位运算符的操作数必须是整型数据。在C中,整型数据分有符号整数和无符号整数,是用一定长度的二进制位来表示。以32位整数为例来说明位移动运算:n有符号数:有符号整数做位移运算时,符号位是不参与移动的。左移时,空出的位用0填补;右移时,空出的位用符号位填补。(机器内数据的补码表示)n无符号数:没有符号位,不管左移或右移,空出的位用0填补。n位移运算的实质(在不发生溢出时):p左移:xn,相当于x/2n1313131313位运算与逻辑运算o位运算:逐位进行逻辑运算o逻辑运算:非零为真,运算结果为0/1分别表示真假ninta=1,b=2;if(a&b)printf(“OK”);if(a&b)printf(“OK”);1414141414运算符优先级o最高优先级:,-,()/左右结合o单目运算:-,!,+,-,!(),sizeof/右结合o算术乘除运算:*,/,%/左结合o算术加减运算:+,-/左结合o移位运算:,/左结合o大小关系运算:,=/左结合o相等关系运算:=,!=/左结合o按位与:&/左结合o按位异或:/左结合o按位或:/左结合o逻辑与:&/左结合o逻辑或:|/左结合o条件运算:?:/右结合o赋值:=,+=,-=,*=,/=,%=,=,&=,|=/右结合1515151515语句o高级程序设计语言的运行单位是语句。n在C语言中,诸如表达式:x=1、i+,等之后加上分号就构成了简单的语句(所有的表达式加上分号之后都可以形成语句,但它们并不都是有效的语句,如:x+5)。oC语言中的语句种类大致包括:n 变量定义与初始化语句,如:int x, y = 1;n 赋值语句,如:x = y + z;n 函数调用语句,如:scanf(“%d”, &n);n 自增(减)语句,如:i+; -i;n 程序控制语句n 空语句n 1616161616输入输出o在标准输入输出函数库(stdio.h)中,提供了通过标准输入输出设备(键盘和显示器)进行数据的输入输出函数:n单个字符输入:intgetchar(),返回的是字符的ASCII码n单个字符输出:intputchar(int)n格式化输入:intscanf(constrol_string,arg1,arg2,)n格式化输出:intprintf(constrol_string,arg1,arg2,)1717171717输入输出ogetchar(),putchar()1818181818输入输出oscanf()和printf()的基本格式控制符有:n%d:整数(int)n%ld:整数(long)n%hd:整数(short)n%c:字符(char)n%s:字符串(字符数组)n%f:单精度浮点数(float)n%lf:双精度浮点数(double)1919191919输入输出o在scanf()中的格式控制中,还可以控制多个输入数据之间的分隔标记,如:scanf(“%c,%d,%f”, &c, &n, &f),则在输入数据时各数据之间用“,”作为分割。若多个输入控制符之间没有任何分隔标记,如:scanf(“%c%d%f”, &c, &n, &f) ,则输入数之间以换行(回车)或空格作为分隔。在printf()中的格式控制中,还可以包含其他希望输出字符(串),如:printf(“nThisisa%d!”,n);如果n的值为10,则输出效果为2020202020程序结构o顺序程序结构:程序顺序地执行语句,语句出现的顺序就是其执行顺序o循环程序结构:程序反复执行某些语句o分支程序结构:控制多路选一的分支情况2121212121三种结构语句o程序控制语句及其控制说明:n分支控制语句:if-else, switch-case/defaultn循环控制语句:while, do-while, forn此外,还有一些与程序转移控制有关的语句:break, continue, return用大括号()把修饰性描述和语句组合在一起的,称为复合语句。复合语句在语法上和简单语句是一样的(代码段:也包括不含有修饰性描述的情况)2222222222分支控制if-elseo两种形式nif(表达式)语句/语句组nif(表达式)语句/语句组else语句/语句组2n例if(i0)y=x/i;elsex=i;y=-x;2323232323分支控制if-elseo嵌套if-else,最近邻原则-else与最近的if语句共同构成一句if(i0)if(ji)x=j;elsex=i;区别if(i0)if(ji)x=j;elsex=i;2424242424分支控制if-else2525252525分支控制if-else2626262626分支控制if-elsestatements1statements2stmts1stmts22727272727分支控制if-else2828282828多分支语句switch-case/defaulto另一类问题,通常我们需要将一个表达式的值与多个不同的常量按顺序进行比较,选择其中的匹配项,执行相应部分的语句。这就是多分支语句。2929292929多分支语句switch-case/defaulto表达式expression的值类型必须是整型或字符型:char,short,int,longocase子句中的值valueI也必须是整型或字符型常量,而且所有case子句中的值应是不同的o可以有任意数目的case条件,但不能有两个完全相同的case表达式3030303030多分支语句switch-case/defaulto执行switch语句时,首先对表达式expression求值,然后与每个case子句中的常量值比较,若找到匹配的常量(相等),程序就执行该分支的语句,直到整个switch语句结束,或者遇到一个break语句o如果所有条件都不满足,且有default语句,则从default语句开始执行odefault语句只能有一个,但不必一定在最后3131313131多分支语句switch-case/defaulto例switch(c)caseA:capa+;casea:lettera+;default:total+;v例switch(i)case-1:n+;break;case0:z+;break;case1:p+;break;v例casea:caseb:casec:cased:casee:casef:x+;另:if(c=a)&(c=f”)x+;3232323232多分支语句switch-case/default3333333333课堂练习o1以下程序的输出结果是()。voidmain()intk1=1,k2=2,k3=3,x=15;if(!k1)x-;elseif(k2)if(k3)x=4; elsex=3;printf(“x=%dn”,x);Ax=4Bx=15Cx=14Dx=3答案A3434343434程序设计一般过程o例题n海水以半圆形侵蚀陆地,每年50平方公里的速度,第一年开始在(0,0)点,问给定坐标(x,y),第几年该点将被侵蚀(x, y)xy3535353535程序设计一般过程o问题分析n该点在第n年被侵蚀,表示以从原点到该点间距离为半径的半圆面积小于n年侵蚀的总土地面积,而大于n-1年侵蚀的总面积n=|(x2+y2)*/2/50|表示上取整xy3636363636程序设计一般过程o程序设计n确定程序的输入输出:读入点坐标x,yn确定输入和中间计算结果的存储方式:存储实数变量x,y;计算出的整数年份nn确定计算过程:n=|(x2+y2)*/2/50|xy3737373737程序设计一般过程o程序实现#include /将输入输出用到的库函数(将输入输出用到的库函数(C语言中的函数)包含进来语言中的函数)包含进来#include /将计算用到的库函数包含进来将计算用到的库函数包含进来void main() /程序开始程序开始 float x, y; /用来存放读入的坐标值用来存放读入的坐标值 int year; /用于保存计算出来的年数用于保存计算出来的年数 scanf(%f%f, &x, &y); /从键盘读入坐标值从键盘读入坐标值x和和y year = (int)ceil(x * x + y * y) * 3.1416/2/50); /套用公式计算年数;套用公式计算年数;ceil是向上取整是向上取整 /(int) 强制转换成整数强制转换成整数 printf (第第%d年年末年年末n, year); /将算出来的年数输出到屏幕上将算出来的年数输出到屏幕上 /程序结束程序结束3838383838程序设计一般过程o程序调试运行n输入数据n验证结果3939393939学习程序设计五要素o理解程序在内存中的运行过程o掌握一门高级程序设计语言o掌握基本的计算方法o掌握从分析问题到算法设计再到程序实现的全过程o多做练习,多读优秀代码、模仿样例解决类似问题、分析问题设计算法、总结经验4040404040学习程序设计五要素o理解程序在内存中的运行过程n程序的构成:语句n程序的执行p顺序执行p分支、循环、函数调用可以改变执行顺序n程序的生存空间p内存:存放程序与运算结果(中间结果)#includestdafx.hintmain()printf(HelloWorld!n);return0;4141414141学习程序设计五要素o理解程序在内存中的运行过程o掌握一门高级程序设计语言n描述计算过程n基本语法p变量定义、引用;分支语句;循环语句;函数结构n函数库p基本算法#includestdafx.hintmain()inta=1,b=2;printf(%d,a+b);4242424242学习程序设计五要素o理解程序在内存中的运行过程o掌握一门高级程序设计语言o掌握基本的计算方法n例p求一组数中的最大值、最小值:逐个比较记住当前的最大/最小值p判断某年是否是闰年p数制转换p判读某数是否是素数p字符串处理p4343434343学习程序设计五要素o理解程序在内存中的运行过程o掌握一门高级程序设计语言o掌握基本的计算方法o掌握从分析问题到算法设计再到程序实现的全过程n分析问题抽象数学模型设计计算过程和数据存储方式代码调试4444444444学习程序设计五要素o理解程序在内存中的运行过程o掌握一门高级程序设计语言o掌握基本的计算方法o掌握从分析问题到算法设计再到程序实现的全过程o多做练习,多读优秀代码、模仿样例解决类似问题、分析问题设计算法、总结经验n避免重复的语法错误4545454545程序阅读理解o输入输出#include/包含输入输出函数的头文件intmain()/主函数/主函数开始记号intbaby,mum;/定义两个整型变量baby,mumscanf(“%dn”,&baby);/从键盘读入一个整数并存放到变量baby中scanf(%dn,&mum);/从键盘读入一个整数并存放到变量mum中printf(“Thebabyis%dyearsoldn”,baby);/显示输出printf(Thebabyis%dyearsoldn,mum);/显示输出return0;/程序运行结束返回/主函数结束的记号4646464646程序阅读理解o表达式#includeintmain()intx,y,z;/定义三个整数变量printf(LiMingsfirstcalculatorn);/显示输出printf(Pleaseinputthefirstinteger:n);/显示输出scanf(%d,&x);/从键盘输入一个整数printf(Pleaseinputthesecondinteger:n);/显示输出scanf(%d,&y);/从键盘输入一个整数z=x+y;/加法计算printf(%d+%d=%dn,x,y,z);/显示输出printf(Howniceitis!n);/显示输出return0;4747474747程序阅读理解o分支语句#includeintmain()intx,y,z;/定义三个整数变量charq;printf(LiMingssencondcalculatorn);/显示输出printf(Pleaseinputtheoperator:n);/显示输出scanf(“%c”,&q);/从键盘输入一个运算符printf(Pleaseinputthefirstinteger:n);/显示输出scanf(“%d”,&x);/从键盘输入一个整数printf(Pleaseinputthesecondinteger:n);/显示输出scanf(“%d”,&y);/从键盘输入一个整数switch(q)case+:z=x+y;break;case-:z=x-y;break;case*:z=x*y;break;case/:z=x/y;break;default:z=x;printf(%d%c%d=%dn,x,q,y,z);/显示输出printf(Howgreatitis!n);/显示输出return0;4848484848程序阅读理解o循环语句#includeintmain()inti,b;/定义整数变量intsum=0;/定义整数变量inta10;/定义整数数组变量,10个整数元素for(i=1;i=10;i+)/循环,从i=1开始,i=11时结束scanf(%d,&ai-1);/读入一个整数到ai-1scanf(%d,&b);/读入一个整数for(i=1;i=10;i+)/循环if(ai-1=b)sum+;/访问数组中的一个元素ai-1进行判断比较,计算sum值printf(%d,sum);/输出显示return0;4949494949程序阅读理解o判断语句#include int main() int n, a, i; scanf (%d, &n); for (i=1; i=n; i+) scanf(%d, &a); if (a%2!=0) printf(0 0 n); else int least, most; if (a%4!=0) least = a/4 + 1; else most = a/4; least = a/2; printf(%d%dn, least, most); return 0; 5050505050程序阅读理解o随机数#include#include#includeintmain()inti;srand(unsigned)time(NULL);/设置随机数的种子printf(这是甲的数%6dn,rand()%6+1);/产生一个随机数printf(这是乙的数%6dn,rand()%6+1);/产生一个随机数printf(这是丙的数%6dn,rand()%6+1);/产生一个随机数5151515151总结o程序结构n顺序、循环和分支n分支语句:if-else,switch-casen循环语句:for,while,do-whilen转移控制:break,continue
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号