2017プログラム設計実習のC++一部作業問題まとめ-G:STL関数対象
28598 ワード
テーマ出所:2017プログラム設計実習のC++部分作業問題まとめ
1、G 01:白給リストソート
合計時間制限:1000 msメモリ制限:65536 kB記述プログラムが空になり、指定された出力が生成されます.
入力無出力9.8,7.3,3.4,2.6,1.2,サンプル入力無サンプル出力同入力ソースGuo Wei
2、G 02:距離順
合計時間制限:1000 msメモリ制限:65536 kB記述プログラムを空にし、指定した結果を出力
複数組のデータを入力します.各組の1行は、1つの整数nと1つの文字列sの出力で、2つの整数の距離を定義します.2つの整数の差の絶対値です.2つの文字列の距離を定義します.2つの文字列の長さの差の絶対値です.
各グループのデータ:配列aに対してnとの距離で小さいから大きいまで並べ替えて出力する.距離は同じで、値の小さいものが前に並んでいます.次に配列bに対して、sとの距離で小さいものから大きいものまで出力する.距離が同じで、ディクショナリシーケンスが小さい上位サンプル入力2 a 123456 4 a 12345サンプル出力1,3,0,4,7,8,9,10,15,20,American,Peking,123456789,Jack,To,abcdefghijklmnop,4,3,1,7,8,9,10,15,20,Peking,American,Jack,123456789,To,abcdefghijklmnop,ソースGuo Wei
3、G03:goodcopy
合計時間制限:1000 msメモリ制限:65536 kB説明GoodCopyクラステンプレートを作成し、プログラムが指定された方法で出力されるようにする
入力第1行は整数tであり、データ群数の各グループのデータを表す.第1行は整数n、n<50第2行はn個の整数、第3行はn個の文字列出力入力の整数原順を2回出力する.「,」分割サンプル入力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,Ted,Ted,ソースGuo Wei
4、G 04:関数オブジェクトのフィルタ
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄出力指定結果
複数グループのデータを入力各グループのデータの2行
最初の行は2つの整数mとnの2番目の行はまず1つの整数kで、それから後ろにkつの整数について各グループのデータを出力して、元の順序で2番目の行の後のkつの整数の中で出力して、mより大きくてnより小さい数は2回のデータを出力して、必ず要求に合致する整数のサンプルが1ソースGuo Wei
5、G 05:クリアしにくいCArray 3 d 3 D配列テンプレートクラス
総時間制限:1000 msメモリ制限:65536 kB記述は3次元配列テンプレートCArray 3 Dを実現し、要素が任意のタイプの変数の3次元配列を生成するために使用することができ、指定結果NOTEを出力する:この問題は最初は実際の3次元配列に従って連続的な空間記憶を開くことを想定し、最初の[]を迂回することはできない.その後、ある大神がプログラム設計実習実験班2017の作業で具体的に実現した構想を参考にし、彼の構想によって解決した.
入力無出力はサンプルサンプル入力無サンプル出力layer 0:0,1,2,3,4,5,6,7,7,8,9,10,11,12,11,12,13,14,15,16,17,18,19,layer 1:20,21,2,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,37,37,38,39,layer 2:40,4,4,1,42,44,46,46,47,4,48,49,50,51,52,53,54,55,56,57,58,59,59,layer 0:0,1,1,1,2,2,3,3,4,4,4,4,4,5,6,6,6 7,8,9,10,11,12,13,14, 15,16,17,18,19, layer 1: -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, layer 2: 40,41,42,43,44, 45,46,47,48,49, 50,51,52,53,54, 55,56,57,58,59, layer 0: 0,1,2,3,4, 5,6,7,8,9, 10,11,12,13,14, 15,16,17,18,19, layer 1: -1,-1,-1,-1,-1, 0,0,0,0,0, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, layer 2: 40,41,42,43,44, 45,46,47,48,49, 50,51,52,53,54, 55,56,57,58,59, layer 0: 10,5, 5,3.33333, layer 1: 5,3.33333, 3.33333,2.5, layer 2: 3.33333,2.5, 2.5,2,
7,3.3333提示提案方法:1.a[i][j][k]という式の最初の[]は、[]も再ロードされ、戻り値がポインタである内部クラスのオブジェクトを返します.2.必要に応じてポインタへのオブジェクトの強制型変換演算子ソースGuo Weiを再ロードする
6、G 06:自分のostream_iterator
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄出力指定結果
入力出力なし5,21,14,2,3,1.4–5.56–3.2–98.3–3.3–サンプル入力サンプル出力と入力元Guo Wei
1、G 01:白給リストソート
合計時間制限:1000 msメモリ制限:65536 kB記述プログラムが空になり、指定された出力が生成されます.
#include
#include
#include
#include
using namespace std;
int main()
{
double a[] = {1.2,3.4,9.8,7.3,2.6};
list<double> lst(a,a+5);
//list , sort , sort
//list sort ,
//1. 。list.sort(), <
//2. , ,op(x,y) true x
//template
//void sort(Pred op)
// greater
lst.sort(greater<double>()
//
// sort op, functional STL greater
// greater , > ,
//
);
for(list<double>::iterator i = lst.begin(); i != lst.end(); ++i)
cout << * i << "," ;
return 0;
}
入力無出力9.8,7.3,3.4,2.6,1.2,サンプル入力無サンプル出力同入力ソースGuo Wei
2、G 02:距離順
合計時間制限:1000 msメモリ制限:65536 kB記述プログラムを空にし、指定した結果を出力
#include
#include
#include
#include
using namespace std;
template <class T1,class T2>
struct Closer {
//
private:
T1 val;
T2 op;
public:
Closer(const T1 & val_t1,T2 & op_t2):val(val_t1),op(op_t2){}
// , (),
bool operator()(const T1 & x,const T1 & y)
{
if (op(val, x) < op(val, y)
|| (op(val, x) == op(val, y)) && x < y)
return true;
return false;
}
//
};
int Distance1(int n1,int n2) {
return abs(n1-n2);
}
int Distance2(const string & s1, const string & s2)
{
return abs((int)s1.length()- (int) s2.length());
}
int a[10] = { 0,3,1,4,7,9,20,8,10,15};
string b[6] = {"American","Jack","To","Peking","abcdefghijklmnop","123456789"};
int main()
{
// main
//sort(a,a+10,Closer (n,Distance1))
//sort(b,b+6,Closer (s,Distance2))
//Closer 2 T1,T2,T2
//Closer
int n;string s;
while( cin >> n >> s ) {
sort(a,a+10,Closer<int ,int (*)(int ,int)> (n,Distance1));
for(int i = 0;i < 10; ++i)
cout << a[i] << "," ;
cout << endl;
sort(b,b+6,Closer<string,int (*)(const string &,const string & )> (s,Distance2));
for(int i = 0;i < 6; ++i)
cout << b[i] << "," ;
cout << endl;
}
return 0;
}
複数組のデータを入力します.各組の1行は、1つの整数nと1つの文字列sの出力で、2つの整数の距離を定義します.2つの整数の差の絶対値です.2つの文字列の距離を定義します.2つの文字列の長さの差の絶対値です.
各グループのデータ:配列aに対してnとの距離で小さいから大きいまで並べ替えて出力する.距離は同じで、値の小さいものが前に並んでいます.次に配列bに対して、sとの距離で小さいものから大きいものまで出力する.距離が同じで、ディクショナリシーケンスが小さい上位サンプル入力2 a 123456 4 a 12345サンプル出力1,3,0,4,7,8,9,10,15,20,American,Peking,123456789,Jack,To,abcdefghijklmnop,4,3,1,7,8,9,10,15,20,Peking,American,Jack,123456789,To,abcdefghijklmnop,ソースGuo Wei
3、G03:goodcopy
合計時間制限:1000 msメモリ制限:65536 kB説明GoodCopyクラステンプレートを作成し、プログラムが指定された方法で出力されるようにする
#include
using namespace std;
template <class T>
struct GoodCopy {
//
// cstring, GoodCopy()(a,a+m,a+m/2)
// , ,
private:
T * ptr;
public:
void operator()(T * b,T * e,T * new_b)
{
int len = e - b;
ptr = new T[len + 1];
for(int i = 0;ifor(int i = 0;idelete []ptr;
}
//
};
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;
}
入力第1行は整数tであり、データ群数の各グループのデータを表す.第1行は整数n、n<50第2行はn個の整数、第3行はn個の文字列出力入力の整数原順を2回出力する.「,」分割サンプル入力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,Ted,Ted,ソースGuo Wei
4、G 04:関数オブジェクトのフィルタ
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄出力指定結果
#include
#include
using namespace std;
struct A {
int v;
A() { }
A(int n):v(n) { };
bool operatorconst A & a) const {
return v < a.v;
}
};
//
// Filter(ia.begin(),ia.end(),ib.begin(),FilterClass(m,n))
// Filter(aa.begin(),aa.end(),ab.begin(),FilterClass(m,n))
// Filter , FilterClass(m,n)は オブジェクトです
template<class T>
struct FilterClass
{
T low;
T high;
FilterClass(int m,int n):low(m),high(n){}
bool operator()(const T & rhs)
{
if( low < rhs && rhs < high)
return true;
return false;
}
};
//
template <class T>
void Print(T s,T e)
{
for(;s!=e; ++s)
cout << *s << ",";
cout << endl;
}
template <class T1, class T2,class T3>
T2 Filter( T1 s,T1 e, T2 s2, T3 op)
{
for(;s != e; ++s) {
if( op(*s)) {
* s2 = * s;
++s2;
}
}
return s2;
}
ostream & operator <return o;
}
vector<int> ia;
vector aa;
int main()
{
int m,n;
while(cin >> m >> n) {
ia.clear();
aa.clear();
int k,tmp;
cin >> k;
for(int i = 0;i < k; ++i) {
cin >> tmp;
ia.push_back(tmp);
aa.push_back(tmp);
}
vector<int> ib(k);
vector ab(k);
vector<int>::iterator p = Filter(ia.begin(),ia.end(),ib.begin(),FilterClass<int>(m,n));
Print(ib.begin(),p);
vector::iterator pp = Filter(aa.begin(),aa.end(),ab.begin(),FilterClass(m,n));
Print(ab.begin(),pp);
}
return 0;
}
複数グループのデータを入力各グループのデータの2行
最初の行は2つの整数mとnの2番目の行はまず1つの整数kで、それから後ろにkつの整数について各グループのデータを出力して、元の順序で2番目の行の後のkつの整数の中で出力して、mより大きくてnより小さい数は2回のデータを出力して、必ず要求に合致する整数のサンプルが1ソースGuo Wei
5、G 05:クリアしにくいCArray 3 d 3 D配列テンプレートクラス
総時間制限:1000 msメモリ制限:65536 kB記述は3次元配列テンプレートCArray 3 Dを実現し、要素が任意のタイプの変数の3次元配列を生成するために使用することができ、指定結果NOTEを出力する:この問題は最初は実際の3次元配列に従って連続的な空間記憶を開くことを想定し、最初の[]を迂回することはできない.その後、ある大神がプログラム設計実習実験班2017の作業で具体的に実現した構想を参考にし、彼の構想によって解決した.
#include
#include
#include
using namespace std;
template <class T>
class CArray3D
{
//
public:
class CArray2D
{
private:
int row;
int col;
int size_;
T *ptr;
public:
CArray2D() :row(0), col(0), size_(0)
{
ptr = new T[1];
}
void init(int r, int c)
{
row = r; col = c; size_ = r * c;
delete[]ptr;
ptr = new T[size_ + 1];
}
T * operator[](int i)
{
return (ptr + i * col);
}
operator T*()//only for memset
{
return ptr;
}
};
CArray2D * a;
CArray3D(int level,int row,int col)
{
a = new CArray2D[level];
//
//
for (int i = 0; i < level; ++i)
a[i].init(row, col);
}
CArray2D& operator[](int i)
{
//a , &
return a[i];
}
//
};
CArray3D<int> a(3,4,5);
CArray3D<double> b(3,2,2);
void PrintA()
{
for(int i = 0;i < 3; ++i) {
cout << "layer " << i << ":" << endl;
for(int j = 0; j < 4; ++j) {
for(int k = 0; k < 5; ++k)
cout << a[i][j][k] << "," ;
cout << endl;
}
}
}
void PrintB()
{
for(int i = 0;i < 3; ++i) {
cout << "layer " << i << ":" << endl;
for(int j = 0; j < 2; ++j) {
for(int k = 0; k < 2; ++k)
cout << b[i][j][k] << "," ;
cout << endl;
}
}
}
int main()
{
int No = 0;
for( int i = 0; i < 3; ++ i ) {
a[i];
for( int j = 0; j < 4; ++j ) {
a[j][i];
for( int k = 0; k < 5; ++k )
a[i][j][k] = No ++;
a[j][i][i];
}
}
PrintA();
memset(a[1],-1 ,20*sizeof(int));
memset(a[1],-1 ,20*sizeof(int));
PrintA();
// ,
memset(a[1][1],0 ,5*sizeof(int));
PrintA();
for( int i = 0; i < 3; ++ i )
for( int j = 0; j < 2; ++j )
for( int k = 0; k < 2; ++k )
b[i][j][k] = 10.0/(i+j+k+1);
PrintB();
int n = a[0][1][2];
double f = b[0][1][1];
cout << "****" << endl;
cout << n << "," << f << endl;
return 0;
}
入力無出力はサンプルサンプル入力無サンプル出力layer 0:0,1,2,3,4,5,6,7,7,8,9,10,11,12,11,12,13,14,15,16,17,18,19,layer 1:20,21,2,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,37,37,38,39,layer 2:40,4,4,1,42,44,46,46,47,4,48,49,50,51,52,53,54,55,56,57,58,59,59,layer 0:0,1,1,1,2,2,3,3,4,4,4,4,4,5,6,6,6 7,8,9,10,11,12,13,14, 15,16,17,18,19, layer 1: -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, layer 2: 40,41,42,43,44, 45,46,47,48,49, 50,51,52,53,54, 55,56,57,58,59, layer 0: 0,1,2,3,4, 5,6,7,8,9, 10,11,12,13,14, 15,16,17,18,19, layer 1: -1,-1,-1,-1,-1, 0,0,0,0,0, -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, layer 2: 40,41,42,43,44, 45,46,47,48,49, 50,51,52,53,54, 55,56,57,58,59, layer 0: 10,5, 5,3.33333, layer 1: 5,3.33333, 3.33333,2.5, layer 2: 3.33333,2.5, 2.5,2,
7,3.3333提示提案方法:1.a[i][j][k]という式の最初の[]は、[]も再ロードされ、戻り値がポインタである内部クラスのオブジェクトを返します.2.必要に応じてポインタへのオブジェクトの強制型変換演算子ソースGuo Weiを再ロードする
6、G 06:自分のostream_iterator
合計時間制限:1000 msメモリ制限:65536 kB記述プログラム空欄出力指定結果
#include
#include
#include
using namespace std;
template <class T1,class T2>
void Copy(T1 s,T1 e, T2 x)
{
for(; s != e; ++s,++x)
*x = *s;
}
template<class T>
class myostream_iteraotr
{
//
private:
string s_;
ostream & os_;
T val;
public:
myostream_iteraotr(ostream & os, const string &s) :os_(os), s_(s) {}
// ++ ,
// ++x *x
// ,*x ,++x
// T * ,
myostream_iteraotr& operator++()
{
os_ << val << s_;
return *this;
}
T & operator*()
{
return val;
}
//
};
int main()
{ const int SIZE = 5;
int a[SIZE] = {5,21,14,2,3};
double b[SIZE] = { 1.4, 5.56,3.2,98.3,3.3};
list<int> lst(a,a+SIZE);
myostream_iteraotr<int> output(cout,",");
Copy( lst.begin(),lst.end(),output);
cout << endl;
myostream_iteraotr<double> output2(cout,"--");
Copy(b,b+SIZE,output2);
return 0;
}
入力出力なし5,21,14,2,3,1.4–5.56–3.2–98.3–3.3–サンプル入力サンプル出力と入力元Guo Wei