1 / 22

程序设计框架举例 对一维数组进行多种操作 简单的学生成绩管理程序 对一个英文短电文进行加密、解密处理。 输出该年的年历表。

程序设计框架举例 对一维数组进行多种操作 简单的学生成绩管理程序 对一个英文短电文进行加密、解密处理。 输出该年的年历表。 用字符 ‘ * ’ 打印一个周期的 sin(x) 或 cos(x) 曲线。 将二进制字串转换为整型、实型数或十六进制字串。. 一、设计程序,用户可根据菜单选择对一维数组进行多种操作,包括求最大、最小值、求和、求平均值、排序、二分查找、有序插入。(大作业题 1 ) 分析: 将每一种功能写成一个函数,主函数根据用户对菜单项的选择确定调用哪个函数。用户可多次输入选择。 各自定义函数从实现功能的角度考虑两点:

ilya
Télécharger la présentation

程序设计框架举例 对一维数组进行多种操作 简单的学生成绩管理程序 对一个英文短电文进行加密、解密处理。 输出该年的年历表。

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 程序设计框架举例 • 对一维数组进行多种操作 • 简单的学生成绩管理程序 • 对一个英文短电文进行加密、解密处理。 • 输出该年的年历表。 • 用字符 ‘*’ 打印一个周期的sin(x)或cos(x)曲线。 • 将二进制字串转换为整型、实型数或十六进制字串。

  2. 一、设计程序,用户可根据菜单选择对一维数组进行多种操作,包括求最大、最小值、求和、求平均值、排序、二分查找、有序插入。(大作业题1)一、设计程序,用户可根据菜单选择对一维数组进行多种操作,包括求最大、最小值、求和、求平均值、排序、二分查找、有序插入。(大作业题1) 分析:将每一种功能写成一个函数,主函数根据用户对菜单项的选择确定调用哪个函数。用户可多次输入选择。 各自定义函数从实现功能的角度考虑两点: 设置哪些参数;各函数都要将待操作的一维数组作为一个形参,其余形参各函数不同。 函数是否需要返回值;排序和有序插入不需要返回值,其他函数均要有返回值。

  3. #define N 30 main( ) { int a[N], b[N+1], n; /* 定义数组 */ scanf(……,&n); input(a, n); 循环 {printf(”1. max\n”); /* 显示操作项目菜单 */ ┇ printf(”Enter your choice:”); scanf(……,&s); /* 用户输入选择 */ switch(s) {case 1: 输出max(a, n);break; ┇ /* 根据选择调用函数 */ case 8: 使循环条件为假 } } }

  4. int max(int a[ ], int n)/* 求最大值 */ { int m; ┇ return (m);} 求最小值、求和、求平均值函数框架与求最大值函数相同,只是函数名不同。 Void sort(int a[ ],int b[ ],int n) /* 排序 */ {将a数组各元素赋给b数组; 对b数组排序;} n是要排序的元素个数, a是原始数组,b是排序后的数组。(注意题目要求a保持不变)

  5. int search(int a[ ], int b[ ], int n, int num) { int f; sort(a,b,n); /* 对b数组排序;*/ 对b数组用二分法查找num; 找到:f=1;否则:f=0; return f; } void insert(int a[ ], int b[ ], int n, int num) { sort(a,b,n); /* 对b数组排序;*/ 将num插入b数组中;} 注意:b数组的长度应比a数组大1。

  6. 二、利用数组,设计一个简单的学生成绩管理程序。每个学生七项信息;成绩管理包括列表、求平均成绩、查找最高分。(大作业题2)二、利用数组,设计一个简单的学生成绩管理程序。每个学生七项信息;成绩管理包括列表、求平均成绩、查找最高分。(大作业题2) 列表:可按性别、平均分筛选、平均分排序列表; 求平均成绩:可按个人、按科目进行; 查找最高分:可查个人最高平均分、指定科目最高分。 分析:将每一项管理写成一个函数,由主函数调用。由于每一项管理功能都可以按几种方式处理,所以每一个函数中要按选择分别完成不同的功能。

  7. #define N 30 main() { int s[N][7], n; /* 定义数组 */ scanf(…….,&n); input(s,n); 循环 {printf(”1. List \n”); /* 显示操作项目菜单 */ ┇ printf(”Enter your choice:”); scanf(……,&sel); /* 用户输入选择 */ switch(sel) {case 1: list(s, n);break; ┇ /* 根据选择调用函数 */ case 4: 使循环条件为假 } } }

  8. void list(int s[ ][7],int n) {定义局部变量及数组; 显示列表条件:1.按性别 2.  3 .  scanf(…….,&sel); /* 输入选择 */ switch(sel) {case 1:输入性别→c 查找s[i][2]==c 调用输出函数; break ; case 2:输入分数线 循环n次 {计算一个学生的平均成绩 若>分数线,输出该学生的信息及平均成绩}

  9. Case 3:计算各学生的平均成绩存入ave数组 ave数组排序;输出ave数组;} } Void average(int s[ ][7], int n) {定义局部变量; 显示:1.按个人 2. 按科目 scanf(…….,&sel); /* 输入选择 */ switch(sel) {case 1:求每个人平均分; 输出平均成绩; case 2:求每个科目平均分; 输出平均成绩;} }

  10. void search(int s[ ][7],int n) {定义局部变量; 显示:1.按个人最高平均分 2. 按科目最高分 scanf(…….,&sel); /* 输入选择 */ switch(sel) {case 1:求个人最高平均分; 调用输出函数,再输出平均成绩; case 2:输入科目号; 找该科目最高分; 输出最高分;} } void print(int s[ ][7],int i) {循环输出编号为i的学生的各项信息;}

  11. 三、设计程序,可对一个英文短电文进行加密、解密处理。加密采用换位法及替代法混合加密。(大作业题4)三、设计程序,可对一个英文短电文进行加密、解密处理。加密采用换位法及替代法混合加密。(大作业题4) 换位加密:根据将换位位移量电文分组,每组的长度是换位位移量的2倍,每组字符对称换位。 替代加密:将电文中字符用ASCII码表中向后偏移一定位置的字符替代。 解密:是加密的逆过程。 分析:将加密、解密功能分别写成函数,主函数只要输入电文、密钥,再调用调用加密、解密函数,最后输出解密结果。

  12. main() {char ch[80],ch1[80]; /*存放原始和加密电文*/ ┇ 输入一行电文;输入p,r1,r2; 调用换位函数exchang(ch,p); 调用替代函数replace(ch,r1,r2); 用户选择是否解密? 是:{strcpy(ch1,ch); 调用解密函数decode(ch1); 输出解密结果;} }

  13. Void exchang(char ch[80],int p) {定义局部变量; 求文本有效长度tlen; 求换位组长度glen=p*2; /*p是换位位移量*/ 求换位组数gnum=tlen/glen; 循环 {对每一组进行换位} } Void replace(char ch[80],int r1,int r2) {int i; 循环判断ch[i],若在第一组或第四组,偏移量为r1,第三组和第五组不替换,第一组偏移两为r2。}

  14. Void decode(char ch1[80]) {int p,r1,r2; 输入p,r1,r2; /* 6位密钥 */ 循环 {根据r1,r2 恢复替换的字符;} exchang(ch1,p); /*调用换位函数,恢复原位*/ }

  15. 四、编写程序,从外界输入一个公元年份,输出该年的年历表。(大作业题5)四、编写程序,从外界输入一个公元年份,输出该年的年历表。(大作业题5) 分析:主函数输入一个年份,计算该年第一天的星期数,然后调用输出年历表函数。 输出年历表函数要构造二重循环,外循环循环12次,每次输出1个月的数据,每月一个表头,接下来是内循环,执行次数是一个月的天数,输出一个月的月历表。输出时把握两点:确定每月的1号是星期几;控制每行输出7个数。

  16. main() {int mon={31,28,…..}; /*一年各月的天数*/ 定义变量; 输入年份,判断是否闰年确定二月分的天数; 计算该年第一天的星期数(先算出该年之前有多少闰年,dnum=((年份-1)*365+闰年数+1)%7); prday(mon,dnum); }

  17. Void Prday(int n(12),int p) {int i,j,k,t; k=p; /* k记录每月第一天的星期数*/ 循环 i=1~12 输出月份名称; 输出表头 Sun Mon …及横线; 输出k个“ ”; /* i月的第一天定位 */ 循环t=1~n[i] 用j控制每7个数换一行; 输出t;j++; 输出横线; k=j%7; }

  18. 五、编写程序,用字符 ‘*’ 打印一个周期的sin(x)或cos(x)曲线。 分析:将输出图形的功能写成一个函数,主函数中根据用户选择确定输出sin 还是cos。由于函数名是不定的,所以函数要设一个指向函数的指针形参。

  19. main() {int n;double (*p)(); 输入n; n==1 则p=sin; n==2 则p=cos; print(p);} Void print(double(*p)(double)) {定义局部变量; 循环{计算x;计算y=(*p)(x); 计算‘*’位置; 输出x,y;输出‘*’前的空格;输出“*\n”;} }

  20. 六、将二进制字串转换为整型、实型数或十六进制字串。六、将二进制字串转换为整型、实型数或十六进制字串。 程序结构: 数据流: 菜单文本 选择项 字串1指针 字串1指针 字串1指针 主控模块 数值 字符

  21. 主控模块主要框架: for( ; ; ) /*循环框架*/ { display_menu(); /*显示菜单*/ m=choice_menu(); /*选择菜单*/ if(m==-5) { printf("Program end."); break;} else { scanf("%s", b); /*输入字串到字符数组b*/ switch(m) { case 1: bintoint(b, col, line); break; /*整数*/ case 2: bintoreal(b, col, line); break; /*实数*/ case 3: bintohex(b, col, line); /*十六进制串*/ } printf("Press any key to continue!"); getch(); } }

  22. bintohex函数主要框架: 符号处理: h[0]='-' 或 h[0]='+' 测试小数点位置、非法字符:位置dotp 非法:1emark if(emark==1) printf("Invalid string!"); else { 整数部分串长; 整数部分4位组组数、不足4位组的位数; 不足4位组十六进制数符h[j++]; 各4位组十六进制数符h[j++]; 小数部分各4位组十六进制数符h[j++]; 小数部分不足4位组十六进制数符h[j++]; 输出结果:printf("%s", h); } 整数部分 小数部分

More Related