第十五周作业

文章讲述了使用面向对象编程中的类结构,如Message和Vehicle子类(Car和Trunk)来表示车辆信息,并涉及文件操作,如逐个字符读取和写入数值。第二题着重于文件读取,演示如何从a.txt中按每3个数字一组提取并写入b.txt。
摘要由CSDN通过智能技术生成

第一题

该题其实就是复习之前的类的思想,这次的题目本身就是希望大家在写的时候脑海里有个类似的概念,每一个类中我需要完成哪些任务,比如这一部分就是我需要一个汽车类去描述题目中提到的一切需要注意的信息(速度,人数,重量)等,这些都可以存放在message类中,而针对不同的车的类型,也可以相应得将限制的信息存放在另一个message变量中,如此即可实现目标。(当前题目也没出好,如果加一个卡车的违规会多加一条限制高度应该就能更加清晰表达这个题目所想强调的东西了)

在这里插入图片描述
对应的Class.h如下

#ifndef CLASS_H
#define CLASS_H
#include <iostream>
using namespace std;
class Message{
     public :
     int weight;
     int num;
     int speed;

    Message(int w=0,int n=0,int s=0):weight(w),num(n),speed(s)
    {
    }
 };
 class Vehicle{
    public:
    Message cur;
    Message max;
    int type;
    int allIndex = 0;
    int typeIndex = 0;
    static int carIndex ;
    static int trunkIndex ;
     void setCur(int t=1,int s=0,int w=0,int n=0)
   {
        type = t;
        cur.speed = s;
        cur.weight = w;
        cur.num = n;
    }
    void setMax(int s=0,int w=0,int n=0)
   {
        max.speed = s;
        max.weight = w;
        max.num = n;
    }
    bool isLegal()
    {
        return true;
    }
    void print()
    {

    }
 };

 class Car:public Vehicle{
    public:
    void set(int s=0,int w=0,int n=0){
        Vehicle::setCur(1,s,w,n);
        Vehicle::setMax(80,4,5);//假如限重不是固定的这里就是接收外部参数设置限制信息
        Vehicle::carIndex++;
        typeIndex = Vehicle::carIndex;
        allIndex = Vehicle::carIndex+Vehicle::trunkIndex;
    }

    bool isLegal()
    {
        return cur.weight <= max.weight && cur.num <= max.num 
                && cur.speed <= max.speed;
    }

    void print()
    {
        cout <<allIndex<<" car "<<typeIndex<<" "<<cur.speed
                <<" "<<cur.weight<<" "<<cur.num<<endl;
    }
 };
 class Trunk:public Vehicle{
    public:
    void set(int s=0,int w=0,int n=0){
        Vehicle::setCur(2,s,w,n);
        Vehicle::setMax(60,20,2);//同样,比如卡车还可能多加一个限高
        Vehicle::trunkIndex++;
        typeIndex = Vehicle::trunkIndex;
        allIndex = Vehicle::carIndex+Vehicle::trunkIndex;
    }

    bool isLegal()
    {//假如卡车和小车的违规判定的规制不一样,这里的重写就有意义了
           return cur.weight <= max.weight && cur.num <= max.num 
                && cur.speed <= max.speed;
    }
    
    void print()
    {
        cout <<allIndex<<" trunk "<<typeIndex<<" "<<cur.speed
                <<" "<<cur.weight<<" "<<cur.num<<endl;
    }
 };
 #endif

第二题

这个题目的重点是文件读取部分的操作,利用FILE结构逐个读取字符直到读取到eof(也就是写个循环逐个读取),随后按照三个一组的规则将数据存放到文件里面,比较容易出问题的地方可能就是最后一部分数据也需要写到文件里面。这点注意下其实和cin逐个读取字符没有太大的区别。

#include <stdio.h>
// 函数extractDigit的功能:从文件a.txt中提取数值写入文件b.txt中
void extractDigit();
// 请在此添加代码,实现extractDigit函数
/********** Begin *********/
char readADigit(FILE *fi)
{
    char c = fgetc(fi);  // 从文件读取一个字符
    if(c==EOF)  // 是结束符则返回
        return EOF;
    while(c>'9' || c<'0')  // 如果不是数字字符,则继续读取下一个字符
    {
        c = fgetc(fi);  // 读取下一个字符
        if(c==EOF)  // 是结束符则返回
            return EOF;
    }
    return c;  // 返回读取的数字字符
}
// 函数extractDigit的功能:从文件a.txt中提取数值写入文件b.txt中
void extractDigit()
{
    FILE *fi = fopen("a.txt","r");  // 以读的方式打开文件a.txt
    FILE *fo = fopen("b.txt","w");  // 以写的方式打开文件b.txt
    if(fi==NULL || fo==NULL)  // 如果某个文件打开失败,则返回
        return;
    char c;
    int num=0,k=0;
    c = readADigit(fi);  // 读取一个数字字符
    while(c!=EOF)
    {
        num=num*10+c-'0';  // 计算数字字符构成的整数
        k++;
        if(k==3)  // 已经三位了
        {
            fprintf(fo,"%d ",num);  // 将计算的整数写入文件指针fo指向的文件
            k=0;  // 重新计数
            num=0;  // 重新计算
    }
        c = readADigit(fi);  // 读取下一个数字字符
    }
    if(k!=0)  // 如果有不到三位的数值,则写入文件b.txt
    {
        fprintf(fo,"%d ",num);
    }
    fclose(fi);  // 关闭文件fi
    fclose(fo);  // 关闭文件fo
}
/********** End **********/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值