题目来源:西工大计算机(微信公众号)
第一题:跑步时间
思想:本题并不算太难,和实际中求平均值是一样的,而此处是求时间的平均值,时间的表示形式是 分 秒 毫秒;求平均值便由前向后求,余数转化为下一单位的数据进行平均值计算。
1、单行输入单行输出
#include<iostream>
using namespace std;
void average(int t[9])
{
int a[3],temp1 = 0,temp2 = 0,temp3 = 0; //三个临时变量用以分别保存 分 秒 毫秒 的和
temp1 = t[0] + t[3] + t[6];
temp2 = t[1] + t[4] + t[7] + temp1 % 3 * 60; //分有余数 则转换为秒
temp3 = t[2] + t[5] + t[8] + temp2 % 3 * 1000 ;//秒有余数 则转换为毫秒
a[0] = temp1 / 3;
a[1] = temp2 / 3;
a[2] = temp3 / 3;
for (int i = 0; i < 3; i++)
{
cout << a[i] << " ";
}
}
int main()
{
int n; //行数
cout << "Please input lines:";
cin >> n;
if (n <= 0)
return 0;
int a[9];//每行9个整数,分别表示三圈的分 秒 毫秒;
for (int i = 0; i < n; i++) //单行输入,单行输出
{
for (int j = 0; j < 9; j++)
{
cin >> a[j];
}
average(a);
cout << endl;
}
return 0;
}
2、多行输入多行输出(和单行输入单行输入解决方法一样,直接用二维数组保存数据,便于多行输入多行输出)
#include<iostream>
using namespace std;
void average(int n,int t[10][9])
{
int a[10][3],temp1,temp2,temp3; //三个临时变量用以分别保存 分 秒 毫秒 的和
for (int i = 0; i < n; i++) //二维数组直接求平均值,i代表行数,控制i循环即可
{
temp1 = 0, temp2 = 0, temp3 = 0;
temp1 = t[i][0] + t[i][3] + t[i][6];
temp2 = t[i][1] + t[i][4] + t[i][7] + temp1 % 3 * 60; //若分 取平均值之后有余数 则转换为秒
temp3 = t[i][2] + t[i][5] + t[i][8] + temp2 % 3 * 1000;//秒有余数 则转换为毫秒
a[i][0] = temp1 / 3;
a[i][1] = temp2 / 3;
a[i][2] = temp3 / 3;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int n; //行数
cout << "Please input lines:";
cin >> n;
if (n <= 0)
return 0;
int a[10][9];//最多10行,每行9个整数,分别表示三圈的分 秒 毫秒;
for (int i = 0; i < n; i++) //单行输入,单行输出
{
for (int j = 0; j < 9; j++)
{
cin >> a[i][j];
}
} //测试数据输入完毕
average(n, a); //调用取平均值子函数
return 0;
}
第二题:排序
这样的题目见了好几次了,定长数组排序比较简单,可以调用排序函数或者自己写快排、冒泡等排序算法;但本题有点复杂,因为长度不固定,数组的长度需要从键盘读入。快速排序加二维数组多行输入输出数据元素。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
void quickSort(int array[], int start, int end) //快排,实现对一组数据进行排序;
{
if (start >= end) //start end分别代表数组的第一个和最后一个位置
return;
int i, j, b;
i = start;
j = end;
b = array[start];
while (i < j)
{
while (i < j && array[j] >= b)
j--;
if (i < j)
{
array[i] = array[j];
i++;
}// 从右向左找比基准数小的数
while (i < j && array[i] <= b)
i++;
if (i < j)
{
array[j] = array[i];
j--;
}// 从左向右找比基准数大的数
}//一趟快排结束
array[i] = b; //基准数放入适当位置
quickSort(array, start, j - 1); //递归调用
quickSort(array, i + 1, end);
}
int main()
{
int num[20][20] = {0}; //最多20行,每行最多20个整数,必须初始化;
int n; //n表示行数
cin >> n;
if (n <= 0)
{
return 0;
}
for (int i = 0; i < n; i++) //遍历行数,每行输入不定长数组;
{
for (int j = 0; j < 20; j++)//数组长度不固定,最多有20位;
{
char c = ' '; //初始化
scanf("%d%c", &num[i][j], &c); //从键盘获取不定长数组的方法
if (c == '\n')
break;
}
}
for (int i = 0; i < n; i++)
{
int count = 0;
while (num[i][count] != 0)
count++; //获取数组长度
quickSort(num[i], 0, count - 1); //快排
}
for (int i = 0; i < n; i++)
{
int count = 0;
while (num[i][count] != 0)
count++;
for (int j = 0; j < count; j++)
cout << num[i][j]<<" ";
cout << endl;
}
return 0;
}
第三题:计算表达式
暂时没有思路,可以参考 该篇博客
第四题:海伦公式求三角形面积
#include<iostream>
#include<cmath>
using namespace std;
bool judge(int a,int b,int c) //判断三个数能否组成三角形
{
if (a + b <= c || a + c <= b || b + c <= a)
return false;
else if (abs(a - b) >= c || abs(a - c) >= b || abs(b - c) >= a)
return false;
else
return true;
}
int compute(int a, int b, int c)//利用海伦公式计算三角形的面积
{
float p = (a + b + c) / 2;
float result;
result = sqrt(p * (p - a) * (p - b) * (p - c));
return result;
}
int main()
{
int n;
cin >> n;
if (n <= 0)
return 0;
int num[20][3] = { 0 };
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
cin >> num[i][j];
}
}
for (int i = 0; i < n; i++)
{
if (judge(num[i][0], num[i][1], num[i][2]))
cout << compute(num[i][0], num[i][1], num[i][2]) << endl;
else
cout << "0.00" << endl;
}
}