C++基础(二)

选择结构

选择结构是用来控制程序流程,使得程序可以根据不同的条件执行不同的代码块。

if语句

简单结构

if (表达式)

{

    // 表达式为真时执行的语句。

}

else

{

    // 表达式为假时执行的语句。

}

#include <iostream>
#include <string>

using namespace std;

int assessment(int regular_grade, int midterm, int final, float regular_weight = 0.3, float midterm_weight = 0.2, float final_weight = 0.5)
{
  if (regular_grade * regular_weight + midterm * midterm_weight + final * final_weight >= 60)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

上述代码中使用到了一点函数内容,功能是计算一下科目是否通过(计算平时分,期中期末成绩以及不同加权)。代码使用了最简单的选择结构,如果三类成绩累计大于60分,那么本科通过,否则不通过。 

 嵌套结构

嵌套结构简单理解为if里面套if,进行多次判断,我们已经实现评估函数,我们可以继续设计一个评奖评优的函数,当评估函数返回1(成绩通过)的情况下,如果总绩点排在本专业前5%时拥有评奖评优资格,这就是嵌套结构。

if (表达式一)

{

    if (表达式二)

    {

        // 表达式二为真时执行的语句。

    }

      else

      {

          // 表达式二为假时执行的语句。

    }

}

else

{

    // 表达式一为假时执行的语句。

}

 需要注意的是,else总是与前面最近if 配对。如果要改变这种配对关系,可以使用花括号来确定新的配对关系。

多条件if语句

if (表达式一)

{

    // 表达式一为真时执行的语句。

}

else if (表达式二)

{

    // 表达式二为真时执行的语句。

}

else if (表达式三)

{

    // 表达式三为真时执行的语句。

}

……

else if (表达式n)

{

    // 表达式n为真时执行的语句。

}

else

{

    // 全部表达式都不为真时执行的语句。

}

 

三目运算符

用的不多,因为逻辑一复杂,三目运算符可读性差,了解即可 。

表达式一 ? 表达式二 : 表达式三

max = a>b?a:b//返回a和b之间较大的

 

switch语句

多条件if语句有点不方便,如果条件具有很高的共性,比如月份,星期等等,这是使用switch会更方便。

switch (表达式)

{

    case 值一:

       语句一;

       break;

    case 值二:

       语句二;

       break;

    ......

    case 值n:

       语句n;

       break;

    default:

       上述条件都不满足时执行的语句;

}

注意:

  1. case后面必须是整数和字符,或者是结果为整数和字符的表达式,但不能使用变量。
  2. default不是必须的,当没有default时,如果全部的case匹配失败,那么就什么都不执行。
  3. 每个分支不要漏写break语句。

循环结构

循环结构是用来重复执行某段代码,直至满足特定条件停止的控制结构。

while循环

while (表达式)

{

    语句块

}

#include <iostream>

using namespace std;

int main()
{
  int sum = 0;
  int n = 1;
  while (n <= 100)
  {
    sum += n;
    n++;
  }
  cout << "Sum:" << sum << endl;
  return 0;
}

上述代码功能就是计算1-100的累和

 

for循环

语法:

for (语句一 ; 表达式 ; 语句二)

{

    语句块

}

1)循环开始的时候,先执行语句一,在整个循环过程中语句一只会被执行一次。

2)计算表达式的值,如果为真,就执行一次循环体中的语句块。

3)执行完语句块后,执行一次语句二。

4)重复第2)步和第3),直到表达式的值不为真才结束for循环。

注意:

  1. 不要纠结for循环与while循环的区别,它们本质上没有区别。
  2. for循环一般需要一个相当于计数器的变量,在语句一中对它进行初始化,在语句二中进行计数操作。
  3. 在for循环的语句一中,可以声明计数器变量。
  4. 在for循环中,语句一、表达式和语句二都可以为空,for (;;)等同于while (true)。
  5. continue和break两个关键字也可以用在for循环体中。
int *pass_rate_iteration(int form[3][3])
{
  static int result[3] = {0};
  int i;
  for (i = 0; i < 3; i++)
  {
    int regular_grade = form[i][0];
    int midterm = form[i][1];
    int final = form[i][2];
    int grade = assessment(regular_grade, midterm, final);
    result[i] = grade;
  }
  return result;
}

上述代码功能为将每个学生的三类成绩的二维数组通过评估函数映射到一维数组(通过与否),每个学生的计算过程相似,所以我们使用循环结构。 

嵌套循环

#include <iostream>  // 包含头文件。
using namespace std; // 指定缺省的命名空间。

