C++自己实现cout
接触这么久C++了,我们得尝试写一个自己的cout了。在实现之前,先扯扯几个概念: 一、cout是谁? 不就是输出语句嘛?!这个答案太浅显。正确答案:cout是类ostream的一个对象,而这个对象有一个成员重载运算符函数:operator <<。顺便一说,类ostream又属于iostream库中,iostream是标准的C++头文件。既然如此,那么这个头文件里应该是这样写的: 123456789//iostreamclass ostream{ public: ostream operator << (int n){输出n} ostream operator << (double n){输出n} ...}ostream cout; 这个ostream::operator <<有多个重载版本,所以形参什么类型都有,包括int,double,char等等。当我们写cout<<a时,其实也可以写成cout.operator<<(a)。 cout的语...
【POJ C++题目】魔兽世界之二:装备(简化)
今天把代码稍微简化了一下,主要改动是: 武士类构造函数形参的简化,形参直接来一个Command类更加方便,但是这样做Command类就必须放在程序开头,所以就有了: 类声明和成员函数的顺序有所改动,顺序是:Command类声明 -> Warrior类声明+各武士类声明 -> Command类成员函数实现 -> Warrior类+各武士类成员函数实现,个人认为这种顺序也是挺合理的 以下为代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132...
【POJ C++题目】魔兽世界之二:装备
一、题目描述 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值这两种属性。 有的武士可以拥有武器。武器有三种,sword, bomb,和arrow,编号分别为0,1,2。 双方的武士编号都是从1开始计算。红方制造出来的第 n 个武士,编号就是n。同样,蓝方制造出来的第 n 个武士,编号也是n。 不同的武士有不同的特点。 dragon 可以拥有一件武器。编号为n的dragon降生时即获得编号为 n%3 的武器。dragon还有“士气”这个属性,是个浮点数,其值为它降生后其司令部剩余生命元的数量除以造dragon所需的生命元数量。 ninja可以拥有两件武器。编号为n的ninja降生时即获得编号为 n%3 和 (n+1)%3的武器。 iceman有一件武器。编号为n的iceman降生时即获得编号为 n%3 的武器。 lion 有“忠诚度”这...
【POJ C++题目】魔兽世界之一:备战
一、题目描述 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性。 双方的武士编号都是从1开始计算。红方制造出来的第n个武士,编号就是n。同样,蓝方制造出来的第n个武士,编号也是n。 武士在刚降生的时候有一个生命值。 在每个整点,双方的司令部中各有一个武士降生。 红方司令部按照iceman、lion、wolf、ninja、dragon的顺序循环制造武士。 蓝方司令部按照lion、dragon、ninja、iceman、wolf的顺序循环制造武士。 制造武士需要生命元。 制造一个初始生命值为m的武士,司令部中的生命元就要减少m个。 如果司令部中的生命元不足以制造某个按顺序应该制造的武士,那么司令部就试图制造下一个。如果所有武士都不能制造了,则司令部停止制造武士。 给定一个时间,和双方司令部的初始生命元数目,要求你将从0点0...
C++学习笔记(5)——标准模板库STL之概述
STL指的是C++的标准模板库(Standard Template Library,STL),本篇将介绍STL的基本概念。 一、容器 容器是用于存放数据的类模板。我们在使用容器类模板时,要将它实例化,指明容器中存放的元素是什么类型。 1.容器的分类 容器有以下几种分类: (1)顺序容器 元素在容器中的位置与元素的值无关,你想在什么位置插入元素就在什么位置插入。顺序容器分为三种:可变长动态数组vector、双端队列deque、双向链表list。 (2)关联容器 关联容器内的元素是排好序的,它是按照某种规则将元素插入到合适的位置上。因为是排好序的,所以关联容器在查找时具有非常好的性能。关联容器有四种:set、multiset、map、multimap。 (3)容器适配器 STL还在两类容器的基础上屏蔽了一部分功能,突出或增加另一部分的功能,实现了容器适配器。容器适配器分为三种:栈stack、队列queue、优先级队列priority_queue。 2.容器对象的定义方法 如何定义一个容器对象呢?跟以前所说的模板类似,写成例如vector<int> a;就行了,其中vect...
C++学习笔记(4)——模板
一、函数模板 函数模板格式(其中class可以替换为typename): 12345template <class 类型参数1, class 类型参数2, ...>返回值类型 模板名(参数名){ 函数体;} 例如: 123456789101112131415161718192021222324252627282930313233#include<iostream>using namespace std;template <typename T> //typename可以替换为classvoid cswap(T &x, T &y) //交换数值{ T tmp = x; x = y; y = tmp;}template <typename T>T test(T o){ return o+1;}int main(){ int n = 1, m = 2; cswap(n, m); //模板被替换为cswap(int &x, int &y),...
C++学习笔记(3)——多态与虚函数
零、为什么引入多态 这部分是我写完第一部分后再加进来的,因为在我写这篇笔记的时候,其实还是不太懂为什么要用多态这个玩意儿的,虽说多态在面向对象程序设计里十分重要,而且不可或缺。既然不知道为什么要用多态,那就自己来体验一下没有多态的感觉吧! (本部分暂略) 一、多态的概念&原理 “多态”指的是同一名字的事物可以完成不同的功能。多态可以分为两种: 编译时的多态:即函数、运算符的重载、对重载函数的调用,在编译时就能根据实参确定应该调用哪个函数 运行时的多态:与继承、虚函数有关 虚函数,就是在声明前加了virtual关键字的成员函数。静态成员函数不能是虚函数。包含虚函数的类称为“多态”。下面是一个程序例子: 1234567891011121314151617181920212223242526272829303132333435363738394041#include<iostream>using namespace std;class A{ public: int n; //一定要加virtual virtual void Print()...
C++学习笔记(2)——继承与派生
一、基本概念 从一个类派生出另一个类的格式如下: 12345678910class A//基类{ public: int n1;}; class B:public A//派生类,继承方式一般用public,当然也有其他方式 { public: int n2;}; 此时类A派生出了类B,类A称为基类,类B称为派生类,派生类对象也是基类对象。 在公有派生的情况下,存在着三条赋值兼容规则(这个和C++三种传递方式(值传递、指针传递和引用传递)相对应): 派生类对象可以赋值给基类对象; 派生类对象可以用来初始化基类引用; 派生类对象的地址(或派生类的指针)可以赋值给基类的指针。 注意,这三条规则仅限于公有派生,如果是私有派生和保护派生则不成立。 这个规则很好理解。基类没有派生类的全部成员,但派生类有基类的全部成员,因此派生类>基类,基类对象当然可以接收派生类的值、址和引用了,但是反过来却不行。 下面这个例子(续上面的程序)展示了这三条规则: 1234567A a;B b;a = b;//派生类对象赋值给基类对象...
C++学习笔记(1)——类和对象
零、C++的指针 动态内存分配实例: 123456789//分配出sizeof(int)大小的空间int *p;p = new int;*p = 5;//分配出10*sizeof(int)大小的空间int *q;q = new int[10];q[4] = 5; 释放动态内存分配实例: 123delete p;delete [] q;delete q; //出错! 定义常量指针实例: 123456789int a, b;const int *p = &a;//写成int const也行*p = 1;//出错!不能通过常量指针修改指向的内容a = 1;*p = &b;int *q;p = q;q = p;//出错!这样子的话q可以修改p指向的内容了 定义指针常量实例: 12345int a;int *const p = &a;//不能再指向别的地址了!!!int q;q = p;p = q;//出错! const*不能通过指针修改变量值,*const不能指向别的地址。总之,const和*,谁在前面,谁就不允许改变。 一、构造函数&析构...
Python爬取天气实况
一、最初的想法 我们昨天弄了个爬取天气实况的程序,本文章用以记录思考和编写过程。 这里选取的爬取网站是http://q-weather.info/weather/59488//realtime/ 下图就是查天气网站截图。 (站号修改成其他气象站号就可以查询其他城市的实况) 我们以59488珠海站为例,爬取的HTML源代码如下: 1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN">\n<head>\n\t<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />\n\t<...



