欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class03-04 lhy 数组,字符串,字符数组,函数

时间:2024-07-19 12:14 作者:admin 点击:
下一周任务:每天10-15题, 一周内把gesp一级全答完,对应的编程题在洛谷上提交 0~9 48~57 A~Z 65~90 a~z 97~122 数组: 1、数组的长度,一旦创建不能修改 2、数组的数据,在内存中是物理连续

下一周任务:每天10-15题,

一周内把gesp一级全答完,对应的编程题在洛谷上提交


0~9 48~57

A~Z 65~90

a~z 97~122


数组:

1、数组的长度,一旦创建不能修改

2、数组的数据,在内存中是物理连续存放

3、数组的名字,代表数组的第一个元素的地址


数组的创建

int n;

cin>>n;

int a[n];//将变量当成了长度,不报错,但是理论错误

创建时遵循两个原则:

   1、多创建一些空间+50,写算法方便。

   2、创建的数组空间不大于1000w,防止内存超限,防止时间超时。

以下创建数组的方案均可

#define N 10050

int a[N];


int a[10050];


cout<<a;//输出的是 0x235677

cout<<&a[0];//输出的是 0x235677


//下标默认是从0开始的,我们人类赋予的

for(int i=0;i<n;i++) cin>>a[i];

[] 是数组重载了[]符号的功能,创建时代表长度,使用时代表下标


创建并初始化 {} 初始化赋值

int a[10];

a[10]={135};//报错


int a[10]={1,2};//如果不够,补零,如果超数量,报错

//1200000000

int a[5]={};//00000

int a[]={1,2,3};//123 默认长度为3


二维

int a[][];

本质上,二维数组是多个一维数组连接在一起的存储结构,所以

二维数组可以当一维用,一维也可以当二维用


二维数组:a[N][M]  b[N*M]

b[k]->a[k/M(+1)][K%M]

a[i][j]->b[i*M+j]


二维数组的题型,题型末尾范围:1<=n*m<=1000000

int a[1000050];

int n,m;

cin>>n>>m;

for(int i=0;i<n;i++){

   for(int j=0;j<m;j++){

       cin>>a[i*m+j];

   }

}



数组下标的用法:

1、移位:存数据去数据不一定从0开始

2、特殊含义:当成月份/时间/ascii

int a[13]={0,31,28,31,30...};

3、当成数据:素数筛算法、桶排序(计数排序)


输入数据后,要求排序并去重

int n;

cin>>n;

//将数组范围与数据范围一致,与数据数量无关

int a[100050]={},b;

//for(int i=0;i<n;i++)

while(n--){

   cin>>b;

   a[b]++;//b这个数据新增1

}

//顺序已经有序

for(int i=0;i<100050;i++){

   if(a[i]) cout<<i<<" ";//从小到大排序并去重

   while(a[i]--) cout<<i<<" ";//从小到大排序不去重

}


空间换时间:计数排序


使用限制:

1、数据范围过大

2、下标能够表示的数据


数据范围包含负数[-100000~100000]

int a[200050]={};

cin>>b;

a[b+100000]++;//数据移位

cout<<i-100000;//数据移位


数据类型是字符型

int a[150]={};

char c;

cin>>c;

a[c]++;

putchar(i);


字符数组:

1、明白字符数组的原理

2、字符数组与数组与字符串的区别

3、字符数组函数的用法


c语言中的字符串

char c[]="hello"; 默认长度是6 结尾包含'\0'

