C++基础2:C++基本数据类型和控制结构

此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C++从入门到深入的专栏,参考书籍:《深入浅出 C {\rm C} C++》(马晓锐)和《从 C {\rm C} C C {\rm C} C++精通面向对象编程》(曾凡锋等)。



2.C++基本数据类型和控制结构
2.1 C++基本数据类型
  • 程序是由算法和数据组成的,数据是算法的前提,数据以常量和变量的形式出现,每个常量和变量都有数据类型;

  • C {\rm C} C++的数据类型主要分为基本数据类型和自定义类型,基本数据类型是 C {\rm C} C++编译系统内置的,自定义类型是用户以基本类型为基础定义的符合自己要求的类型;

  • C {\rm C} C++基本数据类型:

    • 整型 ( i n t , s h o r t , l o n g ) ({\rm int,short,long}) (int,short,long)
    • 字符型包括单字符型 ( c h a r ) ({\rm char}) (char)和宽字符型 ( w c h a r _ t ) ({\rm wchar\_t}) (wchar_t)
    • 实型包括单精度型 ( f l o a t ) ({\rm float}) (float)和双精度型 ( d o u b l e ) ({\rm double}) (double)
  • 非基本数据类型:

    • 逻辑型 ( b o o l ) ({\rm bool}) (bool)
    • 数组 ( t y p e [ ] ) ({\rm type[]}) (type[])
    • 指针 ( t y p e   ∗ ) ({\rm type\ *}) (type )
    • 空类型 ( v o i d ) ({\rm void}) (void)
    • 结构 ( s t r u c t ) ({\rm struct}) (struct)
    • 联合 ( u n i o n ) ({\rm union}) (union)
    • 枚举 ( e n u m ) ({\rm enum}) (enum)
    • ( c l a s s ) ({\rm class}) (class)
  • 整型类型:根据表示范围分为基本整型、短整型、长整型、超长整型,其表示范围根据编译系统和平台而定。

    // 1.基本整型:以int关键字定义;
    int score;
    
    // 2.短整型:用short int或short关键字定义;
    short int age;
    short age;
    
    // 3.长整型:用long int或long关键字定义;
    long int height;
    long height;
    
    // 4.超长整型:用long long int或long long关键字定义;
    long long int studentID;
    long long studentID;
    
    // example2_1.cpp
    /**
     * 作者:罗思维
     * 时间:2023/09/24
     * 描述:确定整型类型在内存中所占的字节数。
     */
    #include <iostream>
    using namespace std;
    
    int main()
    {
        cout << "sizeof(short int) = " << sizeof(short int) << "字节" << endl;
        cout << "sizeof(int) = " << sizeof(int) << "字节" << endl;
        cout << "sizeof(long int) = " << sizeof(long int) << "字节" << endl;
        cout << "sizeof(long long int) = " << sizeof(long long int) << "字节" << endl;
    
        return 0;
    }
    
    // example2_1.cpp程序执行结果(编译系统为:Visual Studio Code编译系统)
    sizeof(short int) = 2字节
    sizeof(int) = 4字节
    sizeof(long int) = 4字节
    sizeof(long long int) = 8字节
    
    • 短整型: − 2 15 ~ 2 15 − 1 -2^{15}~2^{15}-1 2152151,即 − 32768 ~ 32767 -32768~32767 3276832767
    • 基本整型: − 2 31 ~ 2 31 − 1 -2^{31}~2^{31}-1 2312311,即 − 2147483648 ~ 2147483647 -2147483648~2147483647 21474836482147483647
    • 长整型: − 2 31 ~ 2 31 − 1 -2^{31}~2^{31}-1 2312311,即 − 2147483648 ~ 2147483647 -2147483648~2147483647 21474836482147483647
    • 超长整型: − 2 63 ~ 2 63 − 1 -2^{63}~2^{63}-1 2632631,即 − 9223372036854775808 ~ 9223372036854775807 -9223372036854775808~9223372036854775807 92233720368547758089223372036854775807
  • 实型类型:亦称为浮点数,表示形式分为十进制小数形式和指数形式,十进制小数形式由数字和小数点组成,且必须含有小数点,指数形式利用数学上的指数形式表示,形式为数字 + E {\rm +E} +E指数, E {\rm E} E可以为小写 e {\rm e} e,实型数据类型变量分为三种,如下:

    // 1.单精度:利用float关键字定义;
    float fNum;
    
    // 2.双精度:利用double关键字定义;
    double dNum;
    
    // 3.长双精度:利用long double定义;
    long double ldNum;
    
    // example2_2.cpp
    /**
     * 作者:罗思维
     * 时间:2023/09/24
     * 描述:确定实型类型在内存中所占的字节数。
     */
    #include <iostream>
    using namespace std;
    
    int main()
    {
        cout << "sizeof(float) = " << sizeof(float) << "字节" << endl;
        cout << "sizeof(double) = " << sizeof(double) << "字节" << endl;
        cout << "sizeof(long double) = " << sizeof(long double) << "字节" << endl;
    
        return 0;
    }
    
    // example2_2.cpp程序结果
    sizeof(float) = 4字节
    sizeof(double) = 8字节
    sizeof(long double) = 16字节
    
    // example2_3.cpp
    /**
     * 作者:罗思维
     * 时间:2023/09/24
     * 描述:实型数据的运算存在一定的误差。
     */
    #include <iostream>
    using namespace std;
    
    int main()
    {
        float fNumber1, fNumber2;
        fNumber1 = 123456789.0;
        fNumber2 = fNumber1 + 10;
    
        cout << "fNumber1 = " << fNumber1 << endl;
        cout << "fNumber2 = " << fNumber2 << endl;
    
        return 0;
    }
    
    // example2_3.cpp程序结果:
    fNumber1 = 1.23457e+08
    fNumber2 = 1.23457e+08
    
  • 字符类型

    • 字符在 C {\rm C} C++中用单引号(‘’)表示,字符类型数据就是存储字符的数据类型,字符类型变量用关键字 c h a r {\rm char} char定义;

    • 字符类型的变量在内存中占用 1 1 1个字节,即 8 8 8位,在存储时,字符变量存储的是一个 − 128 ~ 127 -128~127 128127的数值,存储的字符是字符的 A S C I I {\rm ASCII} ASCII码;

    • 用"\“表示的字符称为转义字符,用这个符号进行转义的字符一般是控制字符,控制字符不可打印,在程序中无法用一般形式表示,因此必须用”\"开头的字符序列表示;

    • 常用的转义字符及其含义:

      字符形式 字符形式 字符形式 含义 含义 含义 A S C I I {\rm ASCII} ASCII
      \ n {\rm n} n 换行,当前位置移动到下一行开头 换行,当前位置移动到下一行开头 换行,当前位置移动到下一行开头 10 10 10
      \ t {\rm t} t 水平制表符,当前位置移动到下一个 T a b 位置 水平制表符,当前位置移动到下一个{\rm Tab}位置 水平制表符,当前位置移动到下一个Tab位置 9 9 9
      \ b {\rm b} b 退格,当前位置移动到前一列位置 退格,当前位置移动到前一列位置 退格,当前位置移动到前一列位置 8 8 8
      \ r {\rm r} r 回车,当前位置移动到本行开头 回车,当前位置移动到本行开头 回车,当前位置移动到本行开头 13 13 13
      \ f {\rm f} f 换页,当前位置移动到下一页开头 换页,当前位置移动到下一页开头 换页,当前位置移动到下一页开头 12 12 12
      \\ 表示反斜杠 表示反斜杠 表示反斜杠"\" 92 92 92
      \’ 表示单引号 表示单引号 表示单引号“ ’ ” 39 39 39
      \" 表示双引号 表示双引号 表示双引号“ " ” 34 34 34
  • 逻辑类型:亦称布尔型,表示真和假的数据类型,逻辑类型变量用关键字 b o o l {\rm bool} bool定义,逻辑类型变量只有真和假两种情况,真用 t r u e {\rm true} true表示,假用 f a l s e {\rm false} false表示,在 C {\rm C} C++中,真用 1 1 1定义,假用 0 0 0定义;

    // example2_4.cpp
    /**
     * 作者:罗思维
     * 时间:2023/09/25
     * 描述:利用逻辑类型变量的逻辑运算判断学生成绩是否及格。
     */
    #include <iostream>
    using namespace std;
    
    int main()
    {
        bool bIsPassed;
        int nScore1 = 80, nScore2 = 70;
    
        bIsPassed = nScore1 >= 60 && nScore2 >= 60;
        cout << "bIsPassed值为:" << bIsPassed << endl;
    
        if (bIsPassed)
        {
            cout << "成绩及格,请及时打印成绩." << endl;
        }
        else
        {
            cout << "成绩不及格,请重新考试." << endl;
        }
    
        return 0;
    }
    
  • 变量存储限定符:存储类型用在变量前加存储限定符表示,可以对变量在内存中的存储进行控制,常用的变量限定符如下:

    • a u t o {\rm auto} auto:采用堆栈方式分配内存空间,是暂时性的存储,其存储空间可以被其他变量多次覆盖使用,即不是独占的;
    • r e g i s t e r {\rm register} register:变量存储在通用寄存器;
    • e x t e r n {\rm extern} extern:此存储类型变量在程序中的所有函数和程序段中都可以被使用;
    • s t a t i c {\rm static} static:以固定的地址存放变量,在整个程序运行期间都有效;
  • 强制类型转换:开发者自行进行的转换。

    // 1.强制类型转换格式
    类型名(表达式) 或 (类型名)表达式	// 类型名是表达式转换后的数据类型;
        
    // 2.将long类型值转换为int类型值
    long lNumber = 100.0;
    int nNumber = (int)lNumber;
    
    // 3.Tips:
    // 3.1 强制类型转换是一种不安全的转换,从高类型数据向低类型数据转换时可能有精度的损失;
    // 3.2 强制类型转换是暂时性的,不会改变原来数据的数据类型;
    
    // example2_5.cpp
    /**
     * 作者:罗思维
     * 时间:2023/09/25
     * 描述:强制类型转换实例。
     */
    #include <iostream>
    using namespace std;
    
    int main()
    {
        double lNumber = 0.0;
        int nNumber = 0;
    
        nNumber = 32767;
        lNumber = (double)nNumber; // 将int类型转换为double类型值(低->高);
    
        cout << "nNumber = " << nNumber << endl;
        cout << "lNumber = " << lNumber << endl;
    
        lNumber = 3.14;
        nNumber = (int)lNumber; // 将double类型转换为int类型值(高->低);
    
        cout << "lNumber = " << lNumber << endl;
        cout << "nNumber = " << nNumber << endl;
    
        return 0;
    }
    
