220 likes | 371 Views
程序设计框架举例 对一维数组进行多种操作 简单的学生成绩管理程序 对一个英文短电文进行加密、解密处理。 输出该年的年历表。 用字符 ‘ * ’ 打印一个周期的 sin(x) 或 cos(x) 曲线。 将二进制字串转换为整型、实型数或十六进制字串。. 一、设计程序,用户可根据菜单选择对一维数组进行多种操作,包括求最大、最小值、求和、求平均值、排序、二分查找、有序插入。(大作业题 1 ) 分析: 将每一种功能写成一个函数,主函数根据用户对菜单项的选择确定调用哪个函数。用户可多次输入选择。 各自定义函数从实现功能的角度考虑两点:
E N D
程序设计框架举例 • 对一维数组进行多种操作 • 简单的学生成绩管理程序 • 对一个英文短电文进行加密、解密处理。 • 输出该年的年历表。 • 用字符 ‘*’ 打印一个周期的sin(x)或cos(x)曲线。 • 将二进制字串转换为整型、实型数或十六进制字串。
一、设计程序,用户可根据菜单选择对一维数组进行多种操作,包括求最大、最小值、求和、求平均值、排序、二分查找、有序插入。(大作业题1)一、设计程序,用户可根据菜单选择对一维数组进行多种操作,包括求最大、最小值、求和、求平均值、排序、二分查找、有序插入。(大作业题1) 分析:将每一种功能写成一个函数,主函数根据用户对菜单项的选择确定调用哪个函数。用户可多次输入选择。 各自定义函数从实现功能的角度考虑两点: 设置哪些参数;各函数都要将待操作的一维数组作为一个形参,其余形参各函数不同。 函数是否需要返回值;排序和有序插入不需要返回值,其他函数均要有返回值。
#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: 使循环条件为假 } } }
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保持不变)
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。
二、利用数组,设计一个简单的学生成绩管理程序。每个学生七项信息;成绩管理包括列表、求平均成绩、查找最高分。(大作业题2)二、利用数组,设计一个简单的学生成绩管理程序。每个学生七项信息;成绩管理包括列表、求平均成绩、查找最高分。(大作业题2) 列表:可按性别、平均分筛选、平均分排序列表; 求平均成绩:可按个人、按科目进行; 查找最高分:可查个人最高平均分、指定科目最高分。 分析:将每一项管理写成一个函数,由主函数调用。由于每一项管理功能都可以按几种方式处理,所以每一个函数中要按选择分别完成不同的功能。
#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: 使循环条件为假 } } }
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次 {计算一个学生的平均成绩 若>分数线,输出该学生的信息及平均成绩}
Case 3:计算各学生的平均成绩存入ave数组 ave数组排序;输出ave数组;} } Void average(int s[ ][7], int n) {定义局部变量; 显示:1.按个人 2. 按科目 scanf(…….,&sel); /* 输入选择 */ switch(sel) {case 1:求每个人平均分; 输出平均成绩; case 2:求每个科目平均分; 输出平均成绩;} }
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的学生的各项信息;}
三、设计程序,可对一个英文短电文进行加密、解密处理。加密采用换位法及替代法混合加密。(大作业题4)三、设计程序,可对一个英文短电文进行加密、解密处理。加密采用换位法及替代法混合加密。(大作业题4) 换位加密:根据将换位位移量电文分组,每组的长度是换位位移量的2倍,每组字符对称换位。 替代加密:将电文中字符用ASCII码表中向后偏移一定位置的字符替代。 解密:是加密的逆过程。 分析:将加密、解密功能分别写成函数,主函数只要输入电文、密钥,再调用调用加密、解密函数,最后输出解密结果。
main() {char ch[80],ch1[80]; /*存放原始和加密电文*/ ┇ 输入一行电文;输入p,r1,r2; 调用换位函数exchang(ch,p); 调用替代函数replace(ch,r1,r2); 用户选择是否解密? 是:{strcpy(ch1,ch); 调用解密函数decode(ch1); 输出解密结果;} }
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。}
Void decode(char ch1[80]) {int p,r1,r2; 输入p,r1,r2; /* 6位密钥 */ 循环 {根据r1,r2 恢复替换的字符;} exchang(ch1,p); /*调用换位函数,恢复原位*/ }
四、编写程序,从外界输入一个公元年份,输出该年的年历表。(大作业题5)四、编写程序,从外界输入一个公元年份,输出该年的年历表。(大作业题5) 分析:主函数输入一个年份,计算该年第一天的星期数,然后调用输出年历表函数。 输出年历表函数要构造二重循环,外循环循环12次,每次输出1个月的数据,每月一个表头,接下来是内循环,执行次数是一个月的天数,输出一个月的月历表。输出时把握两点:确定每月的1号是星期几;控制每行输出7个数。
main() {int mon={31,28,…..}; /*一年各月的天数*/ 定义变量; 输入年份,判断是否闰年确定二月分的天数; 计算该年第一天的星期数(先算出该年之前有多少闰年,dnum=((年份-1)*365+闰年数+1)%7); prday(mon,dnum); }
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; }
五、编写程序,用字符 ‘*’ 打印一个周期的sin(x)或cos(x)曲线。 分析:将输出图形的功能写成一个函数,主函数中根据用户选择确定输出sin 还是cos。由于函数名是不定的,所以函数要设一个指向函数的指针形参。
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”;} }
六、将二进制字串转换为整型、实型数或十六进制字串。六、将二进制字串转换为整型、实型数或十六进制字串。 程序结构: 数据流: 菜单文本 选择项 字串1指针 字串1指针 字串1指针 主控模块 数值 字符
主控模块主要框架: 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(); } }
bintohex函数主要框架: 符号处理: h[0]='-' 或 h[0]='+' 测试小数点位置、非法字符:位置dotp 非法:1emark if(emark==1) printf("Invalid string!"); else { 整数部分串长; 整数部分4位组组数、不足4位组的位数; 不足4位组十六进制数符h[j++]; 各4位组十六进制数符h[j++]; 小数部分各4位组十六进制数符h[j++]; 小数部分不足4位组十六进制数符h[j++]; 输出结果:printf("%s", h); } 整数部分 小数部分