A. Point&Circle (clase y estructura compuestas)
Tema Descripción
La clase Point es una clase que hemos escrito, la clase Circle es una nueva clase y Point es su objeto miembro, complete la implementación de las funciones miembro de la clase Circle.
Genere un círculo y varios puntos en la función principal, juzgue la relación posicional entre estos puntos y el círculo, si el punto está dentro del círculo (incluso en el borde del círculo), emita "adentro", de lo contrario, emita "afuera"; luego mueva el centro de la posición del círculo, juzgue la relación posicional entre estos puntos y el círculo nuevamente.
ingresar
coordenada x coordenada y radio del círculo
el número de puntos m
La coordenada x coordenada y del primer punto
La coordenada x coordenada y del segundo punto
…
La coordenada x coordenada y del punto n
La nueva coordenada x coordenada y donde el centro del círculo se mueve a
producción
La relación entre el primer punto y el círculo.
La relación entre el segundo punto y el círculo.
…
La relación entre el punto n-ésimo y el círculo.
después de mover el centro del círculo
La relación entre el primer punto y el círculo después de que el centro del círculo se mueve
La relación entre el segundo punto y el círculo después de que el centro del círculo se mueve
…
La relación entre el punto n-ésimo y el círculo después de que el centro del círculo se mueve
Muestra de entrada 1
0 0 5
4
1 1
2 2
5 0
-6 0
-1 0
muestra de salida 1
interior
interior
interior
exterior
después de mover el centro del círculo:
interior
interior
exterior
interior
código de CA
#include<bits/stdc++.h>
using namespace std;
class Point {
double x, y;
public:
Point() {
}
Point(double x,double y):x(x),y(y){
}
double getX() {
return x; }
double getY() {
return y; }
double getDisTo(Point& p) {
return sqrt(pow(x - p.x, 2) + pow(y - p.y,2));
}
void setXY(int x,int y){
this->x = x;
this->y = y;
}
~Point(){
}
};
class Circle {
Point centre;
double radius;
public:
Circle() {
}
Circle(double x, double y, double r) {
centre.setXY(x, y);
radius = r;
}
double getArea() {
return 2.1415926 * radius * radius;
}
void moveCentreTo(double x1, double y1) {
centre.setXY(x1, y1);
}
bool isContain(Point &p) {
double distance = centre.getDisTo(p);
return distance <= radius;
}
};
int main() {
int x, y, r;
cin >> x >> y >> r;
Circle c(x, y, r);
int n;
cin >> n;
vector<Point>v(n);
for (auto& it : v) {
cin >> x >> y;
it.setXY(x, y);
if (c.isContain(it))
cout << "inside" << endl;
else
cout << "outside" << endl;
}
cin >> x >> y;
c.moveCentreTo(x, y);
cout << "after move the centre of circle:" << endl;
for (auto& it : v) {
if (c.isContain(it))
cout << "inside" << endl;
else
cout << "outside" << endl;
}
return 0;
}
B. Complejo (clase y objeto + construcción)
Tema Descripción
Escriba una clase de números complejos, que pueda realizar operaciones de suma y resta, y pueda generar información de números complejos. Requiere al menos los siguientes métodos:
1. El constructor predeterminado (sin parámetros), establece la parte real y la parte imaginaria en 1;
2. Hay un constructor con parámetros, asignando valores a la parte real y la parte imaginaria;
3. Operación de suma, calcula la suma de dos números complejos;
4. Operación de resta, calcula la diferencia entre dos números complejos;
5. Método de salida, salida del valor del número complejo actual
ingresar
El número de grupos de datos de prueba t Las partes reales e imaginarias de los dos números complejos del primer grupo Las partes reales e imaginarias de las partes reales e imaginarias de los dos números complejos del segundo grupo...
producción
La diferencia del primer conjunto de dos números complejos y el primer conjunto de dos números complejos
Muestra de entrada 1
4
2 1 2 1
2
1 2 -1 3 1 2 -6
3 3 2 2
muestra de salida 1
suma:4+2i
resto:0
suma:4
resto:2i
suma:5-5i
resto:1+7i
suma:5+5i
resto:1+i
código de CA
#include<bits/stdc++.h>
using namespace std;
class Complex
{
public:
Complex();
Complex(int, int);
~Complex();
Complex add(Complex&);
Complex sub(Complex&);
void display();
private:
int a, b;
};
Complex::Complex()
{
a = b = 0;
}
Complex::Complex(int a, int b) :a(a), b(b)
{
}
Complex::~Complex()
{
}
Complex Complex::add(Complex& c1)
{
return Complex(a + c1.a, b + c1.b);
}
Complex Complex::sub(Complex& c1)
{
return Complex(a - c1.a, b - c1.b);
}
void Complex::display()
{
if (!(a || b)) {
cout << 0 << endl;
return;
}
if (a)
cout << a;
if (b > 0) {
if(a)
cout << "+";
if (b != 1)
cout << b;
cout << "i" ;
}
else if (b < 0) {
if (b != -1)
cout << b << "i" ;
else
cout << "-i";
}
cout << endl;
}
int main() {
int t;
cin >> t;
while (t--)
{
int a, b, c, d;
cin >> a >> b >> c >> d;
Complex c1(a, b), c2(c, d);
cout << "sum:";
c1.add(c2).display();
cout << "remainder:";
c1.sub(c2).display();
}
return 0;
}
C. Promoción del número de teléfono (constructor de copias)
Tema Descripción
Defina una clase de número de teléfono CTelNumber, que contiene un miembro de datos de puntero de carácter y constructores para construcción, destrucción, impresión y copia.
El puntero de carácter se usa para crear dinámicamente una matriz de caracteres y luego guardar la entrada del número de teléfono desde el exterior
La función del constructor es establecer el número de teléfono de 7 dígitos ingresado por el teclado para el objeto,
La función del constructor de copia es usar el objeto de número original de 7 dígitos para actualizar a un objeto de número de 8 dígitos, es decir, el objeto de la construcción de copia es una actualización del objeto de origen. es el número de teléfono original que comienza con 2, 3 y 4 Agregue 8 al frente y agregue 2 al frente del 5, 6, 7 y 8 originales.
Nota: Número de teléfono legal: 1. La longitud es de 7 dígitos 2. Los caracteres del número de teléfono son todos caracteres numéricos 3. El primer carácter solo puede ser los siguientes caracteres: 2, 3, 4, 5, 6, 7 , 8 . Las entradas que no coincidan con las anteriores son ilegales
ingresar
El número de grupos de datos de prueba t
primeros 7 dígitos
segundo número de 7 dígitos
…
producción
El número después del primer número se eleva
Número elevado del segundo número
…
Si la actualización del número no se realiza correctamente, aparecerá un mensaje de error; consulte el ejemplo para obtener más información.
Muestra de entrada 1
3
6545889
3335656
565655
muestra de salida 1
26545889
83335656
Número de teléfono ilegal
código de CA
#include<bits/stdc++.h>
using namespace std;
class CTelNumber {
string id;
public:
CTelNumber() {
cin >> id;
}
~CTelNumber()
{
id.clear();
}
void print() {
cout << id << endl;
}
bool isLeagle() {
if (id.length() != 7)
return false;
for (auto& it : id)
if (!isdigit(it))
return false;
if (id[0] == '0' || id[0] == '1' || id[0] == '9')
return false;
return true;
}
CTelNumber(const CTelNumber& p) {
id = p.id;
if (id[0] >= '2' && id[0] <= '4')
id = "8" + id;
else if (id[0] >= '5' && id[0] <= '8')
id = "2" + id;
}
};
int main() {
int t;
cin >> t;
while (t--){
CTelNumber c;
if (c.isLeagle()) {
CTelNumber c1(c);
c1.print();
}
else cout << "Illegal phone number" << endl;
}
return 0;
}
D. Configuración de la tarjeta de identificación (clase compuesta + estructura de copia)
Tema Descripción
Defina un PID de tarjeta de identificación, incluidos los atributos privados: tipo de tarjeta de identificación, número de identificación, fecha de nacimiento y métodos: construcción, construcción de copias, impresión, etc.
El tipo de tarjeta de identificación indica la tarjeta de identificación de primera generación o la tarjeta de identificación de segunda generación, representada por 1 y 2 respectivamente
El número de la tarjeta de identificación es una cadena con una longitud de 15 o 18
La fecha de nacimiento es una clase que contiene propiedades privadas año, mes, día y constructores, etc. (agregue otros métodos según sea necesario)
Tenga en cuenta que el constructor es una clase compuesta y se debe considerar la construcción de los miembros de la clase compuesta.
La función de impresión genera todos los atributos de la tarjeta de identificación, vea el ejemplo para el formato de salida
Función de construcción de copias: si el número de la tarjeta de identificación tiene 15 dígitos, se actualizará a 18 dígitos, lo que incluye cambiar el tipo de tarjeta de identificación a 2 y luego expandir el número. Las reglas son las siguientes:
-
Los dígitos 7 a 12 de la tarjeta de identificación original de 15 dígitos representan la fecha de nacimiento, dos dígitos cada uno; expanda los 2 dígitos del año a cuatro dígitos.
-
Sume los 17 números expandidos, tome el último número de la suma, si el último número es 0, cambie el 0 a X, luego coloque este número como el dígito 18
3. Si el número de la tarjeta de identificación ya tiene 18 dígitos, no es necesario actualizar
Por ejemplo, la cédula 123456910203000 significa que la persona nació el 3 de febrero de 1991, y luego según la fecha de nacimiento del atributo de clase, se sabe que es 1991, no 2091. Entonces se expande a 12345619910203000
Luego agregue 17 números para obtener 46, tome los últimos 6 y finalmente expanda a 123456199102030006
ingresar
La entrada t en la primera línea representa t ejemplos
En la segunda línea, ingrese 5 atributos de una tarjeta de identificación, en orden: tipo, número, año de nacimiento, mes, día
Ingrese t líneas a su vez
producción
Use el método del constructor de copias para actualizar el número de la tarjeta de identificación y luego genere
Muestra de entrada 1
3
1 123456910203000 1991 2 3
2 654321200001018889 2000 1 1
1 234567001217000 2000 12 17
muestra de salida 1
tipo=2 nacimiento=1991.02.03
ID=123456199102030006
tipo=2 nacimiento=2000.01.01
ID=654321200001018889
tipo=2 nacimiento=2000.12.17
ID=23456720001217000X
código de CA
#include<bits/stdc++.h>
using namespace std;
class Date {
int y, m, d;
public:
Date() {
}
Date(int y, int m, int d) :y(y), m(m), d(d) {
}
int getYear() {
return y; }
int getMonth() {
return m; }
int getDay() {
return d; }
void init() {
cin >> y >> m >> d; }
};
class Pid {
int type;
string id;
Date birthday;
public:
Pid() {
cin >> type >> id;
birthday.init();
}
Pid(const Pid& pid) {
type = pid.type;
id = pid.id;
birthday = pid.birthday;
if (type == 1) {
id.erase(6, 2);
id.insert(6, to_string(birthday.getYear()));
int sum = 0;
for (auto& it : id) {
sum += it - '0';
}
sum %= 10;
if (sum == 0)
id.push_back('X');
else
id.push_back(sum + '0');
type = 2;
}
}
void display() {
cout << "type=" << type << " ";
cout << "birth=" << birthday.getYear() << "." << setfill('0') << setw(2) << birthday.getMonth() << "." << setfill('0') << setw(2) << birthday.getDay() << endl;
cout << "ID=" << id << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
Pid id;
Pid update_id(id);
update_id.display();
}
return 0;
}
E. Copia de seguridad del software (constructor de copias)
Tema Descripción
Como objeto, el software también se puede describir por clase. Los atributos del software incluyen el nombre del software, el tipo (O, T y B representan la versión original, la versión de prueba o la copia de seguridad), la fecha de caducidad válida (representada por el subobjeto de clase CDate) y medios de almacenamiento (D, H y U se utilizan para representar disco óptico, disco magnético y disco U respectivamente), etc. La copia del software se puede realizar a través del constructor de copias. En este momento, en el constructor de copias, el tipo de software se cambia a "B", el medio de almacenamiento se cambia a "H", y los demás permanecen sin cambios. Intente completar la implementación de las funciones de los miembros de la construcción, construcción e impresión de copias de esta clase (incluidos cuántos días siguen siendo válidos desde el 7 de abril de 2015 y si ha expirado).
Cuando la fecha de caducidad válida del software de entrada es 0, 0, 0, 0, significa que no hay límite de fecha y es ilimitado; cuando la fecha de entrada es anterior al 7 de abril de 2015, está caducada y significa caducado; si la fecha de entrada es en abril de 2015 Después de 7 días, se muestran los días restantes después de eso. Para obtener información de salida específica, consulte el ejemplo de salida.
Se adjunta la implementación de la clase CDate:
class CDate
{ private: int año, mes, día; public: CDate(int y, int m, int d) { año = y; mes = m; día = d; } bool esAñoBisiesto() { return (año%4 = = 0 && año%100 != 0) || año%400 == 0; } int obtenerAño() { devolver año; } int obtenerMes() { devolver mes; } int obtenerDía() { devolver día; } int obtenerDíadelAño( ) // Calcular el número de días desde el 1 de enero del año actual { int i, sum=day; int a[13]={0,31,28,31,30,31,30,31,31,30, 31,30,31}; int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear())
for(i=0;i<month;i++) sum +=b[i];
else
for(i=0;i<mes;i++) sum +=a[i];
suma devuelta;
}
};
ingresar
El número de grupos de datos de prueba t
primer nombre del programa
El primer tipo de software El primer tipo de medio de software El primer período de validez del software año mes día
segundo nombre del programa
El segundo tipo de software El segundo tipo de medio de software El segundo período de validez del software año mes día
…
producción
nombre: el primer nombre del software
tipo: el primer tipo de software
medios: el primer tipo de medio de software
Días válidos después del primer software 2015-4-7
nombre: el primer nombre del software
tipo: copia de seguridad
medios: disco duro
Días válidos después del primer software 2015-4-7
…
Muestra de entrada 1
3
Photoshop_CS5
OD 0 0 0
Audition_3.0
BU 2015 2 3
Visual_Studio_2010
J 2015 5 5
muestra de salida 1
nombre:Photoshop_CS5
tipo:
medio original:disco óptico
este software tiene uso ilimitado
nombre:Photoshop_CS5
tipo:
medio de copia de seguridad:disco duro
este software tiene un uso ilimitado
nombre:Audition_3.0
tipo:
medio de copia de seguridad:disco USB
este software ha caducado
nombre:Audition_3.0
tipo:
medio de copia de seguridad:disco duro
este software ha caducado
nombre:Visual_Studio_2010
tipo:
medio de prueba:disco duro
este software caducará en 28 días
nombre:Visual_Studio_2010
tipo:
medio de copia de seguridad:disco duro
este software caducará en 28 días
código de CA
#include<bits/stdc++.h>
using namespace std;
class CDate
{
int year, month, day;
public:
CDate() {
};
CDate(int y, int m, int d) {
year = y; month = m; day = d; }
CDate(const CDate& c) {
year = c.year;
month = c.month;
day = c.day;
}
bool isLeapYear() {
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; }
int getYear() {
return year; }
int getMonth() {
return month; }
int getDay() {
return day; }
int getDayofYear() //计算日期从当年1月1日算起的天数
{
int i, sum = day;
int a[13] = {
0,31,28,31,30,31,30,31,31,30,31,30,31 };
int b[13] = {
0,31,29,31,30,31,30,31,31,30,31,30,31 };
if (isLeapYear())
for (i = 0; i < month; i++) sum += b[i];
else
for (i = 0; i < month; i++) sum += a[i];
return sum;
}
void goTomorrow() {
int a[13] = {
0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (isLeapYear()) {
a[2] += 1;
}
day++;
if (day > a[month]) {
day = 1;
month++;
}
if (month > 12) {
month = 1;
year++;
}
}
bool operator!=(CDate& date) {
if (year != date.year)
return true;
if (month != date.month)
return true;
if (day != date.day)
return true;
return false;
}
};
class Software {
string name;
char type, media;
CDate ddl;
public:
Software() {
}
Software(string name, char type, char hard, CDate ddl) {
this->name = name;
this->type = type;
this->media = hard;
this->ddl = ddl;
}
Software(const Software& s) {
this->name = s.name;
this->type = 'B';
this->media = 'H';
this->ddl = s.ddl;
}
string getName() {
return name;
}
bool isOverdue() {
if (ddl.getYear() < 2015)
return true;
if (ddl.getYear() > 2015)
return false;
if (ddl.getMonth() < 4)
return true;
if (ddl.getMonth() > 4)
return false;
if (ddl.getDay() < 7)
return true;
if (ddl.getDay() >= 7)
return false;
}
int getRestDay() {
CDate today(2015, 4, 7);
int cnt = 0;
while (today != ddl) {
cnt++;
today.goTomorrow();
}
return cnt;
}
void print() {
cout << "name:" << name << endl;
cout << "type:";
if (type == 'B')
cout << "backup" << endl;
else if (type == 'T')
cout << "trial" << endl;
else
cout << "original" << endl;
cout << "media:";
if (media == 'H')
cout << "hard disk" << endl;
else if (media == 'D')
cout << "optical disk" << endl;
else cout << "USB disk" << endl;
if (!(ddl.getYear() || ddl.getMonth() || ddl.getDay()))
cout << "this software has unlimited use" << endl;
else if (isOverdue())
cout << "this software has expired" << endl;
else
cout << "this software is going to be expired in " << getRestDay() << " days" << endl;
cout << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
string name;
char type, media;
int year, month, day;
cin >> name >> type >> media >> year >> month >> day;
Software s(name, type, media, CDate(year, month, day));
s.print();
Software copy_s(s);
copy_s.print();
}
return 0;
}
F. Carrito de compras (clase compuesta)
Tema Descripción
Defina una clase de producto, incluidos los miembros de datos privados: número de producto, nombre, color, tamaño, precio unitario, cantidad. Las funciones miembro incluyen: calcular el precio total (precio unitario * cantidad) y generar información sobre productos básicos. Para el formato de salida específico, vea la salida de muestra. Se pueden agregar constructores y otras funciones según las necesidades del tema.
Defina una clase de carrito de compras, incluidos los miembros de datos privados: colección de objetos de productos, número total de productos y precio total de todos los productos en el carrito de compras. Los métodos incluyen: agregar productos, eliminar productos, reducir la cantidad de productos, aumentar la cantidad de productos y mostrar la lista de productos en el carrito de compras. Se pueden agregar constructores y otras funciones según las necesidades del tema.
Escriba la función principal, defina los objetos de clase anteriores y realice la simulación simple del carrito de compras de acuerdo con la entrada y salida de la muestra.
Las operaciones del carrito de compras están representadas por AGREGAR, ELIMINAR, ARRIBA y ABAJO, y el formato específico se describe a continuación:
AGREGAR No. de artículo Nombre del artículo Color Tamaño Precio unitario Cantidad//Agregue 1 o más artículos similares Si el carrito de compras ya tiene un producto con el número especificado, simplemente aumente la cantidad, si no, agréguelo al encabezado del carrito de compras .
ELIMINAR número de artículo//Elimine todos los artículos con el número de artículo dado en el carrito de compras, no hay ningún caso de eliminación fallida, es decir, debe haber un artículo con el número dado en el carrito de compras.
ARRIBA número de artículo // Aumente la cantidad de artículos en el número de artículo en el carrito de compras en 1, y no hay ningún caso en el que la operación falle.
ABAJO número de artículo//El número de artículos en el número de artículo en el carrito de compras se reduce en 1, y el mínimo es 1.
Para comprender mejor el problema, puede probar la operación en el carrito de compras de Jingdong. Los datos de la muestra proceden de esta web, incluidos colores y tallas. Para simplificar el tema, suponga que el mismo producto tiene diferentes colores, tamaños y números.
ingresar
Número de pruebas t
Cada conjunto de datos de prueba es:
El número de operaciones del carrito de la compra n, seguido de n operaciones de fila.
producción
Para cada conjunto de datos de prueba, genere la lista de artículos en el carrito de compras después de la operación. El formato de salida se muestra en la muestra, y se generan 10 símbolos antes de las estadísticas del artículo. El carrito de compras después de todas las operaciones de datos de prueba no está vacío.
Muestra de entrada 1
1
8
ADD 2018040801 Green inverter aire acondicionado de calefacción y refrigeración KFR-26GW grande 1 hp inversor colgador 2999 1 ADD 2018040802
Changhong 65D2P alta definición HDR panel plano LED LCD 1 1 4799 1 ADD 2018040803 Konka
LED55X9 inteligencia artificial televisor de panel plano nulo 55 pulgadas 4 999 1
UP 2018040802
UP 2018040803
DOWN 2018040803
DELETE 2018040802
ADD 2018040802 Changhong 65D2P HD HDR panel LED LCD 1 1 4799 2
muestra de salida 1
Lista de productos:
producto, color, tamaño, precio unitario, cantidad ,
subtotal Aire acondicionado de refrigeración y calefacción con inversor Gree KFR-26GW, grande 1 HP, inversor colgado, 2999,00, 1,2999,00 ---------- 4 artículos, valor total del artículo 17596.00
código de CA
#include<bits/stdc++.h>
using namespace std;
class Good {
string id, name, color, size;
double price;
int num;
public:
Good() {
cin >> id >> name >> color >> size >> price >> num;
}
double getSumPrice() {
return num * price;
}
string getId() {
return id;
}
int getNum() {
return num;
}
void display() {
cout << name << "," << color << "," << size << "," << fixed << setprecision(2) << price << "," << num << "," << fixed << setprecision(2) << getSumPrice() << endl;
}
void add(int n = 1) {
num += n;
}
void down() {
num--;
if (num < 1)
num = 1;
}
};
class Cat {
list<Good>set;
public:
Cat() {
}
void ADD() {
Good new_good;
for (auto& good : set) {
if (good.getId() == new_good.getId()) {
good.add(new_good.getNum());
return;
}
}
set.push_front(new_good);
}
void UP() {
string new_id;
cin >> new_id;
for (auto& good : set) {
if (good.getId() == new_id) {
good.add();
return;
}
}
}
void DOWN() {
string new_id;
cin >> new_id;
for (auto& good : set) {
if (good.getId() == new_id) {
good.down();
return;
}
}
}
void DELETE() {
string s;
cin >> s;
for (auto it = set.begin(); it != set.end(); it++)
{
if (it->getId() == s) {
set.erase(it);
return;
}
}
}
int getGoodNum() {
int cnt = 0;
for (auto& it : set)
cnt += it.getNum();
return cnt;
}
double getSumPrice() {
double sum = 0;
for (auto& it : set) {
sum += it.getSumPrice();
}
return sum;
}
void print() {
cout << "商品清单:" << endl;
cout << "商品,颜色,尺码,单价,数量,小计" << endl;
for (auto& it : set) {
it.display();
}
cout << "----------" << endl;
cout << getGoodNum() << "件商品,总商品金额" << fixed << setprecision(2) << getSumPrice() << endl;
}
};
int main() {
int t;
cin >> t;
while (t--) {
Cat c;
int n;
cin >> n;
while (n--) {
string s;
cin >> s;
if (s == "ADD")
c.ADD();
else if (s == "UP")
c.UP();
else if (s == "DOWN")
c.DOWN();
else
c.DELETE();
}
c.print();
}
return 0;
}