【项目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;
}