编程作业: 期末考试—编程试题

编程题#1:输出200

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述
使以下代码输出结果为200.

输入
不需要输入。

输出
输出结果为200。

Code:

#include<iostream>
using namespace std;
class Number {
public:
    int num;
    Number(int n=0): num(n) {}
// 在此处补充你的代码
    int operator*(Number& a) {
        return num * a.num;
    }
    operator int() {
        return num;
    }
};

int main() {
    Number n1(10), n2(20);
    Number n3;n3 = n1*n2;
    cout << int(n3) << endl;
    return 0;
}

  

编程题#2:输出指定结果一

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述

填写代码,使输出结果为

2

2

8

10

 

Code:

#include <iostream>
using namespace std;
class Number {
public:
    int num;
    Number(int n): num(n) {
    }
// 在此处补充你的代码
    int &value() {
        return num;
    }
    void operator+(Number& n) {
        this->num += n.num; 
    }

};
int main() {
    Number a(2);
    Number b = a;
    cout << a.value() << endl;
    cout << b.value() << endl;
    a.value() = 8;
    cout << a.value() << endl;
    a+b;
    cout << a.value() << endl;
    return 0;
}

  

编程题#3:计算数列平方和

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述
请写出sum函数,使其可以计算输入数列的平方和。

输入
第一行是一个整数 t (t <= 10),表示数据组数;

每组输入数据包含两行,第一行是一个整数 n (n <= 100),

第二行是 n 个用空格分隔开的整数

输出
对每组输入数据,输出该组数据中 n 个整数的平方和

样例输入

 

Code:

#include <iostream>
using namespace std;
// 在此处补充你的代码
int sqr(int n) {
    return n * n;
}
int sum(int a[], int n, int (*sqr)(int n)) {
    int sum_ = 0;
    for (int i = 0; i < n; ++i) {
        sum_ += sqr(a[i]);
    }
    return sum_;
}
int main() {
    int t, n, a[0x100];
    cin >> t;
    for (int c = 0; c < t; ++c) {
        cin >> n;
    for (int i = 0; i < n; ++i) cin >> a[i];
    cout << sum(a, n, sqr) << endl;
    }
    return 0;
}

  

编程题#4:计算整数平方和

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述

下列程序每次读入一个整数N,若N为0则退出,否则输出N和N的平方。

#include <iostream>
using namespace std;
// 在此处补充你的代码
int main(int argc, char* argv[]) {
        CType obj;
        int n;
        cin>>n;
        while ( n ) {
                obj.setvalue(n);
                cout<<obj++<<" "<<obj<<endl;
                cin>>n;
        }
        return 0;
}

 

输入

K个整数。除最后一个数据外,其他数据均不为0。

 

输出

K-1行。第I行输出第I个输入数和它的平方。

 

样例输入

1 5 8 9 0

 

样例输出

1 1
5 25
8 64
9 81

 

Code:

#include <iostream>
using namespace std;
// 在此处补充你的代码
class CType {
public:
    int value;
    CType():value(0) {};
    void setvalue(int n) {
        value = n;
    }
    CType &operator++(int) {
        static CType tmp = CType();
        tmp.value = value;
        value *= value;
        return tmp;
    }
    friend ostream & operator<<(ostream &o, CType &cType) {
        o<<cType.value;     //这个地方需要注意不能添加空格,否则的话会出错。
        return o;
    } 
};

int main(int argc, char* argv[]) {
        CType obj;
        int n;
        cin>>n;
        while ( n ) {
                obj.setvalue(n);
                cout<<obj++<<" "<<obj<<endl;
                cin>>n;
        }
        return 0;
}

  

编程题#5:计算数组的低3位之和

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述

