c++学习记录五:析构函数、this关键字和string类

(本文来自c++简明教程)
随着你操纵类的技能越来越熟练,迟早会面临资源管理的问题。
更具体地说,当你设计出特定类型的对象时,程序代码必须要求系统分配一些资源。其中,最常用的资源类型就是内存。正如本章要说明的那样,资源管理会造成一些特殊的问题。不过,辛运的是,c++提供了专门的特性来解决这些问题。
本章展示了如何写一个高级的String类,它简单而又全面地演示了资源管理问题。
说到这个类的目的,它和大多数类一样,都是隐藏细节。操纵字符串时,必须和内存打交道,而String类的宗旨就是让类的用户不必关系内存的分配和回收问题。简单地说,String类封装了char数组,并对它们进行处理,使字符串在类的用户面前表现为一种简单的数据类型,而不是一个复杂的结构。
注意:本章描述的String类是c++中的string类的一个简单版本。假如你的编译器提供了用于支持string类的库,就不必使用本章定义的这个类。不过,通过学习自己编写这样的一个类,有助于你掌握c++面向对象编程时的一些重要概念。尤其是,本章使用String类来展示this关键字、析构函数以及“深拷贝”的概念。


阅读更多

c++学习记录四:New操作符和StringParser类

(本文来自c++简明教程)
本文要强调的一个重点在于,类和面向对象编程并没有什么神秘之处,和其他某些书强调的不同,类之所以有用,并不是因为它是一个类,而是因为它提供了一系列相互练习的服务,能够解决一般性的编程问题。
一个常见的编程任务是获取输入,并对其进行分析。本章将介绍一个StringParser类,它能将一个输入字符串分解成一系列子串,每个子串中都包含一个单词。
注意:该类的大多数功能已经有strtok库函数提供。但是,你仍然有必要知道如何写一个功能相似的类。另外,strtok库函数的一个缺点在于,它不能同时扫描多个字符串,但是,采取面向对象的编程的方式,这就不是个问题。

在讨论这个类的过程中,本章还讨论了new关键字,它是c++中用于操纵类的最有用的关键字之一。简单地说,使用这个关键字允许你申请内存,为可能要用到的新变量留出足够的空间。

阅读更多

c++学习记录三:操作符函数

(本文来自《c++简明教程》)


完成了前两章的学习之后,我们应该掌握了如何写一个自己的类,使其能像标准数据类型那样使用。
但是,相较于真正的标准数据类型,目前写的类还存在一些不足。对于int,float,double和char等标准数据类型,它们最重要的一个特定就是,可以直接对它们进行操作。事实上,没有这些操作符,很难在c++中执行任何运算。
c++允许你为自己的类的对象定义如何执行这些运算(比如加,减,乘,除)。还可以为类的对象定义一个“测试相等性”操作符,以便判断两个对象是否“相等”。如此依赖,你的类才会变得真的与基本数据类型相似。

阅读更多

c++学习记录二:构造函数

(本文来自《c++简明教程》)
##构造函数入门
构造函数(constructor)是c++用于描述“初始化函数”的一个术语,这种函数告诉编译器如何解释下面这样的声明:
Fraction a(1, 2); // a = 1/2
基于前面介绍过的有关Fraction类的知识,你或许已经猜到,这个声明等价于以下语句:

阅读更多

c++学习记录一:Fraction类

(本文来自《c++简明教程》)

Point:一个简单的类

在讨论Fraction类之前,先来看一个简单的类,以下是c++ class关键字的常规语法:

阅读更多

Longest Substring Without Repeating Characters

题目链接: https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
using namespace std;

int length(string s) {
vector<int> dict(256,-1);
int maxLen = 0, start = -1;
for(int i = 0; i != s.length(); i++) {
if(dict[s[i]] > start)
start = dict[s[i]];
dict[s[i]] = i;
maxLen = max(maxLen, i -start);
}
return maxLen;
}

int main()
{
cout<<length("abcabcbb")<<endl;
}

Output: 3

个人理解
dict 记录当前字符出现的位置
start 记录当前字符出现的上一次位置
参考自https://leetcode.com/problems/longest-substring-without-repeating-characters/discuss/1737

sql学习记录

实验一

