【发际线大作战】C++学习记录之数组(发际线-1cm)

【发际线大作战】C++学习记录之数组(发际线-1cm)_第1张图片
ciao~
我又来了惹
基于这周的学习情况
先开个坑
慢慢填(龇牙笑的表情我可太爱了)
【发际线大作战】C++学习记录之数组(发际线-1cm)_第2张图片
今天刚学到一个新知识点
C/C++中从来没有定义过void main()。

C++之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main() {//} is not and never has been C++, nor has it even been C.(void main() 从来就不存在于C++或者C)。
【发际线大作战】C++学习记录之数组(发际线-1cm)_第3张图片

一维数组

定义

形式

数据类型 数组名[常量表达式]
方括号内的常量表达式用来定义数组大小,即数组中元素数量。

Tips

(1)C++中数组大小在编译时确定,编译系统按定义为数组分配一段连续的储存单元。
(2)这段单元的大小是不能改变的
(3)“大开小用”原则,为了避免使用时数组出界。
(4)对数组m的所有元素赋值并输出

int m[5],i;
for(i=0;i<5;i++)//i的初始值必须为0
m[i]=i*i;

带有下标的变量

↓m(输入)

m[0]
m[1]
m[2]
m[3]
  1. 数组元素的命名:数组名[下标],数组名指存储空间的首地址。
  2. Re:从0开始的下标(滑稽

数组的优势

  1. 可以以相同的语句实现对数组元素的操作。
  2. 提高语句的通用性,简化程序。

应用

查找算法

数据存放的方式决定了数据查找的方法

顺序查找(对比关键字)

平均查找次数为数据量的一半

折半查找(二分查找)

mid=(low+high)/2
当 x>mid, 没有找到,low=mid+1,结束本次查找;
当x 当x=mid,找到,输出mid,全部查找结束。
当high

性能

优点
(1)比较次数少(相对于顺序查找),查找速度快,平均性能好。
(2)每执行一次,都将查找空间减少,是计算机科学中分治思想的完美体现。
(3)做多所需的比较次数是第一个大于表中元素个数的2的幂次数。

缺点
(1)待查表的关键字为有序排列

//代码如下:
#include 
using namespace std;
void main()//无返回值 不过据说用这个类型不好
{	const int N=10;
	int r[N];
	int Find,low,high,mid,key,i;
	cout<<"请按照大小顺序输入整数"<<endl;
	for(i=0;i<10;i++)
	{
		cin>>r[i];
	}
	cout<<"请输入您要查找的数字:";
	cin>>key;
	Find=0;//用来判断是否找到 可用布尔型来代替
	low=0;high=N-1;//易错点:low从0开始 high为N-1.
	while(low<=high)
	{
		mid=(low+high)/2;
		if(key<r[mid]) {high=mid-1;}
		if(key>r[mid]) {low=mid+1;}
		if(key==r[mid]){Final=1;break;}
	}
	if(Final==0) {cout<<"没有找到相应的数字";}
	if(Final==1) {cout<<"找到啦 是第"<<mid<<"个"}

先写到这吧 以后再补充
有大佬知道为什么用void main()不好呀? 求解答~
【发际线大作战】C++学习记录之数组(发际线-1cm)_第4张图片

俺又来了
【发际线大作战】C++学习记录之数组(发际线-1cm)_第5张图片

排序算法

基本概念
类型

1.内排序:在排序过程中,全部数据存放在内存。
包括 冒泡排序选择排序、插入排序。
2. 外排序:在排序过程中,需要使用外存。

评价标准

1.时间 2.空间 3.复杂程度 4.执行次数(必须)
5.移动次数(可避免)
6.最坏情况和平均情况的开销

冒泡排序

让大的数往下沉,小的数往上冒,
故称冒泡排序。

基本代码如下:

for(i=0;i<N-1;i++)//冒泡排序
{
	if(a[j]<a[j-1])
	{
		t=a[j];
		a[j]=a[j-1];
		a[j-1]=t;
	}
}
最好时间复杂度 O(n)
最坏时间复杂度 O(n2)
平均时间复杂度 O(n2)
增加的辅助空间temp S(n)=O(1)

冒泡排序是稳定的

巧用数组下标

下标的数据类型一般为整形,且从零开始。

例子—判断一个整数中是否包含重复的数字

法一

//将各个位数的数字分解
cin>>n;
i=0;
	while(n!=0)
	{	a[i]=n%10;
		n=n/10;
		i++;
	}
//通过双层循环检测是否有重复数字
flag=0for(j=0;j<i;j++)
{for(k=j+1;k<i;k++)
	{
		if(a[j]==a[k])
		{flag=1;break;}
	]
}
if(flag=1{cout<<"有重复"<<endl;}
else {cout<<"无重复"<<endl;}

法二

cin>>n;
//int a[10]=0;
//a[k]用于统计数字i出现的次数,初始值为0;
//利用了各个位数的数字均从0-9变化,位数最多九位。
do{
	int k=n%10;//提取数字
  	a[k]++; //对应数字计数器
  	n=n/10;
}while(n!=0);
for(i=0;i<10;i++)
{
	if(a[i]>1)
	{
		cout<<"有重复的位数噢"<<endl;
	return 0;}
}
cout<<"无重复"<<endl;
return 0;
例子—输入一个十进制数,转化为二进制数
int main()
{
	int n,i=0,k;
	int a[1000];
	cout<<请输入一个十进制数<<endl;
	cin>>n;
	cout<<n<<的二进制数为;
	while(n)
	{a[i]=n%2;
	 n/=2;
	 i++;//i比实际多1
	}
	for(k=i-1;k>=0;k--)
	{
	 cout<<a[k];
	}
return 0
}

二维数组

定义

具有两个下标的数组称为二维数组

  • C++把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组,把a看作是一个一维数组,有3个元素 a[0] a[1] a[2],每个元素又是包含四个元素的一维数组,a[0] a[1] a[2]是3个一维数组的名字。
  • C++允许使用多维数组

声明

类型标识符 数组名[常量表达式][常量表达式]
eg:float a[3][4] 定义a为3行4列的单精度数组

初始化

表示

//分行给二维数组赋初值
double
a[3][2]={{1,2},
{3,4},
{5,6}}

类型

  • 分行给二维数组赋初值:int a[3][2]={{1,2},{3,4},{5,6}}:
  • 所有数据写在一个花括号内,按数据顺序对各元素赋初值: int a[3][2]={123456};
  • 对部分元素赋初值,其余元素自动设置为0。
    (1)只对各行第一个元素赋初值
    (2)对各行某个元素赋初值,此元素前面的元素需手动补零:int a={{1},{0,6},{0,5}}
    (3)只对几行元素赋初值: int a[3][2]={{1},{},{9}};
    (4)全部元素赋初值,定义数组时第一维长度可省略,第二维长度不能省略。eg: int a[][2]={1234};

引用

二维数组元素的表示形式:数组名[下标] [下标]
注意下标值应在已定义的数组大小的范围内。
a[2][3]=i*j;

存储

C++中,二维数组中元素排列的顺序:按行优先顺序存放。

在计算机中的存储:
【发际线大作战】C++学习记录之数组(发际线-1cm)_第6张图片
二维数组的逻辑结构:
【发际线大作战】C++学习记录之数组(发际线-1cm)_第7张图片

使用

//用双循环给二维数组赋值
int a[3][2];
for(int i=0;i<3;i++)
{
	for(int j=0;j<2;j++)
	{
		a[i][j]=i*j;
	}
}
//用二维数组找最大值
int a[3][2],max=a[0][0];
for(int i=0;i<3;i++)
{
	for(int j=0;j<2;j++)
	{
		if(a[i][j]>max)
		{
			max=a[i][j];
		}
	}
}
//用双重循环给二维数组输出
int a[3][2];
for(int i=0;i<3;i++)
{
	for(int j=0;j<2;j++)
	{
		cout<

字符串和字符数组

字符数组

字符串和一维字符数组

  • 字符串变量:一定要先写#include < string >预处理语句,再定义后使用;开头要包含#include < string >;可以有如下形式:string c1="then"; string c2; c2=c1;;两个字符串变量可以连接:string c1="lo";string c2="ve";c1=c1+c2;;同样可以使用=,!=,>,<等;多个字符串可以当数组使用 eg:string name[5]={"I","love","you"};
  • 字符数组特有形式:使用字符串常量
    eg:char name2[ ]= “hust”; //数组的长度为5
  • 一维数组的通用形式:枚举字符常量的形式 eg: char name1[ ] ={ ‘h’,‘u’,‘s’,‘t’ } //数组长度为4

字符数组的输入和输出

整体输入和输出:数组名

输入

  • 以数组名输入时,系统会自动添加结束符(’\0’),以字符串的方式存储数组。
  • 遇到空格,Tab键,回车键表示数据之间的分隔,回车键表示输入结束。
  • 用" cin>>数组名 “输入单个字符串时,其中不能有空格
    用” cin>>数组名 "输入多个字符串时,可以以空格分隔
cin.getline 函数

输入字符串中包含空格字符,使用cin.getline函数

  • 表示: cin.getline(字符数组名, 字符个数n)
  • 输入回车表示结束
  • 输入字符数量(不包括回车)最大为n-1。
  • 输入字符后自动添加结束符’\0’,作为字符串放入数组中。
  • 如果溢出,即输入字符的数量大于n-1,那么将n-1放入数组。
  • cin>>和cin,getline() 混合使用时,cin.getline( )会被跳过。
    【发际线大作战】C++学习记录之数组(发际线-1cm)_第8张图片
    【发际线大作战】C++学习记录之数组(发际线-1cm)_第9张图片

(图片来源 中国大学Mooc 华中科技大学 C++程序设计基础 5.6字符数组与字符串)

输出

注意:以数组名输出时,遇到’\0’,输出才结束。

字符数组与数值数组的区别

  • 相同:定义格式一样,可以使用循环访问每个元素。
  • 不同:
    (1)循环控制条件不一样。 字符数组的判断条件为 str[60]!=’\0’
    (2)字符数组可以使用数组名整体访问整个字符串。数值数组的数组名为首地址
//数值数组
int a[2]={1,2};
cout<

赋值

字符数组赋值形式:char 数组名[ 变量 ] ,数组名[ 变量 ];
字符数组之间赋值必须使用循环语句逐字符赋值

for(i=0 ; str1 [ i ] != '\0' ; i++)
{
	str2[i]=str1[i];
}

或者 系统提供的库函数:strcpy(str1,str2);
特殊地,在VC2010中,应写为strcpy_s(字符数组名1,字符数组名2)

类似的函数:

例子 将字符串转化为整数

#include 
using namespace std;

int main()
{
int n=0,i;
char str[10];//声明数组

cout<<"请输入字符串"<<endl;
cin.getline(str,10);//输入字符串 注意不要大于n-1

for(i=0;str[i]!='\0';i++)//转换为整数
{
	if(str[i]>='0' && str[i]<='9')//注意是&& 不是|| 要同时成立
	{
		n=n*10+(str[i]-'\0');//n*10是为还没算的数空出个位数来;(str[i]-'\0')是求出整数,然后变成个位数。
	}
	else break;
}

cout<<"整数为"<<n<<endl;
return 0;
}

例子 统计英文单词数

在此之前,我们先学新函数:
cin、cin.get()、cin.getline()、getline()的区别

程序分析:
【发际线大作战】C++学习记录之数组(发际线-1cm)_第11张图片

#include 
using namespace std;

int main()
{
int num=0,word=0;//word判断是不是依然在同一个单词上。
char str[80];
char c; //用来接收空格,以便判断。

cout<<"请输入句子"<<endl;
cin.getline(str,80);//输入字符函数

for(int i=0;str[i]!=0;i++)
{
	if(c==' ')//如果这样写“if(str[i]==' ')”,那么会把' '赋给str[i]。
	{
		word=0;
	}
	else if(word==0)
		{
			word=1;
			num++;
		}
}
cout<<"一共有"<<num<<"个单词"<<endl;
return 0;
}

你可能感兴趣的:(c++)