您的位置:首页 > 编程语言 > C语言/C++

【十一长假C++八日谈】八天上手C++ 第一篇:基本语句与数据类型

2009-10-04 17:44 501 查看
  又是一年一度的十一长假,因为各种原因,我需要快速的上手C++,不过之前一直保持下来的学一门语言一定要写日志记笔记的习惯让我只看不动手实在难受。正好这八天也就把这些内容给慢慢的写出来了。这个过程,自我感觉也足以让一个人上手C++,所以我也尝试一下这种类型的文章吧。

  那么,先说明一下我自己的情况:

  在此之前,我的主要语言是Java,我有一年多的Java的经验,还在SourceForge上注册有一个基于Java的开源项目。有一定的面向对象的编程思想。此外还在一年半前学过C,有大约3000行C的代码经验,不过现在基本忘记了。因此,对于学习C++来说,上手还是很快的。所以,我相信这篇文章也会适合类似于我这样的人吧。另外,之前在我们学校图书馆有看到一个似乎是C++和Java对比学习Java的书,倒是没有找到反过来的书,有知道的朋友推荐一下哈。

  

接下来说下我这八篇文章的思路

基本语句与数据类型

函数与指针

程序的组织结构

面向对象基础

面向对象进阶

C++泛型与template编程

异常处理机制

用一个小项目来总结

  这里,我就使用一个最简单的约瑟夫环的小项目来总结这些天的内容,这里我将使用我那只知皮毛的UML知识还有单元测试的知识在VS2008上来构建这个项目,实际上,这个约瑟夫环是我数据结构实验的第一个任务,虽然直接用简单的过程化编程不到100行代码就搞定了,为什么要这么麻烦的去弄那么多乱七八糟的东西呢?很简单,其一,用来学习C++,一个小项目也能用上C++大多数的特性。其二,一屋不扫何以扫天下,一个小程序都没办法架构好,有可能搞得定一个大项目吗?

  最后说一下我这两周学C++参考的两本书,第一本是Stanley B. Lippman 的<Essential C++>还有一本是钱能写的《C++程序设计教程第二版》。实话说,前者非常适合有一定背景知识的人上手C++,废话不多,而且对C++的各个方面都有所提及。但是缺点就是不能很形象的以一个项目的流程来从最基本的文件写法上开始,因此如果在不清楚头文件,源代码文件的情况下还是比较难立刻找到想要的东西的。而后者一般是大学的教材,这本书实话说,还是我看过的学校发的书里面比较好的一本,废话虽然多,但是整本书挺有逻辑的,内容非常的有组织,简单来说是它的目录做的很符合ISO文档标准,这个让我很喜欢。而且内容上也比较适合初学者入门。

  那么,C++之路,从这里开始。

程序嘛,还是按照传统的以helloworld开始吧:

#include<iostream>
using namespace std;

int main(int argc, int* argv){
cout << "hello world";
}


  C++的helloworld,和Java没多大差别。作用就是打印出helloword而已。#include就是引用了,用<>按系统或者编译环境搜索,用""就是在本目录下搜索,写法可以这样:

#include<cstdio>
#include"../test/test.h"
#include"./no.h"


  不过要注意的是,那个<>之间不能有空格。

再来一个程序:

#include<iostream>
using namespace std;