char c[6]={'h','e','l','l','o','\0};

访问数据修改数据,通过下标,从0开始,与普通数组一致

数组名代表整体

char c[]="hello";

cout<<c;//hello

字符数组可以通过下标拆分,也可以当成字符串整体输出


cin.getline(c,100);//一直读取一整行,直到遇到'\n'或到最大长度

获取长度

strlen(c);

复制内容

char a[10]="hello";

char b[10];

strcpy(b,a);//将a中的内容拷贝到b

连接

strcat(a,b);//将b连接到a末尾

比较

strcmp(a,b);//从头到尾依次比较ascii直到分出大小,返回int

返回0一样大,返回正数前大,返回负数后大。

char a[3]={'a','b','c'};

char b[3]={'a','b','c'};

strcmp(a,b);//不确定答案 比数组外内存后面的数据,直到分出大小或同时遇到'\0'

查找

char c[]="hello";

char *p=strchr(c,'o');//在c中找o,返回指针 strstr找字符串

cout<<*p;//o

cout<<p;//0x34aa44


字符串

字符串是独立的类型,不属于基本数据类型

字符串包含很多成员函数,通过.调用自身的函数

字符串包含数组的用法,可以通过下标访问修改元素

字符串重写了比较运算符和+

   字符串可以直接比较大小,原理是比较ascii

   字符串可以通过+连接字符串或字符


cin>>s;//无空格输入

getline(cin,s);//可以有空格的输入

cout<<s;


string s;

string s="hello";

string s2(s);//复制初始化

string s(10,'a');//初始化为10个a组成的字符串


相关函数

s.size() 长度

s.length() 长度

s.empty() 返回true代表空,返回false代表不空

s[5]或s.at(5) 访问下标对应元素

string s2=s.substr(5) 从5下标开始截取,截取到最后

string s2=s.substr(5,8) 从5下标开始截取,截取8位

s.find("a"); 查找a的位置,返回下标(如果没找到,返回unsigned long long 最大值)

if(s.find("a")>=s.size()) 没找到

else 找到了


int d=s.find("a");//如果没找到,赋值成-1

if(d>=0) 找到

else 没找到

s.find("a",5);//从5下标开始找a的位置

s.rfind("a");//从后往前找a的位置

+ += append() 表示连接

s=s+b;

s+=b;

不常用函数

s.compare(s1);比较

s.insert(p,'k');//在p地址插入一个字符k,速度特别慢

s.erase(p);//通过地址删除,速度特别慢


有一句话,通过空格拆分成多个单词

string s="i love beijing";

通过字符串流进行拆分 <sstream>

istringstream k(s);

string str;

while(k>>str){

   cout<<str;//通过空格自然拆分成多个字符串str

}


数学函数:

abs 绝对值

mod 取余取模

ceil 向上取整 1.1 -> 2

floor 向下取整 1.9 -> 1

round 四舍五入

cout<<log2(128);//7   求以2为底128的对数 对数函数

cout<<log10(100);//2  

对数函数一共有4个,分别为log,log2,log10,log1p,没有别的了

pow 幂函数,返回值是double

sqrt 平方根,返回值是double

cbrt 立方根,返回值是double

hypot(x,y) 勾股求斜边 相当于sqrt(x*x+y*y)

sin,cos,tan 这些三角函数在c++中全都有


最大公约数 gcd c++17版本新增函数

最小公倍数 lcm c++17版本新增函数

<numeric>



随机数

<cstdlib> srand() rand()

srand 设置随机种子

rand 生成随机数

<ctime> time()

int main(){

   srand(time(0));//随机数通过时间生成

   cout<<rand();//0~RAND_MAX 最大值不同的电脑有差异

   //控制生产的范围 a~b

   cout<<rand()%(b-a+1)+a;

   //0-100

   cout<<rand()%(100-0+1)+0;

}


//自定义函数 自定义类型

函数的结构:返回值类型,函数名,参数,函数体


swap(a,b); 交换,没有返回值

cout<<swap(a,b);//报错

min(a,b); 求最小值,返回最小值


有返回值,函数类型与返回值类型要一致

没返回值,函数类型是void


内置函数:一些自带的函数 + 类型转换

标准库函数:功能广泛,有划分,需要导入头文件

成员函数:类或结构体内的一部分,需要类对象调用的函数

构造函数:初始化对象时,调用的函数

还其他的,如:虚函数,内联函数,lambda函数等。。


语法格式

类型 名(参数,参数){

   //函数体

   return xx;

}

使用函数:

1、注意调用时的权限

#include <iostream>

using namespace std;

struct student{

   int add2(int a,int b){

       return a+b;

   }

};

int add1(int a,int b){

   return a+b;

}

int main(){

   add1(1,2);

   student s;

   s.add2(1,2);

   return 0;

}

2、调用函数时,参数的类型、数量、顺序要与创建函数保持一致

函数的重名用法(多态)

int max(int a,int b,int c){

   return max(max(a,b),c);

}

int max(int a,int b,int c,int d){

   return max(max(a,b),max(c,d));

}

int main(){

   cout<<max(1,2);//调用的是自带的

   cout<<max(1,2,3);//调用自定义的

}


形参:定义函数的参数、实参:调用函数传递的值

传参的方式:值传递,引用传递

void swap1(int a,int b){

   int t=a;

   a=b;

   b=t;

}

void swap2(int &a,int &b){

   int t=a;

   a=b;

   b=t;

}

int main(){

   int a=5,b=10;

   swap1(a,b);//值传递

   cout<<a<<b;//5 10

   swap2(a,b);//引用传递:控制原数据的值

   cout<<a<<b;//10 5

}

递归函数:在函数内部调用自己

使用时,需要有明确的停止条件,防止无限递归

优点:

1、代码简洁,

2、容易理解,

3、自我管理良好

缺点:

1、空间复杂度高,容易栈内存溢出

2、时间复杂度较高,一分多结构

3、调试困难


递归函数的类型题:斐波那契数列,爬楼梯,汉诺塔,全排列

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%