1. 理解C++变量的作用域和生命周期

a) 用少于10行代码演示你对局部变量的生命周期的理解

#include <iostream>
int main()
{
int i=;
for(int i=;i<;i++);
std::cout << i <<std::endl;
  return 0:
}

解释:C++语言中,大多数作用域都是用花括号界定的。一般来说,名字从其声明点开始直到其声明所在的作用域结束处都是可见的。请看上面这个程序,在第4行声明了一个变量i(为方便叙述,记为i1),并初始化为0;在随后的for循环里又声明了一个变量i(为方便叙述,记为i2),并在该循环里增加值。直至i<4即i=3时退出。然后这个变量i(即i2)的作用域也随之结束了。最后输出的值为0,也就是第一个变量i(即i1)的值。因为该变量i(即i1)的作用域是从它上一行的花括号开始直到return 0;后面的花括号结束的。因此cout的i是第一个变量i(即i1)。

2. 理解堆和栈,两种内存的申请和释放的方式

a) 用少于30行代码演示你对堆和栈两种内存申请方式的理解

看到这个题目我只想到了数据结构中的栈,以及它“后进先出”这么一条原则,然后就不知道了。查了下网上的资料,恍然惊醒。原来这里说的是内存分配里的堆和栈。抓紧时间学了学,总结在下面:

内存中的栈区处于相对较高的地址,以地址的增长方向为上的话,栈地址是向下增长的。栈中分配局部变量空间,堆区则是向上增长的,用于分配程序员申请的内存空间。

int main()
{
int a;//栈
char *p1;//栈
p1 = (char *)malloc();//堆
}

两种内存申请方式在于:栈是系统自动分配空间,而堆则是程序员根据需要自己申请空间。

3. 理解unique_ptr和shared_ptr

a) http://msdn.microsoft.com/en-us/library/vstudio/hh279676.aspx

b) http://msdn.microsoft.com/en-us/library/vstudio/hh279669.aspx

先从unique_ptr说起,unique_ptr很重要的特点就是不能分享它的指针。从名字中的“unique”,可见一斑,它不能被复制,所以一切需要复制的操作,它都不能进行。 当这个unique_ptr的资源被传给另一个unique_ptr时,原来的unique_ptr将不再拥有。使用unique_ptr,使某个object任何时候都只有一个所有者,将使程序的逻辑得到简化。

那么与之相对的便是shared_ptr。当不止一个的所有者必须去管理内存中某个object的生命周期的时候,shared_ptr是一个很好的选择。share_ptr可以被复制,传值,赋值。所有这些指针可以指向同一个object,这些shared_ptr分享一个"control block",当有指向同一object的shared_ptr被增加、删除时,control block响应变化,指针数做相应更改。当指针数为0时,这个 “control block”将删除内存资源和自身。

4. 请尝试用“C++0x”,“C++11 & STL”两种不同的代码风格分割一个url,并上传代码到博客上。

For example:

Input: http://msdn.microsoft.com/en-us/library/vstudio/hh279674.aspx

Output: http, msdn, Microsoft, com, en-us, library, vstudio, hh279674, aspx

考察重点:

1. 类的定义和使用,基本成员是否完整

2. 输入参数的检查及其他鲁棒性的考虑

3. STL和C++11元素的使用

4. 除http://之外, 是否有考虑ftp:// site:// 等情况

5. 是否考虑url中的中文

6. 算法是否简洁高效

7. 代码风格

首先应该明确这两种代码风格究竟是怎么样的,有什么区别。百度百科上说“C++0x(也被称为C++11)”,那么C++0x”,“C++11 & STL”两种代码风格的不同点就是前者不适用STL而后者使用STL。

首先采用C++0x风格编写:

void UrlParse::parse(string u)
{
char url[]="\0";
strncpy(url,u.c_str(),u.length());
int i=;
while(url[i]==' '||url[i]=='\t'||url[i]=='\n')i++;//消除开头空白符
for(;url[i]!='\0';i++)
{
if(url[i]==':')
{
if(url[i+]!='\0'&&url[i+]=='/')
if(url[i+]!='\0'&&url[i+]=='/')//这三个字符连起来是 ://
if(i!=)//如果不是开头
{
cout<<", ";//输出逗号+空格,并将i增2.用于跳过后面的两个斜杠
i+=;
}
}// end if(url[i]==':')
else if(url[i]=='.'||url[i]=='/')
cout<<", ";//输出逗号+空格
else
cout<<url[i];
}
}