输入一个正整数构成的数组a[0], a[1], a[2], ... , a[n-1], 计算它们的二进制低3位之和。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 在此处补充你的代码
int main(int argc, char* argv[]) {
        int v, my_sum=0;
        vector<int> vec;
        cin>>v;
        while ( v ) {
                vec.push_back(v);
                cin>>v;
        }
        for_each(vec.begin(), vec.end(), CMy_add(my_sum));
        cout<<my_sum<<endl;
        return 0;
}

 

输入

数组a,以0表示输入结束。

 

输出

一个整数 , 所输入数组各元素的二进制低3位之和。

 

样例输入

1 3 9 7 3 6 20 15 18 17 4 8 18 0

 

样例输出

41

 

Code:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 在此处补充你的代码
class CMy_add {
private:
    int ∑
public:
    CMy_add(int &n):sum(n) {}
    void operator()(int x) {
        sum += x & 7;
    }
};

int main(int argc, char* argv[]) {
        int v, my_sum=0;
        vector<int> vec;
        cin>>v;
        while ( v ) {
                vec.push_back(v);
                cin>>v;
        }
        for_each(vec.begin(), vec.end(), CMy_add(my_sum));
        cout<<my_sum<<endl;
        return 0;
}

  

编程题#6:MyString

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述
写一个MyString 类,使得下面程序的输出结果是:
1. abcd-efgh-abcd-
2. abcd-
3.
4. abcd-efgh-
5. efgh-
6. c
7. abcd-
8. ijAl-
9. ijAl-mnop
10. qrst-abcd-
11. abcd-qrst-abcd- uvw xyz
about
big
me
take
abcd
qrst-abcd-

要求:MyString类必须是从C++的标准类string类派生而来。提示1:如果将程序中所有 “MyString” 用”string” 替换,那么题目的程序中除了最后两条语句编译无法通过外,其他语句都没有问题,而且输出和前面给的结果吻合。也就是说,MyString类对 string类的功能扩充只体现在最后两条语句上面。提示2: string类有一个成员函数 string substr(int start,int length); 能够求从 start位置开始,长度为length的子串

 

Code:

#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
using namespace std;
// 在此处补充你的代码
class MyString : public string {

public:
    MyString() : string(){};
    MyString(const char* str) : string(str) {};
    MyString(MyString &str) : string(str) {};
    MyString(const string &str) : string(str) {};

    MyString operator()(int startPos, int strLength) {
        return this->substr(startPos, strLength);
    }
};

int CompareString( const void * e1, const void * e2)
{
        MyString * s1 = (MyString * ) e1;
        MyString * s2 = (MyString * ) e2;
        if( * s1 < *s2 )
            return -1;
        else if( *s1 == *s2)
            return 0;
        else if( *s1 > *s2 )
            return 1;
}
int main()
{
        MyString s1("abcd-"),s2,s3("efgh-"),s4(s1);
        MyString SArray[4] = {"big","me","about","take"};
        cout << "1. " << s1 << s2 << s3<< s4<< endl;
        s4 = s3;
        s3 = s1 + s3;
        cout << "2. " << s1 << endl;
        cout << "3. " << s2 << endl;
        cout << "4. " << s3 << endl;
        cout << "5. " << s4 << endl;
        cout << "6. " << s1[2] << endl;
        s2 = s1;
        s1 = "ijkl-";
        s1[2] = 'A' ;
        cout << "7. " << s2 << endl;
        cout << "8. " << s1 << endl;
        s1 += "mnop";
        cout << "9. " << s1 << endl;
        s4 = "qrst-" + s2;
        cout << "10. " << s4 << endl;
        s1 = s2 + s4 + " uvw " + "xyz";
        cout << "11. " << s1 << endl;

        qsort(SArray,4,sizeof(MyString),CompareString);
        for( int i = 0;i < 4; ++i)
            cout << SArray[i] << endl;
        //s1的从下标0开始长度为4的子串
        cout << s1(0,4) << endl;
        //s1的从下标5开始长度为10的子串
        cout << s1(5,10) << endl;
        
        return 0;
}

  

编程题#7:字符串排序

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述