int main(int argc, int* argv){
int var1;
//声明一个int类型的变量,常见的情况下int和longint都是4字节的
char var2, var3='1';
//声明两个个char类型的变量,并且为第二个声明的变量赋值为'1'(ascii),常见情况下char是1个字节的
double test=1.0;
// 对于浮点数的一些说明		//此外,这种注释的格式也是不少人喜欢的
//================================================================
// 声明一个双精度浮点型变量并赋值为1.0,常见情况下float为4字节,
// 表示±3.4x10^38次方,精确到小数点后7位(10进制下同),
// double型为8字节,可表示月±1.8x10^308,精确到小数点后15位
// 还有个long double是10字节的,精确到小数点后19位

cin >> var1;
//等待用户输入数据,并把输入的数据赋值给var1.如果你一定要知道的话,通常情况下cin cout被认为是see in, see out,这样读即可。
cout << "your type is" << var1 << endl;
//连续的<<号用来分开各个部分,最后的endl表示换行。
var1 + 1;
//这里其实没有作用只是在这一行计算一个var1 的值加上1的结果。
var1 = var1 + 1;
//这里把var1 + 1 的结果赋值给var1.注意是赋值而不是判断等不等于。
var1 == 5;
//判断var1的值是否等于5,这行的结果是一个逻辑真假的值
var1 = 5 * 3;
//加减乘除都一样还有个%是取模的意思。你要除0的话编译器会骂你的。

// 关于C++中表达式的一个说明。
//===================================================
// 通常C++的一个表达式 var1 = 3*3;这样的句子左边的var1是一个
// 左值(L-value),右边的3×3的结果就是个右值(R-value)了,左右不能
// 互换,左值必须是一个变量或者表达式,右值可以是任何合法的东西。
// 左右是相对来说的,比如 test = var1;这里var1变成了右值了。。。

var1 += 2;
//本句等价于var1 = var1 + 2,其实只是+=这个运算符有这个效果。
//当然对应的也有-=,*=,/=,%=,最后那个是对右边的数取模,比如
//var1是5的话 %=2的结果就是5/2 的余数1了。

var1 ++;
//这个经典吧,要是你声明个变量叫c的,就有了c++。这个运算符的意
//思是把var1自增1,也就是等于var1 += 1; 也等于var1= var1 + 1;
//这个是从结果上看,但是实际上这里面还有差别。--就是自减1了。

// 关于 ++, --运算符的说明
//==========================================================
// 实际上你可以写var1++; 也可以写++var1;
// 这两种写法的差别在于,前者先取var1的值来用,用完再自增1,后者是先自增
// 再拿来用,举例来说,先假设有var1==3,有一个int变量t, 那么t = var1++;
// 这句执行完了结果是t==3,var1==4.而t= ++var1;的结果是t==4,var1==4.
// --操作符就是自减,效果也是一样。

//接下来是浮点和整形直接的转换

float f1 = 3.333f;
//为f1赋予float类型的值3.333

float f2 = 3.333;
//将double类型的3.333转换为float类型赋予f2,你猜对了,直接写小数都会被当作double类型

float f3 = 2.33e+8;
//将2.33×10^8赋予f3,这里是科学计数法,前面的2.33就是2.33,e+8表示乘以10的8次方

double d1 = f1;
//f1的值将被转换为double类型才会赋予给d1

long double ld1 = 133.3L;
long double ld2 = 22.3;
//同理22.3被转换成了long double类型。

//接下来是一些其他类型
bool a = true;
bool b = false;
bool a = 3;
//记得非0为真。不过赋完后a的等价值是1,
bool a = a-1
//结果是false,因为a==1;

enmu Week{ Mon, Tue, Wed, Thu, Fri, Sat, SUN=11};
//注意上面的;,这个就是枚举类型,定义的是枚举类型的变量Week具备后面的常量。
//默认是从0开始往后加,你也可以自己制定。比如上面吧SUN定义为11
//注意这里是把花括号中的名称代表整数值。用的时候可以直接使用枚举符里面的名称
//比如a == Mon这样的。
}


通过上面这段基本已经知道赋值和初学者常用的cin,cout了。

下面就让我们看看其他的一些基本编程语句:

#include<iostream>
using namespace std;

