C++基础学习教程(一)

开始自己的C++复习进阶之路。


声明:

这次写的博文纯当是一个回顾复习的教程,一些非常基础的知识将不再出现,或者一掠而过,这次的主要风格就是示例代码很多~~~

所有代码在Ubuntu 14.04 LTS 版,GCC4.8.1(g++)编译通过。其他的平台没试过,估计有些代码在VC6.0下面通过不了,因为有些语言特性是C++11标准的。

下面就是正文的开始吧。


一、C++必须说和必须略过的一些东西

1、工具

工具的话,简答的编程貌似现在已经习惯了在GCC(g++)下了。Linux平台下面,一般不需要很大的工程的时候我都是用VIM写好代码,直接运行了。稍微复杂一点的就用CodeBlocks。不过由于打字速度一般,觉得VIM的编辑功能也不是很强,所以一般是把代码什么的在VIM写好,然后注释文档以及详细的阅读修改的就直接上Sublime Text或者Gedit了。(Emacs还没用到过, -_-||).

Windows下面的话,如果写的代码用不到C++11的新特性那就用VC6.0吧,CodeBlocks也可以,不过写这篇教程的时候我用的是VS2010的cmd编译的,貌似Windows下面好多各种的编译器。。。喜欢什么用什么吧。如果要用C++11特性的话,貌似CodeBlocks最新版本的是可以支持的。其他的编译器布吉岛。。。

所以,关于编译器的问题,或者由于编译器导致的问题,就不说了,麻烦。

2、代码风格

代码风格神马的也貌似没什么可以说的,无非是你的花括号是怎么括,你的运算符两旁有没有空格,你的注释是写在哪里等等。。。

关于我的风格在具体的示例中可以看粗来。

所有的风格只要不要太标新立异或者奇葩的话,坚持你的风格就好啦。这个实在没有什么好说的。

3、文档注释

关于C++自动文档生成我选择了Doxygen,这个在Windows和Linux下面都能用,不过Windows下面还没用,不过目测应该要比Linux下面好看和易用一点吧。

关于这个文档的一些关键字和标准请查看官方文档或者自行百度,Google一下,很多人都写了技巧和用法。

所以,关于文档和注释什么不再解释。


下面开始具体的回顾复习了。。。

二、C++基础

2.1整数表达式

程序示例:输入一系列的整数,输出其平均值。当输入的数字小于0个的时候给出提示。

整数表达式这些的,实在没必要多费口舌。直接上代码。

代码如下:

/*************************************************************************
    > File Name: list0301_int_exp.cpp
    > Author: suool
    > Mail: 1020935219@qq.com 
    > Created Time: 2014年05月16日 星期五 21时06分20秒
 ************************************************************************/

#include<iostream>
using namespace std;

int main()
{
    int sum(0);
    int count(0);
    int x;

    while(cin >> x)
    {
        sum += x;
        count += 1;
    }
    if(count <= 0)
    {
        cout << count << endl; 
        cout << "The couunt is below zero !" << endl;
    }
    else 
    {
        cout << count << endl;
        cout << "Average = " << sum/count << endl ;
    }
    return 0;
}

运行结果和示例略去。(当时运行的时候木有截图,现在也不想运行截了。)


2.2字符串与简单的输入输出

这一部分涉及到转义字符,关于转义字符,在C语言和其他语言里面大家应该都灰常清楚了,所以,不再说了-_-||。。。。。

很显然C++的输入输出操作符>> & <<大家都明白的:操作符箭头指向爱你过的方向是信息流向的方向:从流到变量是输入,从变量到流是输入。

       下面是一个字符串的简单示例:一个简单的人机交互对话。代码入下:

/*************************************************************************
    > File Name: list0502_cin_string.cpp
    > Author: suool
    > Mail: 1020935219@qq.com 
    > Created Time: 2014年05月16日 星期五 21时23分43秒
 ************************************************************************/

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string name;
    string response;
    cout << "What's your name ?" << endl;
    cin >> name ;
    cout << "Hello " << name << ", how are you ?" <<endl;
    cin >> response ;
    cout << name << "Good bye !" << endl;
}


2.3格式化输出(流程控制语句)

关于if或者while或者for等等循环控制语句没有必要再讲了吧。这些实在是看代码都能看懂的东西。只要有点其他的语言基础都没问题的。

So,让我们直接进入C++的格式化输出。

我们首先要达到下面的输出效果,要求就是写出这个程序。

效果如下:


程序代码如下:

/*************************************************************************
    > File Name: list0801_cout_format.cpp
    > Author: suool
    > Mail: 1020935219@qq.com 
    > Created Time: 2014年05月16日 星期五 21时31分52秒
 ************************************************************************/

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
    cout << " N    N^2    N^3" << endl;
    // cout.flags(ios::left);
    for (int i = 0; i < 21; i++ )
    {
        cout << setw(2) << i+1
             << setw(7) << (i+1)*(i+1)
             << setw(8) << (i+1)*(i+1)*(i+1)
             << endl;
    }
    cout << "Finaish it !" << endl;
    return 0;
}