参照实验指导书附录,建立数据库SCHOOL,分别建立students、teachers、courses、choices四张表。

  1. 用SQL创建数据库、建表。建表时为各表建立关键字、设置外码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    create dabase db_school
    on primary
    (
    name='schoolDB_data',
    filename='E:\schoolDB_data.mdf',
    size=5mb,
    maxsize=100mb,
    filegrowth=15%
    )

    log on(
    name='schoolDB_log',
    filename='E:\schollDB_log.ldf',
    size=2mb,
    filegrowth=1mb
    )

    create table students(
    sid char(10) primary key,
    sname char(30) not null,
    email char(30),
    gread int
    )

    create table teachers(
    tid char(10) primary key,
    tname char(30) not null,
    email char(30),
    salary int
    )

    create table courses(
    cid char(10) primary key,
    cname char(30) not null,
    hour int
    )

    create table choices(
    no int primary key,
    sid char(10),
    tid char(10),
    cid char(10),
    score int,
    foreign key(sid) references students(sid),
    foreign key(tid) references teachers(tid),
    foreign key(cid) references courses(cid)
    )
  2. 为students表、courses建立按主键增序排列的索引

    1
    2
    create index stuid on students(sid)
    create index couid on courses(cid)
  3. 删除course上的索引

    1
    drop index courses.couid
  4. 在students表中增加一个“出生日期”字段,类型为日期时间型

    1
    2
    alter table students
    add "出生日期" datetime
  5. 删除students表中的出生日期字段

    1
    2
    alter table students
    drop column 出生日期
  6. 删除students表

    1
    drop table students

实验二 sql语句

  1. 查询年级为2001的所有学生的名称,按编号顺序排列

    1
    2
    3
    select sid,sname from students
    where grade = '2001'
    order by sid ASC
  2. 查询所有课程中含有data的课程编号

    1
    2
    select cid from courses
    where cname like 'data%'
  3. 统计所有老师的工资

    1
    select avg(salary) from teachers
  4. 查询至少选了3门课的学生编号

    1
    2
    3
    select sid from choices
    group by sid
    having count(*)>3
  5. 查询学号为80009026的学生的姓名、所选课名及成绩

    1
    2
    3
    4
    5
    select students.name, courses.cname, score
    from students, courses, choices
    where
    students.sid = choices.sid and choices.cid = courses.cid
    and choices.sid = '80009026'
  6. 查询没有学生选的课程编号

    1
    2
    3
    4
    5
    6
    select cid from courses
    where not exists
    (
    select courses.cid from courses, choices
    where choices.cid = courses.cid
    )
  7. 查询既选了C++又选了Java课程的学生编号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    select sid from choices,courses
    where choices.cid=courses.cid
    and cname='C++'
    and sid in
    (
    select sid from choices,courses
    where choices.cid=courses.cid
    and cname='Java'
    )
  8. 查询选了C++但没选Java课程的学生编号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    select sid from choices
    where
    cid = (select cid from courses where cname='C++')
    and
    sid not in
    (
    select sid from choices where
    cid = (select cid from courses where cname='Java')
    )
  9. 向students表中插入”LiMing”的个人信息(编号:700045678,名字:LiMing,Email:
    LX@cdemg.com,年级:1992)

    1
    2
    insert into students(sid, sname, email, grade)
    values('700045678','LiMing','LX@cdemg.com','1992')
  10. 将”LiMing”的年级改为2002

    1
    2
    update students set grade='2002'
    where sname='LiMing'
  11. 删除所有选了Java课程的学生选课记录

    1
    2
    3
    4
    5
    6
    delete from choices
    where cid in
    (
    select cid from courses
    where cname='Java'
    )
  12. 求出每门课的课程号、选课人数,结果存入数据库表T1中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create table T1(
    cid char(10),
    m int
    )

    insert into T1(cid, m)
    select courses.cid, count(sid)
    from courses, choices
    where courses.cod = choices.cid
    group by courses.cid
  13. 查询所有选课记录的成绩并换算为五分制

    1
    2
    select sid, cid, score/20 as score
    from choices
  14. 查询成绩小于80的选课记录,统计总数、平均分、最大值和最小值

    1
    2
    3
    select count(*) m, avg(score) avg_score, max(score) max_score,
    min(score) min_score from choices
    where score<80
  15. 按成绩顺序排序显示choices表中所有记录

    1
    2
    select * from choices
    order by score
  16. 创建视图V1,显示学生姓名、所选课名称、任课教师名

    1
    2
    3
    4
    5
    6
    7
    create view V1
    as
    select sname, cname, tname
    from students, courses, teachers, choices
    where students.sid = choices.sid
    and courses.cid = choices.cid
    and teachers.tid = choices.tid
  17. 取消V1视图

    1
    drop view V1

