65,207
社区成员
发帖
与我相关
我的任务
分享
理解和讨论之前请先学会如何观察!
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!
)
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。



//#include"stdafx.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
template <typename T>
class Array {
T *elements;
int last; //已用最大下标值
int maxSize; //数组容量
public:
Array(int = 2); //为了便于检验,缺省元素数暂为2
~Array();
bool IsFull(); //判容器是否满
void renews(int); //数组容量增加若干个元素
void insertFront(T&); //将数据插入在数组最前面
friend ostream& operator<<(ostream& dest, Array& ar) {
if (ar.last == -1) cout << "暂无信息" << endl;
else for (int i = 0; i <= ar.last; i++) dest << ar.elements[i] << endl;
return dest;
}
};
template <typename T>Array<T>::Array(int maxs) {
//补充代码,创建并初始化数组,如有历史数据,则从文件"Exam6.txt"中读取
maxSize = maxs;
elements = new T[maxSize];
last = -1;
T temp;
ifstream datafile("Exam6.txt");
if (!datafile == 0) {//文件存在,则从文件读取数据
while (!datafile.eof()) {//!datafile.eof()是没有到文件结尾的意思
datafile >> temp;
insertFront(temp);
}
datafile.close();
datafile.clear(0);
}//因为是模板,所以志愿者类的东西都不能出现,实现通用性!!!!!!
}//写模板函数的时候要把它当成最普通的数据类型来写
template <typename T>Array<T>::~Array() {
//补充代码,释放动态数组空间,数据写入文件Exam6.txt
if (last != -1) {
ofstream datafile("Exam6.txt");
if (!datafile) cout << "fail to open." << endl;
else {
for (int i = 0; i <= last; i++) datafile << elements[i] << endl;
datafile.close();
}
}
delete[]elements;
}
template <typename T>bool Array<T>::IsFull() {
return (last == maxSize - 1);
}
template <typename T>
void Array<T>::renews(int augment) {
//完成数组容器增加augment个元素空间
T* temp = elements;
elements = new T[maxSize + augment];
maxSize += augment;
for (int i = 0; i <= last; i++) elements[i] = temp[i];//需重载志愿者类的等于运算符
delete[]temp;
}
template <typename T>void Array<T>::insertFront(T & elem) {
//补充代码,将数据插入到数组第一个位置
if (IsFull()) renews(1);
if (last == -1) elements[last + 1] = elem;
else for (int i = last; i > 0; i--) elements[i] = elements[i - 1];
elements[0] = elem;
last++;
}
class volunteer {
string Name;//志愿者姓名
string No;//身份证号
string Department;//所在院系
string Date;//参加日期
public:
volunteer(string = "", string = "", string = "", string = "");
friend ostream& operator<<(ostream&, volunteer&); //重载插入运算符
friend istream& operator >> (istream&, volunteer&);
// bool operator==(volunteer &);//志愿者姓名为关键字
bool operator<(volunteer &); //志愿者姓名为关键字
bool operator==(volunteer &);
};
istream&operator >> (istream& sour, volunteer& vlt) {//文件流类作为形式参数必须是引用
if (sour == cin) {// 完成键盘输入部分,键盘输入必须有提示
cout << "请输入志愿者姓名、身份证号、所在院系、参加日期(yymmdd,如150920): " << endl;
sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
} else { //文件输入不要提示,完成由文件输入部分
sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
}
return sour;
}
ostream& operator<<(ostream& dest, volunteer& vlt) //重载插入运算符
{
dest << " " << vlt.Name << " " << vlt.No << " " << vlt.Department << " " << vlt.Date;
return dest;
}
bool volunteer::operator==(volunteer &me) {
return Name == me.Name;
}
volunteer::volunteer(string name, string no, string department, string date) {
//完成构造函数&
Name = name;
No = no;
Department = department;
Date = date;
}
bool volunteer::operator<(volunteer& vlt) {//为按身份证号排序重载关系运算符
//重载==运算符
if (Name < vlt.Name)
return 1;
else return 0;
}
int main() {
Array<volunteer> mylist;
cout << mylist;
volunteer temp;
char ch;
cout << "是否输入新志愿者?Y or N" << endl;
cin >> ch;
while (ch == 'Y' || ch == 'y') {
cin.get();//吸收回车
cin >> temp;
mylist.insertFront(temp);
cout << "是否继续输入? Y or N" << endl;
cin >> ch;
}
cout << mylist;
return 0;
}