从上面的代码应该就可以看出,C++关于对齐方式的设置是使用cout.flags(ios::left);进行设置的,下面的程序中有另外一种的设置方法,就是使用cout << right; 前提是声明#include<ios>。

So,下面看一个稍微复杂一点的格式化输出,输出的效果如下:(其实就是乘法表。。)

效果如下:



程序代码如下:

/*************************************************************************
    > File Name: list0807_table_cout.cpp
    > Author: suool_hu
    > Mail: 1020935219@qq.com 
    > Created Time: 2014年05月17日 星期六 19时14分40秒
 ************************************************************************/

#include<iomanip>
#include<iostream>
#include<string>
using namespace std;

// 输出10X10的一个乘法表
int main()
{
    // 基本变量设置
    int const min(1);
    int const max(10);
    int const colwidth(4);
    
    // cout << ios::right;
    // 打印表头
    cout << setw(colwidth) << '*' << '|';
    for (int i=1; i<=max ; i++)
        cout << setw(colwidth) << i;
    cout << endl;
    // 打印分割行
    // 设置填充符
    cout << setfill('-') << setw(colwidth) << ""
         << '+'
         << setw(max * colwidth) << ""
         << endl;
    
    // 重设填充符
    cout << setfill(' ');

    // 打印每一行
    for (int row=1; row<=max; row++)
    {
        cout << setw(colwidth) << row << '|';
        for (int col= 1; col<=row; col ++)
        {
            cout << setw(colwidth) << row*col;
        }
        cout << endl;
    }

    return 0;
}

下面的小程序是关于setw()函数和对其方式和默认填充方式设置的具体表现的示例:

示例一:

/*************************************************************************
> File Name: list0803.cpp
> Author: suool_hu
> Mail: 1020935219@qq.com
> Created Time: 2014年05月16日 星期五 22时56分42秒
************************************************************************/
/** Using Alternative Fill Characters  */
#include <iomanip>
#include <iostream>
#include <ostream>

int main()
{
    using namespace std;
    
    int day(16);
    int month(5);
    int year(2014);
    int dollars(42);
    int cents(7);
    
    // Print date in USA order. Later in the book, you will learn how to
    // handle internationalization. //setfill()填充方式设置
    cout << "Date: " << setfill('0') << setw(2) << month 
        << '/' << setw(2) << day
        << '/' << setw(2) << year << '\n';
    cout << "Pay to the order of: CASH\n";
    cout << "The amount of $" << setfill('*') << setw(8) << dollars << '.'
        << setfill('0') << setw(2) << cents << '\n';

    return 0;
}

效果如下:


示例二:

/*************************************************************************
    > File Name: list0804_format_cout.cpp
    > Author: suool_hu
    > Mail: 1020935219@qq.com 
    > Created Time: 2014年05月16日 星期五 21时56分42秒
 ************************************************************************/

#include<iostream>
#include<iomanip>
#include<string>
#include<ios>
using namespace std;
// 格式化输出练习
int main()
{
    cout << '|' << setfill('*') << setw(6) << 1234 << '|' << endl;
    cout << '|' << left <<         setw(6) << 1234 << '|' << endl;
    cout << '|' <<                 setw(6) << 1234 << '|' << endl;
    cout << '|' << right <<        setw(6) << 1234 << '|' << endl;

    return 0;
}

效果如下:


2.4数组和向量

现在我们要写一个程序,要求实现:从标准输入读取数字,然后将数字排序后输出,每行输出一个。

有些人可能先想到的数据结构是用数组解决,不过,在C++中,数组是一种比较劣等的数据结构了,大多数时候我们都更倾向于使用C++的容器类型的数据结构。这个程序我们就可以使用容器中的向量来解决,代码如下:

/*************************************************************************
    > File Name: list0904_iterator_alg.cpp
    > Author: suool_hu
    > Mail: 1020935219@qq.com 
    > Created Time: 2014年05月18日 星期日 07时47分42秒
 ************************************************************************/

#include<algorithm>
#include<iostream>
#include<iterator>
#include<string>
#include<vector>

using namespace std;

// 适用迭代器和算法读入数字并排序(向量存储)
int main()
{
    cout << "请输入数字:" << endl;
    vector<int> data;
    // 每次读取一个数字
    copy(istream_iterator<int>(cin),
        istream_iterator<int>(),
        back_inserter(data));

    // 排序
    sort(data.begin(), data.end());
    cout << "您输入的数字的排序结果为:"<< endl;
    // 打印向量,一行一个数字
    copy(data.begin(), data.end(), ostream_iterator<int>(cout, "\n"));
}

关于向量:

类型:在尖括号内部的是向量的类型vector<int> data;是int类型的向量

初始化:vector没有大小,可以随时扩充和缩小,没有数组的长度大小的限制,但是在初始化的时候依然可以声明其长度大小,如:

Vector<int>  full_zero(10);    // 默认以0初始化,这个含有10个0的向量
Vector<int> full_ten(41, 10);   // 包含41个10的向量,声明以10初始化

Vector有很多自带的方法,比如插入,删除等等内置方法,具体需要使用什么方法请自行百度吧。

迭代器

