上海交大ACM班C++算法与数据结构——C++基础

上海交大ACM班C++算法与数据结构——C++基础

C++ 在线编程平台

replit.com

变量

  • int a = b = 1; cout << a << b;
    a和b不能同时初始化,会编译报错。

常量

  • 声明:获取一块用于存储的地址空间 → 变量名:将变量名与存储空间相关联 → 字面量:为变量赋值,本身值不能变

  • 指数:浮点字面量的一种。e或E的左侧必须要有数字,右侧为幂次的数值,必须为整数。
	  1. 6E-1,30.0e0,0.01415926E3
  • 128个ASCII码
    enter description here
    enter description here
  • 字符串除了存储所包含的字符外,还额外包含一个结束标志’\0’(自动添加,无需手动添加,‘\0’:结束符,ASCII编码值为0),所以"c++"占用是字节数是4,空字符串并不是不占空间,而是占用了 1 字节的空间,这个字节中储存了一个 ‘\0’。
  • 符号常量:随着程序运算不改变的量
	 const int kCokePrice = 5;
	 //const 数据类型 常量名称 = 初始值;
	 int const kCokePrice = 5;
	 //数据类型 const 常量名称 = 初始值;

一维数组

  • 数组方便对大量数据进行存储和操作。
  • c++ 数组长度不能改变,声明时数组长度必须是一个固定的整型常量,不能是变量。
  • c++ 数组越界时,程序一般不会产生运行错误,但是可能会导致其他后果,比如修改了无关变量的值。
  • 几种初始化的方式:(声明和引用元素都使用[ ])
	// TODO 第一种:大括号中包含 1,3,5,7,9,11这6个值
    int sales_1[6] = {1,3,5,7,9,11};
    
    // TODO 第二种:大括号中包含 1,3这2个值,其他默认初始化为0
    int sales_2[6] = {1,3};
    
    // TODO 第三种:大括号中包含 1,3,5,7,9,11这6个值,但是不指定数组的长度,		会得到一个长度为6的数组
    int sales_3[] = {1,3,5,7,9,11};
    
    // TODO 声明后对每个元素依次赋值
    int sales_4[6];
    for (int i = 0; i < 6; i++) {
        sales_4[i]=2 * i +1;
    }
  • C++ 中,普通的一维数组只能对单个元素进行输入输出。
  • 数组名表示首元素的地址。

字符数组

  • 初始化:(结尾要包含一个’\0’)

    // 第一种:给每个元素指定初始化值
    // 依次赋初值,剩下的会默认被初始化为\0
    char userName[11] = {'L', 'a', 'o', 'W', 'a', 'n', 'g', '\0'};
    char userName[11] = {'L', 'a', 'o', 'W', 'a', 'n', 'g'};
    
    // 和普通数组一样,元素个数可以省略,c++会自动识别长度为8
    char userName[] = {'L', 'a', 'o', 'W', 'a', 'n', 'g', '\0'};
    
    //第二种:使用字符串常量初始化字符数组
    char userName[11] = {"LaoWang"};
    // 大括号可以省略
    char userName[11] = "LaoWang";
    
  • 使用cin语句,会不断的读入字符串,直到遇到一个空白字符(空格、回车或者制表符)就结束读入。

  • cout输出字符串时,遇见第一个’\0’就会停止输出。

  • #include <cstring>可以进行字符串连接strcat(s1, s2)、字符串长度获取strlen(s1)(不算’\0’)、字符串字典序比较strcmp(s1, s2)、复制字符串strcpy(s1, s2)。其中连接和复制操作,是以s2为操作对象,改变并返回s1。

  • 不能使用赋值符号=进行数组之间的赋值。

string字符串

  • 将字符串视为一个整体,比字符数组更加灵活。需要#include <string>
    字符串数组是用数组构造的字符串,操作不够符合字符串的要求;
    string字符串是专门为字符串写的新的数据类型,有针对性的方法和符号重载。
    在这里插入图片描述

函数

  • 在调用前就定义的函数,可以省略函数声明。
  • 由于参数传递中使用指针复杂,c++ 用引用来起到指针传参的作用。

递归函数

  • 包括递归关系和终止条件

  • 经典问题:汉诺塔

    左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间需要遵循以下原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤。若将A最上面的盘子移动到B上,则可表示为 “A -> B”
    输入描述:一行,一个整数n
    输出描述:若干行,每行代表一次操作
    示例1:
    输入:2
    输出:
    A -> B
    A -> C
    B -> C

    实现代码:

		#include <bits/stdc++.h>
		using namespace std; 

		void move(int n,char x,char y,char z){
		  //将n个盘子从x上借助y移到z上
		  if(n==1){
			cout<<x<<" -> "<<y<<endl;
		  }
		  else{
			move(n-1,x,z,y);
			move(1,x,y,z);
			move(n-1,z,y,x);
		  }

		}

		int main() {
			// 请补全代码,实现题目功能
			int n;
			cin>>n;
			move(n,'A','C','B');
		  //基本思路:
		  //要把n个盘中从A移到C,
		  //要将n-1个盘子借助C从A移到B上,
		  //再将A上最后一个盘子直接移动到C上,
		  //再将B上n-1个盘子用同样的办法借助A移动到C上,
		  //也就是从这里开始了递归。
			return 0;
		}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ACM竞赛是一项编程竞赛,常用算法与数据结构是竞赛选手在解决问题时所经常使用的方法和工具。以下是一些常见的算法和数据结构: 常用算法: 1.贪心算法:根据每一步的局部最优解来构建整体最优解。 2.动态规划:将问题划分为若干子问题,通过求解子问题的最优解来求得原问题的最优解。 3.分治法:将问题分解为若干个规模更小的子问题,分别求解这些子问题,然后合并子问题的解来得到原问题的解。 4.搜索算法:包括深度优先搜索(DFS)和广度优先搜索(BFS)等,用来穷举解空间以找到最优解。 5.图算法:包括最短路径算法(如Dijkstra和Floyd-Warshall算法)、最小生成树算法(如Prim和Kruskal算法)等,用于处理图相关的问题。 常用数据结构: 1.数组:一组相同类型的元素的集合,可以通过下标访问元素。 2.链表:一组由节点组成的数据结构,每个节点包含指向下一个节点的指针。 3.栈:一种先进后出(LIFO)的数据结构,只能在尾部进行插入和删除操作。 4.队列:一种先进先出(FIFO)的数据结构,可以在尾部插入元素,在头部删除元素。 5.堆:一种可以快速找到最大(或最小)元素的数据结构,分为大顶堆和小顶堆。 6.树:一种用来模拟具有层次结构的数据结构,包括二叉树、AVL树、红黑树等。 7.图:由节点和边组成的数据结构,用于表示各种复杂的关系或网络。 以上仅是ACM竞赛常用的一些算法和数据结构,选手在解决问题时还需要根据具体情况选择合适的算法和数据结构。掌握这些常用算法和数据结构,并根据实际问题进行灵活运用,可以提高解题效率和竞赛表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿航626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值