2.2 实战1

项目需求:提示用户输入三角形的 3 3 3条边长,计算出三角形的面积并取整,将结果输出到输出设备上。

需求分析

  • 输入信息;
  • 判断 3 3 3条边是否能组成一个三角形;
  • 可以组成三角形的情况下计算三角形的面积;
  • 输出信息;

处理步骤

3

程序实现 ( p r o j e c t 2 _ 1. c p p ) ({\rm project2\_1.cpp}) (project2_1.cpp)

/**
 * 作者:罗思维
 * 时间:2023/09/25
 * 描述:计算三角形面积。
 */
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    /**
     * 参数说明:
     * dLine1,dLine2,dLine3:    三角形三边边长;
     * dArea:                   三角形实际面积;
     * dP:                      三角形边长之和的一半;
     * nArea:                   三角形取整面积;
     * bIsTriangle:             三角形的组成条件;
     */
    double dLine1, dLine2, dLine3;
    double dArea, dP;
    long nArea;
    bool bIsTriangle;

    cout << "请输入边长1:";
    cin >> dLine1;

    cout << "请输入边长2:";
    cin >> dLine2;

    cout << "请输入边长3:";
    cin >> dLine3;

    bIsTriangle = ((dLine1 + dLine2) <= dLine3) || ((dLine2 + dLine3) <= dLine1) || ((dLine3 + dLine1) <= dLine2);

    if (bIsTriangle)
    {
        cout << "不是一个有效的三角形." << endl;
        exit(1);
    };

    dP = (dLine1 + dLine2 + dLine3) / 2;
    dArea = sqrt(dP * (dP - dLine1) * (dP - dLine2) * (dP - dLine3));
    nArea = (long)dArea;

    cout << "三角形面积:" << dArea << endl;
    cout << "三角形取整面积:" << nArea << endl;

    return 0;
}
2.3 C++语句与控制结构
  • 表达式:指用运算符连接各个运算对象,合乎语法规则的式子,表达式后面加上分号构成了表达式语句;

    // 1.空语句:指只有一个分号没有表达式的语句;
    // 空语句不做任何运算,是作为一种形式上的语句填充在控制结构中;
    // 语法格式:
    ;
    
    // 2.赋值语句:由赋值表达式加分号构成的语句;
    // 语法格式:
    变量  赋值运算符  表达式;
    age = 18;
    
    // 3.函数调用语句:调用函数语句的表达式;
    
  • 流程图:程序流程图是人们对解决问题的方法、思路或算法的一种描述,流程图用一些专用符号绘制,如:长方形、菱形、椭圆和小圆,这些符号用箭头连接,称为流程;程序中一般有三种控制结构,分别为:顺序结构、选择结构、循环结构,常见流程图图例如下:

    4

    • 顺序结构:指按照语句在程序中的先后次序一条一条地顺序执行的过程;

    • 选择结构:主要由 i f {\rm if} if s w i t c h {\rm switch} switch控制, i f {\rm if} if为单项选择结构, s w i t c h {\rm switch} switch为多项选择结构。

      // 1.if语句的基本形式
      if (条件表达式)
      {
          语句序列;
      }
      
      // 2.if-else语句形式
      if (条件表达式)
      {
          语句序列1;
      }
      else
      {
          语句序列2;
      }
      
      // 3.if-else if-else语句形式
      if (条件表达式1)
      {
          语句序列1;
      }
      else if	(条件表达式2)
      {
          语句序列2;
      }
      ...
      else
      {
          语句序列n;
      }
      
      // 4.switch语句形式
      switch (变量表达式)	// 变量表达式只能是整型、字符型或枚举型表达式;
      {
          case 常量表达式1:<语句序列1>;break;
          case 常量表达式2:<语句序列2>;break;
              ...
          case 常量表达式n:<语句序列n>;break;
          default:<语句序列n+1>;
      }
      
    • 循环结构:在给定条件成立时,反复执行某程序段,直到条件不成立为止,给定条件称为循环条件,反复执行的程序段称为循环体。

      // 1.while结构:通过判断条件是否成立来决定循环的继续和结束;
      while(表达式)		// 表达式是循环条件;
      {
          语句序列;		// 语句序列为循环体;
      }
      
      // 2.do-while结构:
      do
      {
          语句序列;
      }while(条件表达式);
      
      // 3.for结构:
      /**
      * 表达式1:循环初始值;
      * 表达式2:循环结束值;
      * 表达式3:循环的增量;
      */
      for(表达式1;表达式2;表达式3)
      {
          语句序列;
      }
      
      // 4.基于范围的for语句,遍历序列中的每一个元素,并对每个元素进行某种操作;
      for(数据类型 变量:序列)		// 序列是一个对象,可以是数组名、对象名、容器名等; 
      {
          语句序列;			// 对每个元素进行的操作;
      }
      
  • 控制结构实例:

    • i f {\rm if} if语句实例: e x a m p l e 2 _ 6. c p p {\rm example2\_6.cpp} example2_6.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/26
       * 描述:if语句实例。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int nNumber;
          cout << "请输入一个整数:";
          cin >> nNumber;
      
          if (nNumber > 0)
          {
              cout << "输入的整数是正数." << endl;
          }
      
          return 0;
      }
      
    • i f − e l s e {\rm if-else} ifelse语句实例: e x a m p l e 2 _ 7. c p p {\rm example2\_7.cpp} example2_7.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/26
       * 描述:if-else语句实例。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int nNumber;
          cout << "请输入一个整数:";
          cin >> nNumber;
      
          if (nNumber > 0)
          {
              cout << "输入的整数是正数." << endl;
          }
          else
          {
              cout << "输入的整数不是正数." << endl;
          }
      
          return 0;
      }
      
    • i f − e l s e   i f − e l s e {\rm if-else\ if-else} ifelse ifelse语句实例: e x a m p l e 2 _ 8. c p p {\rm example2\_8.cpp} example2_8.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/26
       * 描述:if-else if-else语句实例。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int nScore;
          cout << "请输入你的分数:";
          cin >> nScore;
      
          if (nScore >= 0 && nScore <= 100)
          {
              if (nScore >= 90)
              {
                  cout << "分数等级:A." << endl;
              }
              else if (nScore >= 80 && nScore < 90)
              {
                  cout << "分数等级:B." << endl;
              }
              else if (nScore >= 70 && nScore < 80)
              {
                  cout << "分数等级:C." << endl;
              }
              else if (nScore >= 60 && nScore < 70)
              {
                  cout << "分数等级:D." << endl;
              }
              else
              {
                  cout << "分数等级:E." << endl;
              }
          }
          else
          {
              cout << "输入的分数不正确." << endl;
          }
      
          return 0;
      }
      
    • s w i t c h {\rm switch} switch语句实例: e x a m p l e 2 _ 9. c p p {\rm example2\_9.cpp} example2_9.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/26
       * 描述:switch语句实例,判断四季。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int nSeason;
          cout << "请输入你要查询的月份:";
          cin >> nSeason;
      
          switch (nSeason)
          {
          case 12:
          case 1:
          case 2:
              cout << nSeason << "月份所处季节为冬季." << endl;
              break;
          case 3:
          case 4:
          case 5:
              cout << nSeason << "月份所处季节为春季." << endl;
              break;
          case 6:
          case 7:
          case 8:
              cout << nSeason << "月份所处季节为夏季." << endl;
              break;
          case 9:
          case 10:
          case 11:
              cout << nSeason << "月份所处季节为秋季." << endl;
              break;
          default:
              cout << "Error." << endl;
              break;
          }
          
          return 0;
      }
      
    • w h i l e {\rm while} while语句实例: e x a m p l e 2 _ 10. c p p {\rm example2\_10.cpp} example2_10.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/27
       * 描述:while语句实例,计算1+2+3+...+100的值。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int num = 1, sum = 0;
          while (num <= 100)
          {
              sum = sum + num;
              num++;
          }
      
          cout << "1+2+...+100 = " << sum << endl;
      
          return 0;
      }
      
    • d o − w h i l e {\rm do-while} dowhile语句实例: e x a m p l e 2 _ 11. c p p {\rm example2\_11.cpp} example2_11.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/27
       * 描述:do-while语句实例,计算1+2+3+...+100的值。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int num = 1, sum = 0;
          do
          {
              sum = sum + num;
              num++;
          } while (num <= 100);
      
          cout << "1+2+...+100 = " << sum << endl;
      
          return 0;
      }
      
    • f o r {\rm for} for语句实例: e x a m p l e 2 _ 12. c p p {\rm example2\_12.cpp} example2_12.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/27
       * 描述:for语句实例,计算1+2+3+...+100的值。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int sum = 0;
          for (int num = 1; num <= 100; num++)
          {
              sum = sum + num;
          }
      
          cout << "1+2+...+100 = " << sum << endl;
      
          return 0;
      }
      
    • f o r {\rm for} for语句遍历数组中的元素: e x a m p l e 2 _ 13. c p p {\rm example2\_13.cpp} example2_13.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/27
       * 描述:for语句实例,遍历数组中的元素。
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          char c[] = {'W', 'i', 'l', 'l', 'a', 'r', 'd'};
          for (char word : c)
          {
              cout << word;
          }
          cout << endl;
      
          return 0;
      }
      
  • b r e a k {\rm break} break语句: b r e a k {\rm break} break语句在 w h i l e 、 f o r 、 d o − w h i l e 、 s w i t c h {\rm while、for、do-while、switch} whilefordowhileswitch结构中执行时,使程序立即退出这些结构,从而执行该结构后面的第一条语句。

    • b r e a k {\rm break} break语句实例: e x a m p l e 2 _ 14. c p p {\rm example2\_14.cpp} example2_14.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/28
       * 描述:break语句实例,计算1+2+...+100;
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int sum = 0;
          for (int i = 1;; i++)
          {
              sum += i;
              if (i == 100)
              {
                  break;
              }
          }
      
          cout << "1+2+...+100 = " << sum << endl;
      
          return 0;
      }
      
  • c o n t i n u e {\rm continue} continue语句: c o n t i n u e {\rm continue} continue语句在 w h i l e 、 f o r 、 d o − w h i l e {\rm while、for、do-while} whilefordowhile结构中执行时,跳过当前循环的其余语句,直接进入下一轮循环。

    • c o n t i n u e {\rm continue} continue语句实例: e x a m p l e 2 _ 15. c p p {\rm example2\_15.cpp} example2_15.cpp

      /**
       * 作者:罗思维
       * 时间:2023/09/29
       * 描述:continue语句实例,计算1-100内偶数和;
       */
      #include <iostream>
      using namespace std;
      
      int main()
      {
          int sum = 0;
      
          for (int i = 1; i <= 100; i++)
          {
              if (i % 2 == 0)
              {
                  sum = sum + i;
              }
          }
      
          cout << "1-100内偶数和为:" << sum << endl;
          
          return 0;
      }
      