上面的代码中有一个调用的函数是sort,不要以为那个是vector的成员函数,那个其实是C++ STL中的一个函数,可以对所有传递给他的序列进行排序,只要该类型可以用比较操作符(即是大于或者小于),通过提供初始位置和末端位置。

关于上面的那个begin和end的位置,end是超出末端元素的下一个位置,如下图解:


Std::sort是泛型算法的一个例子,之所以称之为泛型,是因为这些函数实现了通用算法并且具有一般性。即是说,只要能够表示成一个序列且数据可以比较,就能调用泛型算法中函数。大部分在头文件<algorithm>中,一部分在<numeric>中。

几乎所有的泛型都使用迭代器(唯一的例外是std::min & std::max,他们返回序列中最大最小值)。C++中总共有五种迭代器,但是可以分为两类:读迭代器和写迭代器。

读迭代器:指向值序列中的一个位置,使得可以对该序列进行读操作。算法对于输入使用读迭代器,且不修改值。一般而言,必须指定一对读迭代器:开始位置和超出末端的下一个位置。

写迭代器:指向序列中的一个位置,从该位置算法开始写输出。一般而言,只需要指定输出序列的位置即可。算法不能检查溢出,因此必须保证输出序列有足够的空间容纳算法要写的所有内容。

Such as:  std::copy( ) 算法从一个输入序列中复制值到一个输出序列。函数有三个参数:两个读迭代器以指定范围,一集一个写迭代器指定输出范围的开始位置,因此必须要保证输出有足够大的容量。






  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
目录 1. 简介 怎样使用本教程 2. C++基础 Basics of C++ 1. C++程序结构 Structure of a program 2. 变量和数据类型 Variables and Data types 3. 常量 Constants 4. 操作符/运算符 Operators 5. 控制台交互 Communication through console 3. 控制结构和函数 Control structures and Functions 1. 控制结构 Control Structures 2. 函数I Functions I 3. 函数II Functions II 4. 高级数据类型 Advanced Data 1. 数组 Arrays 2. 字符序列 Character Sequences 3. 指针 Pointers 4. 动态内存分配 Dynamic memory 5. 数据结构 Data Structures 6. 自定义数据类型 User defined data types 5. 面向对象编程 Object-oriented Programming 1. 类,构造函数和析构函数,类的指针 Classes. Constructors and Destructors. Pointers to classes. 2. 操作符重载,this,静态成员 Overloading Operators. this. Static members 3. 类之间的关系 Relationships between classes: friend. Inheritance 4. 虚拟成员,抽象,多态 Virtual Members. Abstraction. Polymorphism 6. C++高级 Advanced concepts 1. 模板 Templates 2. 名空间 Namespaces 3. 出错处理 Exception handling 4. 类型转换高级 Advacned Class Type-casting 5. 预处理指令 Preprocessor Directives 7. C++ 标准函数库 C++ Standard Library 1. 文件的输入输出 Input/Output with files C++基础教程简介 怎样使用本教程 读者范围 本教程面向所有希望学习C++语言的读者。如果读者有其他编程语言背景或计算机相关基本知识可以帮助更好的理解教程内容,但这并非必须条件。 对于C语言熟悉的读者可将前三章(1.1 到 3.4)当作复习,因为这部分内容主要介绍C++中的C部分。不过某些C++的语法与C还是有些差别,所以建议还是快速的读一下这部分。 第四章讲述面向对象编程。 第五章主要介绍ANSI-C++标准中的新增的功能。 本教程结构 教程共分6章,每章分若干小节。你可以直接从主目录进入任意小节,并循每页底部的链接向后浏览。 很多小节含有一页例题介绍该章节主要知识点的使用。建议在进入下一章学习之前最好先阅读这些例题,理解每行代码。 学习和练习一种编程语言的最好办法是自己修改书中例题程序,设法在程序中增加新的功能。不要不敢修改这些例题程序,这正是学习的方法。 兼容性备注 ANSI-C++标准近几年来被接受为国际标准。尽管C++语言从二十世纪80年代即存在,ANSI-C++在1997年才被发表,2003年又被修订过。因此很多编译器不支持ANSI-C++中的部分新功能,特别是那些在此标准发表前即被发布的编译器。 在本教程中,那些ANSI-C++中新增的而老一代C++编译器大多不支持概念将备用如下标志标出: ANSI C++新增的概念 同样对于C和C++在实现上有明显不同的概念,将备用如下标志标出: C 与 C++不同的地方 编译器 本教程中所有例题程序均为console程序(控制台程序)。此类程序以文本形式与用户交换信息,显示结果。 所有C++编译器均支持console程序的编译。要了解更多关于如何编译的说明,请查询你的编译器用户使用手册。 C++编译器和开发环境推荐 很多读者询问编译器和开发环境的问题。除了常用的商用收费的MS Visual Studio, VC++,Borland C++等工具外,还有很多免费的工具也是很好用的。这里推荐两种免费的C++开发软件: 1、Eclipse的CDT开发工具,官方网站在http://www.eclipse.org/cdt/ 2、开源工具Dev-C++和wxDev-C++

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值