程序设计与算法测验和作业题部分答案汇总(泛型程序篇)

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《程序设计与数据结构》课程总结

20162317 2016-2017-2《程序设计与数据结构》课程总结

团队作业2:需求分析&原型设计

php面试题汇总四(基础篇附答案)

php面试题汇总四(基础篇附答案)