2.4 实战2

项目需求:求某整数段区间中素数并输出。

需求分析

  • 提示用户输入整数段区间;
  • 判断素数规则:对于数字 n { n} n,如果其无法被任何从 2 2 2 n \sqrt{n} n 的数整除,则为素数。

代码实现 ( p r o j e c t 2 _ 2. c p p ) ({\rm project2\_2.cpp}) (project2_2.cpp):

/**
 * 作者:罗思维
 * 时间:2023/09/29
 * 描述:求某整数区间段的素数。
 */
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    /**
     * 参数说明:
     * nStart:      整数区间最小值;
     * nEnd:        整数区间最大值;
     * nCnt1,nCnt2: 循环计数器;
     * nSqrt:       存储平方根值;
     * nNum:        计算素数个数;
     */
    int nStart = 0, nEnd = 0;
    int nCnt1 = 0, nCnt2 = 0;
    int nSqrt;
    int nNum = 0;

    cout << "请输入区间下限:";
    cin >> nStart;

    cout << "请输入区间上限:";
    cin >> nEnd;

    if (nStart <= 1)
    {
        cout << "区间下限应该大于1." << endl;
        return 1;
    }

    for (nCnt1 = nStart; nCnt1 <= nEnd; nCnt1 += 1)
    {
        nSqrt = sqrt(nCnt1);
        for (nCnt2 = 2; nCnt2 <= nSqrt; nCnt2++) // 判断nCnt1是否能被2到nSqrt的数整除;
        {
            if (nCnt1 % nCnt2 == 0)
            {
                break;
            }
        }

        if (nCnt2 >= nSqrt + 1) // 如果nCnt2>=nSqrt+1,说明nCnt1不能被2到nSqrt的数整除;
        {
            cout << nCnt1 << "\t";
            nNum = nNum + 1;
            if (nNum % 10 == 0)
            {
                cout << endl;
            }
        }
    }
    cout << endl;

    return 0;
}
2.5 实战3