请按照要求对输入的字符串进行排序。

#include <iostream>
#include <string>
#include <list>
using namespace std;

class A{
private:
        string name;
public:
        A(string n) :name(n){}
        friend bool operator < (const class A& a1, const class A &a2);
        friend bool operator == (const class A &a1, const class A &a2){
                if (a1.name.size() == a2.name.size())
                        return true;
                else
                        return false;
        }
        friend ostream & operator << (ostream &o, const A &a){
                o << a.name;
                return o;
        }
        string get_name() const{
                return name;
        }
        int get_size() const{
                return name.size();
        }
};
// 在此处补充你的代码
int main(int argc, char* argv[])
{
        list<A> lst;
        int ncase, n, i = 1;
        string s;
        cin >> ncase;
        while (ncase--){
                cout << "Case: "<<i++ << endl;
                cin >> n;
                for (int i = 0; i < n; i++){
                         cin >> s;
                         lst.push_back(A(s));
                }
                lst.sort();
                Show(lst.begin(), lst.end(), Print());

                cout << endl;
                lst.sort(MyLarge<A>());
                Show(lst.begin(), lst.end(), Print());
                cout << endl;
                lst.clear();
        }
        return 0;
}

 

输入

第一行是正整数T,表示测试数据的组数

每组测试数据输入共两行,

第一行是正整数N,表示字符串个数

第二行是N个字符串, 字符串间用空格分离

 

输出

对于每组测试数据,先输出一行:

Case: n

如对第一组数据就输出Case: 1

第二行按照字符串长度从小到大排序之后输出N个字符串,字符串之间以空格间隔(不会出现字符串长度相同的情况)

第三行按照字符串首字符ASCII码序从小到大排序之后输出N个字符串,字符串之间以空格间隔(不会出现字符串首字母相同的情况)

 

样例输入

2
4
a bnss ds tsdfasg
5
aaa bbbb ccccd sa q

 

样例输出

Case: 1
a ds bnss tsdfasg
a bnss ds tsdfasg
Case: 2
q sa aaa bbbb ccccd
aaa bbbb ccccd q sa

 

Code:

#include <iostream>
#include <string>
#include <list>
using namespace std;

class A{
private:
        string name;
public:
        A(string n) :name(n){}
        friend bool operator < (const class A& a1, const class A &a2);
        friend bool operator == (const class A &a1, const class A &a2){
                if (a1.name.size() == a2.name.size())
                        return true;
                else
                        return false;
        }
        friend ostream & operator << (ostream &o, const A &a){
                o << a.name;
                return o;
        }
        string get_name() const{
                return name;
        }
        int get_size() const{
                return name.size();
        }
};
// 在此处补充你的代码
bool operator<(const A& a1, const A &a2) {
    return a1.name.size() < a2.name.size();
};

template<class Iterator, class Function>            //  这里的class Function应该就是指下面的那个Print类。
void Show(Iterator begin, Iterator end, Function print) {
    for (Iterator iterator1 = begin; iterator1 != end; ++iterator1) 
        print(*iterator1);
};

class Print{
public:
    void operator()(const A &a) {
        cout << a.get_name() << " ";
    }
};

template <class A>
struct MyLarge {
    /* data */
    inline bool operator()(const A &a1, const A &a2) {
        return a1.get_name() < a2.get_name();
    }
};



int main(int argc, char* argv[])
{
        list<A> lst;
        int ncase, n, i = 1;
        string s;
        cin >> ncase;
        while (ncase--){
                cout << "Case: "<<i++ << endl;
                cin >> n;
                for (int i = 0; i < n; i++){
                         cin >> s;
                         lst.push_back(A(s));
                }
                lst.sort();
                Show(lst.begin(), lst.end(), Print());

                cout << endl;
                lst.sort(MyLarge<A>());
                Show(lst.begin(), lst.end(), Print());
                cout << endl;
                lst.clear();
        }
        return 0;
}

 

