C++

C++17教程之1--c++程序结构

    "c++ 17 tutorial 1-Program structure

Posted by xuepro on May 24, 2018

教小白精通编程

系列课程之

C++17教程之1–c++程序结构

严禁未经作者同意,转载请注明出处,否则将追究法律责任!

1. 最简单的C++程序:

int main() {
   return 0;
} 

C++程序是有一些所谓的“函数”构成的,每个C++程序都包含唯一的叫做”main”的主函数。

一个函数包含4个部分:

  • 返回类型: 说明这个函数执行后返回的结果值的数据类型。如上面的程序通过关键字“return”返回结果值0. return的中文是“返回”的意思.

  • 函数名: 这个函数的名字

  • 参数列表: 由(和)括起来的一系列形参(以后会介绍)。

  • 函数体: 由{和}括起来的程序语句。

函数的格式是:

     返回类型  函数名(参数列表)
     {
        函数体
     }

补充说明:main函数的返回值是返回给操作系统,返回0通常表示没有错误,返回其他非0的整数通常表示是不同的错误代码,不同操作系统对返回的整数代码表示的错误有不同的规定。

2. 程序注释:

为了方便他人阅读程序或自己今后回顾程序,可以在程序中添加一些对程序进行说明的文字,称为“注释”。

注释本身不是代码,仅仅是对程序代码的说明。完全可以删除注释,不影响程序任何功能,但良好的程序应该添加一些注释方便阅读理解。

注释主要分为: 多行注释和单行注释

  • 多行注释(也称为块注释): 以/*开头,以*/结尾。它们之间的一行或多行文字都是程序注释。

  • 单行注释: 用//开头,其后的同一行的文字都是注释。

如上述代码可以添加如下注释:

/*
   ------这是多行注释----------   
   这是我的第一个c++程序
   this is my sirst c++program
   作者: hwdong
   修改日期:2018-01-27
*/

int main() {   // main函数是程序的入口,程序总是从这里执行

   return 0;   // 程序结束,返回整数0
   
              //C++的程序语句都以分号';'结尾。
              
}

注意:块注释不能嵌套,即其中不能再出现”/“或”/”。

/*
   块注释不能嵌套,不能在块注释中间包含/*或*/
   作者: hwdong
   修改日期:2018-01-27
*/

3. 输入输出、名字空间

#include <iostream>

using namespace std;

int main() {   
  cout<<"hello world";
  return 0;  
}

执行这个程序,会在控制台窗口输出字符串“hello world”。

3.1) 标准输入输出和cout

可以用C++”标准输入输出流库”的功能进行程序的输入输出。

比如其中定义了一个表示控制台窗口的对象(也叫做变量)cout, 可以用输出流运算符”«“向cout输出信息,比如输出一个字符串:

 cout<<"hello world";

用双引号括起来的一系列字符在C++中称为“字符串”。

3.2) 名字空间

一个C++程序可能是使用其他人写的代码或库,不同的程序库可能会用同一个名字表示某种对象、函数等,即会出现“名字冲突”,比如2个不同班级都有一个叫做“张伟”的学生。C++为了防止这种不同代码或库之间的“名字冲突”,引入了名字空间的概念,即每个名字都属于某个名字空间。比如我们可以用“数学1601班”的“张伟” 和“计算机1703班”的“张伟”来区分它们。“数学1601班”和“计算机1703班”就是2个不同的名字空间。

C++自带的标准库中的所有对象、函数等都属于一个标准名字空间std。如上面的cout变量(对象)就是属于标准名字空间std中的一个名字。我们可以在程序代码前通过“using namespace std; ”将整个标准名字空间std的名字都引入到程序中,从而告知编译器这些名字的含义。

如果我们不使用“using namespace std; ”引入std中的所有名字,也可以在程序代码中对名字空间中的名字加上名字空间限定,例如:

#include <iostream>

int main() {   
  std::cout<<"hello world";
  return 0;  
}

在cout变量前用了所谓的名字限定即”std::“。 “std::cout“表示这是 “名字空间std”的”cout”。

如果某个名字如函数”main”没有明确说明名字空间,那个它就属于一个全局名字空间。全局名字空间中的“东东”不需要名字限定!

再如”std::endl”是标准名字空间std中的某个名字”endl”,它是一个“换行字符”,”输出运算符«“对这个符号会执行一个换行的动作,即从新的一行开始新的输出。