int main()
{
  // 超女分4个小组,每个小组有3名超女,在控制台显示每个超女的小组编号和组内编号。
  // 用一个循环,显示4个小组的信息。
  // for (int ii=1; ii<=4; ii++)
  //{
  //	// 再用一个循环,显示一组中3名超女的信息。
  //	for (int jj = 1; jj <= 3; jj++)
  //	{
  //		cout << "这是第" <<ii<<"个小组的第" << jj << "名超女。\n";
  //	}
  //}

  // 在控制台输出九九乘法表。
  for (int ii = 1; ii <= 9; ii++)
  {
    for (int jj = 1; jj <= ii; jj++)
    {
      cout << ii << "*" << jj << "=" << ii * jj << " ";
    }

    cout << endl;
  }
}

 

 

除此之外,还有do...while语句和goto语句,前者可以用while替换,后者容易造成逻辑混乱,一般不使用,这里就不赘述了。

函数

函数(Function)是一段可重用的代码,它执行特定任务并可能返回一个结果。函数有助于提高代码的模块化、可读性和可维护性。

声明与定义

在复杂的程序中,如果全部的代码都写在main函数中,main函数体将非常庞大臃肿。

把任务分工到其它的函数中,main函数只负责程序的核心流程,具体的任务由其它函数完成。

这种思想就是模块化编程。

声明和定义函数的语法:

返回值的数据类型 函数名(参数一的数据类型 参数一, 参数二的数据类型 参数二,……)

{

    实现函数功能的代码。

    return 返回值;

}

函数的声明:让编译器知道函数的存在,包括返回值的数据类型、函数名和参数列表。

函数的定义:函数的实现过程。

注意:

  1. 函数的声明和定义可以书写在一起,也可以分开,如果书写在一起,一般放在main函数的上面,如果分开,一般在main函数的上面声明,在main函数的下面定义。
  2. 如果函数的声明和定义分开书写,函数的声明后面一定要有分号,函数的定义后面一定不能写分号。
  3. 在同一个程序中,函数只需要声明和定义一次,也可以多次声明,但只能定义一次。
  4. 函数的声明必须和函数的定义一致(返回值的数据类型、函数名和参数列表),如果函数名和参数列表不同,表示它们不是同一个函数。
  5. return语句返回值的数据类型必须与函数的声明一致。
  6. 在函数体中,return语句可以多次使用。
  7. 如果函数的重点是实现功能,不关心返回值,返回值的数据类型填void,return语句后面就空着。
  8. 函数可以没有任何参数。
  9. 函数名是标识符,必须满足标识符的命名规则。
  10. 在函数的声明和函数的定义中,参数命名可以不同,但是没必要这么书写。

函数调用

语法:函数名(参数一,参数二,……)

注意:

  1. 声明函数的代码必须放在调用之前,定义函数的代码可以放在调用之后。
  2. 调用函数的时候,参数列表必须与函数的声明一致(参数的个数、书写的顺序和数据类型)。
  3. 不管在什么地方,都不能调用main函数,但是,在普通函数中,可以调用其它的普通函数。
  4. 调用函数的代码可以独占一条语句,也可以用于表达式(赋值运算、算术运算、关系运算、函数的参数)。
  5. 如果函数用于表达式中,返回值的数据类型要匹配(否则可能会被隐式转换或编译错误)。
  6. 如果函数有返回值,可以不关心它,忽略它。

变量作用域

作用域是指程序中变量存在(或生效)的区域,超过该区域变量就不能被访问。

变量分全局变量和局部变量两种,全局变量在整个程序中都可以访问,局部变量只能在函数或语句块的内部才能访问。

C++中定义变量的场景主要有五种:

1)在全部函数外面定义的是全局变量。

2)在头文件中定义的是全局变量。

3)在函数和语句块内部定义的是局部变量。

4)函数的参数是该函数的局部变量。

5)函数内部用static修饰的是静态局部变量。

1)全局变量

在整个程序生命周期内都是有效的,在定义位置之后的任意函数中都能访问。

全局变量在主程序退出时由系统收回内存空间。

2)局部变量

在函数或语句块内部的语句使用,在函数或语句块外部是不可用的。

局部变量在函数返回或语句块结束时由系统收回内存空间。

3)静态局部变量

用static修饰的局部变量生命周期和程序相同,并且只会被初始化一次。

其作用域为局部,当定义它的函数或语句块结束时,其作用域随之结束。

当程序想要使用全局变量的时候应该先考虑使用static(考虑到数据安全性)。

4)注意事项

  1. 全局变量和静态局部变量自动初始化为0。
  2. 局部变量不会自动初始化,其值是不确定的,程序中应该有初始化局部变量的代码,否则编译可能会报错(不同的编译器不一样)。
  3. 局部变量和全局变量的名称可以相同,在某函数或语句块内部,如果局部变量名与全局变量名相同,就会屏蔽全局变量而使用局部变量,如果想使用全局变量,可以在变量名前加两个冒号(::)。
  4. for循环初始化语句中定义的变量的作用域是for语句块。

函数参数的传递