测试结果如图:

然后C++11 & STL风格。

void UrlParse::parseWithSTL(string u)
{
string url=u;
int tmp=; tmp=url.find("://");
while(tmp>=){
url.replace(tmp,,", ");
tmp=url.find("://");
} //将"://"替换为", " tmp=url.find("/");
while(tmp>=){
url.replace(tmp,,", ");
tmp=url.find("/");
}//将"/"替换为", " tmp=url.find(".");
while(tmp>=)
{
url.replace(url.find("."),,", ");
tmp=url.find(".");
}//将"."替换为", "
cout<<url<<endl;
}

测试结果:

代码已经上传至github:https://github.com/LmengHoo/homework-08/commit/c0966cd1c362201a3a3f4f33484bdc4790eee565

【现代程序设计】homework-08的更多相关文章

  1. 现代程序设计homework——04

    题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...

  2. 软工+C(9): 助教指南,持续更新...

    上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...

  3. 20145219 《Java程序设计》第08周学习总结

    20145219 <Java程序设计>第08周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是log ...

  4. 2016CCPC东北地区大学生程序设计竞赛【01/03/05/06/08】

    吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! 04正在酝酿中!!!马上更新!!!!!  01题意:有一个n个点的图,对于任意两个不同的点,他的权值是两个点下标的最小公倍数,求最小生出 ...

  5. Python Revisited Day 08 (高级程序设计技术)

    目录 8.1 过程型程序设计进阶 8.1.1 使用字典进行分支 8.1.2 生成器表达式与函数 8.1.3 动态代码执行与动态导入 动态程序设计与内省函数(表) 动态代码执行 eval(), exec ...

  6. 20145210 《Java程序设计》第08周学习总结

    第十四章 NIO与NIO2 14.1 认识NIO •NIO概述 •NIO使用频道来衔接数据结点 •在处理数据时,NIO可以让你设定缓冲区容量 •Channel架构与操作 •isOpen():确认Cha ...

  7. 团体程序设计天梯赛L2-013 红色警报 2017-03-23 22:08 55人阅读 评论(0) 收藏

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  8. 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream

    链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...

  9. C语言作业|08

    问题 答案 这个作业的属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/9977 我 ...

  10. C语言I作业08

    C语言I作业08 这个作业属于哪个课程 C语言程序设计ll 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9981 ...

随机推荐

  1. 刨根问底拦不住——I/O模型

    前言 看过很多资料,很多对I/O模型概念模糊甚至错误,希望这篇文章有助理解I/O,欢迎讨论和纠正 参考资料:<UNIX网络编程卷1>  P122 I/O中涉及概念 介绍阻塞非阻塞,同步异步 ...

  2. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  3. linux tail命令的使用方法详解(转)

    本文介绍Linux下tail命令的使用方法.linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新 ...

  4. MongoDB的快速手动安装

    上一篇文章<MongoDB.WebIDE:升级版的Mongodb管理工具>漏了点东西:就是关于MongoDB主从库的安装配置和启动.网上关于MongoDB的安装有大量的文章供大家学习.我这 ...

  5. NBUT1541 Rainwater 题解

    http://cdn.ac.nbutoj.com/Problem/view.xhtml?id=1541 When rain, nocLyt discovered a magical phenomeno ...

  6. C#中跨线程访问控件问题解决方案

    net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件. 第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出 ...

  7. Entity Framework 简单增删改操作

    前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...

  8. windows路径操作API函数

    备用,方便查找: PathRemoveArgs     去除路径的参数 PathRemoveBackslash   去除路径最后的反斜杠"\" PathAddBackslash 在 ...

  9. Unity3D研究院之动态修改烘培贴图的大小&脚本烘培场景

    Unity默认烘培场景以后每张烘培贴图的大小是1024.但是有可能你的场景比较简单,用1024会比较浪费.如下图所示,这是我的一个场景的烘培贴图,右上角一大部分完全是没有用到,但是它却占着空间.  有 ...

  10. CVPR2015文章下载

    http://www.cv-foundation.org/openaccess/content_cvpr_2015/html/Liu_Real-Time_Part-Based_Visual_2015_ ...