编程题#8 计算整数k 

描述
输入整数 n ( 0 <=n<= 2^30) , 以及整数i,j(0 <= i,j <31,i < j-1), 输出整数k(按十六进制输出结果 ),k的第i位和n相同,第j位和n不同,i,j之间的位是1, 其他位都是0。这里提到的所有的位,指的都是二进制位,最右边算第0位。

输入
第一行是整数 t,表示数据组数。

每组输入数据是一行,三个整数 n,i和j。

输出
对每组输入数据,按十六进制输出结果。

 

Code:

#include<iostream>
#include<bitset>

using namespace std;

int main() {
    int t, n, i, j;
    cin >> t;

    while (--t >= 0) {
        cin >> n >> i >> j;
        bitset<32> b(n);
        for (int l = 0; l < i; ++l) 
            b.reset(l);
        for (int l = i+1; l < j; ++l)
            b.set(l);
        b.flip(j);
        for (int l = j + 1; l < 32; ++l)
            b.reset(l);
        cout << hex << b.to_ulong() << endl;
    }

    return 0;
}

  

编程题#9:人群的排序和分类

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

 

描述

对人群按照输入的信息进行排序和分类。

#include <iostream>
#include <set>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此处补充你的代码
int main()
{

        int t;
        cin >> t;
        set<A*,Comp> ct;
        while( t -- ) {
                int n;
                cin >> n;
                ct.clear();
                for( int i = 0;i < n; ++i)	{
                        char c; int k;
                        cin >> c >> k;

                        if( c == 'A')
                                ct.insert(new A(k));
                        else
                                ct.insert(new B(k));
                }
                for_each(ct.begin(),ct.end(),Print);
                cout << "****" << endl;
        }
}

输入

第一行是整数t,表明一共t组数据. t < 20

对每组数据:

第一行是整数n,表示下面一共有n行。 0 < n < 100

下面的每行代表一个人。每行以一个字母开头,代表该人所属的类别,然后跟着一个整数,代表年龄。字母只会是 'A‘或‘B' 。整数范围0到100。数据保证年龄都不相同。

 

输出

对每组输入数据,将这些人按年龄从小到大输出。每个人先输出类别,再输出年龄。每组数据的末尾加一行 "****"

 

样例输入

2
4
A 3
B 4
A 5
B 6
3
A 4
A 3
A 2

 

样例输出

A 3
B 4
A 5
B 6
****
A 2
A 3
A 4
****

 

Code:

#include <iostream>
#include <set>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此处补充你的代码
class A {
public:
    int age;
    string str;
    A(int a): age(a), str("A") {}
    A(int a, string s): age(a), str(s) {}
};

class B : public A {
public:
    B(int b) : A(b, "B") {}
};

struct Comp {
    bool operator()(const A* a1, const A* a2) const {
        return a1->age < a2->age;
    }
};

void Print(const A *a) {
    cout << a->str << " " << a->age << endl;
}


int main()
{
    int t;
    cin >> t;
    set<A*,Comp> ct;
    while( t-- ) {
        int n;
        cin >> n;
        ct.clear();
        for( int i = 0;i < n; ++i)	{
            char c; int k;
            cin >> c >> k;
            if( c == 'A')
                ct.insert(new A(k));
            else
                ct.insert(new B(k));
        }
        for_each(ct.begin(),ct.end(),Print);
        cout << "****" << endl;
    }
}

  

编程题#10:输出指定结果二

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述

通过填空使得程序输出的结果符合下面的要求。

#include <iostream>
#include <map>
using namespace std;
// 在此处补充你的代码
int A::count = 0;
void func(B b) { }
int main()
{
        A a1(5),a2;
        cout << A::count << endl;
        B b1(4);
        cout << A::count << endl;
        func(b1);
        cout << A::count << endl;
        A * pa = new B(4);
        cout << A::count << endl;
        delete pa;
        cout << A::count << endl;
        return 0;
}

 

