如需交流,请添加QQ好友 2636105163.

或可另外提供给你详细的出错样例信息。( 系统的测试样例不只是贴出来的一个测试样例。)

不过代码都是AC版本。需要声明的是,代码并非官方版本,而是自己当年写的,可能会存在不规范、效率不高、排版难看等问题。

仅供学习交流使用,若是抄袭,后果自负

Donghua University Online Judge 1.0

总共48道题目。基本是C++基础知识。不过正所谓是:前人栽树,后人乘凉,自己希望能给有缘人一些启发和帮助吧。

OJ题库文章目录:

目录

1: 控制公司

2 日期结构体操作

3 函数的重载、默认形参练习

4 出现次数

5 最大相同子串

6 解析XML文档

7 盒子类

8 类和对象:使用日期类计算相隔天数

9 函数模板:两点间的距离

10 寻找素数

11 结构体改成类的实现(日期类)

12 字符串反转

13 回文判断

14 学生数组排序

15 寻找最好成绩

16 查找学生

17 长方形(类的实现)

18 长方形集合

19 模板类练习:实现两个整数、浮点数和字符的比较

20 长方形?

21 某年龄段内的学生

22 统计字符串个数

23 提醒队列

24 单词转换为大写

25 相邻数相加

26 从Point继承的Rectangle

27 统计单词

28 面积和

29 发工资

30 字符串填充(默认形参)

31 删除字符(函数重载)

32 正整数格式输出

33 复制字符串

34 字符串分析

35 字符串转换为整型数值

36 类的定义

37 分数计算

38 子串的判断

39 密码安全性判断

40 放大的X

41 对象数组和对象指针

42 学生成绩转换(友元函数)

43 计算学生总评成绩并排序(友元函数)

44 矩阵类(使用二阶指针动态生成指定行、列的二维数组)

45 身份证类(对象数组)

46 重载<<输出圆

47 计算周长

48 企业经营税


1: 控制公司

作者: xxx时间限制: 1S章节: OO:库

问题描述 :

有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分。例如,福特公司拥有马自达公司12%的股票。据说,如果至少满足了以下条件之一,公司A就可以控制公司B了: 公司A = 公司B。 公司A拥有大于50%的公司B的股票。 公司A控制K(K>= 1)个公司,记为C1, ..., CK,每个公司Ci拥有xi%的公司B的股票,并且x1+ .... + xK > 50%。 你将被给予一系列的三对数(i,j,p),表明公司i享有公司j的p%的股票。计算所有的数对(h,s),表明公司h控制公司s。至多有100个公司。 写一个程序读入三对数(i,j,p),i,j和p是都在范围(1..100)的正整数,并且找出所有的数对(h,s),使得公司h控制公司s。

输入说明 :

第一行: N,表明接下来三对数的数量。 第二行到第N+1行: 每行三个整数作为一个三对数(i,j,p),如上文所述。

输出说明 :

输出零个或更多个的控制其他公司的公司。每行包括两个整数表明序号为第一个整数的公司控制了序号为第二个整数的公司。将输出的每行以第一个数字升序排列(并且第二个数字也升序排列来避免并列)。请不要输出控制自己的公司。

输入范例 :

31 2 802 3 803 1 20

输出范例 :

1 2
1 3
2 3

