第一题
该题其实就是复习之前的类的思想,这次的题目本身就是希望大家在写的时候脑海里有个类似的概念,每一个类中我需要完成哪些任务,比如这一部分就是我需要一个汽车类去描述题目中提到的一切需要注意的信息(速度,人数,重量)等,这些都可以存放在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 **********/