#include <iostream>

int main() {   
  std::cout<<"hello world";
  std::cout<<std::endl;
  return 0;  
}

此外,我们还可以用关键字“using”引入单个名字,如”using std::cout“。

#include <iostream>
using std::cout;   //引入std中的单个名字cout

int main() {   
  cout<<"hello world"<<std::endl; //endl必须名字限定
  
  return 0;  
}

我们看到输出运算符”«“可以连续使用,这是因为”std::cout «hello world“的结果仍然是”std::cout“,所以可以继续使用”«“。

3.3 字符串和字符

刚才我们看到用双引号括起来的比如”hello world”是一个字符串,而用单引号‘ ’来表示一个字符,比如’A’, ‘3’,’#’,'@','*'等。但一些特殊的字符,比如那些表达特殊含义的字符,可以用一个反斜杠字符+另外一个字符来表示,比如’\n’表示一个换行字符,输出运算符”«“遇到这个换行字符会执行比如换行动作,即输出另起一行。

例如

cout<<"hello\n\n\nworld";

这条语句将会在输出“hello”后,执行3个换行动作,然后输出”world”。

结果如下:

hello

world

当然这个换行符在std名字空间中有一个名字叫做endl。

还有其他的有特殊含义的字符如’\t’表示“制表符”,”输出运算符«“遇到这个字符会输出几个空格。

例如

cout<<"hello\tworld";

这条语句将会在输出“hello”后,输出几个空格,然后输出”world”。结果如下

hello    world

我们可以用输出运算符输出一些字符或字符串,在控制台窗口输出一些特殊的图案,比如输出如下图案

        *
      *   *
    *   *   *
  *   *   *   *

程序代码如下:

#include <iostream>

using std::cout;
int main() {   
  cout<<"        *"<<'\n';
  cout<<"      *   *"<<'\n';
  cout<<"    *   *   *"<<'\n';
  cout<<"  *   *   *   *"<<'\n';
  return 0;  
}

练习

  1. 想象一下,你还能输出什么样的图案?
   A
   B B
   C C C
   D D D D
   E E E E E
   ++++++++++++++++++++                      *
   +                  +                     * * 
   +                  +                   * * * *
   ++++++++++++++++++++                    *   *  

4. 运算:运算符和运算数

我们可以用运算符对运算数进行运算。先看下面的计算圆面积和周长的程序:

#include <iostream>
int main() {
  std::cout << 3.14*2.5*2.5 << std::endl;
  //..
  
  std::cout << 2*3.14*2.5 << std::endl;
  //...
        
  std::cout << 3.14*4.3*4.3 << std::endl;
  return 0; //程序返回整数0 
  
}

其中3.14表示圆周率,2.5或4.3表示圆的半径,表示“乘法运算符”。即可以用比如乘法运算符”**“对数字(实数)进行运算。运算的结果通过输出运算符输出到cout中。看看执行上面的程序会输出上面?

5. 宏定义#define

用于给一个数值或字符串等起一个名字。

上面程序的圆周率值用3.14表示,但如果后来觉得需要换用其他精度的如3.1415926作为圆周率,那么就需要在程序中搜索出所有的圆周率3.14并用3.1415926替换掉.

#include <iostream>

int main() {
  std::cout << 3.1415926*2.5*2.5 << std::endl;
  //..
  
  std::cout << 2*3.1415926*2.5 << std::endl;
  //...
        
  std::cout << 3.1415926*4.3*4.3 << std::endl;
  return 0; //程序返回整数0 
}

假如很多地方用到圆周率,都需要这样找到它们然后替换。一个更好的办法是给表示圆周率的数值起一个名字,如下所示:

#include <iostream>
#define PI 3.14 //PI就是宏常量。 #define就是宏定义指令
int main() {
  std::cout << PI*2.5*2.5 << std::endl;
  //..
  
  std::cout << 2*PI*2.5 << std::endl;
   //...
   
  std::cout << PI*4.3*4.3 << std::endl;
  return 0; //程序返回整数0 
}

其中”#define PI 3.14“称为宏定义,即定义了一个叫做”PI“的宏,它实际就是数值”3.14”的名字。程序中用到3.14的地方就可以用PI来代替。

宏定义PI提高了程序的阅读性。更主要的是:如果今后需要更改圆周率,只要修改”#define PI 3.14“为”#define PI 3.1415926“即可,程序中其他地方无需修改。