项目需求:根据用户输入的年份判断年份是否为闰年。

需求分析

  • 用户输入年份;
  • 判断闰年的规则:年份可以被 4 4 4整除且不能被 100 100 100整除或能被 400 400 400整除的为闰年。

代码实现 ( p r o j e c t 2 _ 3. c p p ) ({\rm project2\_3.cpp}) (project2_3.cpp)

/**
 * 作者:罗思维
 * 时间:2023/09/29
 * 描述:提示用户输入年份,判断是否为闰年。
 */
#include <iostream>
using namespace std;

int main()
{
    int year = 0;

    cout << "请输入你需要查询的年份:";
    cin >> year;

    while (year <= 0)
    {
        cout << "输入的年份应该大于0,请重新正确输入年份:";
        cin >> year;
    }

    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
    {
        cout << year << " is leap year." << endl;
    }
    else
    {
        cout << year << "is not leap year." << endl;
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/433407.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT应用开发——Navigation开发 页面切换场景范例

简介 在应用开发时&#xff0c;我们常常遇到&#xff0c;需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理&#xff0c;它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载&#xff0c;navPathSta…

2024年最新Android大厂面试笔试题分享,大厂面试题汇总

随着互联网的发展&#xff0c;大众对程序员这个职业有了更多的了解&#xff0c;除了高薪工资之外&#xff0c;压力太大&#xff0c;黑白颠倒&#xff0c;作息不规律等等&#xff0c;也是身为一个程序员必须经历的事情。 大部分程序员都是安静的、稳重的&#xff0c;有什么问题…

算法简单试题

一、选择题 01.一个算法应该是( B ). A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D.A和C 02&#xff0e;某算法的时间复杂度为O(n)&#xff0c;则表示该…

探索AntDB:数据驱动时代的引擎

AntDB的发展道路一直如一条平稳而高效的航线&#xff0c;其升级过程始终是经过细致策划与多方验证。每一次的版本更新&#xff0c;都蕴含着团队的心血和智慧&#xff0c;保障系统的稳定与性能。AntDB在高速发展的同时&#xff0c;始终不忘稳扎稳打&#xff0c;为用户提供最优质…

基于java的宠物常规护理知识管理系统

项目源码&#xff1a;https://gitee.com/oklongmm/biye2 在设计一个宠物常规护理知识管理系统时&#xff0c;我们需要考虑系统的可扩展性&#xff0c;易用性和稳定性。以下是系统设计的功能模块&#xff1a; 一、用户模块&#xff1a; 1. 注册与登录&#xff1a;用户可以通过…

新书速览|软件性能测试、分析与调优实践之路(第2版)

性能调优理论和实践的完美结合&#xff0c;融合作者多年性能调优的经验&#xff0c;读者无须再为性能问题而发 本书内容 《软件性能测试、分析与调优实践之路&#xff08;第2版&#xff09;》主要分享作者在多年软件测试从业中积累的关于性能测试、分析诊断与调优技巧等方面的实…

全排列 全排列 II N皇后

46.全排列 力扣题目链接(opens new window) 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 递归终止条件&#xff1a;当收集元素的数组path的大小达到和nums数组…

Vue3和Vue2的相关面试知识点,一点要记住

Vue3 1、Vue2 和 Vue3 的区别&#xff1f; vue3 对于 typescript 的支持更加的好 vue3 的 Composition API&#xff0c; vue2 的 Option API vue3 打包使用 tree-shaking 策略&#xff0c;体积更小 vue3 在模板编译的阶段会有静态节点提升&#xff0c;运行时性能更好 vue3…

解码Transformer: 自注意力机制和TA的优化策略

注意力机制自从2014年被正式提出后&#xff0c;逐渐成为了NLP中应用最广泛的设计。借助简单而又变幻莫测的Attention机制&#xff0c;一系列横扫SOTA的模型被提出。自注意力机制&#xff08;Self-Attention&#xff09;&#xff0c;允许序列中的标记相互交互&#xff0c;并计算…

msvcr120.dll丢失怎样修复,更了解msvcr120.dll文件从而解决丢失问题

在电脑使用过程中&#xff0c;"msvcr120.dll丢失"是常见的错误提示之一。那么&#xff0c;今天就和大家聊聊msvcr120.dll文件&#xff0c;如果msvcr120.dll文件丢失的问题时什么原因导致的&#xff0c;让我们仔细来看一下msvcr120.dll是什么以及msvcr120.dll丢失怎样…

反射(重点)

1.反射的概述 Java给我们提供了一套API&#xff0c;使用这套API我们可以在运行时动态的获取指定对象所属的类&#xff0c;创建 运行时类的对象&#xff0c;调用指定的结构&#xff0c;(属性&#xff0c;方法)等 API&#xff1a; java.lang.Class&#xff1a;代表一个类 jav…

游戏力:竞技游戏设计实战教程

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 游戏力&#xff1a;竞技游戏设计实战教程 引言…

高中数学:单调奇偶综合(较难)

一、奇偶性扩展 1、普通轴对称函数 要会根据抽象函数的关系&#xff0c;找出对称轴 简便记法&#xff1a;纵相等&#xff0c;对称轴 2、普通中心对称函数 要会找出对称中心点坐标 简便记法&#xff1a;纵和定&#xff0c;中心点 二、题型汇总 解题方法 抽象函数 1、…

社交媒体革新者:揭秘Facebook对在线互动的影响

1. Facebook的兴起与发展 Facebook由马克扎克伯格在哈佛大学宿舍创建&#xff0c;最初只是服务于哈佛大学学生的社交网络。然而&#xff0c;其后快速扩张到其他大学和全球&#xff0c;成为了全球最大的社交媒体平台之一。其发展历程不仅是数字时代的典范&#xff0c;也是创业成…

史上最大优惠!阿里云宣布全线降价99元一年,新老客户同享

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

证件照制作繁琐?学会这三招轻松制作专业级证件照!

朋友们&#xff0c;您是否曾经为了办理各种证件、报名考试或者求职简历中的证件照而烦恼呢&#xff1f;是否希望能在家就能便捷高效地制作出符合规格的专业证件照&#xff1f;今天我将为大家推荐三款国内外备受好评的证件照处理工具&#xff0c;让您随时随地拥有完美证件照&…

AI领域再出“王炸“----Claude3是否会成为下一个“神“

目录 一.Claude3最新发布 二.Claude3支持20万token 三.Claude3在未公开算法上取得重大突破 1.Claude 3读懂博士论文 2.量子跃迁集成&#xff1a; Claude 3智商&#xff1a;101 测试方法 测试细节 通过Karpathy挑战 Claude 3自画像&#xff0c;突破本我 从洛杉矶排到…

蚂蚁感冒c++

题目 思路 “两蚂蚁碰面会掉头&#xff0c;若其中一只蚂蚁感冒了&#xff0c;会把感冒传染给碰到的蚂蚁”&#xff0c;这句话看作是“两蚂蚁碰面会互相穿过&#xff0c;只是把感冒的状态传给了另一只蚂蚁”&#xff0c;因为哪只蚂蚁感冒了并不是题目的重点&#xff0c;重点是有…

浅谈块存储、文件存储、对象存储

**块存储、文件存储和对象存储各自有其独特的特点和适用场景**。具体来说&#xff1a; 1. **块存储**&#xff1a; - 描述&#xff1a;块存储将存储空间分割成固定大小的块&#xff0c;这些块可以直接映射到主机操作系统。它提供的是原始的存储空间&#xff0c;不带文件系统…

Jmeter接口测试参数化

一、前言 接口测试组合不同的参数向服务器发送请求&#xff0c;接受和解析响应结果&#xff0c;通过测试数据的交换逻辑来验证服务端程序工作的正确性。 我们在测试过程中需要考虑不同的输入组合&#xff0c;来覆盖不同的测试范围&#xff1b;除此之外&#xff0c;系统中往往…