C++基础学习教程(一)
開始自己的C++复习进阶之路。
声明:
这次写的博文纯当是一个回想复习的教程。一些非常基础的知识将不再出现。或者一掠而过,这次的主要风格就是演示样例代码非常多~~~
全部代码在Ubuntu 14.04 LTS
版,GCC4.8.1(g++)编译通过。其它的平台没试过。预计有些代码在VC6.0以下通过不了,由于有些语言特性是C++11标准的。
以下就是正文的開始吧。
一、C++必须说和必须略过的一些东西
1、工具
工具的话。简答的编程貌似如今已经习惯了在GCC(g++)下了。Linux平台以下,一般不须要非常大的project的时候我都是用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以下好看和易用一点吧。
关于这个文档的一些keyword和标准请查看官方文档或者自行百度,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。以下看一个略微复杂一点的格式化输出,输出的效果例如以下:(事实上就是乘法表。。)
效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vvb2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
程序代码例如以下:
/*************************************************************************
> 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;
}
效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vvb2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
演示样例二:
/*************************************************************************
> 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是超出末端元素的下一个位置,例如以下图解:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vvb2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Std::sort是泛型算法的一个样例,之所以称之为泛型,是由于这些函数实现了通用算法而且具有一般性。
即是说。仅仅要可以表示成一个序列且数据可以比較。就能调用泛型算法中函数。大部分在头文件<algorithm>中,一部分在<numeric>中。
差点儿全部的泛型都使用迭代器(唯一的例外是std::min & std::max,他们返回序列中最大最小值)。C++中总共同拥有五种迭代器。可是能够分为两类:读迭代器和写迭代器。
读迭代器:指向值序列中的一个位置。使得能够对该序列进行读操作。
算法对于输入使用读迭代器。且不改动值。一般而言,必须指定一对读迭代器:開始位置和超出末端的下一个位置。
写迭代器:指向序列中的一个位置。从该位置算法開始写输出。
一般而言,仅仅须要指定输出序列的位置就可以。
算法不能检查溢出,因此必须保证输出序列有足够的空间容纳算法要写的全部内容。
Such as: std::copy( )
算法从一个输入序列中复制值到一个输出序列。函数有三个參数:两个读迭代器以指定范围。一集一个写迭代器指定输出范围的開始位置,因此必需要保证输出有足够大的容量。
C++基础学习教程(一)的更多相关文章
- C++基础学习教程(八)
转载请注明出处:http://blog.csdn.net/suool/article/details/38300117 引入 在进行下一步的学习之前,我们须要厘清几个概念. RAII 首先介绍一个编程 ...
- spring boot基础学习教程
Spring boot 标签(空格分隔): springboot HelloWorld 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新 ...
- webpack从0到1超详细超基础学习教程
概念 自己是一个一听到webpack就头大,看着一堆不知道那是什么玩意的东西总觉得自己做好前端就行了,但是在使用vue-cli的时候总觉得要改其中的一些东西进行项目初始化的时候能够更好使用!所以想要根 ...
- C++基础学习教程(六)----类编写的前情回想以及项目实战(1)
在開始类的编写之前我们依旧须要回想整理一下前面所说的内容,(前面尽管是一个自己定义数据类型的实现过程,可是内容有点繁杂). 先看一段代码: /** @file calssStruct.cpp */ / ...
- C++基础学习教程(五)
这一讲我们集中解说类和他的一些特性.首先我们从自己定义一个有理数类来開始. 在C语言中有一个keyword: struct ,用来创建一个结构体类型.可是在C++中这个关键的含义就不只如此了,以下我们 ...
- C++基础学习教程(三)
承接上一讲. 2.7文件I/O 关于读写文件,C++中有一个专门的头文件<fstream>. 首先是读文件演示样例,例如以下: </pre><pre> /***** ...
- C++基础学习教程(七)----类编写及类的两个特性解析--->多态&继承
类引入 到眼下为止我们所写的自己定义类型都是keywordstruct,从如今起我们将採用class方式定义类,这样的方式对于学习过其它高级语言包含脚本(Such as Python)的人来说再熟悉只 ...
- Vuejs 基础学习教程
(四)构建基础进阶-env文件与环境设置 我们在实际开发中,我们一般会经历项目的开发阶段,测试阶段,和最终上线阶段,每个阶段对于项目代码的需要可能都有所不同,那我们怎么让它在不同阶段呈现不同的效果呢? ...
- javascript 基础学习教程
http://www.itxueyuan.org/javascript/jiaocheng_2/
随机推荐
- linux mint 自动挂载windows的D盘和E盘
终端敲udisksctl mount -p block_devices/sda后双击tab键补全分区,如下: 如我的E盘是sda6,执行 udisksctl mount -p block ...
- 汕头市队赛 SRM10 T1 贪心只能过样例
贪心只能过样例 SRM 10 描述 给出n个数a[i](1<=a[i]<=n),问最多能把这些数分成几组,使得每个数a[i]所在的组至少有a[i]个数 输入格式 第一行一个整数n,接下来n ...
- input 输入框提示信息
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 结构型设计模式之享元模式(Flyweight)
结构 意图 运用共享技术有效地支持大量细粒度的对象. 适用性 一个应用程序使用了大量的对象. 完全由于使用大量的对象,造成很大的存储开销. 对象的大多数状态都可变为外部状态. 如果删除对象的外部状态, ...
- 理想中的SQL语句条件拼接方式 (二)
问题以及想要的效果,不重复叙述,如果需要的请先看 理想中的SQL语句条件拼接方式 . 效果 现在有2个类映射数据库的2张表,结构如下: public class User { public int U ...
- (七)ubuntu下编译openwrt内核的环境配置
首先安装基本开发环境: sudo apt-get install ssh vim samba tftp nfs 安装编译openwrt须要的包: 解压openwrt包编译出错: Build depen ...
- Ubuntu配置网络遇到的一些问题
Ubuntu配置网络遇到的一些问题 在配置Ubuntu网络时,曾遇到了一些问题.查找了一些博客,所幸都解决了.记录一下,以便日后查阅. 设置DNS sudo vim /etc/resolv.conf ...
- bring to front 必须在右边的form上才生效。
- [BZOJ2095][Poi2010]Bridges 二分+网络流
2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1187 Solved: 408[Submit][Sta ...
- J.U.C并发框架源码阅读(九)LinkedBlockingQueue
基于版本jdk1.7.0_80 java.util.concurrent.LinkedBlockingQueue 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. ...