贺利坚练习(7)

【项目1-折腾二维数组】
创建一个5行4列的二维整型数组,通过初始化,为数组中的前两列的10个元素赋初值,然后:

通过键盘输入,使后两列的10个元素获得值;
按行序优先输出数组元素;
将所有元素值乘以3后保存在数组中;
按列序优先输出(输出的第一行是数组中的第一列……,其实输出的就是“转置”);
将数组“倒”着输出(即最后一行最后一列的最先输出,第0行第0列的最后输出);
输出数组中的所有偶数;
输出所有行列下标之和为3的倍数的元素值。
解:
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int a[5][4] = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } ,{ 9,10 } };                       //为前两列赋值
    cout << "为剩下2列赋值: " << endl;
    for (int i = 0; i < 5;++i)
    {
        for (int j = 2; j < 4;++j)
        {
            cin >> a[i][j];
        }
    }
    cout << "按行序输出: " << endl;
    for (int i = 0; i < 5;++i)                                                               //按行序输出
    {
        for (int j = 0; j < 4;++j)
        {
            cout << a[i][j] << '\t';
        }
        cout << endl;
    }
    for (int i = 0; i < 5; ++i)                                                              //每个元素乘三
    {
        for (int j = 0; j < 4; ++j)
        {
            a[i][j] *= 3;
        }
    }
    cout << "将每个元素乘三后按行序输出: " << endl;
    for (int i = 0; i < 5; ++i)                                                              //按行序输出
    {
        for (int j = 0; j < 4; ++j)
        {
            cout << a[i][j] << '\t';
        }
        cout << endl;
    }
    cout << "按列序输出: " << endl;
    for (int i = 0; i < 4;++i)                                                               //按列序输出
    {
        for (int j = 0; j < 5;++j)
        {
            cout << a[j][i] << '\t';
        }
        cout << endl;
    }
    cout << "逆序输出: " << endl;
    for (int i = 4; i >-1; --i)                                                             //逆序输出
    {
        for (int j = 3; j >-1; --j)
        {
            cout << a[i][j] << '\t';
        }
        cout << endl;
    }
    cout << "输出偶数: " << endl;
    for (int i = 0; i < 5; ++i)                                                           //输出偶数
    {
        for (int j = 0; j < 4; ++j)
        {
            if (!(a[i][j]%2))
                cout << a[i][j] << '\t';
        }
        cout << endl;
    }
    cout << "输出下标和为3的倍数的元素: " << endl;
    for (int i = 0; i < 5; ++i)                                                           //输出下标和为3 的倍数元素
    {
        for (int j = 0; j < 4; ++j)
        {
            if (!((i+j)%3))
                cout << a[i][j] << endl;
        }
    }
    return 0;
}

【项目2-带姓名的成绩单】
设score[8]数组中存储8名同学的C++成绩,增加一个数组string name[8]并赋初值,表示同学们的姓名。这两个数组中,每名同学的姓名与成绩的下标要始终保持一致(例如name[i]和score[i]表示同一位同学(下标为i)的姓名和C++成绩,否则会张冠李戴)。
(1)输出按成绩排序后的同学的名单;
(2)输出按同学姓名排序后的成绩单(排序对象是字符串)。
(3)数据由score.txt提供,程序该如何改?(成绩值利用EXCEL软件随机产生,高了的可以得意,低了的请不要介意,照顾下那位垫底老同鞋的情绪。)
解:

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int scores[8] = { 43, 76, 36, 98, 34, 79, 54, 88 };
    string name[8] = { "zhao", "qian", "sun", "li", "zhou", "wu", "zheng", "wang" };
    cout << "按成绩排序后的学生名单:" << endl;
    int high = scores[0];
    for (int i = 0; i < 8;++i)
    {
        for (int j = 0; j < 8 - i-1;++j)
        {
            if (scores[j]>scores[j+1])
            {
                int temp1 = scores[j];
                scores[j] = scores[j + 1];
                scores[j + 1] = temp1;
                string temp2 = name[j];
                name[j] = name[j + 1];
                name[j + 1] = temp2;
            }
        }
    }
    for (int i = 0; i < 8;++i)
    {
        cout << "name: " << name[i] << '\t' << "scores: " << scores[i] << endl;
    }
    cout << "按姓名排序: " << endl;
    for (int i = 0; i < 8; ++i)
    {
        for (int j = 0; j < 8 - i - 1; ++j)
        {
            if (name[j]>name[j + 1])
            {
                int temp1 = scores[j];
                scores[j] = scores[j + 1];
                scores[j + 1] = temp1;
                string temp2 = name[j];
                name[j] = name[j + 1];
                name[j + 1] = temp2;
            }
        }
    }
    for (int i = 0; i < 8; ++i)
    {
        cout << "name: " << name[i] << '\t' << "scores: " << scores[i] << endl;
    }
    return 0;
}