输入

不需要输入。

 

输出

使得程序的输出结果是:

2

3

B::destructor

A::destructor

3

4

B::destructor

A::destructor

3

B::destructor

A::destructor

A::destructor

A::destructor

 

样例输入

不需要输入。

 

样例输出

2
3
B::destructor
A::destructor
3
4
B::destructor
A::destructor
3
B::destructor
A::destructor
A::destructor
A::destructor

 

提示

int A::count = 0; 这个变量是用来记录一共有多少个类A及类A的派生类的对象的。

 

Code:

#include <iostream>
#include <map>
using namespace std;
// 在此处补充你的代码
class A {
public:
    static int count;
    A() { count++; }
    A(int a) { count++; }
    virtual ~A() {
        cout << "A::destructor" << endl;
    }
    void operator delete(void *a) {
        count--;
    }
};

class B:public A {
public:
    B():A(){}
    B(int b):A(){}
    B &operator=(B &b) {
        return b;
    }
    virtual ~B() {
        cout << "B::destructor" << endl;
    }
};

int A::count = 0;
void func(B b) { }
int main()
{
        A a1(5),a2;
        cout << A::count << endl;
        B b1(4);
        cout << A::count << endl;
        func(b1);
        cout << A::count << endl;
        A * pa = new B(4);
        cout << A::count << endl;
        delete pa;
        cout << A::count << endl;
        return 0;
}

  

#11 数据库内的学生信息 编程题解析北京大学POJ

描述
程序填空,使得下面的程序,先输出

(Tom,80),(Tom,70),(Jone,90),(Jack,70),(Alice,100),

(Tom,78),(Tom,78),(Jone,90),(Jack,70),(Alice,100),

(70,Jack),(70,Tom),(80,Tom),(90,Jone),(100,Alice),

(70,Error),(70,Error),(80,Tom),(90,Jone),(100,Alice),

******

然后,再根据输入数据按要求产生输出数据

#include <iostream>
#include <string>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此处补充你的代码
struct Student
{
string name;
int score;
};
template <class T>
void Print(T first,T last) {
for(;first!= last; ++ first)
cout << * first << ",";
cout << endl;
}
int main()
{

Student s[] = { {"Tom",80},{"Jack",70},
{"Jone",90},{"Tom",70},{"Alice",100} };
MyMultimap<string,int> mp;
for(int i = 0; i<5; ++ i)
mp.insert(make_pair(s[i].name,s[i].score));
Print(mp.begin(),mp.end()); //按姓名从大到小输出

mp.Set("Tom",78); //把所有名为"Tom"的学生的成绩都设置为78
Print(mp.begin(),mp.end());


MyMultimap<int,string,less<int> > mp2;
for(int i = 0; i<5; ++ i)
mp2.insert(make_pair(s[i].score,s[i].name));

Print(mp2.begin(),mp2.end()); //按成绩从小到大输出
mp2.Set(70,"Error"); //把所有成绩为70的学生,名字都改为"Error"
Print(mp2.begin(),mp2.end());
cout << "******" << endl;

mp.clear();

string name;
string cmd;
int score;
while(cin >> cmd ) {
if( cmd == "A") {
cin >> name >> score;
if(mp.find(name) != mp.end() ) {
cout << "erroe" << endl;
}
mp.insert(make_pair(name,score));
}
else if(cmd == "Q") {
cin >> name;
MyMultimap<string,int>::iterator p = mp.find(name);
if( p!= mp.end()) {
cout << p->second << endl;
}
else {
cout << "Not Found" << endl;
}
}
}
return 0;
}
输入
输入数据的每一行,格式为以下之一:

A name score

Q name score

name是个不带个空格的字符串,长度小于 20

score是个整数,能用int表示

A name score 表示往数据库中新增一个姓名为name的学生,其分数为score。开始时数据库中一个学生也没有。

