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的所有元素赋值并输出
1
2
3
4int 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)待查表的关键字为有序排列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26//代码如下: #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.最坏情况和平均情况的开销
冒泡排序
让大的数往下沉,小的数往上冒,
故称冒泡排序。
基本代码如下:
1
2
3
4
5
6
7
8
9
10for(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) |
冒泡排序是稳定的
巧用数组下标
下标的数据类型一般为整形,且从零开始。
例子—判断一个整数中是否包含重复的数字
法一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20//将各个位数的数字分解 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;}
法二
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19cin>>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;
例子—输入一个十进制数,转化为二进制数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19int 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++中,二维数组中元素排列的顺序:按行优先顺序存放。
在计算机中的存储:
二维数组的逻辑结构:
使用
1
2
3
4
5
6
7
8
9
10//用双循环给二维数组赋值 int a[3][2]; for(int i=0;i<3;i++) { for(int j=0;j<2;j++) { a[i][j]=i*j; } }
1
2
3
4
5
6
7
8
9
10
11
12
13//用二维数组找最大值 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]; } } }
1
2
3
4
5
6
7
8
9
10
11//用双重循环给二维数组输出 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)字符数组可以使用数组名整体访问整个字符串。数值数组的数组名为首地址。
1
2
3
4
5
6
7
8
9
10
11
12//数值数组 int a[2]={1,2}; cout<<a ;//输出数组a的首地址 //字符数组 int str[10]="china"; cout<<str;//输出str数组直到 '' 结束 //输出str首地址 int str[10]="china"; cout<<(void*)str;
赋值
字符数组赋值形式:char 数组名[ 变量 ] ,数组名[ 变量 ];
字符数组之间赋值必须使用循环语句逐字符赋值
1
2
3
4
5for(i=0 ; str1 [ i ] != '' ; i++) { str2[i]=str1[i]; }
或者 系统提供的库函数:strcpy(str1,str2);
特殊地,在VC2010中,应写为strcpy_s(字符数组名1,字符数组名2)
类似的函数:
- 字符串的长度计算:strlen(字符数组名);(不算’’)
- 字符串的比较(是否相等):strcmp(字符数组名1,字符数组名2);
- 字符串的连接:strcat(字符数组名1,字符数组名2);
- 字符串的比较(按字典顺序得到ASII码进而比较大小):strcmp(字符数组名1,字符数组名2);
(图片来源 中国大学Mooc 华中科技大学 C++程序设计基础 5.7字符串的应用)
例子 将字符串转化为整数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <iostream> 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]!='';i++)//转换为整数 { if(str[i]>='0' && str[i]<='9')//注意是&& 不是|| 要同时成立 { n=n*10+(str[i]-'');//n*10是为还没算的数空出个位数来;(str[i]-'')是求出整数,然后变成个位数。 } else break; } cout<<"整数为"<<n<<endl; return 0; }
例子 统计英文单词数
在此之前,我们先学新函数:
cin、cin.get()、cin.getline()、getline()的区别
程序分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <iostream> 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++学习记录之数组(发际线-1cm)一维数组二维数组字符串和字符数组的全部内容,更多相关【发际线大作战】C++学习记录之数组(发际线-1cm)一维数组二维数组字符串和字符数组内容请搜索靠谱客的其他文章。
发表评论 取消回复