从文件读入,则增加以下:

int _tmain(int argc, _TCHAR* argv[])
{
    int scores[8];
    string name[8];
    fstream file1("F:\\vs2013\\Projects\\ConsoleApplication2\\scores.txt");
    for (int i = 0; i < 8;++i)
    {
        file1 >> name[i] >> scores[i];
    }
    for (int i = 0; i < 8;++i)
    {
        cout << "name: " << name[i] << '\t' << "scores: " << scores[i] << endl;
    }
    return 0;
}

【项目3-多科成绩单】
某班不超过100名同学。用二维数组score[][4]保存同学们的高数、英语、C++成绩及总成绩(在此假设学生的学号为整型的连续值,用数组的行下标作学号)。在此基础上,完成下面的操作:
(1)输入学生的实际人数num,在输入各科的成绩时,输入3科成绩后可以自动求出总分,并将数据全保存到数组中;
(2)输出各门课及总分的最高成绩、最低成绩、平均成绩。
解:

#include "stdafx.h"

void input(double s[][4], int n); //输入成绩  
void output(double s[][4], int n); //输出成绩  

int _tmain(int argc, _TCHAR* argv[])
{
    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);
    return 0;
}

void input(double s[][4], int n)
{
    for (int i = 0; i < n;++i)
    {
        int sum = 0;
        for (int j = 0; j < 3;++j)
        {
            cin >> s[i][j];
            sum += s[i][j];
        }
        s[i][3] = sum;
    }
}

void output(double s[][4], int n)
{
    int high[4] = { 0, 0, 0, 0 };                           //若不赋初值,会出错
    int low[4] = { 100, 100, 100, 1000 };
    int sum[4] = { 0, 0, 0, 0 };                            //若不赋初值,会出错
    int aver[4];
    for (int j = 0; j < 4;++j)
    {
        for (int i = 0; i < n;++i)
        {
            if (s[i][j]>high[j])
            {
                high[j] = s[i][j];
            }
            if (s[i][j]<low[j])
            {
                low[j] = s[i][j];
            }
            sum[j] += s[i][j];
        }
    }
    for (int i = 0; i < 4;++i)
    {
        aver[i] = sum[i] / n;
    }
    cout << "高数最高分为: " << high[0] << endl;
    cout << "高数最低分为: " << low[0] << endl;
    cout << "高数平均分为: " << aver[0] << endl;
    cout << "英语最高分为: " << high[1] << endl;
    cout << "英语最低分为: " << low[1] << endl;
    cout << "英语平均分为: " << aver[1] << endl;
    cout << "C++最高分为: " << high[2] << endl;
    cout << "C++最低分为: " << low[2] << endl;
    cout << "C++平均分为: " << aver[2] << endl;
    cout << "总分最高分为: " << high[3] << endl;
    cout << "总分最低分为: " << low[3] << endl;
    cout << "总分平均分为: " << aver[3] << endl;
}

项目4-电子词典】
做一个简单的电子词典。在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文与释义间用’\t’隔开。编程序,将文件中的内容读到两个数组e[]和c[]中,分别代表英文和中文,由用户输入英文词,显示中文意思。运行程序后,支持用户连续地查词典,直到输入“0000”结束,如图:
这里写图片描述
解:

#include "stdafx.h"

int trans(string e[], string s,int i,int j)
{
    if (i<=j)
    {
        int mid = (i + j) / 2;
        if (s < e[mid])
        {
            return trans( e, s, i, mid-1);             //需减一,否则进入死循环
        }
        else if (s > e[mid])
        {
            return trans(e, s, mid + 1, j);
        }
        else
        {
            return mid;
        }   
    }
    else
        return -1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    string e[4], c[4];
    fstream file1("F:\\vs2013\\Projects\\ConsoleApplication2\\dictionary.txt");
    for (int i = 0; i < 4;++i)
    {
        file1 >> e[i] >> c[i];                 //会忽略空格
    }
    string find_s;
    int index;
    while (1)
    {
        cin >> find_s;
        if (find_s == "0000")
        {
            break;
        }
        else
        {
            index = trans(e, find_s, 0, sizeof(e) / sizeof(string)-1);
            if (index == -1)
            {
                cout << "查无此词" << endl;
            }
            else
                cout << find_s << '\t' << "中文意思为:" << c[index] << endl;
        }       
    }
    return 0;
}