int main(int argc, int* argv){
bool a= false;
int i1= 0;

//========================================================================
//if语句
if(a){
cout<< "a is true"<<endl;
//如果a为真,执行这个花括号里面的语句,如果只有一句,你也可以不写花括号。
} else {
cout << "a is false"<<endl;
//如果a为假,执行这个语句
}

//a所在的那里填的是一个条件,你可以改成i1,这样会以是否非0来判断真假。你也可以写a>3
//你也可以改成a == false && i1 ==1,这个&&运算符是一个表示“且”的关系的运算符,
//这里有个所谓的短路计算,即&&的时候,只要左边那个是假这个句子就是假的,因此右边
//的直接掠过,同理||运算符表示“或”的关系,只要左边的是真,句子就是真,右边的也就
//不算了。这个在编程的时候常常是一种技巧哦。
//----------------------------------------------------------------------

//条件运算符,唯一的三元运算符
(a>5)? cout<<"yes" : cout<<"no";
//可以这样读:括号里的表达式是真的吗,真的就执行:左边的句子,否则就右边。

//=======================================================================
//switch语句
switch(il){
case 1: cout<<"i1==1"; break;
//i1 == 1 时执行词句
case 2: cout<<"il==2";
//i1 == 2时执行词句
default: cout<<" end";
//如果i1的值没有在上面定义,就执行这句
}

// 关于switch的说明
//======================================================
// 这个句子比较多说的,首先是switch后面的括号里面的语句,
// 它只允许结果是整型,字符型,或枚举型。
// case后面的1,2的位置必须要与其结果相匹配。当然你没指定就执行default里面的。
// 此外,其实这里相当是一个跳转,当switch后面的值是多少的时候,
// 就跳到对应的case行开始执行,所以我们要用break来使一种情况执行
// 完的时候能够停止继续执行,如果不写break的话它就会一直执行到switch对应的花
// 括号处结束或者它遇到的break处
// 比如上面的语句如果是i1==2时候会打印:i1==2 end

//----------------------------------------------------------------------

//======================================================================
//下面介绍循环语句。
while(a) {
cout<<"a is true"<<endl;
}
//这一句只要在a是true的条件下就一直打印出那句话,也就是说是个死循环
int i=1;
while(a) {
i++;
if(i==2) continue;
if(i==5) break;
cout<<"a is true"<<endl;
}
//这句有意思,每次循环i就自增1,关键在那两个if
//它的意思是,当i==2是执行continue;
//当i==5时执行break,否则就打印一句a is true,
//那么,continue和break是什么意思呢?
//实际上,continue表示跳过此轮循环,继续下一轮循环,
//因此,当i==2时,就不会打印了。
//而break表示结束循环。
//所以当i==5时,这个while循环结束。因此只会打印4句a is true;

--------------------
//还有个do while语句
do{
cout<<"test"<<endl;
} while (a)
//这个语句的解释就是每轮循环先执行一便do里面的句子,然后再判断
//如果a是真,那么继续下轮循环,否则跳出。
//另外,必须要注意的是,如果你的while里面用的变量必须在do外面定义。
//---------------------------------------------------------------------

//=====================================================================
//for循环
for(int j=0; j< 5; j++){
cout<< j<< endl;
}
//for里面的分号把它分成三部分,从左往右第一部分
//是for的其实条件,只在进入循环的一开始执行一次
//j<5是终止条件。即当j变成5的时候就停止循环。
//每轮循环在执行循环内的cout之后立刻执行一次最右边的状态
//修正语句,这里就是把j自增1,所以这个循环将打印出0,1,2,3,4。
//注意的是,循环终止语句是每次都会先判断的,因此
//如果你一开始吧j设的比5大的话,这个循环的循环体是不会执行的。
//---------------------------------------------------------------------

}


  好了,通过上面的基础知识,你已经可以编写一个很简单的程序了,比如我这里有个打印菱形星号的小程序:

#include<iostream>
using namespace std;

int main(int argc, int* argv){

int no; //菱形最大星号数

cout<<"请输入菱形最多有多少个星号"<<endl;
cin>> no;

for(int i=0; i<no; i++){
if((2*(i+1)-1) <= no){
for(int j=0; j<(no/2-i); j++){
cout<<" ";
}//打出空白,个数为(no/2-i-1)个
for(int x=1; x<=(2*(i+1)-1); x++){
cout<<"*";
}//打出上半部的星号,个数为(2*(i+1)-1)
} else {
for(int j=0; j<(no/2-(no-i-1)); j++){
cout<<" ";
}//打出空白
for(int x=(2*(no-i)-1); x>0; x--){
cout<<"*";
}//打出下半部的星号
}
cout<<endl;
}
system("pause");
//让程序暂停并显示按任意键继续
return 0;
//注:这个程序显然有更好的写法,有兴趣你可以自己研究
}


我输入的是15的时候,程序执行的结果如下:

请输入菱形最多有多少个星号
15
*
***
*****
*******
*********
***********
*************
***************
*************
***********
*********
*******
*****
***
*
Press any key to continue . . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: