第6周:阅读教材第5章(p134-163),主要内容是数组,完成第6周上机任务;
任务内容:
1. 创建一个长度为20的数组,其中存放斐波那契数列的前20项。
2. 筛法求素数。筛法求素数是一种快速的求素数的方法,其思路是以空间换时间,利用额外的数组作为中介,能够显著降低运行的时间。现在要求列出10000以内的素数。
(筛法求素数的算法请上网查找)
3. 在数组score中将要存储某小组C++程序设计的成绩,请设计完成下面功能函数,并将它们组合成一个完整的应用:
(1)输入小组人数及成绩;
(2)输出该小组的最高成绩、最低成绩、平均成绩和成绩的标准偏差;
附:标准偏差的公式
(3)输出考得最高成绩和最低成绩的同学的人数及对应的学号(设成绩对应的下标即学号,可能有相同的成绩)
(4)输出前3名同学的学号——可以先不考虑有并列名次的情况,然后再考虑无并列。
下图所示的运行结果供参考:
int main(void) { int score[50]; //将score设为局部变量,通过数组名作函数参数,传递数组首地址,在函数中操作数组 int num; //小组人数也设为局部变量,也设为参数之一 int max_score,min_score; cout<<"小组共有多少名同学?"; cin>>num; cout<<endl<<"请输入学生成绩:"<<endl; input_score(score, num); //要求成绩在0-100之间 max_score=get_max_score(score, num); cout<<endl<<"最高成绩为:"<<max_score<<",共有 "<<count(max_score, score, num )<<" 人。"; min_score=get_min_score(); cout<<endl<<"最低成绩为:"<<min_score<<",共有 "<<count(min_score,score, num )<<" 人。"; cout<<endl<<"平均成绩为:"<<get_avg_score(score, num); cout<<endl<<"标准偏差为:"<<get_stdev_score(score, num); cout<<endl<<"获最高成绩的学生(学号)有:"; output_index(max_score,score, num); cout<<endl<<"获最低成绩的学生(学号)有:"; output_index(min_score,score, num); return 0; }
4. 做一个简单的电子词典。在文件dictionary.txt中(下载,此链接已经失效。无语了,相关的资源总被CSDN资源频道删除,不知他们是怎样想的。烟台大学学生可以到BB平台我的教学资源中去找。或者也可以将本文最后的一部分文字粘贴到词本中自建文本文件作为词库文件,只不过,不是8000词的感觉了。),保存的是英汉对照的一个词典,词汇量近8000个,英文与释义间用’\t’隔开。编程序,由用户输入英文词,显示中文意思。涉及文件操作,可以先看有关ASCII文件操作的一般知识,通过模仿,学会ASCII文件的读取。
提示:文件中的词汇已经排序,故在查找时,用二分查找法提高效率;可以将文件中的内容读到两个数组e[]和c[]中,分别代表英文和中文;也可以定义二维数组dict[][2],两列分别代表英文和中文。
扩展1:允许用户运行程序后,连续地查词典,直到输入”0000”结束,如下图
扩展2:试着做一个窗口版的电子词典。
扩展3:做成英汉双向查询的词典。
5. 定义一个8行8列的二维数组a[8][8]
(1)(程序模板中setdata()函数已经完成)利用产生随机数的系统函数为其置初值(1-50之间),可能的取值如下图所示;
(2)设计函数out()按行、列输出二维数组中的数据;
(3)设计函数outDiagonal()输出从左上到右下对角线上的元素的值,如对上图而言,输出为48 34 12 31 40 42 34 45;再输出从右上到左下对角线上的值;
(4)将此数组视为“扫雷”游戏的界面(实际上扫雷游戏的界面一般就用二维数组保存其界面),通过键盘输入一个位置,输出其周围八个格子中的数据,如输入2 2时,输出34 30 47 29 48 14 12 31(注意:一共八个,不包括该位置上的数)(参见图中的黄色部分),计算这些数的和并输出。另外,如果选择的位置在边缘或角上时,周围的格数不够八个,按实际个数输出。请用循环有规律地列举出来各个值,不要采用顺序结构逐个罗列。这项功能由函数mine()完成。
(5)设计函数change()改变数组中的值。改变的规则是:从第2行(即a[1]行)开始到最后一行,每一元素是其正上方元素和右上方元素之和,例如a[1][0]取a[0][0]和a[0][1]之和,a[1][1]取a[0][1]和a[0][2]之和,……。对各行最后一列元素,其右上方无数据,取上一行中的第一个元素,如a[1][7]取a[0][7]和a[0][0]之和。对上图中的数据,a[1]行的元素将依次为:50 27 41 30 33 63 60 64,a[2]行依次为77 68….114。
(6)多文件项目实践。按《C++程序设计题解与上机指导》P226第15.4节的提示,建立一个包含多个文件的项目,将本任务中main()函数保存在一个文件中,所有自定义函数保存到另外一个文件中,运行程序并得到正确的结果。
程序模板:
#include <iostream> #include <time.h> using namespace std; void setdata(int a[8][8]); //设置随机数 void out(int a[8][8]); //输出数组 void outDiagonal(int a[8][8]); //输出对角线元素的值 void mine(int a[8][8],int x, int y); //按“扫雷”游戏的规则输出相邻格子 void change(int a[8][8]); //按要求改变数值 int main() { int a[8][8],x,y; setdata(a); out(a); outDiagonal(a); cout<<"输入一个位置:"; cin>>x>>y; mine(a,x,y); change(a); out(a); return 0; } void setdata(int a[8][8]) { int i,j; srand(time(NULL));//需要用当前时间作“种子”,以便每次运行取得的序列不同 for(i=0;i<8;i++) for(j=0;j<8;j++) a[i][j]=rand()%50+1; return; } void out(int a[8][8]) { } void outDiagonal(int a[8][8]) { } void mine(int a[8][8],int x, int y) { } void change(int a[8][8]) { }
6. (字符数组和字符串):给出一个字符数组char str[],在程序中赋初值为一个句子,例如char str[]="he threw three free throws",自编函数完成下面的功能:
(1)求出字符数组中字符的个数(从第一个字符读起,直到读到'\0'结束计数)(对于例句,输出为26);
(2)计算句子中各字符出现的频数
附:文件dictionary.txt中一部分
abandon v.抛弃,放弃
abandonment n.放弃
abasement n.滥用
abbreviation n.缩写
abeyance n.缓办,中止
abide v.遵守
ability n.能力
able adj.有能力的,能干的
abnormal adj.反常的,变态的
aboard adv.船(车)上
abolish v.废除,取消
abolition n.废除,取消
abortion n.流产
abortive adj.无效果的,失败的
about prep.关于,大约
above prep.在...之上,高于
above-mentioned adj.上述的
abreast adv.并肩,并列
abridge v.省略,摘要