Q name 表示在数据库中查询姓名为name的学生的分数

数据保证学生不重名。

输入数据少于200,000行。

输出
对于每个查询,输出学生的分数。如果查不到,则输出 "Not Found"

样例输入
A Tom1 30
A Tom2 40
Q Tom3
A Tom4 89
Q Tom1
Q Tom2
样例输出
(Tom,80),(Tom,70),(Jone,90),(Jack,70),(Alice,100),
(Tom,78),(Tom,78),(Jone,90),(Jack,70),(Alice,100),
(70,Jack),(70,Tom),(80,Tom),(90,Jone),(100,Alice),
(70,Error),(70,Error),(80,Tom),(90,Jone),(100,Alice),
******
Not Found
30
40

 

Code:

#include <iostream>
#include <string>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此处补充你的代码

template <class T>
struct bigger:public  binary_function<T,T,bool>
{
	bool operator()(const T &t1, const T &t2) const { return t2 < t1; }
};
template<class T1, class T2, class Comp = bigger<T1> >
class MyMultimap{
public:
	typedef multimap<T1, T2, Comp> MAP;
	typedef typename multimap<T1, T2, Comp>::iterator iterator;
	MAP mymap;
	iterator begin() { return mymap.begin(); }
	iterator end() { return mymap.end(); }
	void Set(T1 t1, T2 t2)
	{
			iterator i = mymap.begin();
			for (; i != mymap.end(); i++)
				if (i->first == t1)
					i->second = t2;
	}
	void insert(pair<T1,T2> p){ mymap.insert(p);}
	void clear() { mymap.clear(); }
	iterator find(T1 t) { return mymap.find(t); }
};
template<class T1,class T2>
ostream & operator<<(ostream &o, pair<T1, T2>p)
{
	o << "("<<p.first << "," << p.second<<")";
	return o;
}

struct Student
{
        string name;
        int score;
};
template <class T>
void Print(T first,T last) {
        for(;first!= last; ++ first)
                cout << * first << ",";
        cout << endl;
}
int main()
{

        Student s[] = { {"Tom",80},{"Jack",70},
                                        {"Jone",90},{"Tom",70},{"Alice",100} };
        MyMultimap<string,int> mp;
        for(int i = 0; i<5; ++ i)
                mp.insert(make_pair(s[i].name,s[i].score));
        Print(mp.begin(),mp.end()); //按姓名从大到小输出

        mp.Set("Tom",78); //把所有名为"Tom"的学生的成绩都设置为78
        Print(mp.begin(),mp.end());


        MyMultimap<int,string,less<int> > mp2;
        for(int i = 0; i<5; ++ i)
                mp2.insert(make_pair(s[i].score,s[i].name));

        Print(mp2.begin(),mp2.end()); //按成绩从小到大输出
        mp2.Set(70,"Error");          //把所有成绩为70的学生,名字都改为"Error"
        Print(mp2.begin(),mp2.end());
        cout << "******" << endl;

        mp.clear();
        
        string name;
        string cmd;
        int score;
        while(cin >> cmd ) {
                if( cmd == "A") {
                        cin >> name >> score;
                        if(mp.find(name) != mp.end() ) {
                                cout << "erroe" << endl;
                        }
                        mp.insert(make_pair(name,score));
                }
                else if(cmd == "Q") {
                        cin >> name;
                        MyMultimap<string,int>::iterator p = mp.find(name);
                        if( p!= mp.end()) {
                                cout << p->second << endl;
                        }
                        else {
                                cout << "Not Found" << endl;
                        }
                }
        }
        return 0;
}

  

总结:

虽然大部分都参考别人的代码了,也学到了不少东西。“善始者实繁,克终者盖寡。”,也算是这门课程的一个小结吧。

笔记:

 

 

loading……………………

 

posted @ 2019-02-28 21:10  Veritas_des_Liberty  阅读(1009)  评论(0编辑  收藏  举报