程序设计与算法测验和作业题部分答案汇总(泛型程序篇)
Posted Mount256
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序设计与算法测验和作业题部分答案汇总(泛型程序篇)相关的知识,希望对你有一定的参考价值。
题目来源:程序设计与算法(三)测验和作业题汇总
PS:可能我只是入门小白吧,C++对我来说就是一坨shit,我已经绕晕了!!!两年前做Qt项目的时候就觉得这玩意是个无底洞,现在在准备某校的机试,就更觉得了!!!
文章目录
027:简单的SumArray
#include <iostream>
#include <string>
using namespace std;
template <class T>
T SumArray (T *begin, T *end)
T result;
for (T *i = begin; i < end; i++)
result += *i;
return result;
int main()
string array[4] = "Tom","Jack","Mary","John";
cout << SumArray(array,array+4) << endl;
int a[4] = 1, 2, 3, 4; //提示:1+2+3+4 = 10
cout << SumArray(a,a+4) << endl;
return 0;
输出:
TomJackMaryJohn
10
028:简单的foreach
#include <iostream>
#include <string>
using namespace std;
// 在此处补充你的代码
template <class T, class F>
void MyForeach (T *begin, T *end, F *func) // func为函数指针
for (T *i = begin; i < end; i++)
func(*i);
void Print(string s)
cout << s;
void Inc(int &n)
++n;
string array[100];
int a[100];
int main()
int m,n;
while(cin >> m >> n)
for(int i = 0;i < m; ++i)
cin >> array[i];
for(int j = 0; j < n; ++j)
cin >> a[j];
MyForeach(array, array+m, Print);
cout << endl;
MyForeach(a, a+n, Inc);
for(int i = 0;i < n; ++i)
cout << a[i] << ",";
cout << endl;
return 0;
输入:多组数据,每组数据第一行是两个整数 m 和 n ,都不超过 50;第二行是m个不带空格的字符串;第三行是 n个整数
3 4
Tom Mike Jack
1 2 3 4
1 2
Peking
100 200
输出:对每组数据,第一行输出所有输入字符串连在一起的结果,第二行输出输入中的每个整数加1的结果
TomMikeJack
2,3,4,5,
Peking
101,201,
029:简单的Filter
#include <iostream>
#include <string>
using namespace std;
// 在此处补充你的代码
template <class T, class F>
T *Filter (T *begin, T *end, T *result, F *func) // func为函数指针
int j = 0;
for (T *i = begin; i < end; i++)
if (func(*i))
result[j] = *i;
j++;
return &result[j];
bool LargerThan2(int n)
return n > 2;
bool LongerThan3(string s)
return s.length() > 3;
string as1[5] = "Tom","Mike","Jack","Ted","Lucy";
string as2[5];
int a1[5] = 1,2,3,4,5;
int a2[5];
int main()
string * p = Filter(as1,as1+5,as2,LongerThan3); // 留下长度大于3的字符串
for(int i = 0; i < p - as2; ++i) // p-as2是数组as2的长度
cout << as2[i];
cout << endl;
int * p2 = Filter(a1,a1+5,a2,LargerThan2); // 留下大于2的元素
for(int i = 0; i < p2 - a2; ++i) // p2-a2是数组a2的长度
cout << a2[i] << ",";
return 0;
输出:
MikeJackLucy
3,4,5,
030:你真的搞清楚为啥 while(cin >> n) 能成立了吗?
#include <iostream>
using namespace std;
class MyCin
// 在此处补充你的代码
public:
bool isStop;
MyCin(): isStop(false)
MyCin &operator >> (int &x)
cin >> x;
if (x == -1)
isStop = true;
return *this;
operator bool () // 对强制类型转换运算符bool进行重载
return !isStop;
;
int main()
MyCin m;
int n1, n2;
while(m >> n1 >> n2)
cout << n1 << " " << n2 << endl;
return 0;
输入:多组数据,每组一行,是两个整数
12 44
344 555
-1
2 3
输出:对每组数据,原样输出;当碰到输入中出现-1时,程序结束。输入中保证会有-1
12 44
344 555
031:山寨版istream_iterator
(略)
032:这个模板并不难
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
template <class T>
class myclass
// 在此处补充你的代码
public:
T *p;
int size;
myclass(T *a, int len)
size = len;
p = new T[len+1]; // 考虑到字符串的\\0
for (int i = 0; i < len; i++)
p[i] = a[i];
~myclass()
delete [] p;
void Show()
for(int i = 0; i < size; i++)
cout << p[i] << ",";
cout << endl;
;
int a[100];
int main()
char line[100];
while(cin >> line)
myclass<char> obj(line, strlen(line));
obj.Show();
int n;
cin >> n;
for(int i = 0; i < n; ++i)
cin >> a[i];
myclass<int> obj2(a, n);
obj2.Show();
return 0;
输入:多组数据。每组第一行是一个不含空格的字符串,第二行是整数n,第三行是n个整数
Tom
3
3 4 5
Jack
4
1 2 3 4
输出:对每组数据,先依次输出输入字符串的每个字母,并且在每个字母后面加逗号,然后依次再输出输入的n个整数 ,在每个整数后面加逗号
T,o,m,
3,4,5,
J,a,c,k,
1,2,3,4,
033:排序,又见排序!
#include <iostream>
using namespace std;
bool Greater2(int n1,int n2)
return n1 > n2;
bool Greater1(int n1,int n2)
return n1 < n2;
bool Greater3(double d1,double d2)
return d1 < d2;
template <class T1,class T2>
void mysort(T1 *begin, T1 *end, T2 (*func)(T1, T1)) // 回调函数:函数指针作为函数的参数
int len = end - begin - 1;
for (int i = 0; i < len; i++)
for (int j = 0; j < len - i; j++)
if (func(begin[j+1], begin[j]))
T1 tmp = begin[j];
begin[j] = begin[j+1];
begin[j+1] = tmp;
#define NUM 5
int main()
int an[NUM] = 8,123,11,10,4 ;
mysort(an, an+NUM, Greater1); //从小到大排序
for( int i = 0; i < NUM; i ++ )
cout << an[i] << ",";
mysort(an, an+NUM, Greater2); //从大到小排序
cout << endl;
for( int i = 0; i < NUM; i ++ )
cout << an[i] << ",";
cout << endl;
double d[6] = 1.4,1.8,3.2,1.2,3.1,2.1 ;
mysort(d+1, d+5, Greater3); //将数组从下标1到下标4从小到大排序
for( int i = 0; i < 6; i ++ )
cout << d[i] << ",";
return 0;
输出:
4,8,10,11,123,
123,11,10,8,4,
1.4,1.2,1.8,3.1,3.2,2.1,
034:goodcopy
#include <iostream>
using namespace std;
template <class T>
struct GoodCopy // 函数对象,GoodCopy是一个类名,但可以当作函数名
// 在此处补充你的代码
void operator () (T *begin, T *end, T *init)
int len = end - begin;
T *tmp = new T[len];
for (int i = 0; i < len; ++i) // 先复制到一个中间缓存区
tmp[i] = begin[i];
for (int i = 0; i < len; ++i) // 再将 中间缓存区 的数据复制到 目标地址
init[i] = tmp[i];
;
int a[200];
int b[200];
string c[200];
string d[200];
template <class T>
void Print(T s,T e)
for(; s != e; ++s)
cout << * s << ",";
cout << endl;
int main()
int t;
cin >> t;
while( t-- )
int m ;
cin >> m;
for(int i = 0; i < m; ++i)
cin >> a[i];
GoodCopy<int>()(a, a+m, b);
Print(b, b+m);
GoodCopy<int>()(a, a+m, a+m/2);
Print(a+m/2, a+m/2+m);
for(int i = 0; i < m; ++i)
cin >> c[i];
GoodCopy<string>()(c, c+m, d);
Print(c, c+m);
GoodCopy<string>()(c, c+m, c+m/2);
Print(c+m/2, c+m/2+m);
return 0;
输入:第一行是整数 t,表示数据组数
每组数据:
第一行是整数 n , n < 50
第二行是 n 个整数
第三行是 n 个字符串
2
4
1 2 3 4
Tom Jack Marry Peking
1
0
Ted
输出:将输入的整数原序输出两次,用","分隔
然后将输入的字符串原序输出两次,也用 ","分隔
1,2,3,4,
1,2,3,4,
Tom,Jack,Marry,Peking,
Tom,Jack,Marry,Peking,
0,
0,
Ted,
Ted,
035:按距离排序
输入:多组数据,每组一行,是一个整数n和一个字符串s
2 a123456
4 a12345
输出:定义两个整数的距离为两个整数差的绝对值
定义两个字符串的距离为两个字符串长度差的绝对值
对每组数据:
对数组a按和n的距离从小到大排序后输出。距离相同的,值小的排在前面。
然后对数组b,按照和s的距离从小到大输出。距离相同的,字典序小的排在前面
1,3,0,4,7,8,9,10,15,20,
American,Peking,123456789,Jack,To,abcdefghijklmnop,
4,3,1,7,0,8,9,10,15,20,
Peking,American,Jack,123456789,To,abcdefghijklmnop,
题解:
(没看懂题意,不做了)
036:很难蒙混过关的CArray3d三维数组模板类
(啊,还能这样操作,写的什么呀,完全看不懂,网上答案照着写的,像我这种小白就蒙混不了了)
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
template <class T>
class CArray3D
// 在此处补充你的代码
private:
int layer;
int row;
int col;
T *data;
public:
CArray3D (int l, int r, int c): layer(l), row(r), col(c)
data = new T[layer*row*col];
~CArray3D ()
delete [] data;
class CArray2D
private:
int row;
int col;
T *data;
public:
CArray2D (T *d, int r, int c): data(d), row(r), col(c)
T* operator [] (const int r)
return data + r * col;
operator T* ()
return data;
;
CArray2D operator [] (const int l)
return CArray2D(data + l*row*col, row, col);
20162301 2017-2018-1《程序设计与数据结构》课程总结
20162305 2016-2017-2《程序设计与数据结构》课程总结