概述
ciao~
我又来了惹
基于这周的学习情况
先开个坑
慢慢填(龇牙笑的表情我可太爱了)
今天刚学到一个新知识点
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)。
一维数组
定义
形式
数据类型 数组名[常量表达式]
方括号内的常量表达式用来定义数组大小,即数组中元素数量。
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] |
- 数组元素的命名:数组名[下标],数组名指存储空间的首地址。
- Re:从0开始的下标(滑稽
数组的优势
- 可以以相同的语句实现对数组元素的操作。
- 提高语句的通用性,简化程序。
应用
查找算法
数据存放的方式决定了数据查找的方法
顺序查找(对比关键字)
平均查找次数为数据量的一半
折半查找(二分查找)
mid=(low+high)/2
当 x>mid, 没有找到,low=mid+1,结束本次查找;
当x<mid,没有找到,high=mid-1,结束本次查找;
当x=mid,找到,输出mid,全部查找结束。
当high<low时,没找到,查找结束。
性能
优点
(1)比较次数少(相对于顺序查找),查找速度快,平均性能好。
(2)每执行一次,都将查找空间减少,是计算机科学中分治思想的完美体现。
(3)做多所需的比较次数是第一个大于表中元素个数的2的幂次数。
缺点
(1)待查表的关键字为有序排列
//代码如下:
#include <iostream>
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()不好呀? 求解答~
俺又来了
排序算法
基本概念
类型
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=0;
for(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++中,二维数组中元素排列的顺序:按行优先顺序存放。
在计算机中的存储:
二维数组的逻辑结构:
使用
//用双循环给二维数组赋值
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<<setw(5)<<a[i][j];
}
cout<<endl;//表示为二维数组
}
字符串和字符数组
字符数组
字符串和一维字符数组
- 字符串变量:一定要先写
#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
字符数组的输入和输出
整体输入和输出:数组名
输入
- 以数组名输入时,系统会自动添加结束符(’ ’),以字符串的方式存储数组。
- 遇到空格,Tab键,回车键表示数据之间的分隔,回车键表示输入结束。
- 用" cin>>数组名 “输入单个字符串时,其中不能有空格
用” cin>>数组名 "输入多个字符串时,可以以空格分隔
cin.getline 函数
输入字符串中包含空格字符,使用cin.getline函数
- 表示: cin.getline(字符数组名, 字符个数n)
- 输入回车表示结束。
- 输入字符数量(不包括回车)最大为n-1。
- 输入字符后自动添加结束符’ ’,作为字符串放入数组中。
- 如果溢出,即输入字符的数量大于n-1,那么将n-1放入数组。
- cin>>和cin,getline() 混合使用时,cin.getline( )会被跳过。
(图片来源 中国大学Mooc 华中科技大学 C++程序设计基础 5.6字符数组与字符串)
输出
注意:以数组名输出时,遇到’ ’,输出才结束。
字符数组与数值数组的区别
- 相同:定义格式一样,可以使用循环访问每个元素。
- 不同:
(1)循环控制条件不一样。 字符数组的判断条件为 str[60]!=’ ’
(2)字符数组可以使用数组名整体访问整个字符串。数值数组的数组名为首地址。
//数值数组
int a[2]={1,2};
cout<<a ;//输出数组a的首地址
//字符数组
int str[10]="china";
cout<<str;//输出str数组直到 '