其实这次的题目基本上都是基础题,没啥算法上的难度,主要是让大家熟悉怎么写类,类中的成员函数的声明,定义,使用都各有哪些区别
第一题
这个地方主要是一些常见的语法问题,
- 首先是定义,类中的函数在别的文件而不是在class内部直接实现的话,需要加上
类名::
如果是构造函数,对函数内部变量初始化可以用下面的方法(基础语法没有为啥)
//这个是构造函数,可以这么初始化,其他函数都不可以
Thermometer::Thermometer(double temp): tempCelsius(temp){}
- 随后是对类中的变量修改和使用,一般没有同名的全局变量可以直接和平时一样用,如果想显式指出使用类中某个变量可以用这个
this->
,比如(这个例子里面没有重名的,加不加无所谓)
this->tempFahrenheit=32+1.8* this->temp;
剩下的就没啥好说的
#include "class.h"
Thermometer::Thermometer(double temp): tempCelsius(temp)
{
tempFahrenheit=32+1.8*temp;
}
Thermometer::Thermometer(): tempCelsius(0),tempFahrenheit(0){}
Thermometer::~Thermometer(){}
void Thermometer::SetTempCelsius(double tempCelsius)
{
tempCelsius=tempCelsius;
tempFahrenheit=32+1.8*tempCelsius;
}
void Thermometer::SetTempFahrenheit(double tempFahrenheit)
{
tempCelsius=(tempFahrenheit-32)/1.8;
tempFahrenheit=tempFahrenheit;
}
double Thermometer::GetTempCelsius()
{
return tempCelsius;
}
double Thermometer::GetTempFahrenheit()
{
return tempFahrenheit;
}
//TODO
第二题
这题也没啥太高深的算法,将时间用总共对应多少秒存储即可快速计算,主要就是注意下输出读取的方法,输入这个可以用scanf
格式化读取
输出可以用printf
格式化输出,这些其实要用的时候百度就好,平时稍微记下。
- 头文件class.h
#ifndef CLASS_H
#define CLASS_H
class Clock
{
public:
int h;
int m;
int s;
public:
void SetTime(int hh, int mm, int ss);
void DisplayTime();
Clock();
~Clock();
};
#endif /* CLASS_H */
- 具体实现class.cpp
#include "class.h"
#include <iostream>
Clock::Clock(){}
Clock::Clock(int hh,int mm,int ss):h(hh),m(mm),s(ss)
{
total = h * 3600 + m* 60 + s;
}
Clock::~Clock(){}
void Clock::SetTime(int hh,int mm,int ss)
{
h=hh;
m=mm;
s=ss;
total = h * 3600 + m* 60 + s;
}
void Clock::DisplayTime()
{
printf("%02d:%02d:%02d",h,m,s);
}
//TODO
- main
#include <iostream>
#include "class.h"
#include <bits/stdc++.h>
Clock Time(Clock c1, Clock c2){
// TODO
int time=abs(c1.total - c2.total);
int t1 = time % 3600;
int t2 = t1 % 60;
Clock c(time / 3600, t1 / 60, t2);
return c;
}
using namespace std;
int main(){
// TODO
int h=0,m=0,s=0;
scanf("%d:%d:%d",&h,&m,&s);
Clock c1(h,m,s);
scanf("%d:%d:%d",&h,&m,&s);
Clock c2(h,m,s);
Clock c=Time(c1,c2);
c.DisplayTime();
return 0;
}
第三题
这个题目也算老朋友了,经典的取余计算之类就不再赘述,主要是讲述一下全局变量的用法,如果在头文件中定义全局变量,那么当cpp重复引用该头文件会报错,这种形式本质上等价于多次声明一个全局变量,正确的做法是在头文件中用extern
声明一个变量,在cpp中定义,这样就不会冲突了,具体看下面的例子
- cpp文件
#include "class.h"
char rom[7]={'I','V','X','L','C','D','M'};
int RomanWithInt::dt(char c){
switch(c){
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
}
}
void RomanWithInt::i2r(char * ch){
char s[50];
int l = strlen(ch);
int j=0, d=0;
for(int i=l-1;i>=0;i--){
int k = ch[i]-'0';
int m=k%5;
if(m==4){if(k/5){s[j++]=rom[2*(d+1)];}else{s[j++]=rom[2*d+1];}s[j++]=rom[2*d];}
else{
while(m--){
s[j++]=rom[2*d];
}
if(k/5)s[j++]=rom[2*d+1];
}
d++;
}
for(int n=0;n<j;n++){
st[n]=s[j-n-1];
}
st[j]=0;
}
void RomanWithInt::r2i(char *ch){
int s=0;
int l = strlen(ch);
for(int i=l-1;i>=0;i--){
if(i==l-1)
s+=dt(ch[i]);
else
if(dt(ch[i])<dt(ch[i+1])){
s-=dt(ch[i]);
}
else
s+=dt(ch[i]);
}
int j=0;
while(s){
st[j++]=s%10+'0';
s=s/10;
}
char tmp;
for(int k=0;k<j/2;k++){
tmp = st[k];
st[k] = st[j-k-1];
st[j-k-1] = tmp;
}
st[j]=0;
}
void RomanWithInt::show(){
cout<<st<<endl;
}
- 头文件
#ifndef CLASS_H
#define CLASS_H
#include<cstring>
#include<iostream>
using namespace std;
extern char rom[7];//注意这个extern
class RomanWithInt{
char st[50];
public:
int dt(char c);
void i2r(char * ch);
void r2i(char *ch);
void show();
};
#endif
- main
#include <iostream>
#include "class.h"
using namespace std;
int main(){
RomanWithInt ri;
char ch[50];
while(true){
cin.getline(ch,50);
if(ch[0]=='@')break;
if(ch[0]>='0'&&ch[0]<='9'){
ri.i2r(ch);
//ri.show();
}
else{
ri.r2i(ch);
}
ri.show();
}
return 0;
}
第四题
这个题目是不难的,但是比较繁琐,直接看答案好了(矩阵的乘法,转置,计算这块得学线性代数,这些不是本课的重点就不多说了)其实初始化,转置啥的都好理解,而计算这个就是一个每一行每一列选出一个数字相乘(不允许同一行同一列有两个元素),前面再加个序列符号,这块确实现在你们可能不懂,不做也行
- 头文件
#ifndef CLASS_H
#define CLASS_H
class Matrix{
public:
int matrix[50][50];
int m,n;
void Initialization();
void Transpose();
int Determinant();
Matrix erase(int row);
};
#endif /* CLASS_H */
- cpp文件
#include "class.h"
#include <bits/stdc++.h>
#include <cstdlib>
void Matrix::Initialization()
{
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
scanf("%d",&matrix[i][j]);
}
}
void Matrix::Transpose()
{
for(int j=0;j<n;j++)
{
for(int i=0;i<m-1;i++)
{
printf("%d ",matrix[i][j]);
}
printf("%d\n",matrix[m-1][j]);
}
}
Matrix Matrix::erase(int row)
{
Matrix mm=*this;
for(int i=row;i<mm.m-1;i++)
{
for(int j=0;j<mm.n;j++)
mm.matrix[i][j]=mm.matrix[i+1][j];
}
mm.m--;
mm.n--;
return mm;
}
int Matrix::Determinant()
{
if (n==1)
return matrix[0][0];
int det=0;
for(int i=0;i<n;i++)
{
Matrix submatrix;
submatrix=this->erase(i);
det+=(int)pow(-1,i+n-1)*submatrix.Determinant()*matrix[i][n-1];
}
return det;
}
- 主文件
#include <iostream>
#include "class.h"
using namespace std;
int main()
{
Matrix m;
m.Initialization();
m.Transpose();
if(m.m!=m.n)
printf("@");
else
{
int det=m.Determinant();
printf("%d",det);
}
}