代码:

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#define N 101
using namespace std;class companyHolding {
private:short n;short data[N][N];bool isHeld[N][N];
public:void initial();void readCase();void computing(); void outResult();
};
int main(){companyHolding cH;cH.initial();cH.readCase();cH.computing();cH.outResult();//cout << "Hello World!\n";
}
void companyHolding ::initial() {memset(data, 0, sizeof(data)); memset(isHeld, false, sizeof(isHeld));
}
void companyHolding::readCase(){cin >> n;short i; short j; short p;while (n--) {cin >> i >> j >> p;if (i < 1 || j < 1 || p < 1 || p>100 || j>100 || i>100) {cout << "Input Error!" << endl;}else{if (i == j) { continue; }isHeld[i][j] = true;data[i][j] = p;//股份关联}    }
}
void companyHolding::computing() {for (int i = 1; i < N; i++) {for (int j = 1; j < N; j++) {if ( isHeld[i][j] ) {//之前理解出错导致WA:并非要>50控制了才能传递,只要有股份就能传递for ( int k = 1; k < N; k++) {if(isHeld[k][i] && data[k][i]>50 ) {data[k][j] += data[i][j];//间接控制}}}}}
}
void companyHolding::outResult() {for (int i = 1; i < N; i++) {for (int j = 1; j < N; j++) {if (data[i][j] > 50 && i!=j) {cout << i << " " << j << endl;}}}
}

2 日期结构体操作

作者: Turbo时间限制: 1S章节: OO:其它

问题描述 :

实验目的:巩固结构体类型知识,为学习类的声明打基础。

实验内容:声明一个结构体类型Date,包括年月日,即一个日期类型的结构体。

设计一个程序,完成以下对日期的操作,包括以下函数:

Date AddDay(Date d, int days):对日期增加days天数,然后返回得到的日期

Date AddMonth(Date d, int months):对日期增加months月数,然后返回得到的日期

Date AddYear(Date d, int years):对日期增加years年数,然后返回得到的日期

int Subtract(Date d1, Date d2):用d1-d2,计算它们相距的天数,作为函数值返回

GetWeekDay:输入参数为Date类型,返回该日期是星期几。星期几最好用枚举表示,也就是返回一个枚举类型的值。本函数可选做,测试数据不包含本函数。

程序输出相应计算结果。

请使用以下main函数:

int main()
{
    char WeekDayNames[][15]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday"};

int op;
 while(cin>>op)
    {
      Date d1, d2;
     int n;
     DayName w;
        switch(op)
        {
        case 1:  //add days
            cin>>d1.year>>d1.month>>d1.day>>n;
            d2=AddDay(d1, n);
            cout<<d2.year<<" "<<d2.month <<" " <<d2.day<<endl;
            break;
        case 2:
            cin>>d1.year>>d1.month>>d1.day>>n;
            d2=AddMonth(d1, n);
            cout<<d2.year<<" "<<d2.month <<" " <<d2.day<<endl;
            break;
        case 3:
            cin>>d1.year>>d1.month>>d1.day>>n;
            d2=AddYear(d1, n);
            cout<<d2.year<<" "<<d2.month <<" " <<d2.day<<endl;
            break;
        case 4:
            cin>>d1.year>>d1.month>>d1.day>>d2.year>>d2.month>>d2.day;
            n=Subtract(d1, d2);
            cout<<n<<endl;
            break;
        case 5:
            cin>>d1.year>>d1.month>>d1.day;
            w=GetWeekDay(d1);
            cout<<WeekDayNames[w]<<endl;
            break;
        }
    }
}

输入说明 :

程序包含多组输入,每组测试数据包含两行,第一行用一个整数(1到5)指定需要完成的操作,含义如下:

1:AddDay

2:AddMonth

3:AddYear

4:Subtract

5:GetWeekDay(测试数据中不包含本输入)

第二行为该操作需要的数据。

比如输入:

1

2016 1 1 31

表示将进行AddDay操作,输入日期为2016年1月1日,加31天。

程序输出结果日期,按年月日格式输出,中间以一个空格分隔。

输出说明 :

程序输出相应计算结果。

对于AddDay、AddMonth、AddYear三种操作,输出结果日期,按年月日格式输出,中间以一个空格分隔。

对于Subtract,结果仅输出一个整数,表示相距的天数。

每组输出占一行,行首与行尾无多余空格,所有地方无多余空行。

输入范例 :

1
2000 2 28 20
2
2000 1 31 3
3
2000 1 31 1
4
2016 3 8 2016 2 8
4
2016 1 8 2016 2 8

输出范例 :

2000 3 19
2000 4 30
2001 1 31
29
-31
#include <iostream>
#include <string>
using namespace std;struct Date {int day;int month;int year;
};
class DateOperation {
private:int daysOfMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31 };//Set Days Of February To 28,And Then Check It For Legality Before Using.const string weekdayNames[7] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };int op;//from 1 to 5Date date;int days, months, years;
public:bool isLeapYear(int year) { return (!(year % 400)) || (!(year % 4) && (year % 100)); }void setDaysOfFebruary(int year);void checkLegality(Date& );Date AddDay(Date& , int& );Date AddMonth(Date& , int& );Date AddYear(Date& , int& );//unsigned long long GetDaysOfDate(Date& );int Subtract(Date& , Date& );//date1 - date2int GetWeekday(Date& );void initial();void computing();friend istream& operator>>(istream&in, Date& date);friend ostream& operator<<(ostream&out, const Date& date);
};
void DateOperation::setDaysOfFebruary(int year) {if (isLeapYear(year)) {daysOfMonth[1] = 29;}else{ daysOfMonth[1] = 28;}
}
void DateOperation :: checkLegality(Date& date) {setDaysOfFebruary(date.year);if (date.day > daysOfMonth[date.month - 1]) {date.day = daysOfMonth[date.month - 1];}
}Date DateOperation::AddDay(Date& date, int& days) {date.day += days;setDaysOfFebruary(date.year);while (date.day > daysOfMonth[date.month - 1]) {date.day -= daysOfMonth[date.month - 1];date.month ++;if (date.month > 12) {date.month -= 12;date.year++;setDaysOfFebruary(date.year);}}checkLegality(date);return date;
}
Date DateOperation::AddMonth(Date& date, int& months) {date.month += months;while (date.month > 12) {date.month -= 12;date.year++;}checkLegality(date);return date;
}
Date DateOperation::AddYear(Date& date, int& years) {date.year += years;checkLegality(date);return date;
}
/* //搞不明白哪里出错,该方法测试样例 4 2015 3 8 2016 3 8 会错误的输出 -367 而非 -366,但是其他跨闰年的又对……
//难道是数值过大导致溢出(int范围?
后经过重复测试可以确认,是溢出导致数值运算错误(比如 测试 4 15 3 8 16 3 8 也是-367,但4 5 3 8 6 3 8则正确输出 -365)
解决办法:通过 变加边减 使得数值不能溢出。
当然也可以考虑借助中间变量,long long类型的中间变量。。。后者当然是不行的了,经测试内存爆了。unsigned long long DateOperation::GetDaysOfDate(Date& date) {unsigned long long temp = 0;temp += (date.year - 1) * 365 + date.year / 4 - date.year / 100 + date.year / 400;setDaysOfFebruary(date);for (int i = 0; i < date.month - 1; i++) {temp += daysOfMonth[i];}temp += date.day;return  temp;
}
*/
int DateOperation::Subtract(Date& date1, Date& date2) {//return int(GetDaysOfDate(date1) - GetDaysOfDate(date2));int temp = 0;int i = 1;for ( ; i < date1.year; i++) {if( i< date2.year){}else {if ( isLeapYear(i) ) {temp += 366;}else {temp += 365;}}   }for ( ; i < date2.year; i++) {if (isLeapYear(i)) {temp -= 366;}else {temp -= 365;}}for (i=0; i < date1.month-1; i++) {setDaysOfFebruary(date1.year);temp += daysOfMonth[i];}for (i = 0; i < date2.month-1; i++) {setDaysOfFebruary(date2.year);temp -= daysOfMonth[i];}temp += date1.day;temp -= date2.day;return temp;
}
int DateOperation::GetWeekday(Date& date) {if (date.day == 1 || 2 == date.day) {date.month += 12;date.year--;}return (date.day + 2 * date.month + 3 * (date.month + 1) / 5 + date.year + date.year / 4 - date.year / 100 + date.year / 400 + 1 ) % 7;
}
istream& operator>>(istream&in, Date& date) {return in >> date.year >> date.month >> date.day;
}
ostream& operator<<(ostream&out, const Date& date) {return out << date.year << " " << date.month << " " << date.day;
}
void DateOperation::initial() {days = months = years = 0;
}
void DateOperation::computing() {while (cin >> op) {initial();switch(op) {case 1://add dayscin >> date >> days;cout << AddDay(date, days) << endl;break;case 2://add monthscin >> date >> months;cout << AddMonth(date, months) << endl;break;case 3://add yearscin >> date >> years;cout << AddYear(date, years) << endl;break;case 4://Subtracting date - date_TempDate date_Temp;cin >> date >> date_Temp;cout << Subtract(date, date_Temp) << endl;break;case 5://Get Weekday Of Datecin >> date;cout << weekdayNames[GetWeekday(date)] << endl;break;}}
}int main()
{//cout << "Hello world!" << endl;DateOperation dateOp;dateOp.computing();return 0;
}

3 函数的重载、默认形参练习

作者: Turbo时间限制: 1S章节: OO:其它

问题描述 :

内容:对于字符串,实现以下函数,并编写main函数测试这些函数:

  • padLeft函数:

功能:将一字符串左填充(在左边填充指定字符)至n个字符的长度,可指定填充字符,比如填充“*”,如果不指定填充字符,则填充空格。

提示:为实现以上功能,函数原型可为:

void  padLeft(char string1[], char string2[],  int n, char padding=' ')

或:

string padLeft(string string1, int n, char padding=' ')

这里使用了默认形参。

string1是原字符串,string2是填充之后的结果。

以下函数都不规定函数原型,请自行设计。

  • padRight函数:

功能:将一字符串右填充至n个字符的长度,可指定填充字符,比如填充“*”,如果不指定填充字符,则填充空格。

  • cpy函数:

功能:从第一个字符串复制字符到第二个字符串。可指定复制的起始位置和结束位置,即从startIndex到endIndex之间的所有字符都复制到第二个字符串中。startIndex默认为0, endIndex默认为到字符串尾部。

比如,

cpy(src, dest): 将src的所有字符都复制到dest

cpy(src, dest, 3):将src从下标为3的位置直到结尾的所有字符都复制到dest

cpy(src, dest, 3, 5):将src的第3、4、5个字符复制到dest中

  • remove函数:

从形参传入一个字符,将该字符从字符串中删除。

  • remove函数:

从形参传入一个下标index,将index处的字符从字符串中删除。

  • remove函数:

从形参传入两个下标startIndex和endIndex,将从startIndex到endIndex范围内的字符从字符串中删除。

main函数可参考以下代码编写:

int main()

{

int num, length, index, startIndex, endIndex;

char padding, delChar;

string src, dest;

while(cin >> num)

{

switch(num)

{

case 11:

cin >> src >> length;

cout << padLeft(src, length) << endl;

break;

case 12:

cin >> src >> length >> padding;

cout << padLeft(src, length, padding) << endl;

break;

case 21:

cin >> src >> length;

cout << padRight(src, length) << endl;

break;

case 22:

cin >> src >> length >> padding;

cout << padRight(src, length, padding) << endl;

break;

case 31:

cin >> src;

cout << cpy(src) << endl;

break;

case 32:

cin >> src >> startIndex;

cout << cpy(src, startIndex) << endl;

break;

case 33:

cin >> src >> startIndex >> endIndex;

cout << cpy(src, startIndex, endIndex) << endl;

break;

case 41:

cin >> src >> delChar;

cout << remove(src, delChar) << endl;

break;

case 42:

cin >> src >> index;

cout << remove(src, index) << endl;

break;

case 43:

cin >> src >> startIndex >> endIndex;

cout << remove(src, startIndex, endIndex) << endl;

break;

}

}

return 0;

}

输入说明 :

输入时,每组测试数据包含两行,第一行输入一个整数,指定需要完成的操作,第二行为该操作需要的数据。

对于每个整数对应的操作及其相应数据的输入方式如下(输入的字符串中不包含空格):

11:对应padLeft,第二行输入字符串string1、整数n,其间以空格分隔(由于没指定填充字符,所以填充空格)

异常处理:如果string1的长度大于等于n,则不填充任何字符。

12:对应padLeft,第二行输入字符串string1、整数n、一个填充字符,其间以空格分隔(填充字符不为空格)

异常处理:如果string1的长度大于等于n,则不填充任何字符。

21:对应padRight,第二行输入字符串string1、整数n,其间以空格分隔(由于没指定填充字符,所以填充空格)

异常处理:如果string1的长度大于等于n,则不填充任何字符。

22:对应padRight,第二行输入字符串string1、整数n、一个填充字符,其间以空格分隔(填充字符不为空格)

异常处理:如果string1的长度大于等于n,则不填充任何字符。

31:对应cpy,第二行输入字符串src

32:对应cpy,第二行输入字符串src和整数startIndex,以空格分隔。复制从startIndex开始的子字符串,下标从0开始。

异常处理:如果startIndex不合法,则不复制任何字符,结果为空字符串。

33:对应cpy,第二行输入字符串src和整数startIndex、endIndex,以空格分隔。

异常处理:如果startIndex、endIndex不合法,则不复制任何字符,结果为空字符串。

41:对应remove,第二行输入字符串和一个字符(以空格分隔),将字符从字符串中删除。

42:对应remove,第二行输入字符串和index(以空格分隔),将index处的字符从字符串中删除。

异常处理:如果index不合法,则不删除字符。

43:对应remove,第二行输入字符串和startIndex、endIndex(以空格分隔),将从startIndex到endIndex范围内的字符从字符串中删除。

异常处理:如果startIndex、endIndex不合法,则不删除字符。

输出说明 :

对于每组测试数据,输出对应的结果。如果结果为空字符串,则输出一个空行。

每行行首与行尾无多余空格,第一行之前与最后一行之后无多余空行。

输入范例 :

11
abcdefgh 10
12
abcdefgh 10 *
21
abcdefgh 10
22
abcdefgh 10 *
31
abcdefgh
32
abcdef 1
33
abcdef 1 5
41
abcdef a
42
abcdef 1
43
abcdef 1 4

输出范例 :

  abcdefgh
**abcdefgh
abcdefgh
abcdefgh**
abcdefgh
bcdef
bcdef
bcdef
acdef
af
#include <iostream>
#include <string>using namespace std;/** 3 函数的重载、默认形参练习*/class StringFunction {
private:int num, length, index, startIndex, endIndex;char padding, delChar;string src,dest;
public:string padLeft(string& ,const unsigned int& , char padding);string padRight(string& ,const unsigned int& , char padding);string cpy(string& , int startIndex, int endIndex);string remove(string& , const char& );string remove(string& , const int& i);string remove(string& , const int& ,const int& );bool checkLegality(string& , const int& );bool checkLegality(string& , const int& , const int& );bool isExsit(string& , const char& );void initial();void computing();
};void StringFunction::initial() {src.clear();dest.clear();
}bool StringFunction::checkLegality(string& str, const int& index) {return index >= 0 && index < str.size();
}bool StringFunction::checkLegality(string& str, const int& startIndex, const int& endIndex) {return startIndex >= 0 && startIndex <= endIndex && endIndex < str.size();
}bool StringFunction::isExsit(string& str, const char& ch) {for (unsigned int i = 0; i < str.size(); i++) {return str[i] == ch;}return false;
}string StringFunction::padLeft(string& str,const unsigned int& n, char padding = ' ') {if (str.size() > n) { return str; }for (unsigned int i = str.size(); i < n; i++) {str = padding + str;}return str;
}string StringFunction::padRight(string& str,const unsigned int& n, char padding = ' ') {if (str.size() > n) { return str; }for (unsigned int i = str.size(); i < n; i++) {str += padding;}return str;
}string StringFunction::cpy(string& str, int startIndex = 0, int endIndex = -1) {if (-1 == endIndex) {endIndex = str.size() - 1;}if ( !checkLegality(str, startIndex, endIndex)) {return dest;}dest = string (str, startIndex, endIndex - startIndex + 1);//第三个参数为个数return dest;
}
/*
string StringFunction::remove(string& str,const char& delChar) {//for (string::size_type index = 0; index != str.size(); index++) {//cout << "str.size() = " << str.size() << endl;while ( isExsit(str, delChar)) {for (unsigned int index = 0; index < str.size(); index++) {//for (unsigned int index = 0,length = str.size(); index < length; index++) {if (str[index] == delChar) {str.erase(str.begin() + index);//only delete one char which index is opposite//错误原因,str长度在不断缩短……而且index还不归0初始化。。//解决办法:外层嵌套while循环判断是否还有要删除的字符,continue加快效率//cout << "str[" << index << "] = " << str[index] << endl << "str = " << str << endl;//continue;//经测试有无continue效果一样}}}return str;
}
*/
//方法二:逆向思维,删很多的该字符不如拿其他的组新子串
string StringFunction::remove(string& str, const char& delChar) {if(isExsit(str, delChar)) {string str_temp;for (unsigned int index = 0; index < str.size(); index++) {if (str[index] != delChar) {str_temp.push_back(str[index]);//cpy函数的实现也可以考虑使用 push_back()方法}}return str_temp;}return str;
}string StringFunction::remove(string& str,const int& index) {if (!checkLegality(str, index)) {return str;}//return str.erase(str.begin() + index);str.erase(str.begin() + index);return str;
}
string StringFunction::remove(string& str,const int& startIndex,const int& endIndex) {if ( !checkLegality(str, startIndex, endIndex)) {return str;}str.erase(str.begin() + startIndex, str.begin() + endIndex + 1);return str;
}void StringFunction::computing() {while (cin >> num) {initial();switch (num) {case 11:cin >> src >> length;cout << padLeft(src, length) << endl;break;case 12:cin >> src >> length >> padding;cout << padLeft(src, length, padding) << endl;break;case 21:cin >> src >> length;cout << padRight(src, length) << endl;break;case 22:cin >> src >> length >> padding;cout << padRight(src, length, padding) << endl;break;case 31:cin >> src;cout << cpy(src) << endl;break;case 32:cin >> src >> startIndex;cout << cpy(src, startIndex) << endl;break;case 33:cin >> src >> startIndex >> endIndex;cout << cpy(src, startIndex, endIndex) << endl;break;case 41:cin >> src >> delChar;cout << remove(src, delChar) << endl;break;case 42:cin >> src >> index;cout << remove(src, index) << endl;break;case 43:cin >> src >> startIndex >> endIndex;cout << remove(src, startIndex, endIndex) << endl;break;}}
}int main() {StringFunction SF;SF.computing();return 0;
}

4 出现次数

作者: Turbo时间限制: 1S章节: OO:字符串

问题描述 :

输入两个字符串,计算第二个字符串在第一个字符串中出现的次数并输出。

输入说明 :

输入多组测试数据,每组测试数据占两行。

每个字符串中都不包含空格,也不为空字符串。

输出说明 :

对于每组测试数据,计算第二行的字符串在第一行中出现的次数,输出该数字。

每组输出占一行,每行首尾都无空格,也无多余空行。

输入范例 :

asdfghjasdfghjasdfghj
sdf
asdfasdfasdf
sdfas

输出范例 :

3
1
#include <iostream>
#include <string>using namespace std;class MyFind {
private:unsigned int count;string str, sub_str;
public:void initial();void setCount(const string& ,const string& );void computing();unsigned int getCount();
};void MyFind::initial() {count = 0;str.clear();sub_str.clear();
}
void MyFind::setCount(const string& str,const string& sub_str) {unsigned int i, j;for ( i = 0; i < str.size(); i++) {if (str[i] == sub_str[0]) {for (j = i; j - i < sub_str.size(); j++) {if (str[j] != sub_str[j - i]) {break;//子串未匹配,不对i处理}}if (j - i == sub_str.size()) {i += sub_str.size() - 1;//子串匹配,对i进行加值处理,但是要减1因为还要i++count++;}}//根据实际情况进行如下优化处理if (str.size() - i < sub_str.size()) {break;}}
}
unsigned int MyFind::getCount() {return count;
}
void MyFind::computing() {initial();while (cin >> str >> sub_str) {setCount(str, sub_str);cout << getCount() << endl;initial();}
}
int main(){//std::cout << "Hello World!\n"; MyFind MF;MF.computing();return 0;
}

5 最大相同子串

作者: Turbo时间限制: 1S章节: OO:字符串

问题描述 :

输入两个字符串,获取两个字符串中最大相同子串并输出。

如果有多个相同子串,则输出(按ASCII排序)最小的那个“最大相同子串”。

如果无相同子串,则输出空字符串(即空行)。

输入说明 :

输入多组测试数据,每组测试数据包含两行。

每行包含一个字符串,字符串中无空格,也无空字符串。

输出说明 :

对于每组测试数据,输出最大子串。如果最大子串为空,则输出一个空行。

每组输出占一行,行首与行尾无多余空格,也无多余空行。

输入范例 :

abcded123456aabbcc
abcdaa1234
abcdabcdabcd
abcda

输出范例 :

1234
abcda
#include <iostream>
#include <string>
#include <vector>
#include<algorithm>using namespace std;
typedef pair<string, unsigned int> PSI;
typedef vector<PSI> VP;class MyFind {
private:string str1,str2,substr;VP vp1,vp2;//子串,及其串长
public:void initial();bool isRepetition(string& , VP& );//判断该子串是否已存在void generateSubstring(const string& , VP& );//填充子串//bool cmp(const PSI& , const PSI& );void sortVP(VP& );void displaySortedVP(VP&);bool subStringIsMatch(VP& ,VP& );void outputSubstr();void computing();
};void MyFind::initial() {str1.clear();str2.clear();substr.clear();vp1.clear();vp2.clear();
}
bool MyFind::isRepetition(string& str, VP& vp) {//判断该子串是否已存在for (int i = 0; i < vp.size(); ++i) {return (vp[i].first == str);//有重}return false;//无重
}
void MyFind::generateSubstring(const string& str, VP& vp) {//生成所以子串int len = str.size();for (int i=1; i<=len; ++i) {    // i 子串元素个数for (int j=0; j+i <= len; ++j) { //  j 索引起点string    temp(&str[j], i);// string  temp(str, j, i);if (!isRepetition(temp, vp))vp.push_back( PSI(temp,temp.size()) );// 说明,若是母串没有重复的字符,则可以借助匿名变量实现一步到位,如上}}
}
/*
bool MyFind::cmp(const PSI& a,const PSI& b) {return a.first<b.first && a.second > b.second;串ASCLL码升序,串长降序
}
void MyFind::sortVP(VP& vp) {sort(vp.begin(), vp.end(), cmp);
}
*///上诉排序算法,VS2017报错
//注意,对所有子串的排序,可以仅对其中一个母串执行即可,但是要注意subStringIsMatch函数中外层放的vp1必须是排序了的
//对2个VP都排序的话,则可以根据字串长度在subStringIsMatch中进行代码优化处理void MyFind::sortVP(VP& vp) {int n = vp.size();for (int i = 0; i < n - 1; ++i) {//串长降序//DirectSelectionSort// 先用 k 来存储a[i+1]~a[n-1]之间的最大值的下标索引值,避免多余的数值交换操作swap,选择排序即选出a[MaxIndex]int k = i;for (int j = i + 1; j < n; ++j) {if (vp[j].second > vp[k].second)k = j; //不断更换成更大的元素值的下标,直至找到最大的}if (k != i) {PSI temp(vp[i].first, vp[i].second);vp[i].first = vp[k].first;vp[i].second = vp[k].second;vp[k].first = temp.first;vp[k].second = temp.second;}}for (int i = 0; i < n - 1; ++i) {//ASCLL码升序,注意只对等长子串排序//DirectSelectionSort// 先用 k 来存储a[i+1]~a[n-1]之间的最小值的下标索引值,避免多余的数值交换操作swap,选择排序即选出a[MinIndex]int  k = i;for (int j = i + 1; j < n; ++j) {if (vp[j].second < vp[k].second) {break;}if (vp[j].first < vp[k].first  &&  vp[j].second == vp[k].second) {k = j; //不断更换成更小的元素值的下标,直至找到最小的}}if (k != i) {PSI    temp(vp[i].first, vp[i].second);vp[i].first = vp[k].first;vp[i].second = vp[k].second;vp[k].first = temp.first;vp[k].second = temp.second;}}
}
void MyFind::displaySortedVP(VP& vp) {for (int i = 0; i < vp.size(); ++i) {cout << "i = " << i << '\t' << vp[i].first << '\t' << vp[i].second << endl;}cout << "----------------我是分割符-------------------" << endl;
}
bool MyFind::subStringIsMatch(VP& vp1, VP& vp2) {//遍历vp2,依次与vp1从头至尾匹配for (int i = 0; i < vp1.size(); ++i) {for (int j = 0; j < vp2.size(); ++j) {if (vp1[i].first == vp2[j].first) {substr = vp1[i].first;return true;}//vp2必须是也排序了,才可以如下break优化if (vp1[i].second > vp2[j].second) {break;}}}return false;
}
void MyFind::outputSubstr() {cout << substr << endl;
}
void MyFind::computing() {initial();while (cin >> str1 >> str2) {generateSubstring(str1, vp1);generateSubstring(str2, vp2);sortVP(vp1);sortVP(vp2);//displaySortedVP(vp1);//displaySortedVP(vp2);subStringIsMatch(vp1, vp2);outputSubstr();initial();}
}
int main(){//std::cout << "Hello World!\n"; MyFind MF;MF.computing();return 0;
}

6 解析XML文档

作者: Turbo时间限制: 1S章节: OO:字符串

问题描述 :

在网络上传输或者存储数据,经常使用xml文档。

一个书籍列表的xml文档可能如下:

<bookList>

<book>

<name>C++</name>

<author>yang</author>

<price>33</price>

</book>

<book>

<name>C</name>

<author>Tan</author>

<price>30.8</price>

</book>

<book>

<name>C programming</name>

<author>tan</author>

<price>28.9</price>

</book>

</bookList>

在这里,每一本书的信息包括书名、作者、价格。

通过解析该文档,根据一个书籍列表,输入书名,即可知道该书对应的价格。

输入说明 :

仅输入一组测试数据:

第一行为书籍列表的xml文档(文档中将不包含上述示例中的换行,除书名和作者名外,也不包括任何空格),第二行及以后的若干行为书名。

输出说明 :

根据第二行及其后的书名,针对每本书到xml文档中查找对应的价格,输出其价格。

如果有多本书同名,则输出第一本的价格。

如果书籍不存在,则输出"No"(不包括引号)。

每本书的价格单独占一行,输出价格时,保持其在xml文档中的格式。

不输出多余空格或空行。

输入范例 :

<bookList><book><name>C++</name><author>yang</author><price>33</price></book><book><name>C</name><author>Tan</author><price>30.8</price></book><book><name>C programming</name><author>tan</author><price>28.9</price></book></bookList>
C+
C

输出范例 :

No
30.8
#include <iostream>
#include <string>using namespace std;class XML {
private:string xmlString;string bookName;
public:void init();void computing();
};void XML::init() {getline(cin, xmlString, '\n');
}
void XML::computing() {init();//while (cin >> bookName) {//bookname也有空格的时候。。。C programmingwhile(getline(cin, bookName, '\n')){string temp;unsigned int  index, startIndex, endIndex;string::size_type found = xmlString.find( bookName ,0 );check:if (found == string::npos) {cout << "No" << endl;continue;}//cout << "found1 = " << found << endl;if (xmlString[found + bookName.size()] != '<') {//确保书名正确,不能C或C+顶替了C++found = xmlString.find(bookName, found + 1); //必须+1从在一个字符起再次查找,以免死循环goto check;}//cout << "found2 = " << found << endl;temp.assign(xmlString.begin() + found, xmlString.end());//cout << "temp1 =" << temp << endl;found = temp.find("price",0);//cout << "found3 = " << found << endl;temp.assign(temp.begin() + found, temp.end());//cout << "temp2 =" << temp << endl;for (index = 0; temp[index] != '<'; ++index) {if (temp[index] == '>') {startIndex = index + 1;}}endIndex = index;temp.assign(temp.begin() + startIndex, temp.begin() + endIndex);cout << temp << endl;//cout << "temp3 =" << temp << endl;//bookName.clear();}
}int main(){XML xml;xml.computing();return 0;
}

7 盒子类

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

定义盒子Box类,计算盒子的体积及表面积。Box类包括:

私有数据成员:

int Length //Box的长度

int Width   //Box的宽度

int Height  //Box的高度

公有成员函数:

void InitBox( int x, int y, int z); //设置Box的尺寸

void setVolume( );            //计算Box的体积

void setArea( );             //计算Box的表面积

void show( );              //输出盒子的信息,输出形式见“输出说明”

要求使用以下main函数测试Box类:

int main()

{

int intLength, intWidth, intHeight;

Box box;

cin>>intLength;

cin>>intWidth;

cin>>intHeight;

box.initBox(intLength,intWidth,intHeight);

box.setVolume();

box.setArea();

box.show();

return 0;

}

输入说明 :

输入三个整数:Length(长)、Width(宽)、Height(高),整数之间以空格分隔。

输入的整数都为非负数。

输出说明 :

输出三行:

第一行输出Length(长)、Width(宽)、Height(高),整数之间以一个空格分隔

第二行输出体积

第三行输出表面积

输出行之间无多余的空行和空格

输入范例 :

1 2 3

输出范例 :

1 2 3
6
22
#include <iostream>using namespace std;class Box {
private:int Length; //Box的长度int Width;  //Box的宽度int Height;  //Box的高度int Volume;int Area;
public:void initBox(const int& x,const int& ,const int& ); //设置Box的尺寸void setVolume();                //计算Box的体积void setArea();                  //计算Box的表面积void show();                    //输出盒子的信息,输出形式见“输出说明”
};void Box::initBox(const int& x,const int& y,const int& z) {Length = x;Width = y;Height = z;
}
void Box::setVolume() {Volume = Length * Width * Height;
}
void Box::setArea() {Area = 2 * ( Length * Width + Length * Height + Width * Height );
}
void Box::show() {cout << Length <<" "<< Width <<" "<< Height << endl;cout << Volume << endl;cout << Area << endl;
}int main(){int intLength, intWidth, intHeight;Box box;cin >> intLength;cin >> intWidth;cin >> intHeight;box.initBox(intLength, intWidth, intHeight);box.setVolume();box.setArea();box.show();return 0;
}

8 类和对象:使用日期类计算相隔天数

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

现有日期类Date。Date类定义如下:

class Date{

int year;

int month;

int day;

public:

Date(int y,int m,int d):year(y),month(m),day(d){};

int getYear() const {return year;}

int getMonth() const {return month;}

int getDay() const {return day;}

};

要求:使用日期类,设计1个用户函数CalDay,计算出两个日期之间的相隔天数,在屏幕上输出结果。

CalDay函数的原型定义如下:

int CalDay(const Date &d1, const Date &d2) //d1:较小的日期赋给d1,d2:较大的日期

要求使用以下main函数测试:

int main(){

int y1,m1,d1,y2,m2,d2;

cin>>y1>>m1>>d1;

cin>>y2>>m2>>d2;

Date date1(y1,m1,d1);

Date date2(y2,m2,d2);

cout<<CalDay(date1,date2);

return 0;

}

输入说明 :

测试数据为2行,

第一行:开始日期(分别为年、月、日的值,值与值之间用空格分隔),例如:2010 4 7

第一行:结束日期(分别为年、月、日的值,值与值之间用空格分隔),例如:2017 4 7

注意:开始日期在结束日期之前

输出说明 :

输出结果为截止日期与开始日期的相隔天数。

输入范例 :

2010 2 3
2017 3 17

输出范例 :

2599

9 函数模板:两点间的距离

作者: 冯向阳时间限制: 1S章节: OO:其它

问题描述 :

使用模板函数,分别求出int型数的两点间的距离和浮点型数的两点间的距离。在main函数中测试运用模板函数。

函数原型为:

template <class T>

T distance( T, T, T, T);

main函数可参考以下代码编写:

int main( ){

int i_x1, i_y1, i_x2, i_y2;

double d_x1, d_y1, d_x2, d_y2;

cin>>i_x1>>i_y1>>i_x2>>i_y2;

cin>>d_x1>>d_y1>>d_x2>>d_y2;

cout<<distance( i_x1, i_y1, i_x2, i_y2 )<<endl;

cout<<distance(d_x1, d_y1, d_x2, d_y2 )<<endl;

return 0;

}

输入说明 :

每组测试数据为两行,格式如下:

i_x1 i_y1 i_x2 i_y2  //两个int型测试点的x坐标,y坐标,坐标之间用空格分隔

d_x1 d_y1 d_x2 d_y2  //两个double型测试点的x坐标,y坐标,坐标之间用空格分隔

行与行之间无多余的空行和空格。

输出说明 :

输出数据分两行,分别对应int型和double型的两点间的距离

行与行之间无多余的空行和空格。

输入范例 :

1 1 2 1
10.0 20.0 5.0 5.0

输出范例 :

1
15.8114
#include <iostream>
#include <cmath>
using namespace std;template <class T>
T distance(T a1, T b1, T a2, T b2) {return sqrt((a1 - a2)*(a1 - a2) + (b1 - b2)*(b1 - b2));
}int main() {int i_x1, i_y1, i_x2, i_y2;double d_x1, d_y1, d_x2, d_y2;cin >> i_x1 >> i_y1 >> i_x2 >> i_y2;cin >> d_x1 >> d_y1 >> d_x2 >> d_y2;cout << distance(i_x1, i_y1, i_x2, i_y2) << endl;cout << distance(d_x1, d_y1, d_x2, d_y2) << endl;return 0;
}

10 寻找素数

作者: 冯向阳时间限制: 1S章节: OO:其它

问题描述 :

寻找出任意两个整数之间的所有素数,在屏幕上输出所有的素数以及个数。

提示:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

输入说明 :

每组输入分两行。

第一行是开始数字,第二行是结束数字。结束数字>开始数字

输出说明 :

素数行每行最多输出5个素数(超出5个自动换行),素数与素数之间存在一个空格。

最后一行输出素数的个数。

素数行之间无多余的空行。每行的开头和结尾无多余的空格(最后1行素数如小于5个,后有1个空格)。

素数行和个数行之间存在一个空行。

输入范例 :

100
200

输出范例 :

101 103 107 109 113
127 131 137 139 149
151 157 163 167 173
179 181 191 193 197
199 21
#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;
const int N = 1000000;
short t[N + 3];//省点空间用short不用int
int i, j, m, n;int main() {//memset(t,1,sizeof(t));fill(t, t + N, 1);//memset和fill函数的区别,可以参考博文http://blog.csdn.net/liuchuo/article/details/52296646for (i = 2; i <= N; ++i) {if (t[i]) {// 避免二次筛选,代码优化所在for (j = 2; j*i <= N; ++j)t[i*j] = 0;}}// 此时已得出1000000以内素数,i、j的初值不影响t[2]、t[3]//for (i=2; i<=N; ++i)if(t[i]) {cout <<i <<" "; }while (cin >> m >> n) {int count = 0;for (i = m; i <= n; ++i) {if (t[i]) {count++;//count从0开始,语句先后敏感if (count % 5) {cout << i << " ";}else {cout << i << endl;}}}if (count % 5) {cout << endl;}cout << endl << count << endl;}return 0;
}

11 结构体改成类的实现(日期类)

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

实验目的:掌握类的基本概念,学习如何定义类,如何定义类中的成员函数,以及如何调用成员函数。

实验内容:将前面作业的日期结构体改成类。

即:声明一个类Date,包括数据成员年月日,数据成员的访问属性为private。

Date类拥有几个成员函数:

1、构造函数:传入形参年月日,设置Date类的数据成员的初始值

2、void AddDays(int days):对日期增加days天数。本操作直接修改Date类的数据成员,不返回值。

3、void AddMonth(int months):对日期增加months月数。本操作直接修改Date类的数据成员。

4、void AddYear(int years):对日期增加years年数。本操作直接修改Date类的数据成员。

5、int Subtract(Date d):用本Date类里的数据成员年月日减去d对象的年月日,计算它们相距的天数,作为函数值返回

6、GetWeekDay():返回Date类里年月日所表示的日期是星期几。星期几最好用枚举表示,也就是返回一个枚举类型的值。(选做)

可根据需要增加以下成员函数:

1、int GetYear():获取数据成员“年”的值(函数的实现非常简单,返回数据成员“年”的值即可)

2、int GetMonth():获取数据成员“月”的值

3、int GetDay():获取数据成员“日”的值

再声明一个main函数,测试以上函数。

注意:以上成员函数中,没有定义成员函数来输出Date类里的年月日,所以,如果需要在main函数中输出年月日的值,只能通过GetYear, GetMonth, GetDay函数得到年月日后,才能输出(因为数据成员的访问属性为private,所以不能直接用“对象名.数据成员”来获得年月日的值)。

一般的设计思想是:不在类的成员函数里做cin和cout的操作。

输入说明 :

程序包含多组输入,每组测试数据包含两行,第一行用一个整数(1到5)指定需要完成的操作,含义如下:

1:AddDay

2:AddMonth

3:AddYear

4:Subtract

5:GetWeekDay(测试数据不包含本输入)

第二行为该操作需要的数据。

比如输入:

1

2016 1 1 31

表示将进行AddDay操作,输入日期为2016年1月1日,加31天。

程序输出结果日期,按年月日格式输出,中间以一个空格分隔。

其它各操作的输入方式见范例。

输出说明 :

程序输出相应计算结果。

对于AddDay、AddMonth、AddYear三种操作,输出结果日期,按年月日格式输出,中间以一个空格分隔。

对于Subtract,结果仅输出一个整数,表示相距的天数。

每组输出占一行,行首与行尾无多余空格,所有地方无多余空行。

输入范例 :

1
2000 2 28 20
2
2000 1 31 3
3
2000 1 31 1
4
2016 3 8 2016 2 8
4
2016 1 8 2016 2 8

输出范例 :

2000 3 19
2000 4 30
2001 1 31
29
-31
#include <iostream>
#include <string>
using namespace std;class DateOperation {
private:struct Date{int day;int month;int year;}date;int daysOfMonth[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//Set Days Of February To 28,And Then Check It For Legality Before Using.const string weekdayNames[7] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };int op;//from 1 to 5int days, months, years;
public:bool isLeapYear(int year) { return (!(year % 400)) || (!(year % 4) && (year % 100)); }void setDaysOfFebruary(int year);void checkLegality(Date&);Date AddDay(Date& date, int& days) {date.day += days;setDaysOfFebruary(date.year);while (date.day > daysOfMonth[date.month - 1]) {date.day -= daysOfMonth[date.month - 1];date.month++;if (date.month > 12) {date.month -= 12;date.year++;setDaysOfFebruary(date.year);}}checkLegality(date);return date;}Date AddMonth(Date& date, int& months) {date.month += months;while (date.month > 12) {date.month -= 12;date.year++;}checkLegality(date);return date;}Date AddYear(Date& date, int& years) {date.year += years;checkLegality(date);return date;}int Subtract(Date&, Date&);//date1 - date2int GetWeekday(Date&);void initial();void computing();friend istream& operator>>(istream&in, Date& date) {return in >> date.year >> date.month >> date.day;}friend ostream& operator<<(ostream&out, const Date& date) {return out << date.year << " " << date.month << " " << date.day;}
};
void DateOperation::setDaysOfFebruary(int year) {if (isLeapYear(year)) {daysOfMonth[1] = 29;}else {daysOfMonth[1] = 28;}
}
void DateOperation::checkLegality(Date& date) {setDaysOfFebruary(date.year);if (date.day > daysOfMonth[date.month - 1]) {date.day = daysOfMonth[date.month - 1];}
}int DateOperation::Subtract(Date& date1, Date& date2) {int temp = 0;int i = 1;for (; i < date1.year; i++) {if (i < date2.year) {}else {if (isLeapYear(i)) {temp += 366;}else {temp += 365;}}}for (; i < date2.year; i++) {if (isLeapYear(i)) {temp -= 366;}else {temp -= 365;}}for (i = 0; i < date1.month - 1; i++) {setDaysOfFebruary(date1.year);temp += daysOfMonth[i];}for (i = 0; i < date2.month - 1; i++) {setDaysOfFebruary(date2.year);temp -= daysOfMonth[i];}temp += date1.day;temp -= date2.day;return temp;
}
int DateOperation::GetWeekday(Date& date) {if (date.day == 1 || 2 == date.day) {date.month += 12;date.year--;}return (date.day + 2 * date.month + 3 * (date.month + 1) / 5 + date.year + date.year / 4 - date.year / 100 + date.year / 400 + 1) % 7;
}void DateOperation::initial() {days = months = years = 0;
}
void DateOperation::computing() {while (cin >> op) {initial();switch (op) {case 1://add dayscin >> date >> days;cout << AddDay(date, days) << endl;break;case 2://add monthscin >> date >> months;cout << AddMonth(date, months) << endl;break;case 3://add yearscin >> date >> years;cout << AddYear(date, years) << endl;break;case 4://Subtracting date - date_TempDate date_Temp;cin >> date >> date_Temp;cout << Subtract(date, date_Temp) << endl;break;case 5://Get Weekday Of Datecin >> date;cout << weekdayNames[GetWeekday(date)] << endl;break;}}
}int main(){DateOperation dateOp;dateOp.computing();return 0;
}

12 字符串反转

作者: 冯向阳时间限制: 1S章节: OO:字符串

问题描述 :

请设计一函数,将用户输入的字符串以反向形式在屏幕上输出,并在main函数中调用和测试它。

函数原型:  reverse(char *,char *); //第一个形参代表输入字符串,第二个形参代表输出字符串

要求函数功能使用指针运算实现

输入说明 :

每行输入字符串的长度控制在100个字符以内。

输入单个字符作为结束标志。

输出说明 :

行与行之间无多余空行。每行的开头和结尾无多余的空格。

输入范例 :

China
Tge
1

输出范例 :

anihC
egT
#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;void reverse(char* & ,char* & );
void display(char* & );
const int N = 100;int main(){char *str = new char[N];char *reStr = new char[N];while (cin >> str  && strlen(str) != 1) {getchar();reverse(str, reStr);//cout << "reStr = " << reStr << endl;display(reStr);//cout << "reStr = " << reStr << endl;memset(str, 0, 100);memset(reStr, 0, 100);}delete[] str;delete[] reStr;return 0;
}void reverse(char*& str, char*& reStr) {for (unsigned int i = 0, j = strlen(str) -1 ; i < j ; ++i,--j) {char ch = str[i];str[i] = str[j];str[j] = ch;}reStr = str;//cout <<"str = "<< str << endl;//cout << "reStr = " << reStr << endl;
}
void display(char*& str) {cout << str << endl;
}

13 回文判断

作者: 冯向阳时间限制: 1S章节: OO:字符串

问题描述 :

请设计一函数,判断用户输入的一字符串是否为“回文”,并在屏幕上显示判断结果。

所谓“回文”是指顺读和倒读都是一样的字符串。如“level”、“ABCCBA”都是回文。

函数原型:  bool judge(char *); //形参代表输入字符串

要求函数功能使用指针运算实现

输入说明 :

每行输入字符串的长度控制在100个字符以内。

输入任一单个字符作为结束标志。

输出说明 :

判断结果:T  或  F

(T代表是回文,F代表不是回文)

输入范例 :

level
asdf
ABCCBA
1

输出范例 :

T
F
T
#include <iostream>
#include <cstdio>
#include <cstring>using namespace std;bool isPalindrome(char* & );
const int N = 100;int main() {char *str = new char[N];while (cin >> str && strlen(str) != 1) {getchar();if (isPalindrome(str)) {cout << "T" << endl;}else {cout << "F" << endl;}}delete[] str;return 0;
}bool isPalindrome(char* & str) {for (unsigned int i = 0, j = strlen(str) - 1; i < j; ++i, --j) {if (str[i] != str[j]) {return false;}}return true;
}

14 学生数组排序

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

输入3个学生的姓名和英语、数学成绩,需要求每个学生的总成绩并对3个学生按总成绩降序输出,请编写一个类student,实现该功能。

student类的数据成员包括(但不限于)name(姓名,类型为string)、math(数学)、english(英语)。要求用成员函数实现以下功能:

1、使用构造函数给各属性赋初值

2、调用实例方法计算学生总成绩

3、其它必要的功能

另设计一个函数对学生按总成绩降序排列,并在main函数中输出学生信息。

main函数的实现参考如下代码,请设计student类和sortStudent函数。

main函数中声明了一个数组,包含三个对象,然后输入必要信息,给三个对象赋值并计算总成绩,之后对数组排序并按总成绩降序输出学生姓名及其成绩。

对于两个总成绩相同的学生,排序后不改变他们原来的顺序。

int main()

{

student s[3],temp;

string sName;//或char sName[20];

int sMath, sEnglish;

int i;

for(i=0; i<3; i++)

{

cin>>sName>>sMath>>sEnglish;

s[i]=student(sName, sMath, sEnglish);

s[i].calcTotal();

}

sortStudent(s, 3);

for(i=0;i<3;i++)

{

cout<<s[i].getName()<<" "<<s[i].getMath()<<" "<<s[i].getEnglish()<<" "<<s[i].getTotal()<<endl;

}

return 0;

}

输入说明 :

输入三行,表示三个学生的信息,每一行包括学生姓名、数学成绩、英语成绩,中间以空格分隔。

成绩为0到100之间的整数。

输出说明 :

输出三行,按总成绩降序输出学生姓名及其数学成绩、英语成绩、总成绩。

如果有两个学生总成绩相同,那么原来排在前的学生先输出。

输入范例 :

John 80 90
Kevy 85 90
Lucy 90 80

输出范例 :

Kevy 85 90 175
John 80 90 170
Lucy 90 80 170
#include <iostream>
#include <string>
#include <vector>
#include<algorithm>using namespace std;class student {
private:string name;int sMath;int sEnglish;int total;
public:student(string name, int sMath, int sEnglish) :name(name), sMath(sMath), sEnglish(sEnglish) {};student(){}void calcTotal() { total = sMath + sEnglish; }void setName(string name) {  this->name = name; }void setMath(int sMath) { this->sMath = sMath; }void setEnglish(int sEnglish) { this->sEnglish = sEnglish; }string getName() { return name; }int getMath() { return sMath; }int getEnglish() { return sEnglish; }int getTotal() { return total; }
};void sortStudent(student* stu, int n) {for (int i = 0; i < n - 1; ++i) {//DirectSelectionSort// 先用 k 来存储a[i+1]~a[n-1]之间的最大值的下标索引值,避免多余的数值交换操作swap,选择排序即选出a[MaxIndex]int k = i;for (int j = i + 1; j < n; ++j) {if (stu[j].getTotal() > stu[k].getTotal()) {k = j; //不断更换成更大的元素值的下标,直至找到最大的}}if (k != i) {student    temp(stu[i].getName(), stu[i].getMath(), stu[i].getEnglish());temp.calcTotal();//cout <<"temp"<< temp.getName() << " " << temp.getMath() << " " << temp.getEnglish() << " " << temp.getTotal() << endl;stu[i].setName(stu[k].getName());stu[i].setMath(stu[k].getMath());stu[i].setEnglish(stu[k].getEnglish());stu[i].calcTotal();//cout <<"stu["<<i<<"]" << stu[i].getName() << " " << stu[i].getMath() << " " << stu[i].getEnglish() << " " << stu[i].getTotal() << endl;stu[k].setName(temp.getName());stu[k].setMath(temp.getMath());stu[k].setEnglish(temp.getEnglish());stu[k].calcTotal();//cout <<"stu["<<k<<"]"<< stu[k].getName() << " " << stu[k].getMath() << " " << stu[k].getEnglish() << " " << stu[k].getTotal() << endl;}}
}int main(){student s[3];string sName;//或char sName[20];int sMath, sEnglish;int i;for (i = 0; i < 3; i++){cin >> sName >> sMath >> sEnglish;s[i] = student(sName, sMath, sEnglish);s[i].calcTotal();}sortStudent(s, 3);for (i = 0; i < 3; i++){cout << s[i].getName() << " " << s[i].getMath() << " " << s[i].getEnglish() << " " << s[i].getTotal() << endl;}return 0;
}

15 寻找最好成绩

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

建立一个对象数组,内放若干个学生的学习数据(学号,成绩)。

设计一函数max,使用学生对象数组作为参数,在max函数里找出这些学生中成绩最高者,并输出其学号及成绩。

在main函数中使用并测试之。在main函数中读入学生数据,创建学生对象数组,并调用max函数输出成绩最高者。

如果有多名学生成绩最高,则按照输入的先后顺序输出这些学生的信息。

要求:

(1)学生类的名称为Student,定义如下:

Student{

private:

int num;  //学号

float score; //分数

public:  //成员函数仅给出原型,需自行设计

Student(int num);

void SetScore(float);

int GetNum();

float GetScore();

};

对于Student类,可自行增加属性和成员函数。

(2)max函数原型为void max( Student arr[] ,int n); //函数体需自行设计

main函数可参考如下实现:

int main( )

{

int i, n, num;

float score;

cin>>n;

Student stu[n];

for( i = 0; i < n; i++)

{

cin>>num>>score;

stu[i] = Student(num);

stu[i].SetScore(score);

}

max(stu, n );

return 0;

}

输入说明 :

输入的第一行为学生的数目n,其后n行为n个学生的数据,每个学生的数据占一行(学号,成绩)

学号与成绩之间以空格分隔,每行的开头和结尾无多余的空格。

输出说明 :

输出成绩最高者的学号和成绩,其间以一个空格分隔。

如果输出多名学生,则每名学生独占一行。

输出无多余空行及多余空格。

输入范例 :

10
100 21
101 22
102 23
105 28
104 22
103 28
106 2
107 24
108 3
109 8

输出范例 :

105 28
103 28
#include <iostream>
#include <string>
#include <vector>
#include<algorithm>using namespace std;class Student {
private:int num;float score;public:Student(int num) : num(num) {};Student(){}void SetNum(float num) {  this->num = num; }void SetScore(float score) {  this->score = score; }int GetNum(){return num;}float GeetScore(){ return score;}
};void max(Student stu[], int n) {int i = 0;for (int j = 1; j < n; ++j) {if (stu[j].GeetScore() > stu[i].GeetScore() ) {i = j; //不断更换成更大的元素值的下标,直至找到最大的}}for( int j=0;j<n;++j){if(stu[j].GeetScore() == stu[i].GeetScore() ){cout<< stu[j].GetNum()<<" "<<stu[j].GeetScore()<<endl;}}
}int main( ){int i, n, num;float score;cin>>n;Student stu[n];for( i = 0; i < n; i++){cin>>num>>score;stu[i] = Student(num);stu[i].SetScore(score);}max(stu, n );return 0;
}

16 查找学生

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

实验目的:学习string类型的使用;学习对象数组的使用。

实验内容:

设计一个student类,包含学生学号、姓名、语文成绩、数学成绩。

现有n个学生,保存在一个数组中,请对每个学生,分别计算语数两门课的平均成绩。

此外,再设计一个函数findStudent,根据传入的学生数组和需要查找的姓名searchName,查找姓名中包含searchName的学生。比如输入”huang”,则输出所有姓名中包含”huang”的学生的成绩。

分析:

类中的属性可包括(但不仅限于):number, name, chinese, math, average。其中,学号number为int类型,name为string类型,成绩为double类型。

类中的方法可包括(但不仅限于):

setChinese、getChinese、setMath、getMath、calcAverage、getAverage以及包含两个形参(学号和姓名)的构造函数。

说明:

由于成绩需要在0到100之间,因此语文成绩和数学成绩不能随意赋值,所以不能将chinese和math这两个属性设置为public,而是设置为private,同时增加两个方法,bool setChinese (int score),bool setMath(int score)。

这两个方法的逻辑为(以setChinese为例):

bool setChinese (int score)

{

//如果形参score在0到100之间,则将chinese赋值为score,并返回true,否则将chinese赋值为0,并返回false

}

相应地,还需要增加getChinese方法,该方法里不需要进行什么处理,直接return chinese即可。可如下实现:

double getChinese()

{

return chinese;

}

对于number和name,一般也设置为private,仅通过构造函数给它们赋值,再增加两个方法: getNumber以及getName获取它们的值。

main函数可参考如下代码:

int main()

{

int n,i;

int number;

string name, searchName;

double math,chinese;

cin>>n;

Student stu[n];

for(i=0;i<n;i++)

{

cin>>number>>name>>chinese>>math;

stu[i] = Student(number, name);

stu[i].setChinese(chinese);

stu[i].setMath(math);

}

cin>>searchName;  //输入需要查找的姓名

findStudent(stu, n, searchName);  //调用函数,查找学生,输出信息

return 0;

}

输入说明 :

输入的第一行为学生的数目n,

其后n行为n个学生的数据,每个学生的数据占一行,包括学号、姓名、语文成绩、数学成绩,其间以空格分隔。

再后一行(最后一行)为需要查找的姓名。

每行的开头和结尾无多余的空格。

学号为整数,姓名为字符串,成绩为实数。姓名中不包含空格。

输出说明 :

输出符合条件的学生的学号、姓名、语文成绩、数学成绩及平均成绩,其间以一个空格分隔。

如果输出多名学生,则每名学生独占一行。

输出无多余空行及多余空格。

输出的实数以cout的默认输出格式为准,比如实数82输出就是“82”,后面不会有小数点及“0”。

如果未找到,则输出“Not found.”,不包括引号。

输入范例 :

10
100 stu1 80 81
101 stu12 82 83
102 stu13 1000 81
105 stu5 80 82
104 stu4 80 81
103 stu3 99 81
106 stu6 86 88.5
107 stu7 80 81
108 John 0 0
109 Kevin 0 100
stu1

输出范例 :

100 stu1 80 81 80.5
101 stu12 82 83 82.5
102 stu13 0 81 40.5
#include <iostream>
#include <string>
using namespace std;class Student {
private:int number;string name;double chinese, math, average;public:Student(int number, string name) { this->number = number; this->name = name; }Student() {}bool setChinese(double chinese);bool setMath(double math);void calcAverage() { average = math / 2.0 + chinese / 2.0; }double getChinese() { return chinese; }double getMath() { return math; }double getAverage() { return average; }string getName() { return name; }int getNum() { return number; }
};bool Student::setChinese(double chinese) {if (0.0 <= chinese && chinese <= 100.0) {this->chinese = chinese;return true;}this->chinese = 0.0;return false;
}bool Student::setMath(double math) {if (0.0 <= math && math <= 100.0) {this->math = math;return true;}this->math = 0.0;return false;
}void findStudent(Student* stu, int n, string searchName) {bool flag = false;for (int i = 0; i < n; ++i) {string::size_type found = (stu[i].getName()).find(searchName, 0);if (found != string::npos) {flag = true;cout << stu[i].getNum()  << " " << stu[i].getName() << " " << stu[i].getChinese();cout << " " << stu[i].getMath() << " " << stu[i].getAverage() << endl;}}if (!flag) {cout << "Not found." << endl;}}int main() {int n, i;int number;string name, searchName;double math, chinese;cin >> n;Student stu[n];for (i = 0; i < n; i++) {cin >> number >> name >> chinese >> math;stu[i] = Student(number, name);//如此写法需要重载“=”赋值运算符?stu[i].setChinese(chinese);stu[i].setMath(math);stu[i].calcAverage();}cin >> searchName;  //输入需要查找的姓名findStudent(stu, n, searchName);  //调用函数,查找学生,输出信息return 0;}

17 长方形(类的实现)

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

实验目的:学习组合对象的使用。

实验内容:

定义一个Point类,包括两个私有属性:int x, int y,它们分别表示一个点的x和y座标。

再定义构造函数:

Point(int x, int y),即传两个参数,构造一个点对象。

注意,本题要求Point类不得定义缺省构造函数,也就是只定义以上所说的构造函数。

定义一个Rectangle类,包括三个私有属性:Point topLeft, int width, int height,它们分别表示长方形左上角顶点的座标,以及横向的宽度和纵向的高度。

注意:在计算机系统里,座标系如下定义:屏幕的左上角的座标是(0,0),x轴是横轴,屏幕的最右端x值最大,y轴是纵轴,屏幕的最下方y值最大。图如下:

再定义构造函数:

Rectangle(int x, int y, int width, int height)

以及实例方法:

int getArea()    //获取该图形的面积

bool isIn(Point p)   //判断传入的点是否在该图形之内(不包括边界),如果在内部返回true,否则返回false

使用main函数测试以上getArea方法和isIn方法。main函数可参考如下代码:

int main()

{

int topLeftX, topLeftY, width, height;

int px, py;

cin>>topLeftX>>topLeftY>>width>>height;

cin>>px>>py;

Point p(px, py);

Rectangle r(topLeftX, topLeftY, width, height);

cout<<r.getArea()<<endl;

if(r.isIn(p))

cout<<"In"<<endl;

else

cout<<"Not in"<<endl;

return 0;

}

输入说明 :

第一行输入长方形r的信息,包括左上角顶点x座标、左上角顶点y座标、宽度、高度。

第二行输入一个点p的信息,包括其x座标和y座标。

所有输入都为非负整数,之间以一个空格分隔。无多余空格或空行。

输出说明 :

输出两行,第一行输出长方形面积,第二行输出点p是否位于长方形r之内,如果在内部,则输出“In”,否则输出“Not in”。

输入范例 :

10 20 50 80
20 30

输出范例 :

4000
In
#include <iostream>using namespace std;class Point {
private:int x; //x坐标int y;  //y坐标public:Point(const int x = 0, const int y = 0) :x(x), y(y) {};int getX()const { return x; }int getY()const { return y; }
};class Rectangle {
private:Point topLeft;int width;int height;public:Rectangle(const int x = 0, const int y = 0, const int width = 0, const int height = 0): topLeft(x, y), width(width), height(height) {};int getArea() { return  width * height; }bool isIn(const Point& );
};bool Rectangle::isIn(const Point& p) {return p.getX() > topLeft.getX() && p.getX() < topLeft.getX() + width&& p.getY() > topLeft.getY() && p.getX() < topLeft.getY() + height;
}int main(){int topLeftX, topLeftY, width, height;int px, py;cin >> topLeftX >> topLeftY >> width >> height;cin >> px >> py;Point p(px, py);Rectangle r(topLeftX, topLeftY, width, height);cout << r.getArea() << endl;if (r.isIn(p))cout << "In" << endl;elsecout << "Not in" << endl;return 0;}

18 长方形集合

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

定义一个Point类,包括两个私有属性:int x, int y,它们分别表示一个点的x和y座标。

再定义构造函数:

Point(int x, int y),即传两个参数,构造一个点对象。

定义一个Rectangle类,包括四个私有属性:

Int num, Point topLeft, int width, int height,

它们分别表示长方形的编号(长方形的编号不重复)、左上角顶点的座标,以及横向的宽度和纵向的高度。

注意:在计算机系统里,座标系如下定义:屏幕的左上角的座标是(0,0),x轴是横轴,屏幕的最右端x值最大,y轴是纵轴,屏幕的最下方y值最大。图如下:

再定义构造函数:

Rectangle(int num, int x, int y, int width, int height)

以及实例方法:

int getArea()    //获取该图形的面积

bool isIn(Point p)   //判断传入的点是否在该图形之内(不包括边界),如果在内部返回true,否则返回false

定义一个RectangleCollection类,包括两个私有属性:

Rectangle rects[100];   //一个包含长方形的数组,最多100个元素

int count;            //以上数组中长方形的实际个数

还包括实例方法:

void addRectangle(Rectangle r)//添加一个长方形到数组中,并count++

void deleteRectangle(int num) //根据num从数组中删除一个长方形(该长方形的编号等于num)

int inRects(Point p)//根据传入的p,判断p位于rects数组中的哪些长方形之内,返回这些长方形面积之和。

请根据自己的需要定义其它构造函数或者其它方法和属性。

使用main函数测试以上RectangleCollection类的addRectangle方法、deleteRectangle方法以及inRects方法。main函数可参考如下代码:

int main()
{
    int num, topLeftX, topLeftY, width, height;
    int px, py;
    int op;
    RectangleCollection rc;
    Rectangle r;
    Point p;

while (cin >> op)
    {
        switch (op)
        {
            case 1:
                cin >> num >> topLeftX >> topLeftY >> width >> height;
                r =Rectangle(num, topLeftX, topLeftY, width, height);
                rc.addRectangle(r);
                break;
            case 2:
                cin >> num;
                rc.deleteRectangle(num);
                break;
            case 3:
                cin >> px >> py;
                p=Point(px, py);
                cout << rc.inRects(p) << endl;
                break;
        }
    }
    return 0;
}

输入说明 :

可输入多组测试数据,每组测试数据包含两行:
第一行输入一个操作的种类,
1:增加一个长方形
2:删除一个长方形
3:求包含某一指定点的所有长方形的面积和
第二行输入所需要的参数:
对于第1个操作,第二行输入长方形r的信息,包括编号num,左上角顶点x座标、左上角顶点y座标、宽度、高度。
对于第2个操作,第二行输入一个编号num
对于第3个操作,第二行输入一个点p的信息,包括其x座标和y座标。
所有输入都为非负整数,之间以一个空格分隔。无多余空格或空行,两组测试数据之间也无空行。
在输入时,将保证不会向长方形集合中添加一个编号(num)已经存在的长方形。

输出说明 :

仅第3个操作有输出,因此,测试数据中必然包含第3个操作。
第3个操作仅输出一个整数,占一行。
如果有多个输出,每个输出占一行,行首与行尾无空格,中间无空行。

输入范例 :

1
1 4 4 4 4
1
3 3 3 3 3
1
2 2 3 5 4
3
5 5
2
3
3
5 5
1
3 3 3 4 4
3
5 5

输出范例 :

45
36
52
#include <iostream>
using namespace std;class Point {
private:int x; //x坐标int y;  //y坐标public:Point(const int x = 0, const int y = 0) :x(x), y(y) {};int getX()const { return x; }int getY()const { return y; }
};class Rectangle {
private:int num;Point topLeft;int width;int height;public:Rectangle(const int num = 0, const int x = 0, const int y = 0, const int width = 0, const int height = 0): num(num), topLeft(x, y), width(width), height(height) {};int getNum() { return num; }int getArea() { return  width * height; }bool isIn(const Point&);
};bool Rectangle::isIn(const Point& p) {return p.getX() > topLeft.getX() && p.getX() < topLeft.getX() + width&& p.getY() > topLeft.getY() && p.getY() < topLeft.getY() + height;//&& p.getY() > topLeft.getY() && p.getX() < topLeft.getY() + height;//看看这低级错误}const int N = 100;
class RectangleCollection {
private:Rectangle rects[N];//int count = 0;//C++11以上支持unsigned int count;public:RectangleCollection() { count = 0; }void addRectangle(Rectangle r);void deleteRectangle(int num);int inRects(Point p);
};void RectangleCollection::addRectangle(Rectangle r) {rects[r.getNum()] = r;//复制构造编译器会自动生成++count;
}void RectangleCollection::deleteRectangle(int num) {//for (unsigned int i = num; i < count; ++i) {//元素前移一位// rects[i] = rects[i + 1];//}rects[num] = rects[0];//置为初始化的0值,不可使用常规的移位,题目中并没说明元素索引是连续的--count;
}int RectangleCollection::inRects(Point p) {int sum = 0;unsigned int flag = 0;//查对索引的次数//for (unsigned int i = 1; rects[i].getNum() && i < N; ++i) {for (unsigned int i = 0; flag <= count && i < N; ++i) {//注意索引边界,<=而不是<if (rects[i].getNum()) {++flag;//必须num非0才算找对,因为一开始都初始化为0了}if (rects[i].isIn(p)) {sum += rects[i].getArea();}}return sum;
}int main() {int num, topLeftX, topLeftY, width, height;int px, py;int op;RectangleCollection rc;Rectangle r;Point p;while (cin >> op) {switch (op) {case 1:cin >> num >> topLeftX >> topLeftY >> width >> height;r = Rectangle(num, topLeftX, topLeftY, width, height);rc.addRectangle(r);break;case 2:cin >> num;rc.deleteRectangle(num);break;case 3:cin >> px >> py;p = Point(px, py);cout << rc.inRects(p) << endl;break;}}return 0;
}

19 模板类练习:实现两个整数、浮点数和字符的比较

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

请定义一个类模板,利用它分别实现两个整数、浮点数和字符串的比较。在main函数中应用并测试之。

输入说明 :

每组输出分3行:

第一行:标志行('i'代表输入两个整数进行比较;'f'代表输入两个浮点数进行比较;'s'代表输入两个字符串进行比较;'e'代表输入结束。)

第二行和第三行分别对应进行比较的两个数据

输入行之间无多余的空行,每行的开头和结尾无多余的空格

输入可连续进行。

输出说明 :

每组输入数据对应一行输出数据,为2个比较数据之中的较大者。

组与组的输出行之间无多余的空行,每行的开头和结尾无多余的空格。

输入范例 :

i
212
323
f
1.1
0.51
s
China
china
i
3243
253
e

输出范例 :

323
1.1
china
3243
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
template <class T>
class MyClass {
public:T value;MyClass(T& value) : value(value) { };MyClass(){}bool operator > (const MyClass<T> &) const;T getValue() { return value; }T getMax(MyClass& myClass) { return this->value > myClass.getValue() ? this->value : myClass.getValue(); }
};
template<class T>
bool MyClass<T>::operator > (const MyClass<T> & p) const {return value > p.value;
}
int main() {char ch;int m, n;MyClass<int> pI, qI;float f, g;MyClass<float> pF, qF;string s, t;MyClass<string> pS, qS;while (cin >> ch && ch != 'e') {getchar();switch (ch) {case 'i':cin >> m >> n;pI = MyClass<int>(m);qI = MyClass<int>(n);cout << pI.getMax(qI) << endl;break;case 'f':cin >> f >> g;pF = MyClass<float>(f);qF = MyClass<float>(g);cout << pF.getMax(qF) << endl;break;case 's':cin >> s >> t;pS = MyClass<string>(s);qS = MyClass<string>(t);cout << pS.getMax(qS) << endl;break;}}return 0;
}

20 长方形?

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

实验目的:学习友元的使用。

实验内容:

定义一个Point类,包括两个私有成员:int x, int y,它们分别表示一个点的x和y座标。

再定义构造函数:

Point(int x, int y),即传两个参数,构造一个点对象。

定义一个Rectangle类,包括4个私有成员:Point topLeft, topRight,bottomLeft, bottomRight,它们分别表示长方形4个顶点的座标。

注意:在计算机系统里,座标系如下定义:屏幕的左上角的座标是(0,0),x轴是横轴,屏幕的最右端x值最大,y轴是纵轴,屏幕的最下方y值最大。图如下:

再定义构造函数:

Rectangle(Point topLeft, Point topRight, Point bottomLeft, Point bottomRight)

以及实例方法:

bool isRectangle()  //判断4个顶点构成的图形是不是长方形,是则返回true,否则返回false。这个方法只在本类中调用,所以可声明为private的。

int getArea()    //如果是长方形则返回长方形的面积,否则返回0

bool isIn(Point p)   //如果是长方形则判断传入的点是否在该图形之内(不包括边界),如果在内部返回true,不在内部则返回false。如果不是长方形,则一律返回false。

说明:由于在Rectangle类中有大量的语句需要使用到Point类的私有成员x和y,因此,使用友元可直接访问x和y,从而可减少编程中的麻烦。

使用main函数测试以上getArea方法和isIn方法。main函数可参考如下代码:

int main()
{
   int topLeftX, topLeftY, topRightX, topRightY, bottomLeftX, bottomLeftY, bottomRightX, bottomRightY;
   int px, py;

cin >> topLeftX >> topLeftY >> topRightX >> topRightY >> bottomLeftX >> bottomLeftY >> bottomRightX >> bottomRightY;
   cin >> px >> py;

Point p(px, py);
   Rectangle r(Point(topLeftX, topLeftY), Point(topRightX, topRightY), Point(bottomLeftX, bottomLeftY), Point(bottomRightX, bottomRightY));
   cout << r.getArea() << endl;
   if (r.isIn(p))
        cout << "In" << endl;
   else
        cout << "Not in" << endl;

return 0;
}

输入说明 :

第一行输入长方形r的信息,包括四个顶点x座标及y座标,顶点的输入顺序为左上、右上、左下、右下。

第二行输入一个点p的信息,包括其x座标和y座标。

所有输入都为非负整数,之间以一个空格分隔。无多余空格或空行。

输出说明 :

输出两行,第一行输出长方形面积,第二行输出点p是否位于长方形r之内,如果在内部,则输出“In”,否则输出“Not in”。

输入范例 :

1 1 5 1 1 3 5 3
2 2

输出范例 :

8
In
#include <iostream>using namespace std;class Point {
private:int x; //x坐标int y;  //y坐标friend class Rectangle;
public:Point(const int x = 0, const int y = 0) :x(x), y(y) {};Point(const Point& point) { this->x = point.x; this->y = point.y; }//int getX()const { return x; }//int getY()const { return y; }
};class Rectangle {
private:Point topLeft;Point topRight;Point bottomLeft;Point bottomRight;bool isRectangle() {return (topLeft.x - topRight.x) == (bottomLeft.x - bottomRight.x)&& (topLeft.y - bottomLeft.y) == (topRight.y - bottomRight.y);}//friend class Point;
public:Rectangle() {}Rectangle(Point topLeft, Point topRight, Point bottomLeft, Point bottomRight): topLeft(topLeft), topRight(topRight), bottomLeft(bottomLeft), bottomRight(bottomRight) {};int getArea() {if (isRectangle()) {return (topLeft.x - topRight.x)*(topLeft.y - bottomLeft.y);}return 0;}bool isIn(Point p) {if (isRectangle()) {return p.x > topLeft.x && p.x < topRight.x&& p.y > topLeft.y && p.y < bottomLeft.y;}return false;}
};int main()
{int topLeftX, topLeftY, topRightX, topRightY, bottomLeftX, bottomLeftY, bottomRightX, bottomRightY;int px, py;cin >> topLeftX >> topLeftY >> topRightX >> topRightY >> bottomLeftX >> bottomLeftY >> bottomRightX >> bottomRightY;cin >> px >> py;Point p(px, py);Rectangle r(Point(topLeftX, topLeftY), Point(topRightX, topRightY), Point(bottomLeftX, bottomLeftY), Point(bottomRightX, bottomRightY));cout << r.getArea() << endl;if (r.isIn(p))cout << "In" << endl;elsecout << "Not in" << endl;return 0;
}

21 某年龄段内的学生

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

实验目的:组合对象、静态成员的使用。

实验内容:

设计一个Date类,包含:

1、私有实例属性年月日。

2、私有静态属性maxYear和minYear,

3、公有静态方法设置maxYear和minYear的值,如:

static void SetMaxYear(int maxY)

{

maxYear = maxY;

}

设计一个Student类,数据成员包含int类型的学号、string类型的姓名、Date类型的生日。

设计一个StudentList类,包含:

1、私有属性:Student对象数组,可声明大小为100,即保存不超过100个元素

2、私有属性:数组中实际保存的元素个数

3、公有方法:AddStudent(Student stu),将传入的形参stu增加到数组中

4、公有方法:DeleteStudent(int num),根据传入的学号num从数组中删除学生

5、公有方法:StudentList GetStudent(int year1, int year2),其中:

形参:包括两个int型值year1和year2,并且year1<=year2

功能:查找Student对象数组中所有出生年在year1和year2之间(含year1和year2)的学生

返回值:返回符合条件的学生,用一个StudentList对象返回

6、公有方法:Print(),输出Student对象数组中所有学生的信息,包括学号、姓名、生日(年月日)。如果数组中有多个元素(学生),则一个元素输出一行。如果数组中没有元素,则输出“No result.”

以上三个类只规定了必要的几个方法,其它的方法请自行设计,包括构造函数。

下面解释Date类中静态成员maxYear和minYear的作用:

由于学生入学年龄有限制,比如,规定大学生必须在13岁到45岁之间。因此,如果现在是2020年,则入学学生中,maxYear为2020-13=2007,minYear为2020-45=1975。

程序运行时,首先由用户输入maxYear和minYear,并存储到Date类中。

当创建Student对象时,如果发现学生的出生年份大于maxYear,则设置该学生的出生年为maxYear;如果发现学生的出生年份小于minYear,则设置该学生的出生年为minYear。

输入学生生日时,不需要检查日期是否合法。

main函数可参考如下代码:

int main()
{
   int num, birthYear, birthMonth, birthDay;
   int maxYear, minYear, year1, year2;
   int op;
   string name;
   StudentList sl;
   Student stu;

cin >> maxYear >> minYear;
   Date::SetMaxYear(maxYear);
   Date::SetMinYear(minYear);
   while (cin >> op)
   {
        switch (op)
        {
            case 1:
                cin >> num >> name >> birthYear >> birthMonth >> birthDay;
                stu = Student(num, name, Date(birthYear, birthMonth, birthDay));
                sl.AddStudent(stu);
                break;
            case 2:
                cin >> num;
                sl.DeleteStudent(num);
                break;
            case 3:
                cin >> year1 >> year2;
                StudentList temp = sl.GetStudent(year1, year2);
                temp.Print();
                break;
       }
   }
   return 0;
}

输入说明 :

首先输入两个整数maxYear和minYear。并保证maxYear>=minYear。

然后输入多组测试数据,每组测试数据包含两行:

第一行输入一个操作的种类:

1:增加一个学生

2:删除一个学生

3:输入两个年份,输出出生日期在这两年(包含这两年)之间的所有学生的信息。

第二行输入所需要的参数:

对于第1个操作,第二行输入学生的信息,包括学号、姓名(中间无空格)、出生年、出生月、出生日。

对于第2个操作,第二行输入一个编号num

对于第3个操作,第二行输入两个year:year1和year2,并保证year1<=year2。

所有输入数据之间以一个空格分隔。无多余空格或空行,两组测试数据之间也无空行。

在输入时,将保证不会向学生列表中添加一个学号(num)已经存在的学生。

输出说明 :

仅第3个操作有输出,因此,测试数据中必然包含第3个操作。

第3个操作输出符合条件的所有学生的信息,包括学号、姓名、出生年、出生月、出生日。

每个学生的输出占一行,输出的数据项之间以一个空格分隔。

如果没有符合条件的学生,则输出一行“No result.”,不包括引号。

如果有多个学生,输出学生的顺序为学生加入的顺序。

输出中无多余空格,也无多余空行。

输入范例 :

2007 1990
1
1 Rose 2002 1 1
1
2 Kevin 1992 1 1
1
3 John 2012 1 1
3
1992 2010
2
2
1
2 Tom 1987 1 1
3
1987 2010

输出范例 :

1 Rose 2002 1 1
2 Kevin 1992 1 1
3 John 2007 1 1
1 Rose 2002 1 1
3 John 2007 1 1
2 Tom 1990 1 1
#include <iostream>
#include <string>
#include <cstdio>
#include <vector>using namespace std;class Date {
private:int day;int month;int year;static int maxYear;static int minYear;public://Date(birthYear, birthMonth, birthDay)Date(int y, int m, int d) :year(y), month(m), day(d) {};//初始化列表Date(){}int getYear() const { return year; }int getMonth() const { return month; }int getDay() const { return day; }void setYear(int year) { this->year = year; }static void SetMaxYear(int maxY) { maxYear = maxY; }static void SetMinYear(int minY) { minYear = minY; }int getMaxYear() const { return maxYear; }int getMinYear() const { return minYear; }
};
int Date::maxYear = 0;
int Date::minYear = 0;class Student {
private:int num;string name;Date birthDate;public://Student(num, name, Date(birthYear, birthMonth, birthDay))//Student(int number, string name,Date date) { this->number = number; this->name = name; birthDate = date;}Student(int num, string name, Date date) : num(num), name(name), birthDate(date) {};//初始化列表按照声明顺序依次来Student() {}string getName()const { return name; }int getNum()const { return num; }int getBirthYear()const { return birthDate.getYear(); }int getBirthMonth()const { return birthDate.getMonth(); }int getBirthDay()const { return birthDate.getDay(); }void checkBirthYear() {if (birthDate.getYear() < birthDate.getMinYear()) {birthDate.setYear(birthDate.getMinYear());}if (birthDate.getYear() > birthDate.getMaxYear()) {return birthDate.setYear(birthDate.getMaxYear());}}bool isChecked() {return (birthDate.getYear() >= birthDate.getMinYear()) && (birthDate.getYear() <= birthDate.getMaxYear());}
};const int N = 100;
typedef vector<Student> VS;
class StudentList {
private://Student stu[N];VS vs;int numbers;public:StudentList() { vs.clear();  numbers = 0; }void AddStudent(Student stu);void DeleteStudent(int num);StudentList GetStudent(int year1, int year2);void Print();
};
void StudentList::AddStudent(Student stu) {vs.push_back(stu);++numbers;//cout << "-----------------" << endl;
}
void StudentList::DeleteStudent(int num) {for (unsigned int i = 0; i < vs.size(); ++i) {if (vs[i].getNum() == num) {vs.erase(vs.begin()+i);--numbers;}}
}
StudentList StudentList::GetStudent(int year1, int year2) {StudentList temp;for (unsigned int i = 0; i < vs.size(); ++i) {if (!vs[i].isChecked()) {//出生年的校正vs[i].checkBirthYear();}if (year1 <= vs[i].getBirthYear() && vs[i].getBirthYear() <= year2) {temp.vs.push_back(vs[i]);}}temp.numbers = temp.vs.size();//cout << "size = " << temp.numbers << endl;return temp;
}
void StudentList::Print() {if (!numbers) {cout << "No result." << endl;return;}int len = vs.size();for (int i = 0; i < len; ++i) {cout << vs[i].getNum() << " " << vs[i].getName() << " " << vs[i].getBirthYear() << " " << vs[i].getBirthMonth() << " " << vs[i].getBirthDay() << endl;}
}int main() {int num, birthYear, birthMonth, birthDay;int maxYear, minYear, year1, year2;int op;string name;StudentList sl;Student stu;cin >> maxYear >> minYear;Date::SetMaxYear(maxYear);Date::SetMinYear(minYear);while (cin >> op) {switch (op) {case 1:cin >> num >> name >> birthYear >> birthMonth >> birthDay;stu = Student(num, name, Date(birthYear, birthMonth, birthDay));sl.AddStudent(stu);break;case 2:cin >> num;sl.DeleteStudent(num);break;case 3:cin >> year1 >> year2;StudentList temp = sl.GetStudent(year1, year2);temp.Print();break;}}return 0;
}

22 统计字符串个数

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

实验目的:静态成员、构造函数、析构函数、等于号的使用。

实验内容:

实现一个自己的字符串类MyString,要求包含以下函数:

构造函数:

MyString(unsigned n,char c):将字符c重复n次得到字符串

MyString(char *p):根据传入的字符数组得到字符串

根据需要,还需要设计默认构造函数、拷贝构造函数等其它函数。

其中,MyString类需要提供一个静态方法GetCount,功能为获取到本程序在运行的过程中某时刻有多少个MyString的对象。

本次实验提供了部分代码,请使用以下代码调用MyString类的功能完成输入、处理、输出操作:

void fun1(int n)
{
    MyString strArr[n];
    MyString *pStr;
    cout<<strArr[0].GetCount()<<endl;
}
void fun2(int n)
{
    MyString *pStr=new MyString[n];
    cout<<MyString::GetCount()<<endl;
}
void fun3(MyString &s1, MyString s2)
{
    MyString s3;
    s3=s1=s2;
    cout<<MyString::GetCount()<<endl;
    s3.ShowStr();
    cout<<endl;
}
int main( )
{
 MyString s1;
 MyString s2;
    int n;
    char charArr[20];
 int op;

while (cin >> op)
    {
        switch (op)
        {
            case 1:
            {
                cin>>n;
                fun1(n);
                break;
            }
            case 2:
            {
                cin>>n;
                fun2(n);
                break;
            }
            case 3:
            {
                int m;
                char ch;
                cin>>m>>ch;
                s2=MyString(m,ch);
                fun3(s1,s2);
                s1.ShowStr();

cout<<endl;

break;
            }
            case 4:
            {
                cin >> charArr;
                s1=MyString(charArr);
                cout<<MyString::GetCount()<<endl;
                s1.ShowStr();
                cout<<endl;
                break;
            }
        }
    }

return 0;
}

输入说明 :

可输入多组测试数据,每组测试数据包含两行:

第一行输入一个操作的种类,

第二行输入所需要的参数:

对于第1个操作和第2个操作,第二行输入一个整数。

对于第3个操作,第二行输入一个整数及一个字符。

对于第4个操作,第二行输入一个字符串。

输出说明 :

具体输出见函数中的输出语句及输出范例。

输入范例 :

1
3
2
3
1
3
3
10 *
4
abcd

输出范例 :

5
5
8
7
**********
**********
5
abcd
// 2017.04.02 T25. 好题目,训练!!
//自定义类和内存自动分配...尽可能的不要借助任何库函数!
//School ~ DongHua University
//Turbo Test System , Test 25 -- Record ~
//  Codes   created by the rebuilt boy  ManTruer
//Student ID  : 151340112
//Class     :       Xin'an 1501
//Date  :       2017.04.03//有人不老实啊,完全拷贝了我以前写的代码。。。
///CSDN我的原文 https://blog.csdn.net/I_love_you_dandan/article/details/68955606#include <iostream>
#include <cstring>
using namespace std;class MyString{//使用内存分配new出自定义的类MyString...private:char *p_str; //pointer to string ...int len; //string.size()static int CountObj; //number of objectspublic:static int GetCountObj();void ShowStr(){ cout<<p_str; }MyString();MyString(int ,char );MyString(const char * );MyString( const MyString &);~MyString();MyString & operator=(const MyString &);//重载赋值运算符,字符串赋值MyString & operator=(const char*); //单个字符赋值char &operator[]( int  ); //定义元素索引标识const char & operator[]( int ) const ;friend bool operator==(const MyString &, const MyString &);//重载判等运算符friend bool operator<(const MyString &, const MyString &); //小于号friend bool operator>(const MyString &st1, const MyString &); //大于号friend ostream & operator<<(ostream &,const MyString &);//重载输出运算符friend MyString & operator+(MyString &, MyString &) ;//加法,相连接
};
int MyString::CountObj = 0;
int MyString::GetCountObj(){ return CountObj ; }MyString::MyString(){++CountObj; //object +1//     cout<<"加11!"<<endl;  //用于追踪程序。。。len = 0 ;p_str = new char[ 1 ] ;//为了与 delete对应必须也在此 new...p_str[ 0 ] = '\0' ;
}
MyString::MyString(int n,char c){++CountObj; //object +1
//    cout<<"加22!"<<endl; //程序线程跟踪len = n ;p_str = new char[ len+1];for( int i=0; i<len; ++i )p_str[ i ] = c ;p_str[ len ] = '\0' ; //此处不能再用 i 作为索引,因为 i 生命周期已过...
}
MyString::MyString(const char *str ){++CountObj; //object +1
//    cout<<"加33!"<<endl; //程序线程跟踪len = strlen( str );p_str = new char[ len+1 ];strcpy( p_str, str );
}
MyString::MyString(const MyString&other){++CountObj;
//    cout<<"加44!"<<endl; //程序线程跟踪len = other.len;p_str = new char[ len+1 ];strcpy( p_str, other.p_str ) ;
}
MyString::~MyString(){--CountObj;delete[] p_str;//       cout<<"减咯~!"<<endl; //程序线程跟踪
}MyString & MyString::operator=(const MyString &myStr){if( this->p_str == myStr.p_str )return *this ;if( p_str )delete [] p_str;//必须先清空,先释放当前对象的堆内存len = myStr.len;p_str = new char[ len + 1 ] ;strcpy( p_str , myStr.p_str ) ;return *this;
}
MyString & MyString::operator=(const char* s ){delete [] p_str;len = strlen( s );p_str = new char[ len+ 1 ] ;strcpy( p_str, s );return *this ;
}
char & MyString::operator[](int i ){return p_str[ i ] ;
}
const char & MyString::operator[](int i ) const {return p_str[ i ] ;
}
bool operator==(const MyString &str, const MyString &s ) {return  0 == strcmp( str.p_str, s.p_str)  ;
}
bool operator<(const MyString &str, const MyString &s){return strcmp( str.p_str, s.p_str )<0 ;
}
bool operator>(const MyString &str, const MyString &s){return strcmp( str.p_str, s.p_str )>0 ;
}
ostream & operator <<(ostream &os, const MyString &myStr){os<<myStr.p_str;return os ;
}
MyString & operator+( MyString & left, MyString & right ){MyString *pStr = new MyString(" ") ;pStr->p_str = new char[ strlen(left.p_str) + strlen(right.p_str) ] ;strcpy( pStr->p_str, left.p_str ) ;strcpy( pStr->p_str, right.p_str );return *pStr ;
}void fun1(int n){MyString strArr[n];MyString *pStr;cout<<strArr[0].GetCountObj()<<endl;
}
void fun2(int n){MyString *pStr=new MyString[n];cout<<MyString::GetCountObj()<<endl;
}
void fun3(MyString &s1, MyString s2){MyString s3;s3=s1=s2;cout<<MyString::GetCountObj()<<endl;s3.ShowStr();cout<<endl;
}int main( ){MyString s1;MyString s2;int n;char charArr[20];int op;while (cin >> op && op){switch (op){case 1:{cin>>n;fun1(n);break;}case 2:{cin>>n;fun2(n);break;}case 3:{int m;char ch;cin>>m>>ch;s2=MyString(m,ch);fun3(s1,s2);s1.ShowStr();cout<<endl;break;}case 4:{cin >> charArr;s1=MyString(charArr);cout<<MyString::GetCountObj()<<endl;s1.ShowStr();cout<<endl;break;}}}return 0;
}

23 提醒队列

作者: Turbo时间限制: 1S章节: OO:类

问题描述 :

实验目的:学习拷贝构造函数、析构函数的使用以及重载等于号。

实验内容:

设计一个类Note(提醒),包含时间和事件内容,时间由年月日时分秒组成,事件内容用字符串表示。

类的编码大致如下:

class Note

{

int year, month, day, hour, minute, second;

char *event;  //本题要求event必须为一个字符串指针,不能为字符数组或string字符串

//以下只说明了两个构造函数,可根据需要自己增加构造函数的重载

Note(char * msg, int year, int month, int day, int hour=0, int minute=0, int second=0);

Note(Note & note);

~Note();

//还需要重载等于号,还可根据需要设计ShowNote()方法,用来显示“提醒”的时间和内容

}

再设计一个提醒列表类:NoteList,

私有数据成员包含一个Note数组(如果可能,最好使用vector代替数组)

还有以下成员函数:

插入提醒信息(插入后保持按时间升序排序,如果两个提醒信息时间完全相同,则后插入的排在后)

删除数组中第0个提醒信息并作为函数值返回(因为是按时间排序,所以第0个肯定是时间最早的一个)

输出所有提醒信息

获得提醒信息的数量

NoteList的成员大致为:

数据成员:

一个Note数组:noteArr

一个int成员:noteCount

函数成员:

构造函数

AddNote(Note n):插入提醒信息(插入后保持按时间升序排序)

Note DeleteFirst(): 删除数组中第0个提醒信息,并将其作为函数值返回

PrintAll():输出所有提醒信息

GetNoteCount():获得提醒信息的数量

可根据自己需要再增加其它成员。

main函数参考如下代码:

int main()
{
 char eventMsg[100];
 Note n2;
 int year,month,day,hour,minute,second;
 int i,n;
 NoteList notes;
 int op;
    while (cin >> op)
    {
        switch (op)
        {
            case 1:
            {
                cin>>year;
                cin>>month;
                cin>>day;
                cin>>hour;
                cin>>minute;
                cin>>second;
                cin.get();
                cin.getline(eventMsg,90);
                Note nt(eventMsg,year,month,day,hour,minute,second);
                notes.AddNote(nt);
                break;
            }
            case 2:
            {
                if (notes.GetNoteCount()>0)
                {
                    Note nt=notes.DeleteFirst();
                    nt.ShowNote();
                }                
                break;
            }
            case 3:
            {
                int cnt = notes.GetNoteCount();
                cout<<cnt<<" notes:"<<endl;
                notes.PrintAll();
                break;
            }
        }
    }
 return 0;
}

输入说明 :

可输入多组测试数据,每组测试数据包含一行或者两行:

第一行输入一个操作的种类:

1:输入一个提醒信息并插入

2:输出并删除提醒列表中时间最早的信息

3:输出所有提醒信息。

第二行输入所需要的参数:

对于第1个操作,第二行输入年月日时分秒及提醒信息字符串,以一个空格分隔各数据,提醒信息中可包含空格。

对于第2个操作和第3个操作,不需要输入额外数据。

输入中无多余空格或空行,两组测试数据之间也无空行。

输出说明 :

第1个操作无输出。

第2个操作输出一个提醒事件的具体信息,格式如下:

2020-01-01 08:10:10 go to class

其中,年月日之间以一个减号分隔,时分秒之间以一个冒号分隔,日期后及秒钟后跟一个空格,最后是提醒事件的内容(字符串),注意不要包含多余空格。

月日及时分秒的输出均占两位,如果不足两位,在前面补“0”。

第3个操作输出所有提醒事件的信息,格式如下:

2 notes:

2020-01-01 08:10:10 go to class

2020-01-01 10:00:00 go to library

第一行输出共有多少个notes,然后跟n行,

每个提醒信息占一行,输出格式见第2个操作的描述。

输出中无多余空格,也无多余空行。

输入范例 :

1
2010 1 1 9 0 0 go to class
1
2010 1 1 7 0 0 get up
1
2010 1 1 7 0 0 call zhang san
3
2
2
3

输出范例 :

3 notes:
2010-01-01 07:00:00 get up
2010-01-01 07:00:00 call zhang san
2010-01-01 09:00:00 go to class
2010-01-01 07:00:00 get up
2010-01-01 07:00:00 call zhang san
1 notes:
2010-01-01 09:00:00 go to class
#include <iostream>
#include <cstring>
#include <vector>
#include <iomanip>
using namespace std;const int N = 100;
class Note{
private:int year, month, day, hour, minute, second;char *event;  //本题要求event必须为一个字符串指针,不能为字符数组或string字符串
public:Note(char * msg, int year, int month, int day, int hour = 0, int minute = 0, int second = 0){event = new char[N];//event = msg;strcpy(event, msg);this->year = year; this->month = month; this->day = day;this->hour = hour; this->minute = minute; this->second = second;};Note(const Note & note) {//拷贝构造函数event = new char[N];strcpy(event, note.event);//event = note.event; year = note.year; month = note.month;  day = note.day; hour = note.hour; minute = note.minute; second = note.second;}Note(){ event = new char[N]; }~Note() { delete[] event; }bool operator <(const Note& note) {if (this == &note) {return false;}return year < note.year || month < note.month && day < note.day || hour < note.hour || minute < note.minute|| second < note.second;}Note& operator =(const Note& note) {if (this != &note) {//event = note.event;strcpy(event, note.event);year = note.year; month = note.month;  day = note.day;hour = note.hour; minute = note.minute; second = note.second;}return *this;//return容易被遗漏}void OutBySetw(int& num) { cout << setfill('0') << setw(2) << num; }void ShowNote() {OutBySetw(year); cout << "-"; OutBySetw(month); cout << "-";  OutBySetw(day); cout << " ";OutBySetw(hour); cout << ":"; OutBySetw(minute); cout << ":"; OutBySetw(second); cout << " ";cout << event << endl;}};typedef vector<Note> VN;
class NoteList {
private:VN noteArr;int noteCount;
public:NoteList() { noteArr.clear();  noteCount = 0; }void AddNote(Note );Note DeleteFirst();void PrintAll();int GetNoteCount();
};
void NoteList::AddNote(Note note) {unsigned int len = noteArr.size();//if (!len) {//   noteArr.push_back(note);//}unsigned int i = 0;for (; i < len; ++i) {if( note < noteArr[i] ){break;}}noteArr.insert(noteArr.begin() + i, note);++ noteCount;
}Note NoteList::DeleteFirst() {Note temp(noteArr[0]);noteArr.erase(noteArr.begin());-- noteCount;return temp;
}void NoteList::PrintAll() {for (unsigned int i = 0; i < noteArr.size(); ++i) {noteArr[i].ShowNote();}
}
int NoteList::GetNoteCount() {return noteCount;
}int main(){char eventMsg[100];Note n2;int year, month, day, hour, minute, second;NoteList notes;int op;while (cin >> op){switch (op){case 1:{cin >> year;cin >> month;cin >> day;cin >> hour;cin >> minute;cin >> second;cin.get();cin.getline(eventMsg, 90);Note nt(eventMsg, year, month, day, hour, minute, second);notes.AddNote(nt);break;}case 2:{if (notes.GetNoteCount() > 0){Note nt = notes.DeleteFirst();nt.ShowNote();}break;}case 3:{int cnt = notes.GetNoteCount();cout << cnt << " notes:" << endl;notes.PrintAll();break;}}}return 0;
}

24 单词转换为大写

作者: Turbo时间限制: 1S章节: OO:库

问题描述 :

从键盘读入一段文本到vector对象,每个单词存储为vector中的一个元素。

把vector对象中每个单词的小写字母转换为大写字母。

输出vector对象中转化后的元素,每八个单词为一行输出。

说明:为简单起见,单词的含义是空白字符分隔开的连续字符串。比如“I love China!”这句话包含三个单词,第三个单词是“China!”(包括其中的感叹号),再如“Hi !”,这句话包含两个单词,第二个单词仅为一个感叹号。

输入说明 :

输入一段文本,其中可能包括英文字母以及其它符号,也可能包含换行。

输出说明 :

将以上文本转换为大写,每行输出8个单词,每个单词之间以一个空格分隔。

行首与行尾无多余空格。

也无多余空行。

输入范例 :

CDMA Tool features:
Automatic detect model and update software, download files from server
No waiting for shipping, CDMA Tool You download from our website
Unlock SPC, MSL, SPC3, FSK, OTKSL, User Lock, MIN lock, SIM LOCK

输出范例 :

CDMA TOOL FEATURES: AUTOMATIC DETECT MODEL AND UPDATE
SOFTWARE, DOWNLOAD FILES FROM SERVER NO WAITING FOR
SHIPPING, CDMA TOOL YOU DOWNLOAD FROM OUR WEBSITE
UNLOCK SPC, MSL, SPC3, FSK, OTKSL, USER LOCK,
MIN LOCK, SIM LOCK
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;typedef vector<string> VS;
class Toupper {
private:VS vs;
public:Toupper() { vs.clear(); }void computing(string&);void outResult();
};void Toupper::computing(string& str) {transform(str.begin(), str.end(), str.begin(), ::toupper);vs.push_back(str);
}
void Toupper::outResult() {VS::iterator iter = vs.begin();int num = 1;while (iter != vs.end()) {if (iter == vs.end() - 1) {cout << *iter;}else if ( 0 == num % 8 ) {cout << *iter << endl;}else {cout << *iter << " ";}++ iter;++ num;}
}
int main(){string str;Toupper to;while ( cin >> str) {to.computing(str);}to.outResult();return 0;
}

25 相邻数相加

作者: Turbo时间限制: 1S章节: OO:库

问题描述 :

读一组整数(数目事先不知道,以-1结束输入)到 vector 里,计算每对相邻元素的和。

如果读入元素个数为奇数,则直接使用最后一个元素作为和值。

全部的和求出后,倒序输出这些和值,即最后一个和值最先输出。

输入说明 :

输入一组整数,可能包括多行,以-1结束输入(-1不作为整数输入)。

输出说明 :

倒序输出和值,两个整数之间以一个空格分隔。

行首与行尾无空格。

输入范例 :

1 2 3 4
3 2 1-1

输出范例 :

1 5 7 3
#include <iostream>
#include <vector>
using namespace std;typedef vector<int> VI;
int main() {VI vi;int m,n;vi.clear();while (cin >> m) {if (-1 == m) {break;}cin >> n;if (-1 == n) {vi.push_back(m);break;}vi.push_back(m+n);}for( unsigned int i=0,j=vi.size()-1;i<j;++i,--j){int temp = vi[i];vi[i] = vi[j];vi[j] = temp;}for (unsigned int i = 0; i < vi.size(); ++i) {if (i==vi.size()-1) {cout << vi[i] ;}else {cout << vi[i] << " ";}}return 0;
}

26 从Point继承的Rectangle

作者: Turbo时间限制: 1S章节: OO:继承

问题描述 :

实验目的:学习继承的编程方法

实验内容:

定义一个Point类,包括:

两个私有数据成员:int x, int y,它们分别表示一个点的x和y座标。

构造函数:

Point(int x, int y),即传两个参数,构造一个点对象。

注意,本题要求Point类不得定义缺省构造函数,也就是只定义以上所说的构造函数。

成员函数:

Move(int dx, int dy),将Point对象移动dx,dy的距离。

定义一个Rectangle类,继承Point类,基类对象的x和y表示长方形左上角的坐标。

Rectangle类包括:

两个私有数据成员:int width, int height,它们分别表示长方形的横向的宽度和纵向的高度。

构造函数:

Rectangle(int x, int y, int width, int height)。

成员函数:

int getArea ()    //获取该图形的面积

bool isIn(Point p)   //判断传入的点是否在该图形之内(不包括边界),如果在内部返回true,否则返回false

使用main函数测试以上getArea方法和isIn方法。main函数使用如下代码:

int main()

{

int topLeftX, topLeftY, width, height;

int px, py, dx, dy;

cin>>topLeftX>>topLeftY>>width>>height;

cin>>px>>py;

cin>>dx>>dy;

Point p(px, py);

Rectangle r(topLeftX, topLeftY, width, height);

cout<<r.getArea()<<endl;

if(r.isIn(p))

cout<<"In"<<endl;

else

cout<<"Not in"<<endl;

r.move(dx,dy);

if(r.isIn(p))

cout<<"In"<<endl;

else

cout<<"Not in"<<endl;

return 0;

}

输入说明 :

第一行输入长方形r的信息,包括左上角顶点x座标、左上角顶点y座标、宽度、高度。

第二行输入一个点p的信息,包括其x座标和y座标。

第三行输入长方形移动的距离,分别为在x方向和在y方向移动的距离。

所有输入都为整数,之间以一个空格分隔。无多余空格或空行。

输出说明 :

输出三行:

第一行输出长方形面积。

第二行输出点p是否位于长方形r之内,如果在内部,则输出“In”,否则输出“Not in”。

第三行输出点p移动后是否位于长方形r之内,如果在内部,则输出“In”,否则输出“Not in”。

输入范例 :

1 0 10 9
11 3
2 0

输出范例 :

90
Not in
In
#include <iostream>using namespace std;class Point {
protected:int x; //x坐标int y;  //y坐标public:Point(const int x = 0, const int y = 0) :x(x), y(y) {};int getX() { return x; }int getY() { return y; }void move(int dx, int dy) { x += dx; y += dy; }//void move(int dx, int dy) { x -= dx; y -= dy; }
};class Rectangle :public Point {
private:int width;int height;public:Rectangle(int x = 0, int y = 0, int width = 0, int height = 0) {this->x = x; this->y = y; this->width = width; this->height = height;}//    : x(x), y(y), width(width), height(height) {};int getArea() { return  width * height; }bool isIn(Point);
};bool Rectangle::isIn(Point p) {//return (p.getX() > x && p.getX() < x + width && p.getY() > y && p.getX() < y + height);//看出错误了没return (p.getX() > x && p.getX() < x + width && p.getY() > y && p.getY() < y + height);
}
int main() {int topLeftX, topLeftY, width, height;int px, py, dx, dy;cin >> topLeftX >> topLeftY >> width >> height;cin >> px >> py;cin >> dx >> dy;Point p(px, py);Rectangle r(topLeftX, topLeftY, width, height);cout << r.getArea() << endl;if (r.isIn(p))cout << "In" << endl;elsecout << "Not in" << endl;r.move(dx, dy);//p.move(dx, dy);if (r.isIn(p))cout << "In" << endl;elsecout << "Not in" << endl;return 0;
}

27 统计单词

作者: Turbo时间限制: 1S章节: OO:库

问题描述 :

实验目的:string、vector、类的综合应用。

实验内容:

从键盘输入一篇文章,统计其中单词出现的次数(不区分大小写),并输出出现次数排名第一的单词及其次数。注意:可能有多个单词并列第一,需要全部输出。输出时,如果有多个单词排名并列,则按其在文章中出现的先后顺序输出,先出现的先输出。

说明:为简单起见,单词的含义是空白字符分隔开的连续字符串。比如“I love China!”这句话包含三个单词,第三个单词是“China!”(包括其中的感叹号),再如“Hi !”,这句话包含两个单词,第二个单词仅为一个感叹号。

参考以下main函数:

int main()

{

vector<WordCount> vwc;

string str;

int i;

while(cin>>str)

{

str = ToLower(str);

CountWord(vwc, str);

}

DisplayResult(vwc);

return 0;

}

其中:

  1. WordCount类:存储单词及其出现次数

  2. ToLower函数:传入一个字符串,将其中大写英文字母转换为小写、其余字符保持不变,返回转换后的结果。

  3. CountWord函数:传入一个vector和一个单词,在vector中查找该单词是否已存在(注意:vector中的元素为WordCount对象,该对象有一个属性为单词字符串),如果已存在,则将其出现次数加1,否则在vector中添加一个元素(WordCount对象),该元素存储这个新的单词及其出现次数(此时为1)。

  4. DisplayResult函数:传入一个vector,输出其中出现次数最高的单词及其次数。

    请实现以上定义的WordCount类及三个函数。

输入说明 :

输入一篇文章,其中包含可见字符及空白字符(可能有换行)。

输出说明 :

每个单词占一行,如果有n个单词,则输出n行,

每行首先输出单词(以小写字母形式输出),然后输出一个空格,再输出单词的出现次数。

单词输出的顺序按照在文章中出现的先后顺序。

输入范例 :

abc Abc, ABC.
abc!
abc, def
DEf

输出范例 :

abc, 2
def 2
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>using namespace std;
int times = 1;class WordCount {
private:string str;int num;
public:
};
typedef pair<string,int> PSI;
typedef vector<PSI> VP;string ToLower(string& str) {transform(str.begin(), str.end(), str.begin(), ::tolower);return str;
}void CountWord(VP& vp, string& str) {bool flag = false;for (unsigned int i = 0; i < vp.size(); ++i) {if (str == vp[i].first) {++ vp[i].second;flag = true;}if (times < vp[i].second) {times = vp[i].second;}}if (!flag) {vp.push_back(PSI(str, 1));}
}
void DisplayResult(VP& vp) {for (unsigned int i = 0; i < vp.size(); ++i) {if (vp[i].second == times) {cout << vp[i].first << " " << times << endl;}}
}int main(){VP vp;string str;while (cin >> str){str = ToLower(str);CountWord(vp, str);//if (str == "end") {  break;}}DisplayResult(vp);return 0;
}

28 面积和

作者: Turbo时间限制: 1S章节: OO:多态

问题描述 :

实验目的:多态的应用

实验内容:

定义类Point,包括:

两个私有数据成员:int x, int y,它们分别表示一个点的x和y座标。

构造函数:

Point(int x, int y),即传两个参数,构造一个点对象。

注意,本题要求Point类不得定义缺省构造函数,也就是只定义以上所说的构造函数。

虚成员函数:

double getArea ()    //获取该图形的面积

bool isIn(Point p)   //判断传入的点是否在该图形之内(不包括边界),如果在内部返回true,否则返回false

定义一个Rectangle类,继承Point类,基类对象的x和y表示长方形左上角的坐标。

Rectangle类包括:

两个私有数据成员:int width, int height,它们分别表示长方形的横向的宽度和纵向的高度。

构造函数:

Rectangle(int x, int y, int width, int height)。

成员函数:

实现double getArea ()  和bool isIn(Point p) 函数。

定义一个Circle类,继承Point类,基类对象的x和y表示圆心的坐标。

Circle类包括:

一个私有数据成员: double r,表示圆的半径。

构造函数:

Circle(double x, double y, double r)

成员函数:

实现double getArea ()  和bool isIn(Point p) 函数。计算圆的面积时,PI=3.14。

使用以下main函数测试。测试内容为:首先输入一个点p的信息,然后输入若干长方形及圆形,Point类型的ppArr指针数组里的元素指向这些对象。最后遍历ppArr数组,判断p位于哪些对象之内,然后计算这些对象的面积之和并输出。

main函数如下:

int main()

{

int topLeftX, topLeftY, width, height;

int px, py;

int op, radius, count=0;

Point *ppArr[100];  //声明一个指针数组,最多存放100个Point对象的指针

double totalArea = 0;

cin>>px>>py;

Point p(px, py);

while (cin >> op)

{

switch (op)

{

case 1:

{//往数组里添加元素,指向长方形对象

cin>>topLeftX>>topLeftY>>width>>height;

ppArr[count++] = new Rectangle(topLeftX, topLeftY, width, height);

break;

}

case 2:

{//往数组里添加元素,指向圆形对象

cin>>px>>py>>radius;

ppArr[count++] = new Circle(px, py, radius);

break;

}

}

}

for(int i=0; i<count; i++)

{//遍历ppArr数组,判断p位于哪些对象之内,然后计算这些对象的面积之和

if (ppArr[i]-> isIn(p))

totalArea += ppArr[i]->getArea();

}

cout<<totalArea<<endl;

return 0;

}

输入说明 :

第一行输入两个整数,表示点p的x和y座标

其后若干行,每行为一个对象的信息,具体如下:

首先输入一个整数1或2,

如果输入1,表示本行后面将输入4个整数,分别表示长方形左上角x和y座标及长方形宽度、高度。

如果输入2,表示本行后面将输入3个整数,分别表示圆形的圆心x和y座标及半径。

所有输入均为整数,中间以空格分隔。

输出说明 :

输出计算结果,类型为一个double型数。

输入范例 :

1 1
1 0 0 2 2
2 1 0 2
1 1 0 3 4
2 0 0 1

输出范例 :

16.56
//虚函数是指一个类中你希望重载的成员函数 ,当你用一个基类指针或引用
//指向一个继承类对象的时候,调用一个虚函数时, 实际调用的是继承类的版本
//
#include <iostream>
#include <cmath>
using namespace std;class Point {
protected:int x; //x坐标int y;  //y坐标//double x, y;
public:Point(const int x = 0, const int y = 0) :x(x), y(y) {};double getX() { return x; }double getY() { return y; }virtual double getArea() { return 0.0; }virtual bool isIn(Point& p) { return false; }//注意,当继承类的函数并未使用相同形参(包括传值方式不同)时,编译器无法实现动态联编
};class Rectangle :public Point {
private:int width;int height;public:Rectangle(int x = 0, int y = 0, int width = 0, int height = 0) {this->x = x; this->y = y; this->width = width; this->height = height;}//    : x(x), y(y), width(width), height(height) {};//继承的数据成员x,y不可初始化列表double getArea() { return  width * height; }bool isIn(Point& );
};
bool Rectangle::isIn(Point& p) {return (p.getX() > x && p.getX() < x + width && p.getY() > y && p.getY() < y + height);
}const double PI = 3.14;
class Circle :public Point {
private:double r;public:Circle(double x = 0, double y = 0, double r = 0) {this->x = x; this->y = y; this->r = r;}double getArea() { return  PI * r * r ; }bool isIn(Point& );
};
bool Circle::isIn(Point& p) {return r > sqrt((p.getX() - x)*(p.getX() - x) + (p.getY() - y)*(p.getY() - y));
}int main(){int topLeftX, topLeftY, width, height;int px, py;int op, radius, count = 0;Point *ppArr[100];  //声明一个指针数组,最多存放100个Point对象的指针double totalArea = 0;cin >> px >> py;Point p(px, py);while (cin >> op){//if (-1 == op) { break; }switch (op) {case 1: {//往数组里添加元素,指向长方形对象cin >> topLeftX >> topLeftY >> width >> height;ppArr[count++] = new Rectangle(topLeftX, topLeftY, width, height);//指向派生类,break;}case 2: {//往数组里添加元素,指向圆形对象cin >> px >> py >> radius;ppArr[count++] = new Circle(px, py, radius);break;}}}for (int i = 0; i < count; i++){//遍历ppArr数组,判断p位于哪些对象之内,然后计算这些对象的面积之和if (ppArr[i]->isIn(p))totalArea += ppArr[i]->getArea();}cout << totalArea << endl;return 0;
}

29 发工资

作者: Turbo时间限制: 1S章节: OO:多态

问题描述 :

实验目的:多态的应用

实验内容:

公司有三类雇员:老板、销售员、实习生。

老板每月固定5000元;销售员每月2000元底薪加提成,提成的计算方式为销售额的10%;实习生的工资按实习时间计算,每小时30元。

现输入若干雇员的信息,请输出一个月该发多少工资。

要求:

首先声明类employee,包含:

数据成员:

string name;

string role;

double salary;

以及

  • 构造函数:employee(string name, string role),并且仅声明这一个构造函数,无默认构造函数。

  • 虚函数calcSalary

  • 普通成员函数showInformation(该输出雇员的姓名、角色、工资信息)

  • 普通成员函数getSalary(返回salary的值)

再声明三个employee的派生类:boss、salesman、intern,类中需要实现虚函数calcSalary。

在main函数中,首先输入若干雇员的信息,放入empList中,然后遍历empList,计算各雇员的工资,输出其信息,最后输出总工资。

main函数代码如下:

int main()

{

vector<employee *> empList;

int op, salesCount, workHours;

string name;

while (cin >> op)

{

switch (op)

{

case 1:

{

cin>>name;

employee *pe = new boss(name);

empList.push_back(pe);

break;

}

case 2:

{

cin>>name>>salesCount;

employee *pe=new salesman(name, salesCount);

empList.push_back(pe);

break;

}

case 3:

{

cin>>name>>workHours;

employee *pe=new intern(name, workHours);

empList.push_back(pe);

break;

}

}

}

double totalSalary = 0;

for(int i=0; i<empList.size(); i++)

{

empList.at(i)->calcSalary();//先利用各派生类的多态性计算出工资

totalSalary += empList.at(i)->getSalary();

empList.at(i)->showInformation();

}

cout<<"total salary:"<<totalSalary<<endl;

return 0;

}

输入说明 :

输入若干行,每行输入一个雇员的信息。

每一行的输入形式为:

首先输入一个整数,表示雇员的种类,1为老板,2为销售员,3为实习生。

如果输入1,后面紧接着输入老板的姓名。

如果输入2,后面紧接着输入销售员的姓名及销售额。

如果输入3,后面紧接着输入实习生的姓名及实习小时数。

输入的姓名中无空格,销售额及实习小时数均为整数。

输出说明 :

如果共有n个雇员,则共输出n+1行,

前n行输出雇员的姓名、角色及工资,以空格分隔。角色为:boss、salesman、intern。

第n+1行输出工资总额。

n个雇员的输出顺序按照输入的顺序。

输入范例 :

1 David
2 Kevin 10000
3 stu1 80
2 John 10200
3 stu2 102
3 stu3 0

输出范例 :

David boss 5000
Kevin salesman 3000
stu1 intern 2400
John salesman 3020
stu2 intern 3060
stu3 intern 0
total salary:16480
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>using namespace std;
int times = 1;class employee {
protected:string name;string role;double salary;
public:employee(string name = "!!!", string role = "!!!") {  }//由子类实现virtual void calcSalary(){}//由子类实现void showInformation() { cout << name << " " << role << " " << salary << endl; }double getSalary() { return salary; }
};class boss :public employee {
private:
public:boss(string name, string role = "boss") { this->name = name; this->role = role; }void calcSalary() { salary = 5000.0; }
};class salesman :public employee {
private:int salesCount;
public:salesman(string name, int salesCount, string role = "salesman") { this->name = name; this->role = role; this->salesCount = salesCount; }void calcSalary() { salary = 2000.0 + 0.1*salesCount; }
};class intern :public employee {
private:int workHours;
public:intern(string name, int workHours, string role = "intern") { this->name = name; this->role = role; this->workHours = workHours; }void calcSalary() { salary = 30.0*workHours; }
};int main(){vector<employee *> empList;int op, salesCount, workHours;string name;while (cin >> op){if (!op) { break; }switch (op){case 1:{cin >> name;employee *pe = new boss(name);empList.push_back(pe);break;}case 2:{cin >> name >> salesCount;employee *pe = new salesman(name, salesCount);empList.push_back(pe);break;}case 3:{cin >> name >> workHours;employee *pe = new intern(name, workHours);empList.push_back(pe);break;}}}double totalSalary = 0;for (unsigned int i = 0; i < empList.size(); i++){empList.at(i)->calcSalary();//先利用各派生类的多态性计算出工资totalSalary += empList.at(i)->getSalary();empList.at(i)->showInformation();}cout << "total salary:" << totalSalary << endl;return 0;
}

30 字符串填充(默认形参)

作者: Turbo时间限制: 1S章节: OO:其它

问题描述 :

实验目的:学习函数的默认形参的使用。

内容:对于字符串,实现以下填充函数,并编写main函数测试这些函数:

1. padLeft函数:

功能:将一字符串左填充(在左边填充指定字符)至n个字符的长度,可指定填充字符,比如填充“*”,如果不指定填充字符,则填充空格。

提示:为实现以上功能,函数原型可为:

void  padLeft(char string1[], char string2[],  int n, char padding=' ')

或:

string padLeft(string string1, int n, char padding=' ')

这里使用了默认形参。

string1是原字符串,string2是填充之后的结果。

类似地,可编写右填充函数,函数原型参照padLeft。

2. padRight函数:

功能:将一字符串右填充至n个字符的长度,可指定填充字符,比如填充“*”,如果不指定填充字符,则填充空格。

main函数可参考如下进行编写:

int main()
{
 int num, length;
 char padding;
 string src, dest;

while(cin >> num)
 {
  switch(num)
  {
   case 11:
    cin >> src >> length;
    cout << padLeft(src, length) << endl;
    break;
   case 12:
    cin >> src >> length >> padding;
    cout << padLeft(src, length, padding) << endl;
    break;
   case 21:
    cin >> src >> length;
    cout << padRight(src, length) << endl;
    break;
   case 22:
    cin >> src >> length >> padding;
    cout << padRight(src, length, padding) << endl;
    break;
  }
 }
 return 0;
}

输入说明 :

测试程序输入时,每组测试数据包含两行,第一行输入一个整数,指定需要完成的操作,第二行为该操作需要的数据。
对于每个整数对应的操作及其相应数据的输入方式如下(输入的字符串中不包含空格):
11:对应padLeft,第二行输入字符串string1、整数n,其间以空格分隔(由于没指定填充字符,所以填充空格)
异常处理:如果string1的长度大于等于n,则不填充任何字符。

12:对应padLeft,第二行输入字符串string1、整数n、一个填充字符,其间以空格分隔(填充字符不为空格)
异常处理:如果string1的长度大于等于n,则不填充任何字符。

21:对应padRight,第二行输入字符串string1、整数n,其间以空格分隔(由于没指定填充字符,所以填充空格)
异常处理:如果string1的长度大于等于n,则不填充任何字符。

22:对应padRight,第二行输入字符串string1、整数n、一个填充字符,其间以空格分隔(填充字符不为空格)
异常处理:如果string1的长度大于等于n,则不填充任何字符。

输出说明 :

对于每组测试数据,输出对应的结果。如果结果为空字符串,则输出一个空行。

每行行首与行尾无多余空格,第一行之前与最后一行之后无多余空行。

输入范例 :

11
abcdef 4
12
abcdef 8 *
21
abcdef 6
22
abcdef 10 .

输出范例 :

abcdef
**abcdef
abcdef
abcdef....
#include <iostream>
#include <string>using namespace std;class StringFunction {
private:int num, length, index, startIndex, endIndex;char padding, delChar;string src, dest;
public:string padLeft(string&, const unsigned int&, char padding);string padRight(string&, const unsigned int&, char padding);string cpy(string&, int startIndex, int endIndex);string remove(string&, const char&);string remove(string&, const int& i);string remove(string&, const int&, const int&);bool checkLegality(string&, const int&);bool checkLegality(string&, const int&, const int&);bool isExsit(string&, const char&);void initial();void computing();
};void StringFunction::initial() {src.clear();dest.clear();
}bool StringFunction::checkLegality(string& str, const int& index) {return index >= 0 && index < str.size();
}bool StringFunction::checkLegality(string& str, const int& startIndex, const int& endIndex) {return startIndex >= 0 && startIndex <= endIndex && endIndex < str.size();
}bool StringFunction::isExsit(string& str, const char& ch) {for (unsigned int i = 0; i < str.size(); i++) {return str[i] == ch;}return false;
}string StringFunction::padLeft(string& str, const unsigned int& n, char padding = ' ') {if (str.size() > n) { return str; }for (unsigned int i = str.size(); i < n; i++) {str = padding + str;}return str;
}string StringFunction::padRight(string& str, const unsigned int& n, char padding = ' ') {if (str.size() > n) { return str; }for (unsigned int i = str.size(); i < n; i++) {str += padding;}return str;
}void StringFunction::computing() {while (cin >> num) {initial();switch (num) {case 11:cin >> src >> length;cout << padLeft(src, length) << endl;break;case 12:cin >> src >> length >> padding;cout << padLeft(src, length, padding) << endl;break;case 21:cin >> src >> length;cout << padRight(src, length) << endl;break;case 22:cin >> src >> length >> padding;cout << padRight(src, length, padding) << endl;break;}}
}int main() {StringFunction SF;SF.computing();return 0;
}

31 删除字符(函数重载)

作者: Turbo时间限制: 1S章节: OO:其它

问题描述 :

内容:对于字符串,实现以下删除字符的函数,并编写main函数测试这些函数:
实验目的:学习函数重载的使用。

1. remove函数:
从形参传入一个字符,将该字符从字符串中删除。

2.remove函数:
从形参传入一个下标index,将index处的字符从字符串中删除。

3.remove函数:
从形参传入两个下标startIndex和endIndex,将从startIndex到endIndex范围内的字符从字符串中删除。

main函数可参考以下代码编写:

int main()
{
 int num, index, startIndex, endIndex;
 char delChar;
 string src, dest;

while(cin >> num)
 {
  switch(num)
  {
   case 1:
    cin >> src >> delChar;
    cout << remove(src, delChar) << endl;
    break;
   case 2:
    cin >> src >> index;
    cout << remove(src, index) << endl;
    break;
   case 3:
    cin >> src >> startIndex >> endIndex;
    cout << remove(src, startIndex, endIndex) << endl;
    break;
  }
 }
 return 0;
}

输入说明 :

输入时,每组测试数据包含两行,第一行输入一个整数,指定需要完成的操作,第二行为该操作需要的数据。
对于每个整数对应的操作及其相应数据的输入方式如下(输入的字符串中不包含空格):
1:对应remove,第二行输入字符串和一个字符(以空格分隔),将字符从字符串中删除。

2:对应remove,第二行输入字符串和index(以空格分隔),将index处的字符从字符串中删除。
异常处理:如果index不合法,则不删除字符。

3:对应remove,第二行输入字符串和startIndex、endIndex(以空格分隔),将从startIndex到endIndex范围内的字符从字符串中删除。
异常处理:如果startIndex、endIndex不合法,则不删除字符。

输出说明 :

对于每组测试数据,输出对应的结果。如果结果为空字符串,则输出一个空行。

每行行首与行尾无多余空格,第一行之前与最后一行之后无多余空行。

输入范例 :

1
acdef b
2
abcdef 3
2
abcdef 6
3
abcd 0 3
3
abcdef 3 5
3
abcdef 3 7

输出范例 :

acdef
abcef
abcdefabc
abcdef
#include <iostream>
#include <string>using namespace std;class StringFunction {
private:int num, length, index, startIndex, endIndex;char padding, delChar;string src, dest;
public:string remove(string&, const char&);string remove(string&, const int& i);string remove(string&, const int&, const int&);bool checkLegality(string&, const unsigned int&);bool checkLegality(string&, const unsigned int&, const unsigned int&);bool isExsit(string&, const char&);void initial();void computing();
};void StringFunction::initial() {src.clear();dest.clear();
}bool StringFunction::checkLegality(string& str, const unsigned int& index) {return index >= 0 && index < str.size();
}bool StringFunction::checkLegality(string& str, const unsigned int& startIndex, const unsigned int& endIndex) {return startIndex >= 0 && startIndex <= endIndex && endIndex < str.size();
}bool StringFunction::isExsit(string& str, const char& ch) {for (unsigned int i = 0; i < str.size(); i++) {return str[i] == ch;}return false;
}string StringFunction::remove(string& str, const char& delChar) {if (isExsit(str, delChar)) {string str_temp;for (unsigned int index = 0; index < str.size(); index++) {if (str[index] != delChar) {str_temp.push_back(str[index]);//cpy函数的实现也可以考虑使用 push_back()方法}}return str_temp;}return str;
}string StringFunction::remove(string& str, const int& index) {if (!checkLegality(str, index)) {return str;}str.erase(str.begin() + index);return str;
}
string StringFunction::remove(string& str, const int& startIndex, const int& endIndex) {if (!checkLegality(str, startIndex, endIndex)) {return str;}str.erase(str.begin() + startIndex, str.begin() + endIndex + 1);return str;
}void StringFunction::computing() {while (cin >> num) {initial();switch (num) {case 1:cin >> src >> delChar;cout << remove(src, delChar) << endl;break;case 2:cin >> src >> index;cout << remove(src, index) << endl;break;case 3:cin >> src >> startIndex >> endIndex;cout << remove(src, startIndex, endIndex) << endl;break;}}
}int main() {StringFunction SF;SF.computing();return 0;
}

32 正整数格式输出

作者: 冯向阳时间限制: 1S章节: OO:其它

问题描述 :

内容:对于任意一个输入的位数不确定的正整数,实现以下格式输出函数:将该整数按照标准的三位分解格式输出。例如,当用户输入82668234时,程序应该输出82,668,234。并编写main函数测试该功能函数。

注意:要求使用函数参数的地址传递方式实现。

函数原型为:

void format(char *ptr, int digit); //第一个形参为字符型指针变量,第二个形参为输入的正整数

功能:将输入的正整数按位转换成字符,并通过指针间址访问。从最低位开始计数,每三位添加字符',',实现格式转换。转换结束后,将转换结果输出到屏幕上。

main函数可参考以下代码编写:

int main(){

int digit;

char tmp, *ptr;

while(cin>>digit){

ptr = &tmp; //tmp仅用于指针初始化

format(ptr, digit); //格式化转换并输出

cout<<endl;

}

return 0;

}

输入说明 :

输入时,可输入任意组测试数据。每组测试数据包含一行,即输入一个整数。

组与组之间无空行。

输出说明 :

对于每组测试数据,输出对应的结果。

每行行首与行尾无多余空格,第一行之前与最后一行之后无多余空行。

输入范例 :

1234567890
123
12
1234

输出范例 :

1,234,567,890
123
12
1,234
//竟然不支持C++11?
#include <iostream>
#include <string>
#include <sstream>using namespace std;void format(int digit);int main() {int digit;//char tmp, *ptr;while (cin >> digit) {//    ptr = &tmp; //tmp仅用于指针初始化format(digit); //格式化转换并输出cout << endl;}return 0;
}//void format(char *ptr, int digit) {void format(int digit) {//string str = to_string(digit);std::ostringstream stm;stm << digit;string str = stm.str();string temp;unsigned int len = str.size();unsigned i = len % 3;if (3 >= len) {cout << str;return;}//立flag,避免首先输出逗号“,”(len为3的整数倍导致)//也避免输出空串if (i != 0) {temp.assign(str.begin(), str.begin() + i);cout << temp;}else {temp.assign(str.begin(), str.begin() + 3);cout << temp;i = 3;}while (i != len) {temp.assign(str.begin() + i, str.begin() + i + 3);cout << "," << temp;i += 3;}
}

33 复制字符串

作者: Turbo时间限制: 1S章节: OO:其它

问题描述 :

内容:对于字符串,实现以下复制功能数,并编写main函数测试这些函数:
实验内容:使用默认形参或者重载实现

cpy函数:
原型可为:
string cpy(string src, int startIndex, int endIndex)

功能:从字符串src复制部分字符形成新字符串并返回。可指定复制的起始位置和结束位置,即从startIndex到endIndex之间的所有字符都复制到结果字符串中。startIndex默认为0, endIndex默认为到字符串尾部。

比如,
cpy(src): 将src的所有字符都复制并返回
cpy(src, 3):将src从下标为3的位置直到结尾的所有字符都复制并返回

cpy(src, 3, 5):将src的第3、4、5个字符复制并返回

main函数可参考以下代码编写:
int main()
{
 int num, length, index, startIndex, endIndex;
 string src, dest;

while(cin >> num)
 {
  switch(num)
  {
   case 1:
    cin >> src;
    cout << cpy(src) << endl;
    break;
   case 2:
    cin >> src >> startIndex;
    cout << cpy(src, startIndex) << endl;
    break;
   case 3:
    cin >> src >> startIndex >> endIndex;
    cout << cpy(src, startIndex, endIndex) << endl;
    break;
  }
 }
 return 0;
}

输入说明 :

输入时,每组测试数据包含两行,第一行输入一个整数,指定需要完成的操作,第二行为该操作需要的数据。
对于每个整数对应的操作及其相应数据的输入方式如下(输入的字符串中不包含空格):

1:对应cpy,第二行输入字符串src

2:对应cpy,第二行输入字符串src和整数startIndex,以空格分隔。复制从startIndex开始的子字符串,下标从0开始。
异常处理:如果startIndex不合法,则不复制任何字符,结果为空字符串。

3:对应cpy,第二行输入字符串src和整数startIndex、endIndex,以空格分隔。
异常处理:如果startIndex、endIndex不合法,则不复制任何字符,结果为空字符串。

输出说明 :

对于每组测试数据,输出对应的结果。如果结果为空字符串,则输出一个空行。

每行行首与行尾无多余空格,第一行之前与最后一行之后无多余空行。

输入范例 :

1
aabbccdd
2
abcdef 4
2
abcdef 7
3
abcdef 0 3
3
abcdef 0 6
3
abcdef 3 2
3
abcdef 0 0

输出范例 :

aabbccdd
efabcda
#include <iostream>
#include <string>using namespace std;class StringFunction {
private:int num, length, index, startIndex, endIndex;char padding, delChar;string src, dest;
public:string cpy(string&, int startIndex, int endIndex);bool checkLegality(string&, const int&);bool checkLegality(string&, const int&, const int&);bool isExsit(string&, const char&);void initial();void computing();
};void StringFunction::initial() {src.clear();dest.clear();
}bool StringFunction::checkLegality(string& str, const int& index) {return index >= 0 && index < str.size();
}bool StringFunction::checkLegality(string& str, const int& startIndex, const int& endIndex) {return startIndex >= 0 && startIndex <= endIndex && endIndex < str.size();
}bool StringFunction::isExsit(string& str, const char& ch) {for (unsigned int i = 0; i < str.size(); i++) {return str[i] == ch;}return false;
}string StringFunction::cpy(string& str, int startIndex = 0, int endIndex = -1) {if (-1 == endIndex) {endIndex = str.size() - 1;}if (!checkLegality(str, startIndex, endIndex)) {return dest;}dest = string(str, startIndex, endIndex - startIndex + 1);//第三个参数为个数return dest;
}void StringFunction::computing() {while (cin >> num) {initial();switch (num) {case 1:cin >> src;cout << cpy(src) << endl;break;case 2:cin >> src >> startIndex;cout << cpy(src, startIndex) << endl;break;case 3:cin >> src >> startIndex >> endIndex;cout << cpy(src, startIndex, endIndex) << endl;break;}}
}int main() {StringFunction SF;SF.computing();return 0;
}

34 字符串分析

作者: 冯向阳时间限制: 1S章节: OO:其它

问题描述 :

内容:对于任意一个输入的字符串(限定长度在100以内),实现以下功能函数:要求统计其中字符(包括空格)的个数,同时分别指出其中大、小写字母、数字以及其它字符的个数。最后将所有统计结果输出到屏幕上。并编写main函数测试该功能函数。

注意:要求使用指针实现,函数的参数传递采用地址传递、引用传递方式。

函数原型为:

void string_analysis(char *ptr, int &total, int &cap, int &sma, int &num, int &oth);

//total为所有字符的个数,cap为大写字母的个数,sma为小写字母的个数,num为数字的个数,oth为其它字符的个数

main函数可参考以下代码编写:

int main(){

char str[100];

int total,cap,sma,num,oth;

total = cap = sma = num = oth = 0;

cin.get(str,100);

string_analysis(str, total, cap, sma, num, oth);

cout<<cap<<endl;

cout<<sma<<endl;

cout<<num<<endl;

cout<<oth<<endl;

cout<<total<<endl;

return 0;

}

输入说明 :

输入的字符串测试数据位于一行。

输出说明 :

对于测试数据,输出对应的分析结果。

第一行:大写字母的个数

第二行:小写字母的个数

第三行:数字的个数

第四行:其它字符的个数

第五行:所有字符的个数

输入范例 :

I am 21 years old.

输出范例 :

1
10
2
5
18
#include <iostream>
#include <cstring>
#include "ctype.h"
using namespace std;void string_analysis(char *, int &, int &, int &, int &, int &);int main() {char str[100];int total, cap, sma, num, oth;total = cap = sma = num = oth = 0;cin.get(str, 100);string_analysis(str, total, cap, sma, num, oth);cout << cap << endl;cout << sma << endl;cout << num << endl;cout << oth << endl;cout << total << endl;return 0;
}
void string_analysis(char *ptr, int &total, int &cap, int &sma, int &num, int &oth) {for (unsigned int i = 0; ptr[i] != '\0'; ++i) {if (isalnum(ptr[i])) {if (isupper(ptr[i])) {++ cap;}else if (islower(ptr[i])) {++ sma;}else {++ num;}}else {++ oth;}}total = cap + sma + num + oth;//if (total == strlen(ptr)) {    cout << "!!!!=========!!!" << endl;}
}

35 字符串转换为整型数值

作者: 冯向阳时间限制: 1S章节: OO:其它

问题描述 :

内容:对于任意一个输入的数字字符串(限定长度在100以内,允许有正负号,字符串内部无多余的空格),实现以下功能函数:将该数字字符串转换为整型数值。最后将转换结果输出到屏幕上。并编写main函数测试该功能函数。

注意:要求使用指针实现,函数的参数传递采用地址传递方式。

函数原型为:

int myatoi(char *string);

main函数可参考以下代码编写:

int main(){

char str[100];

cin>>str;

cout<<myatoi(str)<<endl;

return 0;

}

输入说明 :

输入时,可输入任意组测试数据。每组测试数据包含一行,即输入一个数字字符串。

组与组之间无空行。

输出说明 :

对于每组测试数据,输出对应的转换结果。

每行行首与行尾无多余空格,第一行之前与最后一行之后无多余空行。

输入范例 :

-123
+345

输出范例 :

-123
345
#include <iostream>
#include <cstdlib>
#include <cstring>using namespace std;int myatoi(char *);int main() {char str[100];while (cin >> str) {cout << myatoi(str) << endl;}return 0;}
int myatoi(char *str) {if ('-' == str[0]) {cout << "-";}for (unsigned int i = 0; i < strlen(str); ++i) {str[i] = str[i + 1];}return atoi(str);
}

36 类的定义

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

要求:设计一个点类Point,再设计一个矩形类Rectangle,矩形类使用Point类的两个坐标点作为矩形的对角顶点。并可以输出4个坐标值和面积。使用测试程序验证程序。(假定坐标值均为整数)

Point类:

私有数据成员:

int x, y;//私有成员变量,坐标

共有成员函数:

Point(int a = 0, int b = 0); //带默认参数的构造函数

void setXY(int a, int b); //设置坐标值

int getX(); //获取x坐标

int getY(); //获取y坐标

Rectangle1类:

私有数据成员:

Point point1, point2, point3, point4;//私有成员变量,矩形的4个顶点

共有成员函数:

Rectangle(Point one, Point four); //构造函数使用两个点作为矩形的对角顶点

Rectangle(int x1, int y1, int x2, int y2); //构造函数使用坐标值设置四个顶点

void init(); //给另外两个顶点做初始化的函数

void printPoint(); //输出四个顶点point1,point2,point3,point4

int getArea(); //计算矩形的面积

要求使用以下main函数测试:

int main(){

int x1, y1, x2, y2;

cin>>x1>>y1;

cin>>x2>>y2;

Point p1(x1, y1), p4(x2, y2); //定义两个点

Rectangle r1(p1, p4);//用两个点做参数,声明一个对角顶点分别为p1,p4的矩形对象r1

r1.printPoint(); //输出矩形对象r1的4个顶点坐标,

cout<<r1.getArea(); //输出矩形对象r1的面积

return 1;

}

输入说明 :

第一行:输入2个整数:x(横坐标)、y(纵坐标),整数之间以空格分隔。

第二行:输入2个整数:x(横坐标)、y(纵坐标),整数之间以空格分隔。

输出说明 :

输出三行:

第一行:输出第一个点的横坐标、纵坐标,整数之间以一个空格分隔

第二行:输出第二个点的横坐标、纵坐标,整数之间以一个空格分隔

第三行:输出第三个点的横坐标、纵坐标,整数之间以一个空格分隔

第四行:输出第四个点的横坐标、纵坐标,整数之间以一个空格分隔

第五行:面积

输出行之间无多余的空行和空格

输入范例 :

-15 56
89 -10

输出范例 :

-15 56
89 56
-15 -10
89 -10
6864
#include <iostream>using namespace std;class Point {
private:int x; //x坐标int y;  //y坐标public:Point( int x = 0, int y = 0) :x(x), y(y) {};void setXY(int a, int b) { x = a; y = b; }int getX()const { return x; }int getY()const { return y; }
};class Rectangle {
private:Point point1, point2, point3, point4;//矩形的4个顶点public:Rectangle(Point one, Point four) :point1(one), point4(four) { init(); }; //构造函数使用两个点作为矩形的对角顶点Rectangle(int x1, int y1, int x2, int y2) :point1(x1, y1), point2(x2, y1), point3(x1, y2), point4(x2, y2) {};//构造函数使用坐标值设置四个顶点int getArea() { int temp = ( point1.getX()-point4.getX()) * ( point1.getY() - point4.getY()); return temp > 0 ? temp : 0 - temp;}void init() { point2.setXY(point4.getX(), point1.getY()); point3.setXY(point1.getX(), point4.getY()); }; //给另外两个顶点做初始化的函数void printPoint() { //输出四个顶点point1,point2,point3,point4cout << point1.getX() << " " << point1.getY() << endl;cout << point2.getX() << " " << point2.getY() << endl;cout << point3.getX() << " " << point3.getY() << endl;cout << point4.getX() << " " << point4.getY() << endl;}
};int main() {int x1, y1, x2, y2;cin >> x1 >> y1;cin >> x2 >> y2;Point p1(x1, y1), p4(x2, y2); //定义两个点 Rectangle r1(p1, p4);//用两个点做参数,声明一个对角顶点分别为p1,p4的矩形对象r1 r1.printPoint(); //输出矩形对象r1的4个顶点坐标, cout << r1.getArea(); //输出矩形对象r1的面积  return 0;
}

37 分数计算

作者: UVA时间限制: 1S章节: OO:字符串

问题描述 :

There is an objective test result such as "OOXXOXXOOO". An 'O' means a correct answer of a problem and an "X' means a wrong answer. The score of each problem of this test is calculated by itself and its just previous consecutive `O's only when the answer is correct. For example, the score of the 10th problem is 3 that is obtained by itself and its two previous consecutive `O's.

Therefore, the score of ``OOXXOXXOOO" is 10 which is calculated by ``1+2+0+0+1+0+0+1+2+3".

You are to write a program calculating the scores of test results.

请使用以下Main函数进行测试:

int main()

{

int i, num;

cin>>num;

string str[num];

for(i = 0; i < num; i++)

cin>>str[i];

CalScore(str, num);  //要求自行设计

return 0;

}

输入说明 :

Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given in the first line of the input. Each test case starts with a line containing a string composed by `O' and `X' and the length of the string is more than 0 and less than 80. There is no spaces between `O' and `X'.

输出说明 :

Your program is to write to standard output. Print exactly one line for each test case. The line is to contain the score of the test case.

The following shows sample input and output for five test cases.

输入范例 :

5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

输出范例 :

10
9
7
55
30
#include <iostream>
#include <string>
using namespace std;int main() {int T;//输入字符串次数string str;int num, sum;//连续的O的个数,总分数cin >> T;for (int i = 0; i < T; i++){sum = 0;cin >> str;for(unsigned int j=0;j<str.size();++j){num = 0;while( 'O'==str[j] ){++ num;++ j;}//cout<<"num = "<<num<<endl;for( int n =1; n<=num; ++n ){sum += n;//cout<<"sum = "<<sum<<endl;}}cout<<sum<<endl;}return 0;
}

38 子串的判断

作者: POJ时间限制: 1S章节: OO:字符串

问题描述 :

描述:你设计了一个新的加密技术,可以用一种聪明的方式在一个字符串的字符间插入随机的字符串从而对信息进行编码。由于专利问题,我们将不会详细讨论如何在原有信息中产生和插入字符串。不过,为了验证你的方法,有必要设计一个函数来验证原来的信息是否全在最后的字符串之中。

给定两个字符串s和t,你需要判断s是否是t的“子列”。也就是说,如果你去掉t中的某些字符,剩下字符将连接而成为s。

要求设计的函数原型为:

bool judge(const &s, const &t); //s:原来的信息 t:最后的字符串 原来的信息如全在最后的字符串之中,为真;否则为假。

请使用以下Main函数对该函数的功能进行测试:

int main(){

string s, t;

int len_s, len_t;

while(cin>>s>>t)

if(judge(s, t)) cout<<1<<endl;

else cout<<0<<endl;

return 0;

}

输入说明 :

输入包括多个测试样例。每一个都是由空格分隔的由字母数字ASCII字符组成的两个特定的字符串s和t。s和t的长度不超过100000。

输出说明 :

对于每个测试样例,如果s是t的“子列”,则输出1,否则输出0

输入范例 :

sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter

输出范例 :

1
0
1
0
#include <iostream>
#include <string>
using namespace std;bool judge(const string&, const string&);
//s:原来的信息 t:最后的字符串
//原来的信息如全在最后的字符串之中则为真;否则为假。int main() {string s, t;//int len_s, len_t;while (cin >> s >> t)if (judge(s, t)) cout << 1 << endl;else cout << 0 << endl;return 0;
}
bool judge(const string& s, const string& t) {int ls = s.size();//length of string s.maned lsint lt = t.size();//and ls<=ltint flag = 0;//用于统计依照顺序找到的字符数if (ls > lt) { return false; }for (int i = 0; i < ls; ++i) {for (int j = 0; j < lt; ++j) {while ( t[j] == s[i]) {++ i;++ j;++ flag;//前半部分控制条件是保证索引不越界if (i >= ls &&  flag>=ls ) { return true; }//the last char of s is foundif (j >= lt && flag<ls ) { return false; }//no enough char}}}if(flag >= ls) { return true; }else { return false;}
}

39 密码安全性判断

作者: HDU时间限制: 1S章节: OO:其它

问题描述 :

描述:

网上流传一句话:"常在网上飘啊,哪能不挨刀啊~"。其实要想能安安心心地上网其实也不难,学点安全知识就可以。

首先,我们就要设置一个安全的密码。那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:

(1).密码长度大于等于8,且不要超过16。

(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。

这四个字符类别分别为:

1.大写字母:A,B,C...Z;

2.小写字母:a,b,c...z;

3.数字:0,1,2...9;

4.特殊符号:~,!,@,#,$,%,^;

给你一个密码,你的任务就是设计一个函数,判断它是不是一个安全的密码。

要求设计的函数原型为:

bool judge(const string &code);

请使用以下Main函数对该函数的功能进行测试:

int main(){

string code;

int num;

cin>>num;

for(int i = 0; i < num; i++){

cin>>code;

if(judge(code)) cout<<1<<endl;

else cout<<0<<endl;

}

return 0;

}

输入说明 :

输入数据第一行包含一个数M,接下有M行,每行一个密码(长度最大可能为50),密码仅包括上面的四类字符。

输出说明 :

对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出1,否则输出0。

输入范例 :

3
a1b2c3d4
Linle@ACM
^~^@^@!%

输出范例 :

0
1
0
#include <iostream>
#include <string>
#include <cstring>
#include "ctype.h"
using namespace std;bool judge(const string &code);int main(){  string code;int num;cin>>num;for(int i = 0; i < num; i++){cin>>code;if(judge(code)) cout<<1<<endl;             else cout<<0<<endl;}return 0;
}const int N = 4;
bool judge(const string &code) {int flag[N] = { 0 };int sum = 0;for (unsigned int i = 0; i < code.size(); ++i) {if (isalnum(code[i])) {if (isupper(code[i])) {flag[0] = 1;}else if (islower(code[i])) {flag[1] = 1;}else {flag[2] = 1;}}else {flag[3] = 1;}}for (unsigned int i = 0; i < N; ++i) {sum += flag[i];}if (sum >= 3) {return true;}else {return false;}
}

40 放大的X

作者: HDU时间限制: 1S章节: OO:其它

问题描述 :

描述:

请你设计一个函数,在屏幕上输出(画)一个放大的’X’。

如3*3的’X’应如下所示:

X XX
X X

5*5的’X’应如下所示:

X   XX XXX X
X   X要求设计的函数原型如下所示:
void X_Draw(const int &T, const int *n);请使用以下Main函数对该函数的功能进行测试:int main(){  int T;  cin>>T;  int n[T];for(int i = 0; i < T; i++)cin>>n[i];  X_Draw(T, n);;  return 0;
}

输入说明 :

输入数据第一行是一个整数T,表示有T组测试数据;

接下来有T行,每行有一个正奇数n(3 <= n <= 79),表示放大的规格。

输出说明 :

对于每一个n打印一个规格为n * n放大的’X’;每组输出后面空一行,但最后1组输出后没有空行。

输入范例 :

3
3
5
7

输出范例 :

X XX
X XX   XX XXX X
X   XX     XX   XX XXX XX   X
X     X
#include <iostream>
#include <cstdio>
using namespace std;void X_Draw(const int &, const int *n);int main() {int T;cin >> T;int n[T];for (int i = 0; i < T; i++)cin >> n[i];X_Draw(T, n);return 0;
}void X_Draw(const int &T, const int *n) {for (int t = 0; t < T; ++t){int len = n[t];for (int i = 0; i < len; ++i){for (int j = 0; j < len; ++j){if ((j == i) || ((i + j) == (len - 1))){printf("X");}else{//右半部分空格不需要打印(即右半边i<j区域),否则PE输出格式错误//printf(" ");//左半边空格打印if(i*2 <len-1){if(i+j<len){printf(" ");}}//右半边上下两个三角形区域空格打印else{if( i>=j ){printf(" ");}}}}printf("\n");}printf("\n");}
}

41 对象数组和对象指针

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

要求:在给定的Student类的基础上建立一个对象数组,内放n个学生的数据(学号,分数)。请设计一个用户函数max,用指向对象的指针作为函数参数。max函数的功能是找出这n个学生中成绩最高者(假定无相同的成绩),并输出其学号。

Student类如下:

class Student{

public:

void Set_StuNum(int); //自行设计

int Get_StudNum();  //自行设计

void Set_Score(float); //自行设计

float Get_Score();  //自行设计

private:

int stu_num; //学号

float score; //分数

};

max函数原型为:

void max(Student *, int, int &, float &); //5个形参的含义分别为:对象指针,学生数,最高分的学生学号,最高分

要求使用以下main函数测试:

int main(){

int n, stu_num, max_stu_num;

float score, max_score;

cin>>n;

Student stu[n];

for( int i = 0; i < n; i++ ){

cin>>stu_num>>score;

stu[i].Set_StuNum(stu_num);

stu[i].Set_Score(score);

}

max(stu, n, max_stu_num, max_score);

cout<<max_stu_num<<" "<<max_score;

return 1;

}

输入说明 :

第一行:学生数目n。

第二行至第n+1行:每行输入:学号 分数。 二者之间以空格分隔,行与行之间无空行。

输出说明 :

最高分的学生学号 分数。二者之间以空格分隔

输入范例 :

5
1001 70.5
1002 78
1003 68
1004 82.5
1005 81

输出范例 :

1004 82.5
#include <iostream>using namespace std;class Student {
private:int stu_num;float score;public:Student(int num) : stu_num(num) {};Student() {}void Set_StuNum(int stu_num) { this->stu_num = stu_num; }void Set_Score(float score) { this->score = score; }int Get_StudNum() { return stu_num; }float Get_Score() { return score; }
};void max(Student *, int& , int& , float& );int main() {int n, stu_num, max_stu_num;float score, max_score;cin >> n;Student stu[n];for (int i = 0; i < n; i++) {cin >> stu_num >> score;stu[i].Set_StuNum(stu_num);stu[i].Set_Score(score);}max(stu, n, max_stu_num, max_score);cout << max_stu_num << " " << max_score;return 0;}//4个形参的含义分别为:对象指针,学生数,最高分的学生学号,最高分
void max(Student *stu, int& n, int& max_stu_num, float& max_score) {int i = 0;for (int j = 1; j < n; ++j) {if (stu[j].Get_Score() > stu[i].Get_Score()) {i = j; //不断更换成更大的元素值的下标,直至找到最大的}}max_stu_num = stu[i].Get_StudNum();max_score = stu[i].Get_Score();
}

42 学生成绩转换(友元函数)

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

描述:有一个学生类Student,包括学号、成绩(百分制)。要求设计一个友元函数Score_Trans,将百分制成绩转换成对应的等级输出到屏幕上:大于等于90:优;80~90:良;70~79:中;60~69:及格;小于60:不及格。

Student类如下:

Student类如下:

class Student{

public:

void Set_StuNum(int); //自行设计

int Get_StudNum();  //自行设计

void Set_Score(float); //自行设计

float Get_Score();  //自行设计

friend void Score_Trans(Student &s);

private:

int stu_num; //学号

float score; //分数

};

要求使用以下main函数测试:

int main(){

int n, i, stu_num, max_stu_num;

float score, max_score;

cin>>n;

Student stu[n];

for( i = 0; i < n; i++ ){

cin>>stu_num>>score;

stu[i].Set_StuNum(stu_num);

stu[i].Set_Score(score);

}

for( i = 0; i < n; i++ ){

Score_Trans(stu[i]);

if(i < n - 1) cout<<endl;

}

return 0;

}

输入说明 :

第一行:学生数目n。

第二行至第n+1行:每行输入:学号 分数。 二者之间以空格分隔,行与行之间无空行。

输出说明 :

第一行之n行:学生学号 分数登机。二者之间以空格分隔,行与行之间无空行

输入范例 :

5
1001 70.5
1002 98
1003 68
1004 82.5
1005 58

输出范例 :

1001 中
1002 优
1003 及格
1004 良
1005 不及格
#include <iostream>using namespace std;class Student {
private:int stu_num;float score;public:void Set_StuNum(int stu_num) { this->stu_num = stu_num; }void Set_Score(float score) { this->score = score; }int Get_StudNum() { return stu_num; }float Get_Score() { return score; }friend void Score_Trans(Student &s);
};void Score_Trans(Student &s) {if (s.Get_Score() >= 90.0) {cout << s.Get_StudNum() << " " << "优" ;}else if (s.Get_Score() >= 80.0) {cout << s.Get_StudNum() << " " << "良" ;}else if (s.Get_Score() >= 70.0) {cout << s.Get_StudNum() << " " << "中" ;}else if (s.Get_Score() >= 60.0) {cout << s.Get_StudNum() << " " << "及格" ;}else {cout << s.Get_StudNum() << " " << "不及格" ;}
}int main() {int n, i, stu_num;float score;cin >> n;Student stu[10];for (i = 0; i < n; i++) {cin >> stu_num >> score;stu[i].Set_StuNum(stu_num);stu[i].Set_Score(score);}for (i = 0; i < n; i++) {Score_Trans(stu[i]);if (i < n - 1) cout << endl;}return 0;
}

43 计算学生总评成绩并排序(友元函数)

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

问题描述:试定义一个实现计算学生课程成绩的类Student,对学生学期总评成绩进行计算并排序。具体要求如下:

(1)私有数据成员:

int norm, ex, final,overall:分别表示学生的平时成绩、实验成绩、期末考试和总评成绩

char name[15]:学生姓名

(2)公有成员函数:

void init(char *name1, int nor1, int ex1, int fin1); 用参数name1,nor1,exp1,fin1分别初始化数据成员name,norm, ex, final

void fun( ); 计算学生的总评成绩。

计算方法为:总评成绩=平时成绩占*20%+实验成绩占*25%+期末成绩占*55%。总评成绩计算时要求四舍五入,并且期末考试成绩不足50分时,则期末考试成绩即为总评成绩。

void print( ); 输出该学生信息。

(3)友元函数:

friend void sort(Student st[], int n); 友元函数,对st按总评成绩进行从大到小排序

要求使用以下main函数测试:

int main(){

int n;

int norm, ex, final;

char name[15];

cin>>n;

Student stu[n];

for( int i = 0; i < n; i++ ){

cin>>name>>norm>>ex>>final;

stu[i].init(name,norm,ex,final);

stu[i].fun();

}

sort(s,5);

for(i = 0;i < n; i ++){

stu[i].print();

}

return 1;

}

输入说明 :

第一行:学生数目n。

第二行至第n+1行:每行输入:姓名 平时成绩 实验成绩 期末成绩 项与项之间以空格分隔,行与行之间无空行。

输出说明 :

第一行至第n行按总评成绩的排序结果

姓名 平时成绩 实验成绩 期末成绩 项与项之间以空格分隔,行与行之间无空行。

输入范例 :

5
CCC 67 82 81
BBB 93 60 84
AAA 82 75 58
DDD 54 78 51
EEE 91 52 41

输出范例 :

BBB 93 60 84 80
CCC 67 82 81 78
AAA 82 75 58 67
DDD 54 78 51 58
EEE 91 52 41 41
#include <iostream>
#include <cstring>using namespace std;class Student {
private:int norm, ex, final, overall;//平时成绩、实验成绩、期末考试和总评成绩char name[15];public:void init(char *name1, int nor1, int ex1, int fin1);int getOverall();void fun();void print();friend void sort(Student st[], int n);
};
void Student::init(char *name, int norm, int ex, int final) {strcpy(this->name , name);this->norm = norm; this->ex = ex;this->final = final;
}int Student::getOverall() { return overall;
}void Student::fun() {if (final < 50) {overall = final;}else {overall = norm * 0.2 + ex * 0.25 + final * 0.55 + 0.5;//数据类型隐式转换}
}void Student::print() {cout << name << " " << norm << " " << ex << " " << final << " " << overall << endl;
}void sort(Student stu[], int n) {for (int i = 0; i+1 < n; ++i) {int k = i;for (int j = i+1; j < n; ++j) {if (stu[j].getOverall() > stu[k].getOverall()) {k = j; //不断更换成更大的元素值的下标,直至找到最大的,插入排序思想}}if (k != i) {Student temp = stu[i];stu[i] = stu[k];stu[k] = temp;}}
}int main() {int n;int norm, ex, final;char name[15];cin >> n;Student stu[n];//Student stu[10];for (int i = 0; i < n; i++) {cin >> name >> norm >> ex >> final;stu[i].init(name, norm, ex, final);stu[i].fun();}sort(stu, 5);for (int i = 0; i < n; i++) {stu[i].print();}return 0;
}

44 矩阵类(使用二阶指针动态生成指定行、列的二维数组)

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

问题描述:试定义一个类Array,首先求各列元素中的合数(非素数)之和,再将数组各列以其合数之和的大小从大到小排序,具体要求如下:

(1)私有数据成员:

int **array; 需要排序的二维数组,使用二阶指针来关联访问

(2)公有成员函数:

Array(int **t, int m, int n); //构造函数,用二阶指针t初始化二阶指针array关联访问的成员数组,m和n分别对应二维数组的行数、列数

int comp(int n) const; //判断整数n是否为合数,如果是合数,返回值为1,否则返回值为0

int sum_comp(int j); //求数组a第j列元素中所有合数之和

void exch(int j1, int j2); //交换成员数组的第j1, j2列元素

void fun(int m, int n); //根据题意对成员数组进行列排序,m和n分别对应二维数组的行数、列数

void print(int m, int n) const; //以矩阵的形式输出成员数组,m和n分别对应二维数组的行数、列数

(3)用户函数:

bool make2DArray(int row,int col, int ** &array); //动态申请指定行、列的二维数组的存储空间,在InputEdge函数内调用

bool InputEdge(int row, int col, int ** &array); //在申请指定行、列的二维数组的存储空间成功的基础上,针对该二维数组进行初始化

要求使用以下main函数测试:

int main(){

int **array;   //二阶指针,用于关联访问二维数组

int m, n;  //m:行数 n:列数

cin>>m; //输入行数

cin>>n; //输入列数

InputEdge(m, n, array); //在申请指定行、列的二维数组的存储空间成功的基础上,针对该二维数组进行初始化

Array arr(array, m, n);

arr.fun(m, n);

arr.print(m, n); //输出排序后的数组

return 0;

}

输入说明 :

第一行:行数m

第二行:列数n

第三行至第m+3行:输入二维数组的各数组元素的值,同一行的元素之间以空格分隔,行与行之间无多余的空行

输出说明 :

第一行至第m行:排序后的二维数组,同一行的元素之间以分隔符'\t'分隔,行与行之间无多余的空行

输入范例 :

4
5
10 12 5 4 15
16 17 8 19 10
11 12 13 14 15
16 70 18 19 20

输出范例 :

12   15  10  5   4
17  10  16  8   19
12  15  11  13  14
70  20  16  18  19
#include <iostream>
#include <cstring>using namespace std;bool newEdge(int row, int col, int**&edge);
void deleteEdge(int row, int col, int**&edge);
void InputEdge(int row, int col, int**&edge);//找了半天WA原因,才发现原来给的参考代码用的竟然是值传递……class Array {//Matrix
private:int ** edge;int row;int col;bool flag;
public://Array(int **t, int row = 0, int col = 0);//默认形参重定义Array(int **t, int row , int col);//Array(){}//竟然会无参数构造函数重定义……//~Array() {}//应只作函数声明,错误地把{}给写上了而非分号,失误……Array();~Array();bool comp(int n) const;//合数int sum_comp(int j);void exch(int j1, int j2);//交换列void fun(int m, int n);void print(int m, int n) const;};Array::Array(int **t, int row = 0, int col = 0) {flag = false;//暂未申请获得内存if (newEdge(row, col, edge) ) {//内存申请this->row = row;this->col = col;for (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {edge[i][j] = t[i][j];}}flag = true;}else {cout << "1 Too Large!" << endl;}
}Array::Array() {flag = false;if (newEdge(row, col, edge)) {//别遗漏了这个无参数构造内存的申请flag = true;}else {cout << "2 Too Large!" << endl;}
}Array::~Array() {if (flag = true) {//别遗漏了这个内存撤销deleteEdge(row, col, edge);flag = false;}else {cout<<"Unknown Error!"<<endl;}
}bool Array::comp(int n)const {for (int i = 2; i*i < n; ++i) {if (0==n%i) {return true;}}return false;
}
int Array::sum_comp(int j) {int sum = 0;for (int i = 0; i < row; ++i) {if (comp(edge[i][j])) {sum += edge[i][j];}}return sum;
}
void Array::exch(int j1, int j2) {for (int i = 0; i < row; ++i) {int temp = edge[i][j1];edge[i][j1] = edge[i][j2];edge[i][j2] = temp;}
}
void Array::fun(int m, int n) {for (int i = 0; i < n-1; ++i) {int k = i;for (int j = i + 1; j < n; ++j) {if (sum_comp(j) > sum_comp(k) ) {k = j;//MaxIndex}}if (k != i) {exch(k, i);//矩阵排序,各列合数之和会自动跟着排序}}
}
void Array::print(int m, int n) const {for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (j != n - 1) {cout << edge[i][j] << '\t';//cout << "edge["<<i<<"]["<<j<<"]"<< edge[i][j] << '\t';}else {//cout << edge[i][j]  << endl;cout << edge[i][j]  << '\t' << endl;//cout << "edge["<<i<<"]["<<j<<"]"<< edge[i][j] << endl;}}}
}int main() {int **array;   //二阶指针,用于关联访问二维数组int m, n;  //m:行数 n:列数cin >> m; //输入行数cin >> n; //输入列数InputEdge(m, n, array); //在申请指定行、列的二维数组的存储空间成功的基础上,针对该二维数组进行初始化Array arr(array, m, n);arr.fun(m, n);arr.print(m, n); //输出排序后的数组deleteEdge(m, n, array);return 0;
}bool newEdge(int row, int col, int**&edge) {edge = new int *[row];if (!edge) { return false; }for (int i = 0; i < row; ++i) {edge[i] = new int[col];if (!edge[i]) { return false; }}return true;
}void InputEdge(int row, int col, int**& edge) {if (newEdge(row, col, edge)) {for (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {cin >> edge[i][j];}}}
}void deleteEdge(int row, int col, int**&edge) {for (int i = 0; i < row; ++i) {delete[] edge[i];}delete[] edge;
}

45 身份证类(对象数组)

作者: 冯向阳时间限制: 1S章节: OO:类

问题描述 :

问题描述:判断某人是否为青年的标准是男性不超过35周岁或女性不超过40周岁。已知身份证号从第7位开始的连续8位表示持证人的出生年月日,身份证号的第17位为奇数表示持证人为男性,身份证号第17位数字为偶数表示持证人为女性。例如:身份证号为32110219830103191X的持证人出生年月为1983年1月3日,性别为男性。试定义一个类ID,根据身份证号判断持证人截止到2015年10月1日是否为青年。具体要求如下:

(1) 私有数据成员:

char *id; 保存18位身份证号

int year, month, date; y,m,d分别表示持证人的出生年、月、日

char sex; 持证人的性别(”M”或”F”) M代表男性,F代表女性

(2) 公有成员函数:

set_ID(char * s); 用参数s初始化成员id(需申请动态内存),并将year,month,date初始化为0

void fun( );  根据身份证号计算持证人的出生年月和性别,并判断其是否为青年,并将获得的信息存储到对应的数据成员中

void print( ); 输出持证人的信息

~ID(); 析构函数,进行必要的操作

要求使用以下main函数测试:

int main(){  
   int T, i;
   char id[19];
   
   cin>>T;
   ID person[T];
   
   for(i = 0; i < T; i++){
      if(i> 0 && i < T) cout<<endl;
      cin>>id;
      person[i].set_ID(id); 
      person[i].fun(); 
      person[i].print(); 
   }

return 0;
}

输入说明 :

第一行:身份证数目T

第二行至第T+1行:输入身份证id,行与行之间无多余的空行

输出说明 :

输出T组身份证的信息,组与组之间的信息有一空行

每组的信息如下:

身份证id

year.month.date

M/F  M:男   F:女

Y/N  Y:青年 N:非青年

输入范例 :

2
321102197504011201
321102196103011213

输出范例 :

321102197504011201
1975.4.1
F
Y321102196103011213
1961.3.1
M
N
#include <iostream>
#include <cstring>
using namespace std;class ID{
private:char *id;//18位身份证号int year, month, day;//出生年、月、日char sex;//性别(”M”或”F”) M代表男性,F代表女性char isYouth;//青年标志('Y'/'N')public:ID() { id = new char[19]; }~ID() { delete id; }void set_ID(char * s) { strcpy(id, s); }void fun();void print() {cout << id << endl;cout << year << "." << month << "." << day << endl;cout << sex << endl;cout << isYouth << endl;}
};
void ID::fun() {year = id[6] - '0';int temp = 0;for (int i = 7; i < 10; ++i) {temp = id[i] - '0';year = temp + year * 10;}month = (id[10] - '0') * 10 + (id[11] - '0');day = (id[12] - '0') * 10 + (id[13] - '0');if ((id[16] - '0') % 2) {sex = 'M';if (year + 35 > 2015) {isYouth = 'Y';}else if(year+35==2015 && month>10){isYouth = 'Y';}else if (year + 35 == 2015 && month == 10 && day>=1 ) {isYouth = 'Y';}else{isYouth = 'N';}}else {sex = 'F';if (year + 40 > 2015) {isYouth = 'Y';}//else if (year + 40 == 2015 && month > 10) {else if (year + 40 == 2015 && month < 10) {//题目答案本身有问题isYouth = 'Y';}else if (year + 40 == 2015 && month == 10 && day >= 1) {isYouth = 'Y';}else {isYouth = 'N';}}
}int main() {int T, i;char id[19];cin >> T;ID person[T];//ID person[10];for (i = 0; i < T; i++) {if (i > 0 && i < T) cout << endl;cin >> id;person[i].set_ID(id);person[i].fun();person[i].print();}return 0;
}

46 重载<<输出圆

作者: Turbo时间限制: 1S章节: OO:其它

问题描述 :

定义一个圆类(Circle),其中:
属性包括:
  半径(radius)、周长(perim)和面积(area),
方法包括:
  构造函数(以半径为参数,默认值为0,周长和面积在构造函数中生成)
  重载运算符<<:输出半径、周长和面积。输出的格式为:
  “radius:2;perim:12.56;area:12.56”
请编写Circle类的代码并使用以下main函数测试:
int main()
{
    double r;
    while(cin>>r)
    {
        if (r>0)
        {
           Circle c1(r);
           cout<<c1<<endl;
        }
        else
        {
           Circle c2;
           cout<<c2<<endl;
        }
    }
   return 0;
}
注:PI取值为3.14。

输入说明 :

可输入多组数据,每组数据占一行,包含一个半径值。

输出说明 :

对于每个输入的半径,输出对应的圆的信息,

输出格式形如:
radius:2;perim:12.56;area:12.56

输入范例 :

2
0

输出范例 :

radius:2;perim:12.56;area:12.56
radius:0;perim:0;area:0
#include <iostream>using namespace std;const double PI = 3.14;
class Circle {
private:double radius;double perim;double area;public:Circle(double radius = 0) : radius(radius){perim = 2 * PI*radius;area = PI * radius*radius;}friend istream& operator>>(istream& , Circle& );friend ostream& operator<<(ostream& , const Circle& );};
istream& operator>>(istream&in, Circle& circle) {return in >> circle.radius;
}
ostream& operator<<(ostream&out, const Circle& circle) {return out << "radius:" << circle.radius << ";perim:" << circle.perim << ";area:" << circle.area;
}int main(){double r;while (cin >> r){if (r > 0){Circle c1(r);cout << c1 << endl;}else{Circle c2;cout << c2 << endl;}}return 0;
}

47 计算周长

作者: Turbo时间限制: 1S章节: OO:多态

问题描述 :

已定义一个Shape抽象类、常量PI以及main函数。
  请在Shape的基础上派生出矩形Rectangle和圆形Circle类,二者都有 GetPerim()函数计算并返回对象的周长。 
  请编写这两个类的代码,使得在main函数中正确输出两个对象的周长。

提供的代码如下:
#include <iostream>
using namespace std;
const double PI=3.14;
class Shape
{
public:
    Shape() {}
    ~Shape() {}
    virtual float GetPerim()=0;
};
/*******在此编写代码********/
int main()
{
    Shape * sp;
    double r,width,height;
    cin>>r;
    sp=new Circle(r);
    cout<<sp->GetPerim ()<<endl;
    cin>>width>>height;
    sp=new Rectangle(width,height);
    cout<<sp->GetPerim()<<endl;
    return 0;
}

输入说明 :

输入共两行,第一行输入一个半径,第二行输入矩形的宽和高,用空格进行分隔。

输出说明 :

共输出两行,第一行输出圆的周长,第二行输出矩形的周长。

输入范例 :

10
6 4

输出范例 :

62.8
20
#include <iostream>
using namespace std;
const double PI = 3.14;class Shape{
public:Shape() {}~Shape() {}virtual double GetPerim() = 0;
};class Rectangle :public Shape {
private:double width;//数据类型别搞错double height;public:Rectangle(double width=0, double height=0) : width(width), height(height) {};double GetPerim() { return  2.0 * (width + height); }};class Circle :public Shape {
private:double radius;public:Circle(double radius = 0) : radius(radius) {};double GetPerim() { return   2.0 * PI*radius; }
};int main(){Shape * sp;double r, width, height;cin >> r;sp = new Circle(r);cout << sp->GetPerim() << endl;cin >> width >> height;sp = new Rectangle(width, height);cout << sp->GetPerim() << endl;return 0;
}

48 企业经营税

作者: Turbo时间限制: 1S章节: OO:多态

问题描述 :

有两类企业:服务性企业及制造业企业。服务性企业按营业收入的5%征税,制造业企业按营业收入的17%征税。

现需编写程序,输入多个企业的类别及营业收入,计算并输出税收总额。

本题使用多态的特性完成,需要定义三个类:

Company类:基类

Service类:服务性企业类,由Company类派生

Manufacturer类:制造业企业类,由Company类派生

请完成以上三个类的代码,使得程序能按范例输入、输出。

输入说明 :

可输入多组数据,每组占一行。

每一行包含两部分,

第一部分为一个字母S或M,输入S表示服务性企业,输入M表示制造业企业。

第二部分为一个整数,表示企业的营业收入。

输出说明 :

输出一个数字,表示企业的税收总额。

输入范例 :

S 1005
M 2000

输出范例 :

390.25
#include <iostream>using namespace std;class Company{
//private:
protected:char ch;//类别int income;//营收double tax;//缴税public:virtual double calTax() = 0;};class Service :public Company {
private:public:Service(int income = 0) { this->income=income; };double calTax() { return  this->tax = 0.05 * this->income; }};class Manufacturer :public Company {
private:public:Manufacturer(int income = 0) { this->income = income; };double calTax() { return  this->tax = 0.17 * this->income; }
};int main(){char ch;//类别int income;//营收double totalTax = 0;//总税收Company * sp;while (cin >> ch >> income) {switch (ch) {case 'S': {sp = new Service(income);totalTax += sp->calTax();break;}case 'M': {sp = new Manufacturer(income);totalTax += sp->calTax();break;}}}cout << totalTax;return 0;
}

LYY,树洞真的已经爱上你了。

今后的日子里,加油吧!!

东华大学(C++)OJ题目收集(代码详解版)相关推荐

  1. 大一新生上手题(题目加源代码详解)(每日一题,一题多解)

    2019 数列有序! Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序.n从键盘输 ...

  2. 【洛谷】P1830 轰炸III 题解 代码+详解

    这里是Jane的OJ解答之洛谷系列~ (放假啦 尽量日更叭ε≡٩(๑>₃<)۶ ) 来分享一些算法和题解,一般用的都是C语言,还在学C++ |ू・ω・` ) 如果内容有问题,欢迎大家私信 ...

  3. 常见字典用法集锦及代码详解

    目录 前言 字典的简介 1. 字典对象 1.1 Add 方法 1.2 Exists 方法 1.3 Keys 方法 1.4 Items 方法 1.5 Remove 方法 1.6 RemoveAll 方法 ...

  4. oracle回滚断查询,Oracle回滚段使用查询代码详解

    大批量执行DML语句造成回滚段大量占用,又回退操作,如何直观查询数据回滚情况? 单机环境 查询回滚执行进度 sql;"> select /*+ rule */s.sid,r.name ...

  5. 从零编写60%+胜率的短线择时信号!零基础python量化投资代码详解【邢不行】

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. ​ ​ 如果有人说你是百年难得一见的量化投资天才, ...

  6. 从PointNet到PointNet++理论及代码详解

    从PointNet到PointNet++理论及代码详解 1. 点云是什么 1.1 三维数据的表现形式 1.2 为什么使用点云 1.3 点云上以往的相关工作 2. PointNet 2.1 基于点云的置 ...

  7. 后缀数组模板及代码详解

    后缀数组代码详解 上图中存在直边和斜边,下文会用到. #include <cstdio> #include <cstring> #include <iostream> ...

  8. 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 ...

  9. 【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职 ...

  10. 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 ...

最新文章

  1. 运行 vue 报node错
  2. OpenG 轮廓检测
  3. LeetCode 1004.最长连续1的个数
  4. koa --- restful规范及其栗子
  5. win7系统怎么更改语言及字体
  6. DataGridView使用技巧二:设置单元格只读
  7. 在Linux下安装QT交叉编译,安装QT交叉编译 成功 + 测试
  8. CSS - 样式以及样式权重
  9. imx6ul之LCD驱动移植
  10. Google Dapper 大规模分布式系统的跟踪方案
  11. vue中清除浏览器缓存得方法
  12. 苹果手机怎么信任软件_苹果安装未受信任软件如何设置信任企业APP证书
  13. 持续集成之Jenkins _ 老徐先带你入个门
  14. CVPR 2022 | 商汤/上交/港中文提出U2PL:使用不可靠伪标签的半监督语义分割
  15. 哈·曼丁的故事(二)
  16. 【PAT】A1099. Build A Binary Search Tree (30)
  17. C 语言教程详解——入门到精通
  18. pear在php中的用法,php使用pear_smtp发送邮件
  19. Linux kernel内存管理之OOM相关参数
  20. 关注幼儿教育-儿童木工DIY室、木工坊

热门文章

  1. java短信生成6位数的校验码
  2. 3600S软件测试工资,软件测试工资能拿到多少?谁说软件测试收入低?
  3. UE4中实现Cesium 3dtileset的压平
  4. 服务器设置自动开机及定时开机
  5. 20170605——login页面(代码知识点分析)
  6. Android自定义view实现日历控件
  7. Scrum如何拥抱变化
  8. 苹果手机支持鸿蒙,除了苹果,这四款华为也能三年不卡,还能升级鸿蒙
  9. Android 8.1 DisplayPowerController(三) 亮度调节
  10. Simulink中scope变为白色背景