调用函数的时候,调用者把数值赋给了函数的参数。

实参:调用者程序中书写的在函数名括号中的参数,可以是常量、变量和表达式。

形参:函数的参数列表。

在函数定义的代码中,修改形参的值,会不会影响实参。

#include <iostream>
#include <string>

using namespace std;

int assessment(int regular_grade, int midterm, int final, float regular_weight = 0.3, float midterm_weight = 0.2, float final_weight = 0.5)
{
  if (regular_grade * regular_weight + midterm * midterm_weight + final * final_weight >= 60)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

int *pass_rate_iteration(int form[3][3])
{
  static int result[3] = {0};
  int i;
  for (i = 0; i < 3; i++)
  {
    int regular_grade = form[i][0];
    int midterm = form[i][1];
    int final = form[i][2];
    int grade = assessment(regular_grade, midterm, final);
    result[i] = grade;
  }
  return result;
}

int main()
{
  int student[3][3] = {{90, 90, 90}, {70, 48, 49}, {100, 44, 38}};
  int *pass_form = pass_rate_iteration(student);

  for (int i = 0; i < 3; i++)
  {
    cout << pass_form[i] << endl;
  }

  return 0;
}

 

函数分文件编写 

头文件(*.h):需要包含的头文件,声明全局变量,函数的声明,数据结构和类的声明等。

源文件(*.cpp):函数的定义、类的定义。

主程序:main函数,程序的核心流程,需要用#include "头文件名"把头文件包含进来。

编译:

Windows是集成开发环境,不需要写编译指令。

 

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

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

相关文章

卫星通讯传输电力运维巡检EasyCVR视频汇聚平台智能监控方案

随着科技的快速发展&#xff0c;视频监控技术已广泛应用于各个领域。而卫星通讯作为一种高效、稳定的通信方式&#xff0c;为视频监控系统的远程传输提供了有力支持。 一、方案背景 随着电力行业的快速发展&#xff0c;电力运维巡检工作变得愈发重要。传统的巡检方式往往受到…

知识图谱的应用---新零售

文章目录 新零售知识图谱构建过程典型应用 新零售 新零售&#xff0c;即个人、企业以互联网为依托&#xff0c;通过运用大数据、人工智能等先进技术手段并运用心理学知识&#xff0c;对商品的生产、流通与销售过程进行升级改造&#xff0c;进而重塑业态结构与生态圈&#xff0c…

镜舟科技携手中通快运,入选 2024 爱分析·数据库应用实践报告

典型案例&#xff1a;中通快运重构数据中心&#xff0c;满足业务多种复杂分析需求 中通快运成立于2016年&#xff0c;是中通品牌旗下快运企业&#xff0c;聚焦数智物流新趋势&#xff0c; 提供面向企业及个人客户的全链路一站式物流服务。目前中通快运全国揽派件网点有21000 余…

MySQL存储引擎详述:InnoDB为何胜出?

MySQL作为当前最流行的开源关系型数据库之一,其强大的功能和良好的性能使其广泛应用于各种规模的应用系统中。其中,存储引擎的设计理念是MySQL数据库灵活高效的关键所在。 一、什么是存储引擎 存储引擎是MySQL架构的重要组成部分,负责MySQL中数据的存储和提供了视图,存储过程等…

大疆智图_空三二维重建成果传输

一、软件环境 1.1 所需软件 1、 大疆智图&#xff1a;点击下载&#xff1b;   2、 ArcGIS Pro 3.1.5&#xff1a;点击下载&#xff0c;建议使用IDM或Aria2等多线程下载器&#xff1b;   3、 IDM下载器&#xff1a;点击下载&#xff0c;或自行搜索&#xff1b;   4、 Fas…

初出茅庐的小李博客之CJSON库解析心知天气数据

心知天气数据JSON格式介绍 JSON格式介绍http://t.csdnimg.cn/pJX1n 下面代码是利用CJSON库进行数据解析 解析代码 #include <stdio.h> #include <string.h> #include "cJSON.h" // 假设你的CJSON库头文件路径是正确的int main(void) {// 提供的JSON…

LLM基础介绍

文章目录 一、语言模型1、概念2、预训练语言模型3、NLP4、benchmark1&#xff09;概念2&#xff09;GLUE 5、TPU6、语料 二、神经网络1、概念2、训练神经网络3、案例&#xff1a;word2vec3、RNN&#xff08;循环神经网络&#xff09;4、GRU5、LSTM&#xff08;长短时记忆网络&a…

SLT简介【简单介绍SLT】

SLT简介 在c的学习当中STL的学习是一个很重要的一环&#xff0c;但是STL又是一个庞大的章节&#xff0c;因此这里我们先简单介绍一下STL&#xff0c;有助于后面我们对STL的学习&#xff0c;这里就是做一个简单的介绍&#xff0c;并无干货。 1.什么是STL STL(standard templa…

Python自动化测试框架pytest的详解安装与运行

1. pytest的介绍 pytest是一个非常成熟的全功能的python测试工具&#xff0c;它主要有以下特征&#xff1a; 简单灵活&#xff0c;容易上手&#xff1b; 支持简单的单元测试和复杂的功能测试 显示详细的断言失败信息 能自动识别测试模块和测试功能 有测试会话、测试模块、…

【全开源】多平台租房系统源码(Fastadmin+ThinkPHP+Uniapp)

&#x1f3e0;多平台租房系统&#xff1a;一站式租房新体验&#x1f50d; &#x1f310;一、引言&#xff1a;租房市场的变革 在快节奏的现代生活中&#xff0c;租房已成为许多人解决居住问题的首选。然而&#xff0c;传统的租房方式往往繁琐且效率低下。随着互联网的飞速发展…

1996-2023年各省农林牧渔总产值数据(无缺失)

1996-2023年各省农林牧渔总产值数据&#xff08;无缺失&#xff09; 1、 时间&#xff1a;1996-2023年 2、 来源&#xff1a;国家统计局、统计年鉴 3、 指标&#xff1a;农林牧渔总产值 4、 范围&#xff1a;31省 5、 缺失情况&#xff1a;无缺失 6、 指标解释&…

【课程总结】Day7:深度学习概述

前言 本篇文章&#xff0c;我们将通过示例来逐步学习理解导数、求函数最小值、深度学习的本质、以及使用numpy和pytorch实操深度学习训练过程。 线性回归 线性回归内容回顾 在《【课程总结】Day5(下)&#xff1a;PCA降维、SVD分解、聚类算法和集成学习》中&#xff0c;我们…

6.Hugging Face Transformers 快速入门

Hugging Face Transformers 库独特价值 丰富的预训练模型&#xff1a;提供广泛的预训练模型&#xff0c;如BERT、GPT、T5等&#xff0c;适用于各种NLP任务。易于使用&#xff1a;设计注重易用性&#xff0c;使得即使没有深厚机器学习背景的开发者也能快速上手。最新研究成果的…

数据结构下的线性回归模型

文章目录 1. 线性回归模型的基本概念与原理2. 数据结构在构建线性回归模型中的应用2.1 数组和矩阵2.2 列表2.3 字典2.4 数据框架 3. 线性回归模型的实现方法4. 示例代码演示总结 线性回归是统计学中最基础也是应用最广泛的预测模型之一&#xff0c;主要用于分析两个或两个以上变…

Unity图集

概述 相信在同学们学习过程中&#xff0c;在UI的的使用时候一定经常听说过图集的概念。 Unity有UI的组件&#xff0c;有同学们好奇&#xff0c;那为什么还要使用图集呢&#xff1f; 这就需要提到一个性能优化的问题了&#xff0c;因为过多的UI图片&#xff0c;会大幅增加Dra…

pip切换至国内镜像超简单方法

新配置的python环境&#xff0c;pip安装包超时 这里给出最简单配置国内镜像的方法 这里将服务器地址切换为国内清华镜像&#xff0c;具体执行的命令如下&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 执行完&#xff0c;看到上面提…

6月11日 C++day6

#include <iostream>using namespace std; class Animal //讲解员 { public:Animal(){}virtual void perform(){cout << "" << endl;} }; class Lion:public Animal //狮子 { public:Lion(){}void perform(){Animal::perform();cout <<…

SpringCloud微服务架构(eureka、nacos、ribbon、feign、gateway等组件的详细介绍和使用)

一、微服务演变 1、单体架构&#xff08;Monolithic Architecture&#xff09; 是一种传统的软件架构模式&#xff0c;应用程序的所有功能和组件都集中在一个单一的应用中。 在单体架构中&#xff0c;应用程序通常由一个大型的、单一的代码库组成&#xff0c;其中包含了所有…

【ARM Cache 与 MMU 系列文章 7.5 -- ARMv8/v9 MMU FEAT_XS(XS Attribute)与 FEAT_MTE2 介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 MMU FEAT_XSXS AttributeXS Attribute 兼容性和影响XS Attribute 应用场景MMU FEAT_MTE2MTE2 主要目的和用途MTE2 工作原理MTE2 特性实现MTE2 注意事项MMU FEAT_XS 在ARMv8架构中,FE…

【投稿优惠|权威主办】2024年物联网、土木建筑与城市工程国际学术会议(ICITCEUE 2024)

2024年物联网、土木建筑与城市工程国际学术会议&#xff08;ICITCEUE 2024&#xff09; 2024 International Academic Conference on the Internet of Things, Civil Engineering and Urban Engineering&#xff08;ICITCEUE 2024&#xff09; ▶会议简介 2024年物联网、土木建…