项目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 "stdafx.h"

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]);               //按要求改变数值  
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])
{
    for (int i = 0; i < 8;++i)
    {
        for (int j = 0; j < 8;++j)
        {
            cout << a[i][j] << '\t';
        }
        cout << endl;
    }
}
//输出对角线元素的值(从左上到右下、从右上到左下)  
void outDiagonal(int a[8][8])
{
    for (int i = 0; i < 8;++i)
    {
        cout << a[i][i] << endl;
    }
}
//按扫雷游戏规则,输出a[x][y]周围的8个数字  
void mine(int a[8][8], int x, int y)
{
    for (int i = x - 1; i < x + 2;++i)
    {
        for (int j = y - 1; j < y + 2;++j)
        {
            if (i>-1&&j<8&&(!(i==x&&j==y)))
            {
                cout << a[i][j] << '\t';
            }
        }
    }
    cout << endl;
}
//按题目中所言规则更改元素的值  
void change(int a[8][8])
{
    for (int i = 1; i < 8;++i)
    {
        for (int j = 0; j < 8;++j)
        {
            if (j<7)
            {
                a[i][j] = a[i - 1][j] + a[i - 1][j + 1];
            }
            else
                a[i][j] = a[i - 1][j] + a[i - 1][0];
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[8][8], x, y;
    setdata(a);
    cout << "按行序优先输出数组 : " << endl;
    out(a);
    cout << "输出对角线元素的值(从左上到右下、从右上到左下): " << endl;
    outDiagonal(a);
    cout << "输入一个位置:";
    cin >> x >> y;
    cout << "按扫雷游戏规则,输出a[x][y]周围的8个数字 : " << endl;
    mine(a, x, y);
    change(a);
    cout << "按题目中所言规则更改元素的值  : " << endl;
    out(a);
    return 0;
}

杨辉三角
Description

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
上面的图形熟悉吗?这是大名鼎鼎的杨辉三角。
杨辉三角可不只是数学游戏,在实际应用中有大用。例如两个未知数x、y之和的n次方的系数问题,(x+y)^1=x+y,系数为1, 1,(x+y)^2=x^2+2xy+y^2,系数是1,2,1,立方、四次方,你可以继续下去,这不就是杨辉三角的各行吗?
所以,生成了杨辉三解,解决的就是多项式展开问题。而多项式,解决的实际问题更广了。
Input

一个正整数n(1

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    int a[30][30], n;
    cout << "请输入行数: " << endl;
    cin >> n;
    for (int i = 0; i < n;++i)
    {
        a[i][0] = a[i][i] = 1;
    }
    for (int i = 2; i < n;++i)
    {
        for (int j = 1; j < i;++j)
        {
            a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
        }
    }
    cout << "产生杨辉三角为: " << endl;
    for (int i = 0; i < n;++i)
    {
        for (int j = 0; j < i + 1;++j)
        {
            cout << a[i][j] << '\t';
        }
        cout << endl;
    }
    return 0;
}

1012: 求矩阵对角线元素之和
Description

在 数学中,矩阵(Matrix)是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。矩阵是高等代数学中的常见工具,也常见于统计分析 等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,计机图形学、三维动画制作也需要用到矩阵。 矩阵的运算是数值分析领域的重要问题。介绍矩阵理论的线性代数课程是工程专业学生的必修科目。
用程序设计的方法解决矩阵问题,最简单的就是将矩阵用二维数组存储和处理。
下面,我们将矩阵对角线元素加起来。
Input

一个整数n,代表接下来的要输入n行n列的数据,作为矩阵中的元素。(1

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int a[15][15], n;
    cout << "请输入行数: " << endl;
    cin >> n;
    for (int i = 0; i < n;++i)
    {
        for (int j = 0; j < n;++j)
        {
            cin >> a[i][j];
        }
    }
    int sum1 = 0;
    for (int i = 0; i < n;++i)
    {
        sum1 += a[i][i];
    }
    int sum2 = 0;
    for (int i = n - 1; i > -1;--i)
    {
        sum2 += a[i][n - i-1];
    }
    cout << sum1 << '\t' << sum2 << endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值