分享一下我老师大神的人工智能教程!零基础,通俗易懂!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的倍数的元素:"<<endl; return 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 std; int 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图中的背景有斜线