实验三 数据库完整性与安全性

  1. 创建一张新表class,包括Class_id(varchar(4)), Name(varchar(10)),Department(varchar(20))三个属性列, 其中Class_id为主码

    1
    2
    3
    create TABLE CLASS( Class_id varchar(4) primary key,
    Class_name varchar(10),
    Department varchar(20))
  2. 使用SQL命令创建一张学生互助表,要求:包括学生编号、学生姓名、学生帮助对象的编号,每个学生有且仅有一个帮助对象,帮助的对象必须是已存在的学生

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table help
    (
    sid char(10) primary key,
    sname char(10),
    help_sid char(10)
    );

    alter table help
    add constraint fk_help
    foreign key (help_sid)
    references help(sid);
  3. 使用STC数据库,修改设置,完成以下2种不同的要求,请写出对应的语句或简述操作过程:

    1. 当更新、删除STU表中记录时,若SC表中有此学生的记录,则拒绝
      1
      2
      3
      4
      5
      6
      alter table sc
      add constraint fuck
      foreign key (sno)
      references stu(sno)
      on update no action
      on delete no action
    2. 当更新、删除STU表中记录时,若SC表中有此学生的记录,则自动更新或删除
      1
      2
      3
      4
      5
      6
      alter table sc
      add constraint fuck2
      foreign key (sno)
      references stu(sno)
      on update cascade
      on delete cascade
  4. 使用sql命令完成以下任务

    1. 创建Worker表,定义约束U1、U2,其中U1规定Name字段取值唯一,U2规定sage字段上限是28

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      create table worker(
      number char(5),
      name char(8),
      sex char(1),
      sage int,
      deapartment char(20)
      );

      alter table worker
      add constraint U1 unique(name);
      alter table worker
      add constraint U2 check(sage <= 28);
    2. 去除U1约束,修改约束U2,令sage的值大于等于0

      1
      2
      3
      4
      5
      6
      7
      alter table worker
      drop constraint U1;
      alter table worker
      drop constraint U2;

      alter table worker
      add constraint U2 check(sage >= 0)
    3. 创建规则rule_sex,规定更新或插入的值只能是M或F,并绑定到Worker的sex字段

      1
      2
      3
      create rule rule_sex
      as @value in('M','F');
      sp_bindrule rule_sex, 'worker.[sex]';
  5. 创建触发器并测试

    1. 为worker表创建触发器T1,当插入或更新表中数据时,保证所操作记录的sage大于0

      1
      2
      3
      4
      5
      6
      create trigger T1
      on worker
      for update,insert
      as
      if (select sage from inserted) <= '0'
      rollback transaction
    2. 为worker表创建触发器T2,禁止删除编号为00001的记录

      1
      2
      3
      4
      5
      6
      create trigger T2
      on worker
      for delete
      as
      if (select number from deleted) = '00001'
      rollback transaction
    3. 为worker表创建触发器T3,要求更新一个巨鹿时,表中记录的sage要比老记录的sage值大

      1
      2
      3
      4
      5
      6
      create trigger T3
      on worker
      for update
      as
      if (select sage from inserted) < (select sage from deleted)
      rollback transaction

简单的条件编译

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#define DEBUG 0
using namespace std;
int main()
{
#if DEBUG
cout<<"OK!"<<endl;
#endif
#if !DEBUG
cout<<"nice!"<<endl;
#endif
return 0;
}

当DEBUG为1时输出”OK!”,为0时输出”nice!”
即DEBUG为1时,6-8行参与编译,9-11行不参与,反之亦然。

const限定符

有时我们希望定义这样一种变量,它的值不能被改变。例如,用一个变量来表示缓冲区的大小。使用变量的好处是当我们觉得缓冲区大小不再合适时,很容易对其进行调整。另一方面也应随时警惕防止程序一不小心改变了这个值。为了满足这一要求,可以用关键字const对变量的类型加以限定:

阅读更多