资源预览内容
第1页 / 共70页
第2页 / 共70页
第3页 / 共70页
第4页 / 共70页
第5页 / 共70页
第6页 / 共70页
第7页 / 共70页
第8页 / 共70页
第9页 / 共70页
第10页 / 共70页
亲,该文档总共70页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第五章第五章 控制结构控制结构nC语言的控制语句语言的控制语句条件语句条件语句nif 语句语句nswitch 语句语句循环语句循环语句nwhile 语句语句nfor 语句语句ndo while 语句语句循环控制语句循环控制语句nbreak 语句语句ncontinue 语句语句目的:目的:更方便更方便地进行算法描述地进行算法描述5.1 switch 的的使用使用#include #define PR(a,b,c,d) printf(“%f%c%f=%fn”,a,b,c,d)main( )float x, y;char op;scanf( “%f%c%f”, &x, &op, &y );switch( op ) case + : PR(x, op, y, x+y);break;case - :PR(x, op, y, x-y);break;case * :PR(x, op, y, x*y);break;case / :PR(x, op, y, x/y);break;default:printf( “Error: %cn”, op ); 带参数的宏代换带参数的宏代换多路多路选择选择结束结束case分支分支程序读程序读解解n新的语言现象新的语言现象nswitchswitch语句语句:按照条件表达式求值结果,决定转:按照条件表达式求值结果,决定转向哪个向哪个casecase的执行的执行ncasecase分支分支:当条件式的值等于开关值:当条件式的值等于开关值( (必须是常必须是常量量) )时,执行时,执行ndefaultdefault分支分支:在所有:在所有casecase不匹配时,执行不匹配时,执行 ( (可可缺省缺省) )nbreakbreak语句语句:用于结束:用于结束casecase分支的执行,转向分支的执行,转向switchswitch后续语句的执行后续语句的执行switch 语句语句switch( e ) /* 条件式条件式 */case c1:/* 常量常量 */stmt1。case cnstmtndefault:stmt0 /* 语句组语句组 */* 语句组中常使用语句组中常使用break */e = c1stmt1stmtnstmt0e = c2e = cnstmt2FFFTTTbreakbreakbreak注注意意:switch语语句句的的每每一一个个case判判断断,都都只只负负责责指指明明流流程程分分支支的的入入口口点点,而而不不负负责责指指定定分分支支的的出出口口点点,出出口口点点由由编编程程人人员员用用相相应的跳转语句来表明。应的跳转语句来表明。break是流程是流程跳转语句跳转语句。n宏代换宏代换n预处理命令(前缀预处理命令(前缀# #)n在程序编译之前进行(同在程序编译之前进行(同includeinclude)n功能:完成参数代换后,将定义复制到引用处功能:完成参数代换后,将定义复制到引用处程序读程序读解解思考:思考:#define S(x) (x * x) 有问题?有问题? S(3) , S(i) , S(3+4)正确写法:正确写法:#define S(x) (x) * (x) 例例5-2:求:求16进制数进制数的数值的数值n基本思路基本思路n逐个输入逐个输入1616进制数的字符进制数的字符c c,计算相应的数值计算相应的数值n nn每次计算每次计算 n = n * 16 + n = n * 16 + (c c代表的值)代表的值)n数据对象数据对象nn n 保存数值(已计算出的数值)保存数值(已计算出的数值)nc c 保持当前字符保持当前字符n算法算法1.1.0 0 n n2.2.读入一个字符读入一个字符 c c3.3.如果如果 c c 是数字字符,则是数字字符,则 n*16+cn*16+c的值的值 n n4.4.如果如果 c c 是是a-fa-f等字母,则等字母,则 n*16+(10.15) n*16+(10.15) n n5.5.否则,输出否则,输出n n;结束结束6.6.重复重复2-52-5程序实现#include main( )char c;longn=0;while( 1 ) scanf( “%c”, &c );switch( c ) case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:n = n * 16 + c 0;break;case a:case b:case c:case d:case e:case f:n = n *16 + 10 + c a;break;default:printf( “n = %ldn”, n );return; 长整型长整型结束结束main字符的字符的ASCII值值长整型长整型输出输出无限无限循环循环实现技巧实现技巧n循环条件难以描述循环条件难以描述n采用无限循环采用无限循环 while( 1 ) while( 1 ) nreturnreturn语句语句n函数出口;(结束当前函数的运行)函数出口;(结束当前函数的运行)n可以用于结束循环可以用于结束循环n字符处理字符处理n利用利用ASCIIASCII值实现值实现nC C语言的特点(弱类型语言)语言的特点(弱类型语言)n整数、字符、逻辑值的混合运算整数、字符、逻辑值的混合运算5.2 循环语句循环语句n常见算法描述常见算法描述1 1n迭代过程经常存在循环控制变量迭代过程经常存在循环控制变量nC C 语言提供语言提供 for for 语句,简化描述,增加可语句,简化描述,增加可读性读性n常见算法描述常见算法描述2 2n循环条件判断在循环处理之后循环条件判断在循环处理之后nC C 语言提供语言提供 do while do while 语句语句n常见算法描述常见算法描述3 3n循环出口在处理之中循环出口在处理之中nC C 语言提供语言提供 break break 语句语句for 语句语句n语法语法for( e1; e2; e3 )for( e1; e2; e3 )stmtstmtne1e1初始化初始化ne2e2循环条件循环条件ne3e3改变量处理改变量处理nstmtstmt循环体循环体流流程程图图e1e2= 0?stmte3YN例例5-3:构造华氏温度和摄氏温度对照表:构造华氏温度和摄氏温度对照表n要求要求n华氏温度华氏温度 0 度到度到 300 度每度每 20 度为一项,输出对照表。度为一项,输出对照表。n计算公式:计算公式:C = ( F - 32 ) * 5 / 9n程序实现程序实现#include main () int f;/* 华氏温度华氏温度 */ float c;/* 摄氏温度摄氏温度 */ for (f = 0; f = 300; f += 20) c = (f-32) * 5 / 9.0 ; printf(”F = %d, C = %fn,f,c); 程序读解程序读解n针对问题,设置循环变量针对问题,设置循环变量n利用华氏温度利用华氏温度n利用利用 for for 语句语句n设置控制变量初值、终止条件、增量控制设置控制变量初值、终止条件、增量控制n简洁、易懂简洁、易懂n混合运算的规律混合运算的规律n不同精度的数据进行运算时,结果为精度高的数据不同精度的数据进行运算时,结果为精度高的数据(精度高的数据占用内存空间大)(精度高的数据占用内存空间大)n如:(如:(f32)*5/9.0 f32)*5/9.0 的结果为浮点数的结果为浮点数赋值与类型转换赋值与类型转换n精度比较精度比较nchar char intint unsigned long float double unsigned long float doublendouble double 类型:类型:16bit16bit阶阶码、码、48bit48bit尾数尾数n赋值赋值n将右侧数据变换成左侧数据类型后,完成赋值将右侧数据变换成左侧数据类型后,完成赋值1.1.高精度的数据变换成低精度数据时,被剪断高精度的数据变换成低精度数据时,被剪断2.2.低精度的数据变换成高精度数据时,被补零或符号位低精度的数据变换成高精度数据时,被补零或符号位3.3.有有符符号号数数据据和和无无符符号号数数据据相相互互变变换换时时,可可能能带带来来值值的的变变化化4.4.必要时,采用强制类型转换必要时,采用强制类型转换do-while 语句语句n语法语法dostmtwhile( e )nstmt循环体循环体ne循环条件循环条件 stmte= 0YN计算公式:计算公式:在在 n 趋向无穷的过程中累加趋向无穷的过程中累加项值趋向于项值趋向于0,而,而累加值趋向累加值趋向函数值函数值。 x3 x 5 x 7 x2n+1 = x 3! 5! 7! (2n+1)!例例5-4:求:求 sin x 的近似值的近似值sin如何利用迭代方法完成累加如何利用迭代方法完成累加累加项累加项(t) 的递推公式:的递推公式:循环结束条件:用循环结束条件:用 t 的绝对值小于的绝对值小于 10-6 为结束条件。为结束条件。数据对象考虑数据对象考虑累加值累加值 sum参数值参数值 x累加项累加项t迭代次数迭代次数n算法设计问题算法设计问题 、初始化、初始化sum,t,n;、do 2. 累加累加t 2.2 n n+1; 2.3 求下一累加项求下一累加项t; 直到直到 |t| 10-6 、输出输出循环的初始值:循环的初始值:sum = 0.0,n = 0,t = x。算法描述算法描述#include #include main() double sum = 0.0, t, x; int n = 0; scanf( “%f”, &x ); t = x; do sum = sum + t; n = n + 1; t = -t * x * x / (2*n) / (2*n + 1); while (fabs(t) = 1E-6 ); printf(“%lfn”,sum);求绝对值求绝对值指数形式指数形式程序实现程序实现C语言中的常数语言中的常数n整数整数n十进制十进制 8080n八进制(前缀八进制(前缀0 0) 01200120n十六进制(前缀十六进制(前缀0x) 0x) 0x500x50n字符常数字符常数na n t 0 020a n t 0 020n字符串常数字符串常数n“stringstring” 00 结尾结尾 (不能作为(不能作为casecase条件)条件)n长整数长整数 n80l 80l 80L80Ln浮点常数浮点常数( (双精度)双精度)n0.123 1.23e3 123E-5 0.123 1.23e3 123E-5 5.3 循环控制语句nbreak break 语句语句n出现在循环体中,用于终止循环(最内层);出现在循环体中,用于终止循环(最内层);n出现在出现在switchswitch语句中,用于终止多路选择;语句中,用于终止多路选择;ncontinue continue 语句语句n出现在循环体中,用于终止循环体的本次执行出现在循环体中,用于终止循环体的本次执行(最内层)(最内层)ngotogoto 语句语句ngotogoto label; label; 转向执行转向执行labellabel指定的语句指定的语句nlabel:label:定义在某个语句前;定义在某个语句前;n破坏程序的结构化,不推荐使用;破坏程序的结构化,不推荐使用;例例5-5:求出:求出21世纪的所有闰年世纪的所有闰年#include main( )/* 阅读该程序阅读该程序 */int y;for( y = 2001; y 2100; y+ ) /* 枚举每年枚举每年 */ if( 0 != y%4 )continue;/* 不能整除不能整除4 */ if( 0 = y%400 )printf( “%dn”, y );/* 能整除能整除400 */ else if( 0 != y%100 )printf( “%dn”, y );/* 不能整除不能整除100 */ n判断闰年的方法是判断闰年的方法是: 若该年份能被若该年份能被400400整除整除 或能被或能被4 4整除而不能被整除而不能被100100整除整除 则为闰年,否则为平年则为闰年,否则为平年 。主要用途主要用途n简化程序结构、提高程序可读性简化程序结构、提高程序可读性n减少程序的嵌套层次(复合语句)减少程序的嵌套层次(复合语句)n控制转移的其他解决方案控制转移的其他解决方案n引入专用变量,表示处理状态引入专用变量,表示处理状态n对程序可读性的影响较大对程序可读性的影响较大n避免多重循环结构的嵌套避免多重循环结构的嵌套n算法中循环深度较大时,算法中循环深度较大时,n应引入新的函数,负责内层循环的计算应引入新的函数,负责内层循环的计算例例5-6:复数四则运算:复数四则运算n 输入一个复数运算表达式输入一个复数运算表达式n 格式:格式: (实部虚部(实部虚部i i )n 例:例: (-23 + 4 i-23 + 4 i)* * (4 7 i4 7 i)n 输出计算结果输出计算结果n 仅考虑加法和乘法仅考虑加法和乘法n 例:例: (-120 + 177 i )-120 + 177 i )算法描述算法描述1.1.读复数读复数r1,i1r1,i12.2.读运算符读运算符opop3.3.读复数读复数r2,i2r2,i24.4.若若 op = +op = +,则则计算计算 r0 = r1+r2, i0 = i1+i2r0 = r1+r2, i0 = i1+i25.5.若若 op = *op = *,则则计算计算 r0 = r1*r2 i1*i2, i0 = r1*i2 + r2*i1r0 = r1*r2 i1*i2, i0 = r1*i2 + r2*i16.6.输出输出 ( r0 + r1i )( r0 + r1i )程序实现的考虑程序实现的考虑n难点难点n正确地识别出复数的实部、虚部和运算符正确地识别出复数的实部、虚部和运算符n考虑空格的存在、正负号的存在、考虑空格的存在、正负号的存在、i i的存在的存在设置设置 3 3 个函数个函数nchar char getSymbolgetSymbol( )( )n读取一个符号后,返回读取一个符号后,返回nintint getNumgetNum( )( )n读取一个整数(包括正负号)后,返回读取一个整数(包括正负号)后,返回nvoid void getCompgetComp( ( intint x ) x )n读取一个复数(包括括弧)后,存入数组返回读取一个复数(包括括弧)后,存入数组返回主程序的实现主程序的实现#include #include char getSymbol( void );int getNum( void );void getComp( int x );main( )int a2, b2, r0, i0;char op;getComp( a );op = getSymbol( );getComp( b );switch( op ) case + :r0 = a0 + b0;i0 = a1 + b1;break;case *:r0 = a0*a1 b0*b1;i0 = a0*b1 + a1*b0;break;if( i0 0 )printf( “(%d%d)”, r0, i0 );elseprintf( “(%d+%d)”, r0, i0 );读一个整数读一个整数(包括正负号)(包括正负号)的算法的算法1.1.跳过空格跳过空格2.2.0 0 n n3.3.读入字符读入字符chch4.4.若若chch是是+ +1 1sign sign 跳过空格跳过空格5.5.若若chch是是- -1-1sign sign 跳过空格跳过空格6.6.若若chch是数字,是数字,chchn n7.7.读入字符读入字符chch8.8.若若chch是数字是数字n * 10 + n * 10 + chch n n重复重复 7 7,8 89.9.返回返回 n * signn * sign变量设置变量设置nn n 结果结果nchch 当前字符当前字符nsign sign 符号符号getNum( )的实现的实现int getNum( )int ch, sign = 1, n = 0;do ch = getchar( );while( ch = );switch( ch ) case -:sign = -1;case + :doch = getchar( );while( ch = );default:if( isdigit( ch ) )n = ch 0;while( isdigit( ch ) ) n = n * 10 + ch 0;ch = getchar( );return n;程序说明程序说明n字符检验:字符检验: 使用使用头头文件文件 ctype.hctype.hnisdigitisdigit 是数字字符是数字字符? ?nisalphaisalpha 是字母?是字母?nisalnumisalnum 是字母或数字字符?是字母或数字字符?n输入函数输入函数n格式化输入格式化输入scanfscanfn低级字符输入低级字符输入getchargetcharn最好不混合使用最好不混合使用函数的实现函数的实现char getSymbol( ) /* 跳过空格,得到字符跳过空格,得到字符 */int ch;doch = getchar( );while( ch = );return ch;void getComp( int x ) /* 读取一个复数读取一个复数 (a+bi) */if( ( = getSymbol() ) x0 = getNum( ); /* 实部实部 */x1 = getNum( ); /* 虚部虚部 */if( i = getSymbol() & ) = getSymbol() )return;printf( “Input Errorn” );函数设置的考虑函数设置的考虑n程序可维护性程序可维护性n简化主函数的实现简化主函数的实现n隐蔽数字输入的细节隐蔽数字输入的细节n处理局部化处理局部化n设计要点设计要点n简明的输入和输出,功能明确简明的输入和输出,功能明确n相对独立,不使用全局变量相对独立,不使用全局变量n可参考信息可参考信息n功能独立的子任务功能独立的子任务n数据粒度;信息隐蔽的层次数据粒度;信息隐蔽的层次5.4 几个特殊功能几个特殊功能nconstn说明不允许赋值的变量说明不允许赋值的变量n如:如: int getLength( const char arr );n二进制运算二进制运算n& 按位与按位与n| 按位或按位或n条件表达式条件表达式ne1 ? e2 : e3 的值的值 = 如果如果 e 求值求值 != 0,则取,则取 e2 的值,的值,否则取否则取 e3 的值的值 n逗号表达式逗号表达式ne1, e2 的值的值 = 完成完成 e1, e2 的求值后,取的求值后,取 e2 的值的值求值顺序问题n 函数调用n 多个参数表达式(实在参数)的计算顺序不定n 应避免使用:类似fun( +x, x+=1 ) 的求值n 双目运算(算术、关系)n 两个操作表达式的计算顺序不定n 应避免使用:类似+x + (x+=1) 的求值各个编译系统可能采用不同的求值顺序n 逻辑运算n 前左后右函数类型检查n 函数定义的类型说明n getNum( arr ) /* 旧版本C 语言*/n int arr ;n n 引用处n char buf64;n getNum( buf ); /* 编译时不检查错第五章作业第五章作业n 阅读教科书第四章n 自我测验4.3 4.4n 程序设计练习n 6.15 4.8 4.14 4.19 4.26 4.28 4.34n 上机作业n 实验4.1 实验4.2 实验4.3第六章第六章 结构和模块化设计结构和模块化设计6.1 结构结构n复合数据对象的需求复合数据对象的需求n描述由不同类型的数据元素组成的数据对象描述由不同类型的数据元素组成的数据对象n例如:例如:n教学管理系统中的学生数据教学管理系统中的学生数据n包括:姓名、性别、学号、班级包括:姓名、性别、学号、班级n语言支持语言支持nC C 语言中的结构语言中的结构nPascal Pascal 语言中的记录语言中的记录nC+ C+ 、Java Java 语言中的类语言中的类结构定义和变量说明结构定义和变量说明n语法结构语法结构structstruct 结构名结构名 类型类型 成员变量;成员变量;。;/* /* 学生信息的结构学生信息的结构 * */ /structstruct Student Student char name32;char name32;char sex;char sex;intint no; no;char class8;char class8; ; n结构变量说明结构变量说明structstruct Student Student chenchen; ;n或直接说明或直接说明structstruct char name32;char name32;char sex;char sex;intint no; no;char class8;char class8; chenchen; ; 结构变量及相关运算结构变量及相关运算n结构变量占用的内存空间结构变量占用的内存空间n大于等于各个元素占用内存空间之和大于等于各个元素占用内存空间之和n结构变量的运算结构变量的运算n初始化初始化如:如:structstruct Student Student chenchen= “= “chenchen”, F, 24, ”, F, 24, “9707” ;“9707” ;n赋值赋值n函数参数函数参数n结构分量的运算结构分量的运算n引用:引用: chen.namechen.namechen.sexchen.sexn运算取决于分量的类型运算取决于分量的类型例例6-1:洗牌和发牌模拟:洗牌和发牌模拟n任务:任务:n考虑扑克牌的考虑扑克牌的4 4个花色和个花色和5252张,完成洗牌过程,张,完成洗牌过程,通过输出完成发牌过程通过输出完成发牌过程n基本思路基本思路n设置数据对象保存设置数据对象保存5252张牌、张牌、4 4个花色和牌名信个花色和牌名信息息n产生随机数来控制牌的交换,模拟洗牌过程产生随机数来控制牌的交换,模拟洗牌过程n按照按照4 4个一组的顺序,输出所有牌,模拟发牌个一组的顺序,输出所有牌,模拟发牌过程过程算法设计算法设计n数据对象设计数据对象设计5252张牌张牌cards52cards524 4个花色个花色suit4suit41313个牌号个牌号 face13face13n算法算法1.1.初始化初始化5252张牌张牌2.2.洗牌过程洗牌过程3.3.发排过程发排过程n初始化初始化依次设置每张牌的花色和牌号依次设置每张牌的花色和牌号n洗牌过程洗牌过程依次处理每张牌依次处理每张牌( (第第i i张张) )产生一个随机数产生一个随机数(0-51) j(0-51) j将第将第j j张张和第和第i i张牌交换张牌交换程序结构设计程序结构设计n数据结构数据结构n采用采用 structstruct 描述扑克牌的信息(花色、牌号)描述扑克牌的信息(花色、牌号)n采用整数数组表示牌号采用整数数组表示牌号 1, 2, 3, 13 1, 2, 3, 13 n采用字符数组表示花色采用字符数组表示花色 H, D, C, SH, D, C, Sn程序结构程序结构n设置设置 3 3 个函数个函数 fillDeckfillDeck, shuffle, deal, shuffle, dealn分别负责初始化、洗牌和发牌的完成分别负责初始化、洗牌和发牌的完成程序实现程序实现(1/3)#include #include #include struct card int face;char suit10;typedef struct card Card;void fillDeck( Card deck , int face , char suit )int i;/* 顺序排列52张牌 */for( i=0; i52; i+ ) deck i .face = face i%13 ;deck i .suit = suit i%4 ;通用函数头文件通用函数头文件时间函数头文件时间函数头文件类型定义类型定义结构分量结构分量的引用的引用程序实现程序实现(2/3)void shuffle( Card deck )int i, j; /* 洗牌过程洗牌过程 */Card temp;for( i=0; i52; i+ ) j = rand( ) %52;temp = deck i ;deck i = deck j ;deck j = temp; void deal( Card deck ) int i;/* 发牌过程发牌过程 */ for( i=0; i52; i+ )printf(“%d of %c%c”, decki.face, decki.suit,(i+1)%4? t: n );条件表达式条件表达式制表符制表符随机数生成随机数生成程序实现(3/3)main( )Card deck52;int face = 1,2,3,4,5,6,7,8,9,10,11,12,13;char suit = H, D, C, S ;srand( time(NULL) );fillDesk( deck, face, suit );shuffle( deck );deal( deck );数组初始化数组初始化获得当获得当前时间前时间初始化随机数初始化随机数函数函数几点程序说明几点程序说明n类型定义类型定义ntypedeftypedef intint INTARRAY 80 ; INTARRAY 80 ;n可定义任何类型,用于简化程序描述可定义任何类型,用于简化程序描述n数组初始化数组初始化n可利用初值个数设置数组大小可利用初值个数设置数组大小n随机数的产生随机数的产生nintint rand( ) rand( )返回随机数返回随机数nvoid void srandsrand( unsigned seed )( unsigned seed )初始化随机数生成初始化随机数生成ntime( )time( )获得当前时间(单位:秒)获得当前时间(单位:秒)n需要通用函数和时间函数头文件需要通用函数和时间函数头文件 stdlib.hstdlib.h, time.h, time.h虚拟机的概念虚拟机的概念n抽象的计算机抽象的计算机n接受一组指令,按照给定的指令序列执行接受一组指令,按照给定的指令序列执行n虚拟机概念在程序设计中的应用虚拟机概念在程序设计中的应用n使得一个程序模块,按照类似的方式工作:使得一个程序模块,按照类似的方式工作:n以一组函数实现虚拟机的指令系统以一组函数实现虚拟机的指令系统n以函数调用表示指令的执行以函数调用表示指令的执行n例如:例如:n上例中,扑克牌数组以及相关的上例中,扑克牌数组以及相关的3 3个函数组成一个虚拟个函数组成一个虚拟机;机;3 3个函数实现了该虚拟机的个函数实现了该虚拟机的3 3个指令。个指令。n使用者(使用者(mainmain函数)仅负责向虚拟机发送指令(函数函数)仅负责向虚拟机发送指令(函数调用),不必关系其内部实现细节调用),不必关系其内部实现细节抽象方法与信息隐蔽抽象方法与信息隐蔽n抽象方法的运用抽象方法的运用n通过通过3 3个函数的设置(个函数的设置(fillDeckfillDeck, shuffle, deal, shuffle, deal),),完全隐蔽了扑克牌相关处理的内部计算逻辑;完全隐蔽了扑克牌相关处理的内部计算逻辑;n虚拟机使用者的视点虚拟机使用者的视点n仅了解仅了解3 3个函数的使用方法,好象它们是系统提供个函数的使用方法,好象它们是系统提供的标准函数的标准函数n对软件工程的支持对软件工程的支持n虚拟机的使用者和实现者可以是不同的开发组虚拟机的使用者和实现者可以是不同的开发组n分别实现大型软件的不同组成部分分别实现大型软件的不同组成部分n软件模块接口就是一组函数原型及其说明软件模块接口就是一组函数原型及其说明6.2 模块化程序设计模块化程序设计n软件模块软件模块n数据对象及其相关处理算法数据对象及其相关处理算法n程序模块:数据结构及其相关函数程序模块:数据结构及其相关函数n例例 6-1 6-1 中的模块中的模块n主控模块:主控模块:mainmain函数函数n扑克牌模块:数组扑克牌模块:数组deckdeck以及以及3 3个函数个函数n信息隐蔽信息隐蔽n模块的使用者无须连接数据对象的细节模块的使用者无须连接数据对象的细节如:如:mainmain函数编制时,无须了解数组函数编制时,无须了解数组deckdeck的详细定义、的详细定义、数据内容和结构组织。数据内容和结构组织。例例6-2:简易学生管理系统:简易学生管理系统n任务:任务:n分别输入须生学生的户籍信息和学籍信息,打印出学分别输入须生学生的户籍信息和学籍信息,打印出学生基本信息表(假设学生人数生基本信息表(假设学生人数250人)人)n户籍信息:姓名、身份证号码、出生年月日、住址;户籍信息:姓名、身份证号码、出生年月日、住址;n学籍信息:学号、身份证号码、所属学院、专业、班学籍信息:学号、身份证号码、所属学院、专业、班级级n学生基本信息表:学号、姓名、年龄、所属学院、班学生基本信息表:学号、姓名、年龄、所属学院、班级;级;n数据对象数据对象n学生户籍数据、学生学籍数据学生户籍数据、学生学籍数据n学生基本信息表可以直接输出(不保存)学生基本信息表可以直接输出(不保存)算法设计算法设计1.输入户籍数据输入户籍数据(每行输入一个学生的数据,空格分割各个项目)(每行输入一个学生的数据,空格分割各个项目)2.输入学籍数据输入学籍数据(每行输入一个学生的数据,空格分割各个项目)(每行输入一个学生的数据,空格分割各个项目)3.构造并输出学生基本信息表构造并输出学生基本信息表(提取户籍和学籍数据,构造并输出学生信息表)(提取户籍和学籍数据,构造并输出学生信息表)算法的逐步求精算法的逐步求精n1 1、2 2 步步n仅涉及输入输出,忽略算法描述仅涉及输入输出,忽略算法描述n3 3 构造学生基本信息表构造学生基本信息表n3.1 3.1 依次从户籍数据中驱除取出一个学生的信息依次从户籍数据中驱除取出一个学生的信息n3.2 3.2 根据其身份证号码,找出该生的学籍信息根据其身份证号码,找出该生的学籍信息n3.3 3.3 综合该生的户籍信息和学籍信息,构造基本信息综合该生的户籍信息和学籍信息,构造基本信息记录,填入学生基本信息表记录,填入学生基本信息表n3.4 3.4 重复重复 3.1-3.3 3.1-3.3 的处理,直至处理完所有学生的的处理,直至处理完所有学生的数据数据程序结构设计程序结构设计n数据对象数据对象n户籍数据、学籍数据、学生基本信息表户籍数据、学籍数据、学生基本信息表n尽可能符合信息的原始结构、采用尽可能符合信息的原始结构、采用structstructn采用采用 3 3个结构数组来保存数据个结构数组来保存数据n模块与函数的设计模块与函数的设计n围绕户籍数据,提供输入、依次提取的函数围绕户籍数据,提供输入、依次提取的函数n围绕学籍数据,提供输入、查找的函数围绕学籍数据,提供输入、查找的函数n为学生基本信息,提供构造并输出的函数为学生基本信息,提供构造并输出的函数n形成形成 3 3 个程序模块个程序模块户籍处理模块的设计户籍处理模块的设计#include #include typedef struct /* 户籍数据结构户籍数据结构 */char name 16 ;/* 姓名姓名 */long no;/* 身份证号身份证号 */struct int year, mon, day;/* 作为分量的结构作为分量的结构 */ birthday;/* 生日生日 */char addr 128 ;/* 地址地址 */ InfoAddr;int InputAddr( InfoAddr info );/* 输入数据到数组输入数据到数组info, 返回学生数量返回学生数量 */学籍处理模块的设计学籍处理模块的设计typedef struct /* 户籍数据结构户籍数据结构 */char student 20 ;/* 学号学号 */long no;/* 身份证号身份证号 */char college 32 ;/* 学院学院 */char class 10 ;/* 班级班级 */ InfoStudent;int InputStudent( InfoStudent info );/* 输入数据到数组输入数据到数组info, 返回学生数量返回学生数量 */InfoStudent GetStudent( long no, InfoStudent info , int n );/* 获得身份证号为获得身份证号为 no 的的学生的学籍数据学生的学籍数据, n是学生数量是学生数量 */主控模块的设计主控模块的设计void Output( int n, InfoAddr addr , InfoStudent info );/* 构造学生基本信息,按表格输出(构造学生基本信息,按表格输出(n是是学生人数)学生人数) */main( )static InfoAddr addr 256 ;static InfoStudent stu 256 ;int num;/* 人数人数 */num = InputAddr( addr );/* 输入户籍数据输入户籍数据 */if( num != InputStudent( stu ) )/* 输出学籍数据输出学籍数据 */return;Output( num, addr, stu );/* 输出基本信息表输出基本信息表 */设计说明设计说明n函数原型设计函数原型设计n考虑函数内部功能的实现中,需要用到的所有输入输考虑函数内部功能的实现中,需要用到的所有输入输出信息;出信息;n将输入信息作为参数;输出结果作为返回值,或通过将输入信息作为参数;输出结果作为返回值,或通过参数返回;参数返回;n确保信息处理的局部化确保信息处理的局部化n实现技术细节实现技术细节n对于复杂结构,利用结构,结构分量的结构对于复杂结构,利用结构,结构分量的结构n对于大的数据对象(结构数组),采用静态变量对于大的数据对象(结构数组),采用静态变量学生基本信息表的构造和输出学生基本信息表的构造和输出void Output( int n, InfoAddr addr , InfoStudent info )int i, age;InfoAddr a;InfoStudent s;for( i=0; in; i+ ) a = addr i ;/* 取户籍数据取户籍数据 */age = 2004 - a.birthday.year;/* 计算年龄计算年龄 */s = GetStudent( a.no, info, n ); /* 取学籍数据取学籍数据 */printf( “%8d %.16s %2d %.32s %.10sn”,a.no, a.name, age, s.college, s.class ); 户籍信息的输入户籍信息的输入int InputAddr( InfoAddr info )/* 输入数据到数组输入数据到数组info, 返回学生数量返回学生数量 */int i;char buf 256 ;InfoAddr a;for( i=0; gets(buf); i+ ) /* 读入一行读入一行 */sscanf( buf, “%s%ld%d%d%d%128s”,a.name, &a.no, &a.birthday.year,&a.birthday.mon, &a.birthday.day, a.addr );info i = a;/* 添加到数组中添加到数组中 */ return i;学籍数据的输入学籍数据的输入int InputStudent( InfoStudent info )/* 输入数据到数组输入数据到数组info, 返回学生数量返回学生数量 */int i, r;char buf 256 ;InfoStudent s;for( i=0; ; i+ ) /* 读入一行读入一行 */r = scanf( buf, “%s%ld%s%s”,s.student, &s.no, s.college, s.class );if( r != 4 )break;/* 输入错误输入错误 */info i = s;/* 添加到数组中添加到数组中 */ return i;查找学籍数据的实现查找学籍数据的实现InfoStudent GetStudent( long no, InfoStudent info , int n )/* 获得身份证号为获得身份证号为 no 的学生的学籍数据的学生的学籍数据 */int i;for( i=0; in; i+ ) if( infoi.no = no )return infoi;return info0;格式化输入输出的说明格式化输入输出的说明n转换说明符(转换说明符(scanfscanf、printfprintf)n格式:格式:% %m.ndm.ndn宽度宽度m m:用于整数和实数的输入、字符串的输入用于整数和实数的输入、字符串的输入n精度精度n n:用于小数部分的输出位数、字符串的输出宽度用于小数部分的输出位数、字符串的输出宽度n返回值返回值nscanfscanf:匹配的数据项个数匹配的数据项个数nprintfprintf:输出的字符个数输出的字符个数n& & 表示取变量的内存单元地址表示取变量的内存单元地址n数组名本身是内存单元地址,不用数组名本身是内存单元地址,不用& &其他输入输出其他输入输出n字符输入字符输入intint getchargetchar( )( )n从标准输入读入一字符,返回从标准输入读入一字符,返回ASCIIASCII值值gets( char gets( char bufbuf ) )n从标准输入读入一行字符,返回数组名或从标准输入读入一行字符,返回数组名或0 0n来自字符数组的格式化输入和输出来自字符数组的格式化输入和输出nsscanfsscanf( char ( char bufbuf , char , char fmtfmt , ) , )nsprintfsprintf( char ( char bufbuf , char , char fmtfmt , ) , )各种数据类型的表示范围和精度类型范围精度内存char -128,1271byteunsigned char0,2551byteshort-32768,327672byteunsigned short0,655352bytelong-2147483648, 21474836474byteunsigned long0,42949672954bytefloat-3.4E+38, 3.4E+384bytedouble-1.7E+308, 1.7E+3088byte模块化程序的文件组织模块化程序的文件组织n标准的组织方法标准的组织方法n将所有结构定义、函数原型放在某个头文将所有结构定义、函数原型放在某个头文件中(件中(* *.h.h)n将将每个模块的函数定义和全局变量放在同每个模块的函数定义和全局变量放在同一个源程序文件中(一个源程序文件中(* *.c.c)n每个源程序文件中,添加每个源程序文件中,添加 #include “#include “头头文件名文件名”n建立工程文件,统一管理所有源程序文件建立工程文件,统一管理所有源程序文件6.3 软件工程概念软件工程概念n软件工程软件工程n提案提案分析分析设计设计实现实现测试测试维护维护n软件工程的目标软件工程的目标 有效性有效性 满足用户需求(功能、友好性)满足用户需求(功能、友好性) 可修改性可修改性 易于理解易于理解 易于扩充易于扩充 易于修改易于修改 可靠性可靠性 出错处理出错处理 避免灾难性后果避免灾难性后果n结构化程序设计的作用结构化程序设计的作用n改善可修改性改善可修改性软件开发生命周期软件开发生命周期 需求分析需求分析n目标分析目标分析 环境分析环境分析 数据分析数据分析n提出系统需求定义书提出系统需求定义书 系统设计系统设计n系统构成系统构成 画面设计画面设计 数据库设计数据库设计 报表设计报表设计 实施计划实施计划n提出系统设计书和系统测试要求提出系统设计书和系统测试要求 详细设计详细设计n子系统划分子系统划分 模块设计模块设计 数据字典设计数据字典设计n提出程序设计书提出程序设计书 程序设计与调试程序设计与调试n编码编码 书写程序文档书写程序文档 调试调试n提出程序和文档提出程序和文档 系统测试和评估系统测试和评估n提出测试报告提出测试报告 系统维护系统维护 软件工程原理和软件开发技术 抽象与信息隐蔽抽象与信息隐蔽 模块化和局部化模块化和局部化 一致性、完整性和可验证性一致性、完整性和可验证性 结构化程序设计结构化程序设计n自顶向下、逐步求精自顶向下、逐步求精n任务分解:采用抽象方法、实现信息隐蔽任务分解:采用抽象方法、实现信息隐蔽 面向对象设计面向对象设计n将数据及其相关操作包装成模块将数据及其相关操作包装成模块n定义模块接口、隐藏内部实现定义模块接口、隐藏内部实现n以消息传递作为交互手段以消息传递作为交互手段软件开发环境与工具软件开发环境与工具n综合开发工具综合开发工具n支持编辑、编译、调试、运行、部署支持编辑、编译、调试、运行、部署n支撑环境支撑环境n函数库函数库n类库(模块库)类库(模块库)n程序框架程序框架n专用软件工具专用软件工具n自动生成工具自动生成工具n调试工具、测试工具调试工具、测试工具
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号