C语言程序设计基本方法.pps
《C语言程序设计基本方法.pps》由会员分享,可在线阅读,更多相关《C语言程序设计基本方法.pps(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、高级语言程序设计高级语言程序设计(一一)(C Programming)第三讲:程序设计方法第三讲:程序设计方法-问题分析问题分析本章目标本章目标n了解一般程序设计过程了解一般程序设计过程n通过实例重点掌握问题分析方法通过实例重点掌握问题分析方法l精度计算;精度计算;l输入数据处理;输入数据处理;l字符串操作字符串操作程序设计过程程序设计过程n程序设计过程就是解决问题的过程。程序设计通程序设计过程就是解决问题的过程。程序设计通常包括如下五个步骤:常包括如下五个步骤:问题问题分析分析编码编码算法设计算法设计程序设计步骤程序设计步骤测试测试调试调试有问题有问题无问题无问题分析问题:分析问题:功能功能
2、:需要弄清楚软件要完成的功能;输入输入:如果问题有输入,分析输入是什么及输入数据的类型;处理处理:对输入数据做什么处理;输出输出:如果有输出,输出什么数据及输出数据的格式;对于复杂问题,可将问题分解为若干子对于复杂问题,可将问题分解为若干子问题,然后再进行上面的分析。问题,然后再进行上面的分析。算法设计:算法设计:设计解决问题的具体方案(步骤)。编码:编码:将算法用高级语言实现。测试:测试:运行编译连接后得到的执行程序,以验证程序是否按要求 解决了问题,并没有产生副作用。即程序是否做了该做的事,同时没有做不该做的事。调试:调试:如果程序经测试发现问题,则通过调试手段找到产生错误的代码并修复它。
3、算法算法n任何计算问题的解决都是按指定的顺序执行一系任何计算问题的解决都是按指定的顺序执行一系列动作的结果。解决问题的步骤列动作的结果。解决问题的步骤(动作及动作之间动作及动作之间的顺序的顺序)称为算法(称为算法(algorithm)。)。算法表示算法表示n算法既可以用自然语言表述算法既可以用自然语言表述(如前如前),也可用用半结,也可用用半结构化语言或结构化图形表示,如:构化语言或结构化图形表示,如:read 学生成绩值学生成绩值if 成绩值成绩值=60print“Pass”elseprint“Fail”读学生成绩值读学生成绩值成绩值成绩值=60输出输出”Fail”输出输出”Pass”真真假
4、假流程图流程图问题问题3.1:计算计算e值值【问题描述问题描述】e(自然对数自然对数)值计算公式为值计算公式为 1+1/1!+1/2!+1/n!。输入一个整数。输入一个整数n(0=n=30),计算相应),计算相应e近似值近似值。【输入形式输入形式】从控制台输入整数从控制台输入整数n(0=n=30)。)。【输出形式输出形式】控制台输出计算结果,要求小数点后保留控制台输出计算结果,要求小数点后保留10位。位。【样例输入样例输入1】12【样例输出样例输出1】2.7182818283【样例输入样例输入2】13【样例输出样例输出2】2.7182818284问题问题3.1:问题分析:问题分析n输入:一个整
5、数(输入:一个整数(整型)整型);n处理:计算处理:计算 公式公式1+1/1!+1/2!+1/n!;n输出:以输出:以%.10f格式输出格式输出(小数后保留小数后保留10位位)n变量:变量:l一个整型变量一个整型变量,用于存储所读入的整数用于存储所读入的整数,如如,int n;l一个双精度浮点变量一个双精度浮点变量(Why?),用于存储计算结果用于存储计算结果,如如double e;问题问题3.1:算法设计:算法设计n解决问题解决问题3.1的解决过程(算法一):的解决过程(算法一):设计算结果保存在变量设计算结果保存在变量e e中;中;读入一个整数到变量读入一个整数到变量n;n;for(i=0
6、;i=n;i+)for(i=0;i=n;i+)e=e+1/i!;e=e+1/i!;输出输出e e值值;e=1+1/1!+1/2!+1/n!问题问题3.1:代码实现:代码实现#include int fact(int n)int f,i;f=1;for(i=2;i=n;i+)f*=i;return f;int main()int n,i;double e=0.0;scanf(%d,&n);for(i=0;i=n;i+)e+=1.0/fact(i);printf(%.10f,e);return 0;问题问题3.1:测试:测试n测试数据的考虑测试数据的考虑1.首先选取输入数据区间(首先选取输入数据区
7、间(0=n=30)的正常值)的正常值,如问题如问题3.1中所提供的输入样例;中所提供的输入样例;输入:输入:12期望(正确)输出:期望(正确)输出:2.7182818283输入:输入:13期望(正确)输出:期望(正确)输出:2.71828182842.选取输入数据区间边界附近的值,本例中可选选取输入数据区间边界附近的值,本例中可选取:取:ln=0,期望输出:期望输出:1.0000000000ln=1,期望输出:期望输出:2.0000000000ln=30,期望输出:,期望输出:2.7182818285 问题问题3.1:常见问题分析:常见问题分析n以整型计算以整型计算n!,即函数,即函数fact
8、返回整数(观察现象返回整数(观察现象what happened?)n=13实际输出:实际输出:2.7182818288(期望输出:期望输出:2.7182818284)Why?如何调试如何调试?数据范围与精度数据范围与精度nint类型数据范围类型数据范围(对于对于IA32结构的计算机结构的计算机):-232-1-232-1-1(即即-2147483648 2147483647)12!int最大值最大值 13!n修改方法:修改方法:将保存阶乘结果的变量将保存阶乘结果的变量改为改为double类型,并将类型,并将fact的返回类型也改为的返回类型也改为double 0!11!12!23!64!245
9、!1206!7207!50408!403209!36288010!362880011!3991680012!47900160013!1932053504(error!,溢出溢出)(正确应为正确应为:6227020800)14!1278945280(error!,溢出溢出)(正确应为正确应为:87178291200)问题问题3.1:修改后的程序:修改后的程序#include double fact(int n)int i;double f=1.0;for(i=1;i=n;i+)f*=i;return f;int main()int n,i;double e=0.0;scanf(“%d”,&n);
10、for(i=0;i=n;i+)e+=1.0/fact(i);printf(“%.10f”,e);return 0;n 计算结果为计算结果为float类型,即类型,即float e;(观察现象(观察现象what happened?)n=12实际输出:实际输出:2.7182819841(期望输出:期望输出:2.7182818283)n double类型比类型比float类型有更高的精度类型有更高的精度 float尾数:尾数:23位,指数:位,指数:8位位double尾数:尾数:52位,指数:位,指数:11位位问题问题3.1:常见问题分析(续):常见问题分析(续)问题问题3.1:另一种方法:另一种方
11、法n观察计算观察计算 公式公式1+1/1!+1/2!+1/n!,可知:,可知:若前一次迭代若前一次迭代1/(n-1)!计算结果为计算结果为fn-1,则本次迭代的结果则为,则本次迭代的结果则为fn=fn-1/n因此,因此,没有必要每次迭代都重新计算没有必要每次迭代都重新计算n!,显然效率会更高,显然效率会更高。n具体算法(解题步骤)为:具体算法(解题步骤)为:给双精度浮点变量给双精度浮点变量e和和 f 赋初值赋初值 1.0;for(i=1;i=n;i+)f=f/i;e=e+f;输出输出e问题问题3.1:另一种方法(代码):另一种方法(代码)#include int main()int n,i;d
12、ouble e,f e=f=1.0;scanf(“%d”,&n);for(i=1;i=n;i+)f=f/i;e+=f;printf(“%.10f”,e);return 0;考虑为什么循环从考虑为什么循环从i=1开始,而开始,而不从不从i=0开始?开始?17问题问题3.2:简易计算器:简易计算器【问题描述问题描述】编程实现简单的交互式计算器,能进行整数的编程实现简单的交互式计算器,能进行整数的+-*/运算。运算。【输入形式输入形式】从键盘读入如下形式的输入行,数据与运算符之间可以从键盘读入如下形式的输入行,数据与运算符之间可以用一个或多用一个或多个空格分隔个空格分隔:120+350【输入形式输入
13、形式】对于对于+,-及及*运算,输出形式如下:运算,输出形式如下:120+350=470对于对于/运算,输出形式如下(小数后保留两位):运算,输出形式如下(小数后保留两位):5/2=2.50 18问题问题3.2:问题分析:问题分析n如何读入数据及运算符?如何读入数据及运算符?l方法一方法一int data1,data2;char op;scanf(“%d%c%d”,&data1,&op,&data2);l方法二方法二int data1,data2;char op;scanf(“%d”,&data1);getchar();op=getchar();scanf(“%d”,&data1);不足:数据
14、与运算符之间只能有一个空格分隔不足:数据与运算符之间只能有一个空格分隔输入时,数据输入时,数据与字符之间不与字符之间不能有空格,否能有空格,否则空格作为字则空格作为字符输入。符输入。19问题问题3.2:问题分析:问题分析n如何读入数据及运算符?如何读入数据及运算符?l方法三方法三int data1,data2;char op;scanf(“%d%c%d”,&data1,&op,&data2);好处:数据与运算符之间可以有多个空格分隔好处:数据与运算符之间可以有多个空格分隔空格使得跳过两次非空格使得跳过两次非空白输入间的所有空空白输入间的所有空白字符。白字符。20问题问题3.2:算法设计:算法设
15、计int data1,data2,result1;float result2;char op;从标准输入中读入整数从标准输入中读入整数data1,运算符,运算符op及整数及整数data2;判断判断op:若为若为+,则,则result1=data1+data2;若为若为-,则,则result1=data1-data2;若为若为*,则,则result1=data1*data2;若为若为/,则,则result2=data1/data2;若若op为为+,-或或*,输出结果,输出结果result1;若若op为为/,输出结果,输出结果result2;op值加运算+减运算乘运算 除运算-*/多路选择多路选择
16、注意:由于注意:由于data1和和data2为整为整数,结果仍为整数。要用数,结果仍为整数。要用强制强制类型类型转换才能得到小数位。转换才能得到小数位。result2=(float)data1/data2;多路选择,可使用多路选择,可使用if-else if语句实现。在此,语句实现。在此,更适合更适合switch语句。语句。21问题问题3.2:代码实现:代码实现/c3_2.c#include int main()int data1,data2,result1;float result2;char op;scanf(“%d%c%d”,&data1,&op,&data2);switch(op)ca
17、se+:result1=data1+data2;break;case-:result1=data1-data2;break;case*:result1=data1*data2;break;case/:result2=(float)data1/data2;break;default:printf(Input error!n);break;if(op=+|op=-|op=*)printf(%d%c%d=%dn“,data1,op,data2,result1);else if(op=/)printf(%d%c%d=%.2fn“,data1,op,data2,result2);return 0;测试数
18、据测试数据:120+35012 1235*23/2123+12123 +12123&1222问题问题3.2:思考(一):思考(一)n本问题程序一次运行只能计算一次。若要能进行多次计算,并用本问题程序一次运行只能计算一次。若要能进行多次计算,并用ctrl+c退出退出程序,如何实现?程序,如何实现?/c3_2c.c#include int main()int data1,data2,result1;float result2;char op;for(;)scanf(%d%c%d,&data1,&op,&data2);switch(op)case+:result1=data1+data2;break
19、;case-:result1=data1-data2;break;case*:result1=data1*data2;break;case/:result2=(float)data1/data2;break;default:printf(Input error!n);continue;if(op=/)printf(%d%c%d=%.2fn,data1,op,data2,result2);elseprintf(%d%c%d=%dn,data1,op,data2,result1);return 0;无穷循环,可用无穷循环,可用ctrl+c退出,实际上可退出,实际上可以利用以利用ctrl+c终止任何
20、控制台终止任何控制台C程序的执程序的执行。行。continue语句,语句,跳到下一次循跳到下一次循环。环。n本问题程序一次运行只能进行单运行符计算。若要本问题程序一次运行只能进行单运行符计算。若要使程序能支持多运算符的使程序能支持多运算符的混合运算混合运算,并输入等号,并输入等号(=)结束输入,如,)结束输入,如,1+2-3*5/2-3/2=,如何实现?难,如何实现?难点:点:l如何读入数据及运算符?如何读入数据及运算符?l如何保证计算时运算符的优先级?如何保证计算时运算符的优先级?n更进一步,若要程序支持圆括号来改变计算次序,更进一步,若要程序支持圆括号来改变计算次序,如,如,(1+2-3)
21、*(5-3)/2=,如何实现?如何实现?n如果出现错误的输入,例如输入:如果出现错误的输入,例如输入:4+r=,如何过滤,如何过滤掉错误输入,继续程序的运行?掉错误输入,继续程序的运行?23问题问题3.2:思考(二):思考(二)利用利用scanf的返回值的返回值为了保证运算符的优先级,其为了保证运算符的优先级,其算法分析算法分析:当前当前datai opi datai+1 是否进行是由是否进行是由opi+1决定。当决定。当 opi+1为为+,-,=时,立即进行当前运算,否则先进行下一步运算,以此时,立即进行当前运算,否则先进行下一步运算,以此迭代。部分伪代码如下:迭代。部分伪代码如下:scan
22、f(“%d%c”,&data1,&op1);while(op1!=)scanf(“%d%c”,&data2,&op2);while(op2=*|op2=/)scanf(“%d%c”,&data,&op);data2=data2 op2 data;op2=op;data1=data1 op1 data2;op1=op2;其它方法其它方法?输入串可表示为输入串可表示为data1 op1 datai opi opi为为+,-,*,/,=因此可采用如下方式读入数据和运算符因此可采用如下方式读入数据和运算符:scanf(“%d%c”,&data1,&op1);while(op!=).scanf(“%d%
23、c”,&data2,&op2);格式化输入函数格式化输入函数int scanf(“.”,)n该函数根据格式化字符串中的格式控制字符,将该函数根据格式化字符串中的格式控制字符,将输入流中的信息转换成相应的数据类型;输入流中的信息转换成相应的数据类型;n返回返回成功转换并赋值的输入项个数成功转换并赋值的输入项个数;n若格式完全匹配失败,则返回若格式完全匹配失败,则返回0;n若遇到输入结束,则返回若遇到输入结束,则返回EOF;n将过滤掉出现的空白字符(空格、制表符、换行将过滤掉出现的空白字符(空格、制表符、换行符)。符)。n一次性读入所有数据:一次性读入所有数据:num=scanf(“%d%c%d”
24、,&data1,&op,&data2);根据根据num的值判断各种情况。的值判断各种情况。n利用利用getchar输入函数循环读入一行字符,逐个分输入函数循环读入一行字符,逐个分析各个字符进行数据组装和判断;析各个字符进行数据组装和判断;n利用利用gets函数读入一行字符串,逐个分析各个字符函数读入一行字符串,逐个分析各个字符进行数据组装和判断。进行数据组装和判断。问题问题3.2:其它读取方法:其它读取方法问题问题3.3 扩展字符扩展字符【问题描述问题描述】编写程序将含有缩记符号的字符串扩展为等价的完整字符串,例如将编写程序将含有缩记符号的字符串扩展为等价的完整字符串,例如将a-d扩展为扩展为
25、abcd。该程序可以处理大小写字母和数字,并可以处理。该程序可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与与-a-z等等类似的情况。要求扩展符类似的情况。要求扩展符-两边的字符只要右边的大于左边就扩展(即两边的字符只要右边的大于左边就扩展(即Z-b情情况也要扩展),并且况也要扩展),并且-两边不能有空格。两边不能有空格。【输入形式输入形式】从键盘输入包含扩展符的字符串,字符串中可以包含空格从键盘输入包含扩展符的字符串,字符串中可以包含空格【输出形式输出形式】输出扩展后的字符串输出扩展后的字符串【输入样例输入样例1】a-c-u-B【输出样例输出样例1】abcdefghijklmn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 基本 方法
限制150内