2014秋C++ 第14周项目 二维数组

简介: 课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 【项目1-折腾二维数组】创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后:通过键盘输入,使后两列的10个元素获得值;按行序优先输出数组元素;将所有元素值乘
课程主页在 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菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====



目录
相关文章
|
1月前
|
开发工具 C语言 C++
CMake构建大型C/C++项目:跨平台设计与高级应用(二)
CMake构建大型C/C++项目:跨平台设计与高级应用
42 0
|
1月前
|
设计模式 测试技术 编译器
C++项目中打破循环依赖的锁链:实用方法大全(一)
C++项目中打破循环依赖的锁链:实用方法大全
79 0
|
14天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
38 6
|
24天前
C/C++test两步完成CMake项目静态分析
通过将C/C++test集成到CMake项目中,并根据项目的需要进行配置,可以在两步内完成CMake项目的静态分析。这样可以帮助开发人员及时发现并修复潜在的代码问题,提高代码质量和可靠性。
8 0
|
30天前
|
IDE 算法 编译器
快速掌握陌生C++项目的科学与心理学策略
快速掌握陌生C++项目的科学与心理学策略
58 0
|
30天前
|
敏捷开发 安全 API
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
C/C++ 工程师面试:如何精彩展示你的项目经验并获得高分
73 0
|
1月前
|
消息中间件 存储 算法
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
43 1
|
1月前
|
编译器 持续交付 项目管理
CMake构建大型C/C++项目:跨平台设计与高级应用(三)
CMake构建大型C/C++项目:跨平台设计与高级应用
41 0
|
1月前
|
编译器 Linux C语言
CMake构建大型C/C++项目:跨平台设计与高级应用(一)
CMake构建大型C/C++项目:跨平台设计与高级应用
69 0
|
1月前
|
设计模式 敏捷开发 持续交付
C++项目中打破循环依赖的锁链:实用方法大全(三)
C++项目中打破循环依赖的锁链:实用方法大全
52 0