#include <iostream>
#define PI 3.1415926 //PI就是宏常量。 #define就是宏定义指令

int main() {
  std::cout << PI*2.5*2.5 << std::endl;
  //..
  
  std::cout << 2*PI*2.5 << std::endl;
  //...
  
  std::cout << PI*4.3*4.3 << std::endl;
  return 0; //程序返回整数0 
  
}

6. 变量: 命令的内存块

程序中的更多数据来自于外部输入(比如键盘或文件或网络等),程序员在编写程序时,并不能预知这些数据的具体数值,比如我们要用一个程序统计一个班级学生的平均分数,程序在实际运行时才能知道所有学生的成绩从而计算平均成绩。

因此,数据需要一块计算机内存,这块内存必须有一个名字,才能根据名字去访问这个内存块。这个名字我们称之为变量

另外,数据会有不同的类型,不同类型的数据占据的内存块大小是不一样的,比如字符’A’占据一个字节内存,而一个整数”25”通常占据4个字节内存,而一个实数可能占据8个字节的内存。

在C++中可通过定义变量(也称为对象) 的方式可以申请到一块特定类型的内存块。

比如:

    int i;      //定义了一个叫做i的int型(int整数类型)的变量(对象)
    
    double r;   //定义了一个叫做r的double型(double浮点实数类型)的变量(对象)
    
    double area;  //定义了一个叫做area的double型的变量(对象)
    

定义变量时还可以给它们一个初始值,比如:

int i{2};        //double型(整型)变量i的值是2

double r{2.5};  //double型(浮点型)变量r的值是2.5

double area = 0;  //double型(浮点型)变量area的值是0,也可以用=代替{}初始值

看一个完成的使用“变量”的例子:

#include <iostream>

#define PI 3.14159 

int main() {
  double r; // r是double类型的变量,double是浮点实数类型
  
  r = 2.5;
  std::cout << PI*r*r << std::endl;
  //...
  
  std::cout << 2*PI*r << std::endl;
  return 0; 
}

7. 标准输入流对象cin

输入输出标准流库还定义了叫做"**cin**"的输入流对象, 它代表键盘对象,可以从cin中输入数据到某个程序变量(对象)中。

   double r; 
   std::cin>>r; //等待用户从键盘输入一个实数给变量r。其中">>"是输入流运算符

看一个完成的使用“cin”和输入流运算符”»“的例子:

#include <iostream>

#define PI 3.14159 //PI就是宏常量。 #define就是宏定义指令

int main() {
  double r; 
  std::cin>>r;   //等待用户从键盘输入一个实数给变量r。
  
  std::cout << PI*r*r << std::endl;
  //..
  
  std::cout << 2*PI*r << std::endl;
  return 0; 
}
#include <iostream>

int main() {  
    std::cout <<"请输入2个整数:"<< std::endl; 
    int a,b;
    std::cin>>a>>b;   //等待用户从键盘输入2个整数,输入2个整数时,可以用空格或回车隔开它们。 
    
    
    std::cout << a << "+" << b << "=:" <<a+b << std::endl;
    return 0; 
}

8. 总结:

本文介绍了下列概念:简单的C++程序、程序注释、输入输出、名字空间、宏定义#define、变量-命令的内存块、标准输入流对象cin、输出运算符«和输入运算符»

9. 练习:

  1. 写1个程序,输出下面的图形:
                1
    
             2     3
    
          4     5    6
    
  2. 写一个程序计算体积: cube(立方体), sphere(球), cone(圆锥).

     Cube Volume = side^3 
    
     Sphere Volume = (4/3) * pi * radius^3 
    
     Cone Volume = pi * radius^2 * (height/3) 
    

    要求图形参数如radius等从键盘输入。

#include<iostream>
int main(){           

    double cubeSidesphereRadius coneRadius coneHeigh  //图形的参数

    volCube, volSphere, volCone = 0;       //体积变量的初始值为0

   //补充你的代码

   return 0;

}

编程环境:

  1. CodeBlocks编译C/C++程序

  2. VS2017编译C++程序

  3. sublime配置MinGW搭建C/C++编程环境,并解决控制台汉字输出乱码问题 ​​​​

关注微博”教小白精通编程”. 加入QQ群:101132160 ​​​ 享受直接的辅导!


支付宝打赏 微信打赏

您的打赏是对我最大的鼓励!