第十二周作业

其实这次的题目基本上都是基础题,没啥算法上的难度,主要是让大家熟悉怎么写类,类中的成员函数的声明,定义,使用都各有哪些区别

第一题

这个地方主要是一些常见的语法问题,

  • 首先是定义,类中的函数在别的文件而不是在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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值