课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。
【项目1-折腾二维数组】
创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后:
- 通过键盘输入,使后两列的10个元素获得值;
- 按行序优先输出数组元素;
- 将所有元素值乘以3后保存在数组中;
- 按列序优先输出(输出的第一行是数组中的第一列……,其实输出的就是“转置”);
- 将数组“倒”着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出);
- 输出数组中的所有偶数;
- 输出所有行列下标之和为3的倍数的元素值。
提示:编程时,可以做一点,调一点。参考的运行界面如图:
#include <iostream> using namespace std; int main( ) { int i,j; //创建数组,为数组中的前两列的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; //将数组“倒”着输出(见题目描述) cout<<"倒着输出:"<<endl; //输出数组中的所有偶数 cout<<"数组中的偶数:"<<endl; //输出所有行列下标之和为3的倍数的元素值 cout<<"行列下标之和为3的倍数的元素:"<<endl; return 0; }
【项目2-带姓名的成绩单】
设score[8]数组中存储8名同学的C++成绩,增加一个数组string name[8]并赋初值,表示同学们的姓名。这两个数组中,每名同学的姓名与成绩的下标要始终保持一致(例如name[i]和score[i]表示同一位同学(下标为i)的姓名和C++成绩,否则会张冠李戴)。
(1)输出按成绩排序后的同学的名单;
(2)输出按同学姓名排序后的成绩单(排序对象是字符串)。
(3)数据由score.txt提供,程序该如何改?(成绩值利用EXCEL软件随机产生,高了的可以得意,低了的请不要介意,照顾下那位垫底老同鞋的情绪。)
#include<iostream> #include<string> using namespace std; const int num=8; int main() { int i,j,t; string temp; string name[num]= {"zhao","qian","sun","li","zhou","wu","zheng","wang"}; double score[num]= {79,84,65,89,60,92,78,56}; //(1)按成绩排序并输出结果 //(2)按姓名排序并输出结果 }
提示:排序中交换score中的元素时,只要同时也交换name中的相应元素,就可以实现姓名和成绩的同步(如果交换成绩而不交换姓名,两者的对应关系就被破坏了。)
【项目3-多科成绩单】
某班不超过100名同学。用二维数组score[][4]保存同学们的高数、英语、C++成绩及总成绩(在此假设学生的学号为整型的连续值,用数组的行下标作学号)。在此基础上,完成下面的操作:
(1)输入学生的实际人数num,在输入各科的成绩时,输入3科成绩后可以自动求出总分,并将数据全保存到数组中;
(2)输出各门课及总分的最高成绩、最低成绩、平均成绩。
#include<iostream> #include<string> using namespace std; void input(double s[][4],int n); //输入成绩 void output(double s[][4],int n); //输出成绩 double max(double s[][4],int n,int i); //求第i门课的最高成绩,i=3时是总分 double min(double s[][4],int n,int i); //求第i门课的最低成绩 double avg(double s[][4],int n,int i); //求第i门课的平均成绩 int main() { int i,num; string temp; double score[100][4]; //设一个班最多100人,实际按输入来 string course[4]= {"高等数学","英语","C++","总分"}; cout<<"输入学生人数:"; cin>>num; //(1)输入成绩并求出总分 input(score,num); //(2)输出成绩 output(score,num); //(3)输出各门课及总分的最高成绩、最低成绩、平均成绩和成绩的标准偏差; for(i=0; i<4; ++i) { cout<<course[i]<<"的最高成绩是"<<max(score,num,i)<<", "; cout<<"最低成绩是"<<min(score,num,i)<<", "; cout<<"平均成绩是"<<avg(score,num,i)<<", "; cout<<endl; } return 0; }
(3)增加用数组string name[]表示同学们的姓名,使姓名与成绩的下标保持一致(例如name[1]和score[1][0]、score[1][1]、score[1][2]和score[1][3]表示同一位同学的数据)。请在写上面的程序的基础上,输出获得最高成绩的同学的名单(可能有并列第一名哦)。
(4)你现在可以自己构思并实现一个学生成绩管理系统了,功能上可以再扩充,数据存储手段上,将文件用起来。这是学习中重要的事,不过,这是拓展的内容,甚至放在假期完成,你需要先完成后面的工作。
【项目4-电子词典】
做一个简单的电子词典。在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文与释义间用’\t’隔开。编程序,将文件中的内容读到两个数组e[]和c[]中,分别代表英文和中文,由用户输入英文词,显示中文意思。运行程序后,支持用户连续地查词典,直到输入“0000”结束,如图:
提示:文件中的词汇已经排序,故在查找时,用二分查找法提高效率。
【项目5-体会棋盘游戏中的数据存储】
定义一个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(48+2) 27(2+25) 41 30 33 63 60 64(16+48),a[2]行依次为77 68…114。
程序模板:
#include <iostream> #include <ctime> 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图中的背景有斜线的部分。可走到的位置一般为八个,位置在边缘或角上时,可能不够八个,按实际输出)。
(2)马走日还有“别马腿”的规则。在任务4的图中,如果马腿位置上的数大于25,认为马腿被别了(实际游戏中,以该位置是否有棋子进行判断)。请在(1)的基础上考虑这一规则,只输出所有能走到的位置及数值。
(3)俄罗斯方块游戏中的每一个小方块也用二维数组(一般4*4或8*8)表示,单色游戏数组元素用0、1即可,彩色的取值不限于0、1。对小方块的基本操作包括左旋、右旋、反转等操作。请针对上面的二维数组,实现左旋、右旋、反转等操作。
(4)JPEG是数字图像存储的国际标准。在JPEG编码规则中,其编码的基本单位是8*8的图像“块”,其中有一个环节叫“Z字型编码”,也即将一个8*8的“块”中数据按如图所示的方向取出,形成一个1*64的向量(可以保存在一个一维数组中)。请输出前面的8*8的数据块对应的向量。
(5)《线性代数》是工程数学的重要组成,在大二时开设,其中将涉及大量矩阵的运算,用于解决工程中的问题。在编程实现矩阵操作时,就是二维数组的操作。
【项目6-阅读程序】
阅读下面的程序,写出程序的运行结果,上机时可以验证。阅读程序中,也学习其中的一些表达方式。
1.
#include <iostream> using namespace std; int main() { int a [6]={2,-3,4,-6,-8,10}, i; for (i=0;i<6;i++) { if(a[i]<0) continue; cout<<a[i]<<" "; } cout<<endl; return 0; }
2.
#include <iostream> using namespace std; int main( ){ int y=53,i=0,j,a[8]; do { a[i++]=y%2; y=y/2; }while(y!=0) ; for(j=i-1;j>=0;j--) cout<<a[j]; cout<<endl; return 0; }
3.
#include <iostream> using namespace std; int main( ){ char ch[]={"12yue25ri"}; int i,s=0; for(i=0;ch[i]>='0' && ch[i]<='9';i++) s=10*s+ch[i]-'0'; cout<<s<<endl; return 0; }
4.
#include <iostream> using namespace std; int main( ) { int n=0; char str[80]="Beijing-China 2008"; cout<<str<<endl; while(str[n]!='\0') str[n++]=str[n]>='a'&&str[n]<='z'?str[n]-'a'+'A':str[n]; cout<<str<<endl; return 0; }
5.
#include <iostream> using namespace std; int main( ) { int x[2][3]={5,4,6,7,8,9}; int m[2],i,j; for (i=0;i<2;i++) { m[i]=x[i][0]; for(j=1;j<3;j++) if(x[i][j]<m[i]) m[i]=x[i][j]; } for (i=0;i<2;i++) cout<<m[i]<<endl; return 0; }
6.
#include <iostream> using namespace std; int main( ) { int a[4][4]={1,2,4,7,2,3,5,8,4,5,6,9,7,8,9,10}; int i,j,found=0; for(i=0;j<4;i++) for(j=0;j<=i;j++) if(a[i][j]!=a[j][i]) { found=1; break; } if(found) cout<<"No!"<<endl; else cout<<"Yes!"<<endl; return 0; }
7.
#include <iostream> #include <iomanip> using namespace std; int main() { int a[5][5]={0},i,j,k; k=1; for (i=0;i<5;i++) for (j=i;j>=0;j--) a[j][i-j]=k++; for (i=0;i<5;i++) { for (j=0;j<5-i;j++) cout<<setw(4)<<a[i][j]; cout<<endl; } return 0; }
8.
#include <iostream> using namespace std; void reverse(int a[],int n); int main( ) { int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0; reverse(b,8); for(i=5;i<10;i++) s+=b[i]; cout<<s<<endl; return 0; } void reverse(int a[],int n) { int i,t; for(i=0;i<n/2;i++) { t=a[i]; a[i]=a[n-1-i]; a[n-1-i]=t; } }
9.
#include <iostream> using namespace std; void f(int a[],int i,int j); int main( ) { int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0; f(b,0,9); for(i=5;i<10;i++) s+=b[i]; cout<<s<<endl; return 0; } void f(int a[],int i,int j) { int t; if(i<j) { t=a[i]; a[i]=a[j];a[j]=t; f(a,i+1,j-1); } }
10.
#include <iostream> using namespace std; int f(int n); int main() { cout<<f(5)<<” “; cout<<f(8)<<endl; return 0; } int f(int n) { static int a=2; int b=0; a+=n; b+=a; return b; }
11.
#include <iostream> using namespace std; void f(char p[][10],int n); int main() { char p[][10]={"China","America","Russia","England","France"}; f(p,5); cout<<p[0]<<","<<p[4]<<endl; return 0; } void f(char p[][10],int n) { char t[10]; int i,j; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(strcmp(p[i],p[j])<0) { strcpy(t,p[i]); strcpy(p[i],p[j]); strcpy(p[j],t); } }
=================== 迂者 贺利坚 CSDN博客专栏================= |== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==| |== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==| |== 我写的书——《逆袭大学——传给IT学子的正能量》 ==| ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 ===== |