已知每个月份的英文单词如下,要求创建一个指针数组,数组中的每个指针指向一个月份的英文字符串,要求根据输入的月份数字输出相应的英文单词
1月 January
2月 February
3月 March
4月 April
5月 May
6月 June
7月 July
8月 Aguest
9月 September
10月 October
11月 November
12月 December
第一行输入t表示t个测试实例
接着每行输入一个月份的数字
依次输入t行
每行输出相应的月份的字符串,若没有这个月份的单词,输出error
3
5
11
15
May
November
error
#include
using namespace std;
int main() {
const char* month[12] = { "January","February","March","April","May","June","July","Aguest","September","October","November","December" };
int n;
cin >> n;
while (n--)
{
int t;
cin >> t;
if (t >= 13 || t <= 0) {
cout << "error" << endl;
continue;
}
cout << month[t - 1] << endl;
}
return 0;
}
已知一组学生成绩,然后根据输入的序号查询成绩
要求:
例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???
第一行输入t表示有t个测试实例
第二行先输入n,表示有n个学生,然后再输入n个成绩(正整数)
第三行输入1个序号,表示要查询成绩的学生的序号。
依次输入t个实例
按自然意义,序号是从1开始计算
提示:在数组中是从…
对于每个测试实例:
第一行输出数组中间元素的前一个成绩和后一个成绩(若为偶数,取中间右边的数为中间数)
第二行根据序号输出1个成绩
2
7 66 99 88 44 77 33 11
2
10 60 80 50 20 90 35 70 40 10 95
10
88 77
99
90 70
95
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
int n, dis;
cin >> n;
int* p = new int[n];
for (int i = 0; i < n; i++)
cin >> *(p + i);
cin >> dis;
int mid = n / 2;
int* p1 = p + mid, * p2 = p + mid;
p1--;
p2++;
cout << *p1 << " " << *p2 << endl;
cout << *(p + dis - 1) << endl;
}
return 0;
}
下面是一个日期类的定义,请在类外实现其所有的方法,并在主函数中生成对象测试之。
注意,在判断明天日期时,要加入跨月、跨年、闰年的判断
例如9月30日的明天是10月1日,12月31日的明天是第二年的1月1日
2月28日的明天要区分是否闰年,闰年则是2月29日,非闰年则是3月1日
测试数据的组数t
第一组测试数据的年 月 日
…
要求第一个日期的年月日初始化采用构造函数,第二个日期的年月日初始化采用setDate方法,第三个日期又采用构造函数,第四个日期又采用setDate方法,以此类推。
输出今天的日期
输出明天的日期
4
2012 1 3
2012 2 28
2012 3 31
2012 4 30
Today is 2012/01/03
Tomorrow is 2012/01/04
Today is 2012/02/28
Tomorrow is 2012/02/29
Today is 2012/03/31
Tomorrow is 2012/04/01
Today is 2012/04/30
Tomorrow is 2012/05/01
#include
using namespace std;
class Date {
int year, month, day;
public:
Date();
Date(int y, int m, int d);
int getYear();
int getMonth();
int getDay();
void setDate(int y, int m, int d);
void print();
void addOneDay();
};
Date::Date(){}
Date::Date(int y, int m, int d):year(y),month(m),day(d){}
int Date::getYear() { return year; }
int Date::getMonth() { return month; }
int Date::getDay() { return day; }
void Date::setDate(int y, int m, int d) { year = y; month = m; day = d; }
void Date::print() { printf("%d/%02d/%02d\n", year, month, day); }
void Date::addOneDay()
{
int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
days[1] = 29;
day++;
if (day > days[month - 1])
{
month++;
day = 1;
}
if (month > 12)
{
year++;
month = 1;
}
}
int main()
{
int n;
cin >> n;
while (n--)
{
int y, m, d;
cin >> y >> m >> d;
Date date(y, m, d);
cout << "Today is ";
date.print();
date.addOneDay();
cout << "Tomorrow is ";
date.print();
}
return 0;
}
设计一个点类Point,包含私有属性x坐标和y坐标,操作包括
1、构造函数,要求满足两个条件:1.能够使用类Point去创建一个对象数组(缺省构造方法!);2.能够接收外来输入的x和坐标做初始化,提示:构造函数重载
2、析构函数,把x坐标和y坐标都清0,并输出信息“point clear”
3、设置(setXY),接受外来输入,并设置x坐标和y坐标
4、获取x坐标,直接返回x值
5、获取y坐标,直接返回y值
设计一个圆类Circle,包含私有属性:圆心坐标x和y、半径r;操作包括:
1、构造函数,接受外来输入,设置圆心x坐标、y坐标和半径
2、析构函数,将圆心坐标x和y以及半径都清零,并输出"circle clear"
3、包含(Contain),判断一个圆是否包含一个点,计算圆心到这个点的距离,然后和半径做比较,大于则不包含,小于等于则包含。提示:用点对象做参数不一定符合输出
第一行输入一个点的x坐标和y坐标,用Point类去创建一个点对象,并且自动通过构造函数来初始化
第二行输入n,用Point类去创建一个点对象数组,包含n个点
第三行起输入n行,每行输入一个点的x和y坐标,使用设置(setXY)来设置每个点的x和y坐标
接着一行输入三个参数,表示一个圆的圆心坐标x和y,以及半径,使用Circle类去创建一个圆对象,并自动通过构造函数来初始化
通过调用圆的包含(Contain)方法,判断每个点是否在圆内。
按照点的输入顺序,每行输出一个点的判断结果,如果包含则输出in,不包含则输出out
说明:当一个对象数组是动态创建的,那么在程序结束时,这个数组是不会被回收。只有增加代码delete []p,才会回收数组。
!!本题目不要求回收数组!!
5 2
3
4 7
9 9
2 4
3 3 3
in
out
out
in
circle clear
point clear
#include
using namespace std;
class Point {
double x, y;
public:
Point(double x = 0, double y = 0) :x(x), y(y) {}
void setXY() { cin >> x >> y; }
double getX() { return x; }
double getY() { return y; }
~Point()
{
x = y = 0;
cout << "point clear" << endl;
}
};
class Circle {
double x, y, r;
public:
Circle() { cin >> x >> y >> r; }
~Circle()
{
x = y = r = 0;
cout << "circle clear" << endl;
}
void Contain(double x, double y)
{
double distance = sqrt(pow(this->x - x, 2) + pow(this->y - y, 2));
if (distance <= r)
cout << "in" << endl;
else
cout << "out" << endl;
}
};
int main() {
double x, y;
int n;
cin >> x >> y >> n;
Point p0(x, y);
Point* p = new Point[n];
for (int i = 0; i < n; i++)
{
(p + i)->setXY();
}
Circle c;
c.Contain(x, y);
for (int i = 0; i < n; i++)
{
c.Contain((p + i)->getX(), (p + i)->getY());
}
return 0;
}
上面是我们曾经练习过的一个习题,请在原来代码的基础上作以下修改:1、增加自写的拷贝构造函数;2、增加自写的析构函数;3、将getDisTo方法的参数修改为getDisTo(const Point &p);4、根据下面输出的内容修改相应的构造函数。
然后在主函数中根据用户输入的数目建立Point数组,求出数组内距离最大的两个点之间的距离值。
测试数据的组数 t
第一组点的个数
第一个点的 x 坐标 y坐标
第二个点的 x坐标 y坐标
输出第一组距离最大的两个点以及其距离
…
在C++中,输出指定精度的参考代码如下:
#include
#include //必须包含这个头文件
using namespace std;
void main( )
{ double a =3.141596;
cout<<fixed<<setprecision(3)<<a<<endl; //输出小数点后3位
2
4
0 0
5 0
5 5
2 10
3
-1 -8
0 9
5 0
Constructor.
Constructor.
Constructor.
Constructor.
The longeset distance is 10.44,between p[1] and p[3].
Distructor.
Distructor.
Distructor.
Distructor.
Constructor.
Constructor.
Constructor.
The longeset distance is 17.03,between p[0] and p[1].
Distructor.
Distructor.
Distructor.
#include
using namespace std;
class Point {
double x, y;
public:
Point(double x = 0, double y = 0) :x(x), y(y) { cout << "Constructor." << endl; }
Point(const Point& p) { x = p.x; y = p.y; }
~Point() { cout << "Distructor." << endl; }
void setXY(double x1, double y1) { x = x1; y = y1; }
void setX(double x1) { x = x1; }
void setY(double y1) { y = y1; }
double getX() { return x; }
double getY() { return y; }
double getDisTo(const Point& p)
{
return sqrt(pow(x - p.x, 2) + pow(y - p.y, 2));
}
};
int main() {
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
Point* p = new Point[n];
for (int i = 0; i < n; i++)
{
double x, y;
cin >> x >> y;
(p + i)->setXY(x, y);
}
double _max = -1;
int _i = 0, _j = 0;
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
{
double temp = (p + i)->getDisTo(p[j]);
if (temp > _max)
{
_max = temp;
_i = i;
_j = j;
}
}
cout << fixed << setprecision(2) << "The longeset distance is " << _max << ",between p[" << _i << "] and p[" << _j << "]." << endl;
delete[]p;
}
return 0;
}
设计一个类来实现手机的功能。它包含私有属性:号码类型、号码、号码状态、停机日期;包含方法:构造、拷贝构造、打印、停机。
1、号码类型表示用户类别,只用单个字母,A表示政府,B表示企业、C表示个人
2、号码是11位整数,用一个字符串表示
3、号码状态用一个数字表示,1、2、3分别表示在用、未用、停用
4、停机日期是一个日期对象指针,在初始化时该成员指向空,该日期类包含私有属性年月日,以及构造函数和打印函数等
5、构造函数的作用就是接受外来参数,并设置各个属性值,并输出提示信息,看示例输出
6、拷贝构造的作用是复制已有对象的信息,并输出提示信息,看示例输出。
想一下停机日期该如何复制,没有停机如何复制??已经停机又如何复制??
7、打印功能是把对象的所有属性都输出,输出格式看示例
8、停机功能是停用当前号码,参数是停机日期,无返回值,操作是把状态改成停用,并停机日期指针创建为动态对象,并根据参数来设置停机日期,最后输出提示信息,看示例输出
要求:在主函数中实现号码备份的功能,对已有的虚拟手机号的所有信息进行复制,并将号码类型改成D表示备份;将手机号码末尾加字母X
第一行输入t表示有t个号码
第二行输入6个参数,包括号码类型、号码、状态、停机的年、月、日,用空格隔开
依次输入t行
每个示例输出三行,依次输出原号码信息、备份号码信息和原号码停机后的信息
每个示例之间用短划线(四个)分割开,看示例输出
2
A 15712345678 1 2015 1 1
B 13287654321 2 2012 12 12
Construct a new phone 15712345678
类型=政府||号码=15712345678||State=在用
Construct a copy of phone 15712345678
类型=备份||号码=15712345678X||State=在用
Stop the phone 15712345678
类型=政府||号码=15712345678||State=停用||停机日期=2015.1.1
----
Construct a new phone 13287654321
类型=企业||号码=13287654321||State=未用
Construct a copy of phone 13287654321
类型=备份||号码=13287654321X||State=未用
Stop the phone 13287654321
类型=企业||号码=13287654321||State=停用||停机日期=2012.12.12
----
#include
using namespace std;
class Date {
int year, month, day;
public:
Date() {}
Date(int y, int m, int d) :year(y), month(m), day(d) {}
Date(const Date& p) :year(p.year), month(p.month), day(p.day) {}
void print() { cout << year << "." << month << "." << day << endl; }
};
class Phone {
char lei;
string number;
int state;
Date* stop_date;
public:
Phone() {}
Phone(char l, string n, int s, Date* d)
{
lei = l;
number = n;
state = s;
stop_date = new Date(*d);
cout << "Construct a new phone " << n << endl;
}
Phone(const Phone& p)
{
lei = 'D';
number = p.number + "X";
state = p.state;
stop_date = new Date(*p.stop_date);
cout << "Construct a copy of phone " << p.number << endl;
}
~Phone()
{
delete stop_date;
}
void print()
{
cout << "类型=";
if (lei == 'A')
cout << "政府";
else if (lei == 'B')
cout << "企业";
else if (lei == 'C')
cout << "个人";
else if (lei == 'D')
cout << "备份";
cout << "||号码=" << number << "||State=";
if (state == 1)cout << "在用" << endl;
else if (state == 2)cout << "未用" << endl;
else if (state == 3)
{
cout << "停用||停机日期=";
stop_date->print();
}
}
void Stop()
{
state = 3;
cout << "Stop the phone " << number << endl;
}
};
int main() {
int n;
cin >> n;
while (n--)
{
char lei;
string number;
int state;
int y, m, d;
cin >> lei >> number >> state >> y >> m >> d;
Phone phone(lei, number, state, new Date(y, m, d));
phone.print();
Phone p1 = phone;
p1.print();
phone.Stop();
phone.print();
cout << "----" << endl;
}
return 0;
}
一开始未知数组长度,根据要求创建不同类型的指针,并且使用指针创建相应长度的数组,然后再完成不同的要求
若要求创建整数数组,计算数组内所有数据的平均值
若要求创建字符数组,找出数组内的最大字母
若要求创建浮点数数组,找出数组的最小值
要求程序整个过程不能使用数组下标,从数组创建、输入到搜索、比较、计算,到输出都必须使用指针
提示:使用new关键字
第一行输入t表示有t个测试实例
第二行先输入一个大写字母表示数组类型,I表示整数类型,C表示字符类型,F表示浮点数类型;然后输入n表示数组长度。
第三行输入n个数据
依次输入t个实例
每个根据不同的数组类型输出相应的结果
3
C 5
A D E B C
I 6
22 55 77 33 88 55
F 4
3.1 1.9 6.5 4.8
E
55
1.9
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
char c;
cin >> c;
int n;
cin >> n;
if (c == 'I') {
int* p = new int[n];
int _max = 0;
for (int i = 0; i < n; i++)
{
cin >> *(p + i);
_max += *(p + i);
}
cout << _max / n << endl;
delete[]p;
}
else if (c == 'C') {
char* p = new char[n];
char c1 = 0;
for (int i = 0; i < n; i++) {
cin >> *(p + i);
if (*(p + i) > c)
c1 = *(p + i);
}
cout << c1 << endl;
delete[]p;
}
else if (c == 'F')
{
double* p = new double[n];
for (int i = 0; i < n; i++)
cin >> *(p + i);
double _min = *p;
for (int i = 1; i < n; i++) {
if (*(p + i) < _min)
_min = *(p + i);
}
cout << _min << endl;
delete[]p;
}
}
return 0;
}
输入一个2*3的矩阵,将这个矩阵向左旋转90度后输出
比如现在有2*3矩阵 :
1 2 3
4 5 6
向左旋转90度后的矩阵变为:
3 6
2 5
1 4
要求:除了矩阵创建和数据输入可以使用数组和数组下标的方法,其他过程对矩阵的任何访问都必须使用指针
提示:m行n列的二维矩阵,第i行第j列的元素与首元素的距离为i*n+j,序号从0开始计算
第一行输入t表示有t个测试实例
连续两行输入一个2*3的矩阵的数据
依次输入t个实例
依次输出左转后的矩阵结果
在输出的每行中,每个数据之间都用空格隔开,最后一个数据后面也带有空格
2
1 2 3
4 5 6
4 5 6
7 8 9
3 6
2 5
1 4
6 9
5 8
4 7
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--)
{
int arr[2][3];
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
cin >> *(*(arr + i) + j);
for (int i = 2; i >= 0; i--) {
for (int j = 0; j < 2; j++)
cout << arr[j][i] << " ";
cout << endl;
}
}
return 0;
}