时间限制: 1 Sec 内存限制: 128 MB
题目描述
一开始未知数组长度,根据要求创建不同类型的指针,并且使用指针创建相应长度的数组,然后再完成不同的要求
若要求创建整数数组,计算数组内所有数据的平均值
若要求创建字符数组,找出数组内的最大字母
若要求创建浮点数数组,找出数组的最小值
要求程序整个过程不能使用数组下标,从数组创建、输入到搜索、比较、计算,到输出都必须使用指针
提示:使用new关键字
输入
第一行输入t表示有t个测试实例
第二行先输入一个大写字母表示数组类型,I表示整数类型,C表示字符类型,F表示浮点数类型;然后输入n表示数组长度。
第三行输入n个数据
依次输入t个实例
输出
每个根据不同的数组类型输出相应的结果
样例输入
3
C 5
A D E B C
I 6
22 55 77 33 88 55
F 4
3.1 1.9 6.5 4.8
样例输出
E
55
1.9
提示
解决方案
不明白这种要求存在的意义。它对于让学生更好地理解指针这个问题上没有任何意义,反而降低代码质量。对于这个问题,我建议你去阅读《征服C指针》之类的图书,或许对你帮助会很大。
顺便一提,*(p+5)
是p[5]
的语法糖,也就是说,p[5]
是前者的简化形式,方便输入等。因此,在这个时候甚至5[p]
和p[5]
也是一样的,不过别写成这样。具体内容详见上述图书。
#include <iostream>
int getAverageValue(const int *array, size_t size) {
int sum = 0;
size_t times = size;
while (times--) {
sum += *(array++);
}
return (sum / static_cast<int>(size));
}
char getMaximumChar(const char *array, size_t size) {
char maxChar = *array;
while (size--) {
if (maxChar < *array) {
maxChar = *array;
}
array += 1;
}
return maxChar;
}
double getMinimumFloat(const double *array, size_t size) {
double minDouble = *array;
while (size--) {
if (minDouble > *array) {
minDouble = *array;
}
array += 1;
}
return minDouble;
}
template<typename T>
T *handleArray(size_t size) {
T *array = new T[size];
for (size_t i = 0; i < size; ++i) {
std::cin >> *(array + i);
}
return array;
}
int main() {
size_t T;
std::cin >> T;
while (T--) {
char type;
size_t size;
std::cin >> type >> size;
switch (type) {
case 'I': {
const int *array = handleArray<int>(size);
std::cout << getAverageValue(array, size) << std::endl;
break;
}
case 'C': {
const char *array = handleArray<char>(size);
std::cout << getMaximumChar(array, size) << std::endl;
break;
}
case 'F': {
const double *array = handleArray<double>(size);
std::cout << getMinimumFloat(array, size) << std::endl;
break;
}
default:
exit(-1);
}
}
return 0;
}