2013级C++第15周项目——二维数组

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759

【项目1-折腾二维数组】创建一个长度为5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后通过键盘输入,使后两列的10个元素获得值,将所有元素值乘以3后保存在数组中。输出数组时,按行序优先输出,再按列序优先输出(输出的第一行是数组中的第一列……,其实输出的就是“转置”),再将数组“倒”着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出),再输出数组中的所有偶数,以及行列下标之和为3的倍数的元素值。
     提示:编程时,可以做一点,调一点,全写好再改会自讨苦吃。

  同时也给出参考的运行界面:

  
     报告模板及部分代码

/** 程序的版权和版本声明部分* Copyright (c)2013, 烟台大学计算机学院学生* All rightsreserved.* 文件名称: array.cpp                           * 作    者:                            * 完成日期:  年  月   日* 版本号: v1.0      * 输入描述:无* 问题描述:定义二维数组,为数组赋初值、输入值、更改值、按各种方法输出*/#include <iostream>using namespace std;int main( )int i,j;    //创建5行4列的二维整型数组,为数组中的前两列的10个元素赋初值 int a[5][4]={
   {
   0,1},{
   4,5},{
   8,9},{
   12,13},{
   16,17}};  //键盘输入使后两列10个元素的值 cout<<"请输入10个整数:"<<endl//按行序优先输出 cout<<"数组中的值为:"<<endl;  //将所有元素值乘以3后保存在数组中 cout<<"现在将所有元素乘以3倍...";  //按行序优先输出 cout<<"行序优先输出:"<<endl;   //按列序优先输出(输出的第一行是数组中的第一列……,其实输出的就是“转置”) cout<<"列序优先输出:"<<endl;  //将数组“倒”着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出) cout<<"倒着输出:"<<endl//输出数组中的所有偶数 cout<<"数组中的偶数:"<<endl;  //输出所有行列下标之和为3的倍数的元素值 cout<<"行列下标之和为3的倍数的元素:"<<endlreturn 0;}

补充:为了督促同学们学会与习惯使用单步调试工具,要求在报告中加一张图,图示在单步执行时,看到的数组a中各行各列的值。


【项目2-杨辉三角】编写程序,打印出以下形式的扬辉三角形。
1
1    1
1    2   1
1    3    3    1
1    4   6    4    1
1    5   10   10   5    1
1    6   15   20   15   6   1
  可以将杨辉三角形的值放在一个方形矩阵的下半三角中,如果需打印7行杨辉三角形,应该定义等于或大于7X7的方形矩阵,只是矩阵的上半部和其余部分并不使用。杨辉三角形具有如下特点:(1)第0列和对角线上的元素都为1。(2)除第0列和对角线上的元素以外,其它元素的值均为前一行上的同列元素和前一列元素之和。
  函数setdata按以上规律给数组元素置数,函数outdata输出杨辉三角形。

#include <iostream>  using namespace stdint main()  {    int a[7][7]={
   0};    setdata(a); //给数组赋值    outdata(a); //输出数组    return 0;}  void setdata(int a[7][7])  {  }  void outdata(int a[7][7])  {   }  

【项目3-带姓名的成绩单】设score数组中存储同学们的C++成绩,增加一个数组string name[20]并赋初值,表示同学们的姓名。这两个数组中,同学的姓名与成绩的下标保持一致(例如name[1]和score[1]表示同一位同学的姓名和C++成绩)。请(1)输出按成绩排序后的同学的名单;(2)输出按同学姓名排序后的成绩单(排序对象是字符串)。提示:排序中交换score中的元素时,只要同时也交换name中的相应元素,就可以实现姓名和成绩的同步(如果交换成绩而不交换姓名,两者的对应关系就被破坏了。)



【项目4-多科成绩单】用二维数组score[][4]保存同学们的高数、英语、C++成绩及总成绩(在此假设学生的学号为整型的连续值,用数组的行下标作学号)。在此基础上,完成下面的操作:
(1)设计输入成绩的函数,输入3科成绩后可以自动求出总分,并将数据全保存到数组中;
(2)输出各门课及总分的最高成绩、最低成绩、平均成绩和成绩的标准偏差;
(3)输出考得总分最高、最低同学的人数及对应的学号。
要求:学生人数num在main()函数中输入,score[][4]数组也是main()函数的局部变量,最好将其他功能也设计成函数,使main()函数尽可能地简单。
【项目4扩展(选做)-带姓名的多科成绩单】增加用数组string name[]表示同学们的姓名,使姓名与成绩的下标保持一致(例如name[1]和score[1][0]、score[1][1]、score[1][2]和score[1][3]表示同一位同学的数据)。据此,将项目4中的第(3)项任务改为输出总分最高的同学的姓名。


【项目5-电子词典】:做一个简单的电子词典。在文件dictionary.txt中(本文后附了一部分(b打头的词)作为调试,校内同学到我的BB教学平台中找,校外人士感兴趣的告知我Email),保存的是英汉对照的一个词典,词汇量近8000个,英文与释义间用’\t’隔开。编程序,将文件中的内容读到两个数组e[]和c[]中,分别代表英文和中文,由用户输入英文词,显示中文意思。运行程序后,支持用户连续地查词典,直到输入“0000”结束,如下图:
      
  提示:文件中的词汇已经排序,故在查找时,用二分查找法提高效率。


【项目6-体会棋盘游戏中的数据存储】
  定义一个8行8列的二维数组a[8][8]。
  

  (1)为二维数组中的数据赋50以内的随机数(程序模板中setdata()函数已经完成,利用产生随机数的系统函数实现),可能的取值如上图所示;
  (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。
程序模板:

#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]){}//按扫雷游戏规则,输出a[x][y]周围的8个数字void mine(int a[8][8],int x, int y){}//按题目中所言规则更改元素的值void change(int a[8][8]){}

【拓展-二维数组更多用处】这部分可以不去选择实践,看看、想想即可。
  中国象棋的棋盘也可以采用二维数组存储。
  (1)下棋程序需要体现相关的规则,例如,马走日。通过键盘输入一个位置,输出按“日”字型可以走到的所有位置,及其位置上的数值。例如,在项目6的图中,输入2 2时,输出(0,1,2)(0,3,16) (1,0,9) (1,4,12)……(项目6图中的背景有斜线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值