05==数组(查找,添加,删除,排序)
来源:互联网 发布:网络用语盘点 编辑:程序博客网 时间:2024/06/06 03:07
// int a
// int a[65]
/*
1:数组:同类型的一组数,在类存上连续分布
定义数组
类型 数组名[数组元素的个数];
int score[65];//里面有65个int类型的数据,并且连续分布
占有的内存=sizeof(类型)*元素个数
引用数组的元素:数组名[下标],数组的下标从0开始
数组元素不能越界访问
数组定义后未初始化,里面的内容随机,是不确定的,不能用
数组的下标必须是常量,不可以为变量
例如
int len = 5;
int a[len] = {1,2,3,4,5};//事件错误的
*/
#include <stdio.h>#include <string.h>int main(int argc, const char * argv[]) { int a[5];//元素a[0]~a[4],可以通过a[i]来访问元素 printf("a[0]=%d\n",a[0]); //遍历:挨个访问 for (int i = 0; i<5; i++) { printf("a[%d]=%d\n",i,a[i]); } a[4] = 100;//通过下标,设置数组元素 return 0;}
#include <stdio.h>
#include <string.h>
//int main()
//{
// int a[5] = {1,2,3,4,5};//完全初始化,用集合的方式,给每个元素赋值
// // a = {1,2,3,4,5};// 除了初始化,不可以给数组元素以集合方式进行集体赋值;
// int b[5] = {1,0,0,0,0};//完全初始化
// int c[5] = {1};//和b[5]是等价的,后面的0是可以省略的.叫做部分初始化
// int d[5] = {};//部分初始化,所有元素都是0,跟不带"="的不一样,
// int e[ ] = {1,2,3,4,5};
// int f[ ] = {1};
// int g[ ] = {};
// printf("sizeof(d)=%lu\n",sizeof(d));//sizeof(d)=20,他与里面是否存储内容没有关系.
// printf("sizeof(e)=%lu\n",sizeof(e));//sizeof(e)=20,定义时省略数组的下标,是完全初始化;
// printf("sizeof(f)=%lu\n",sizeof(f));//sizeof(f)=4,一个元素完全初始化.
// printf("sizeof(g)=%lu\n",sizeof(g));//sizeof(g)=0,0个元素,完全初始化,不能使用,没有存储空间
// for (int i = 0 ; i<5; i++)
// {
// printf("d[%d]=%d\n",i,d[i]);
// }
// return 0;
//}
//int main()
//{
// int len = 5;
// int a[5] = {1,2,3,4,5};
// int a[len] = {1,2,3,4,5} //错误的示范
//
//}
//int main()
//{
// double score[5] = {};//score保存的是数组的首个元素地址.数组名是常量,数组元素才是变量,
// double sum = 0;
// printf("请输入五位学生成绩\n");
// for (int i = 0 ; i<5; i++)//编译器是不能检查越界错误 for(int i = 0 ; i<80; i++)
// {
// scanf("%lf",&score[i]);
// sum += score[i];
// }
// printf("学生成绩平均值是:%.2lf",sum/5);
//}
//int main()
//{
// int a[5];
// int a[5] = {43,54,32,21,7};
// printf("请输入五个数\n");
// for (int i = 0 ; i<5; i++)
// {
// scanf("%d",&a[i]);
// }
// printf("数组元素为: ");
// for (int i = 0 ; i<5; i++)
// {
// printf("%3d ",a[i]);
// }
// printf(" \n");
// for (int i = 0 ; i<5-1; i++)
// {
// for (int j = i+1 ; j<5; j++)
// {
// if (a[i]>a[j])
// {
// int temp = a[i];
// a[i] = a[j];
// a[j] = temp;
// }
// }
// printf("第%d次打印结果",i+1);
// for (int i = 0 ; i<5; i++)
// {
// printf("%3d ",a[i]);
// }
// printf("\n");
// }
// printf("排序后打印结果");
// for (int i = 0 ; i<5; i++)
// {
// printf("%3d ",a[i]);
// }
/*
冒泡排序法
*/
// for (int i = 0 ; i<5-1; i++)
// {
// for (int j = 0 ; j<5-i-1; j++)
// {
// if (a[j]>a[j+1])
// {
// int temp = a[j];
// a[j] = a[j+1];
// a[j +1] = temp;
// }
// }
// printf("第%d次打印结果",i+1);
// for (int i = 0 ; i<5; i++)
// {
// printf("%3d ",a[i]);
// }
// printf("\n");
// }
// printf("排序后打印结果");
// for (int i = 0 ; i<5; i++)
// {
// printf("%3d ",a[i]);
// }
//}
//输出1 1 2 3 5 8 13 21 34 55
//a[i]=a[i-1]+a[i-2]
//int main()
//{
// int a[20] = {};
// //求数组的元素
// for (int i = 0; i<20; i++)
// {
// if(i==0 || i==1)
// {
// a[i]=1;
// }
// else
// {
// a[i]=a[i-1]+a[i-2];
// }
// printf("%d ",a[i]);//正序打印
// }
// printf("\n");
// //逆序打印
// for (int i = 19; i>=0; i--)
// {
// printf("%d ",a[i]);
// }
//}
/*
数组常用的操作:
查找,
*/
//int main()
//{
// //在分数数组里查找是否有60分,找到第一个就结束
// int score[5] = {12,45,60,78,60},number = 60,count = 0;
// int i;
// for (i = 0; i<5; i++)
// {
// if (score[i] == number)//把所有符合条件的值都遍历出来
// {
// printf("score[%d]的成绩符合条件\n",i);
// count++;//如果有符合的元素就记录一下;
// continue;
// }
// }
// if (count == 0)//如果遍历真个数组没有符合要找的元素
// {
// printf("没有符合条件的值");
// }
// return 0;
//}
//int main()
//{
// int score[] = {12,45,60,78,60,78},max=score[0],count=0,min=score[0],j=0;//max记录最大数字,count记录最大数的角标;
// for(int i=1;i<6;i++)
// {
// if (max<score[i])
// {
// max = score[i];//max记录最大数;
// count = i;
// }
// if(min>score[i])
// {
// min = score[i];
// j = i;
// }
// }
// for(int m=0;m<6;m++)//把所有的相同的最大数全部打印出来
// {
// if (max == score[m])
// {
// printf("\n最大数值是score[%d]=%d",m,max);
// }
// }
// printf("\n最小数值是score[%d]=%d",j,min);
//}
/*
插入和删除
有序序列 int a[10] ={23,45,60,88,98};
删除一个元素60
删除前 int a[10] ={23,45,60,88,98};
删除后 int a[10] ={23,45,88,98};
*/
//int main()
//{
// int a[10] ={23,45,60,88,98},valid = 5;//当前有效的元素个数,人为认为有效
// int value = 60;
// int pos = 2;//需要删除的元素的下标
//1,后面的元素前移
//待移动a[pos+1],最后一个元素a[valid-1]
//前移 用前面的元素来接收 a[i-1]=a[i]
//2,清理最后一个元素残留拷贝
// for (int i=0; i<valid ; i++)
// {
// if (a[i] == value )//查找是否有需要删除的元素,如果有记录当前元素的下标
// {
// pos = i;
// }
// }
// for(int i=pos;i<valid;i++)//定义从记录位置到数组末尾
// {
// a[i] = a[i+1];//记录位置之后开始依次赋值给前面的元素
// if (i == valid-1)//当元素到最后的一个位置时,需要清除最后一个元素值
// {
// a[i]=0;
// }
// }
// for (int i=0; i<10; i++)
// {
// printf("%d ",a[i]);
// }
//
// for (int i=pos+1; i<valid;i++)
// {
// a[i-1]=a[i];
// }
// for (int i=0; i<10; i++)
// {
// printf("%d ",a[i]);
// }
//}
/*
有序序列 int a[10] ={23,45,60,88,98};
插入 65
插入前 int a[10] ={23,45,60,88,98};
插入后 int a[10] ={23,45,60,65,88,98};
*/
//int main()
//{
// int a[10] ={23,45,60,88,98},valid = 5;
// int pos = 0;//用来记录插入的下标
// int value = 65;//用来记录需要插入的数字
// for (int i=0; i<5; i++)
// {
// if (a[valid-1]<value)//判断是否需要插入的元素比数组所有元素大
// {
// pos=valid;
// a[pos]=value;
// }
// if (a[i]>=value)//用来查找value插入的位置,并记录
// {
// pos = i;
// break;//当找到这个元素后退出for循环;
// }
// }
// for (int i=valid-1; i>=pos; i--)//需要移动的边界,右边界为valid-1,左边界为pos
// {
// a[i+1]=a[i];//把当前的有效元素移动到后一位
// }
// a[pos]=value;//原来左边界位置已经移动,直接将需要插入的元素赋值即可
// for (int i=0; i<10; i++)
// {
// printf("%d ",a[i]);
// }
//}
/*
字符数组:数组里存储的是字符
int a[10]
char str[100]
*/
//int main()
//{
// char str[100];//字符数组,里面有100个char;只定义没有初始化,里面的字符是不确定的
// char str1[10] = {};//部分初始化,全0
// char str2[10] = {'h','e','l','l','o'};//前面是hello后面是'\0'=0;
// char str3[10] = "hello";//和上面是等价的,用一个常量字符串来初始化字符数组,部分初始化,
// char str4[] = "hello";//完全初始化,sizeof(str4)=6,系统给字符串加上一个结束符{'h','e','l','l','o','\0'};
// //for循环遍历数组的元素
// printf("sizeof(str4)=%lu\n",sizeof(str4));
// for (int i=0; i<10; i++)
// {
// printf("str3[%d]=%c \n",i,str3[i]);
// }
// return 0;
//}
/*
sizeof() 运算符存储的概念,数据类型或者表达式,数据在内存中占有的字节数,与里面存储的内容没有关系
strlen() 字符串处理函数 表示字符串的有效长度,从首地址开始到'\0'结束;'\0'不是有效字符,不统计;头文件<string.h>,与当前字符串中存储的字符(内容)有关系.
*/
//int main()
//{
// char str[10]="hello";
// char str1[10]="hello\0abc";
// char str2[]="hello";
// for(int i=0;i<10;i++)
// {
// printf("str1[%d]=%c\n",i,str1[i]);
// }
// printf("%s\n",str1);//从str地址开始,打印到'\0'结束;
// printf("sizeof(str2)=%lu\n",sizeof(str2));
// printf("strlen(str2)=%lu\n",strlen(str2));
// printf("sizeof(str1)=%lu\n",sizeof(str1));
// printf("strlen(str1)=%lu\n",strlen(str1));
//}
/*
练习:char str[100]= "hello";中的l替换成L
*/
//int main()
//{
// char str[100]= "hello";
// for(int i=0;i<strlen(str);i++)
// {
// if(str[i] == 'l')
// {
// str[i] = str[i]-32;
// }
// }
// printf("%s",str);
//}
//int main()
//{
// int a[10]={23,45,600,88,90};
// int number = 600;//待插入的数据
// int pos=5;//插入的位置,默认插入到最后
// for(int i=0;i<5;i++)
// {
// if(a[i]>number)
// {
// pos = i;//pos=第一个比number大的数的位置
// break;
// }
// }
// printf("pos=%d\n",pos);
//}
//int a[5]={60,23,90,88,45}
/*
选择排序:每一次从待排序的数据元素中选出最小(或最大的)大一个元素,存放在序列的起始位置,直到全部待排序的数据排完
通过交换把最小的元素放到前面
待排序: 60,23,90,88,45
第一次:23],60,90,88,45. i=0.无序数列从开始到最后结束a[0]~a[4],选出最小的数,放在a[0]位置
第二次:23,45],90,88,60//第二次直接从23之后开始对比,23不需要参加排序 i=1.无序数列从a[1]~a[4],选出最小的数,放在a[1]位置
第三次:23,45,60],88,90 i=2.无序数列从a[2]~a[4]
第四次:23,45,60,88],90
N个元素的无序数组,每次排序拿出一个添加到有序数组,N-1次排序,剩下一个必然是有序的
i从0开始,每次无序数列a[i]~a[4],选出最小的放在a[i]位置
*/
//int main()
//{
// int a[5]={60,23,90,88,45};
// int len = sizeof(a)/sizeof(a[0]);//数组中元素个数
// int k;
// int temp;
// for(int i=0;i<len-1;i++)
// {
// k = i;//a[k]是当前最小的数,
// for (int j=i+1; j<len; j++)
// {
// //a[k] a[j]相比,如果a[j]更小,更新k=j
// if (a[j]<a[k])
// {
// k = j;
// }
// }
// //把a[k]放到a[i]的位置,交换
// if(k != i)
// {
// temp = a[k];
// a[k] = a[i];
// a[i] = temp;
// }
// }
// for (int i=0; i<len; i++)
// {
// printf("%d ",a[i]);
// }
//}
/*
int a[5]={60,23,90,88,45};
冒泡排序:从左往右,依次捉对,如果前面的数比后面的数大,就交换
待排序: 60,23,90,88,45
第一对: [23,60],90,88,45
第二对: 23,[60,90],88,45
第三对: 23,60,[88,90],45
第四对: 23,60,88,[45,90]-->经过一次排序(4对),把最大的数传到了最后面;产生一个有序数,在最后面;每次产生一个最大的数,放在后面有序数列
N个数的数组,N-1次排序,有序数列有N-1,剩下一个必然是最小的;
第一次捉了4=len-1对
a[0]~a[len-1]捉对
第二次 i=1
a[0]~a[len-1-1]捉对
第i次
a[0]~a[len-1-i]一共捉len-1-i对
*/
//
//int main()
//{
// int a[5]={60,23,90,88,45};
// int len = sizeof(a)/sizeof(a[0]);//数组中元素个数
// for(int i=0;i<len-1;i++)
// {
// for (int j=i; j<len; j++)
// {
// if (a[i]>a[j])
// {
// int temp = a[i];
// a[i] = a[j];
// a[j] = temp;
// }
// }
// }
// for (int i=0; i<len; i++) {
// printf("%d ",a[i]);
// }
//}
//int main()
//{
// int a[5]={60,23,90,88,45};
// int len = sizeof(a)/sizeof(a[0]);//数组中元素个数
// for(int i=0;i<len-1;i++)//需要排序的次数
// {
// //无序数列a[0]~a[len-1-i],去两两捉对比较
// for(int j=0;j<len-1-i;j++)
// {
// //a[j]和a[j+1]对比
// if(a[j]>a[j+1])
// {
// int temp = a[j];
// a[j] = a[j+1];
// a[j+1] =temp;
// }
// }
// }
// for (int i=0; i<len; i++)
// {
// printf("%d ",a[i]);
// }
//}
/*
二维数组:数据的矩阵;
a[2][3] 2行3列
int a[2][3];定义
第一行: {a[0][0],a[0][1],a[0][2];//i=0} = a[0]数组
第二行: {a[1][0],a[1][1],a[1][2];//i=1} = a[1]数组
二维数组可以看成是一维数组的数组(行数组)
*/
//int main()
//{
//// int a[2][3] = {1,2,3,4,5,6};//完全初始化;
//// int a[2][3] = {{1,2,3},{4,5,6}};//和上面等价;
//// int b[2][3] = {{1},{2,5}};
// int c[ ][3] = {1,2,3,4,5,6};//二维数组的省略形式,可以省略行,但是列必须有,告诉系统每行元素个数;
// //遍历访问
// for(int i=0;i<2;i++)
// {
// for(int j=0;j<3;j++)
// {
// printf("c[%d][%d]=%d ",i,j,c[i][j]);
// }
// printf("\n");
// }
//}
/*输出杨辉三角
请输入行数:7
1
11
12 1
13 3 1
14 6 4 1
15 10 10 5 1
16 15 20 15 61
*/
//int main()
//{
// int a[20][20]={0};
// int n;
// printf("请输入行数:");
// scanf("%d",&n);
// for(int i=0;i<n;i++)//行数
// {
// for(int j=0;j<=i;j++)//列数
// {
// if ((i == j) || (j == 0))//每行的开始,结束赋值为1
// {
// a[i][j] = 1;
// }
// else
// {
// a[i][j] = a[i-1][j] + a[i-1][j-1];//结果为上一行对应前两位的数之和
// }
// printf("%d \t",a[i][j]);
// }
// printf("\n");
// }
//}
//int main()
//{
// char str[100] = {};//一维的字符数组,可以存储一个字符串,有效字符数99,要预留结束符
// char str1[5] = {};//接收4个有效字符;非常容易出界,不要使用
// printf("请输入一个字符串\n");
// scanf("%s",str1);//接收字符串,但是容易越界,例如输入:wwwwwwwww;输出结果是wwwwwwwww;
// printf("%s",str1);//str1首地址开始,打印到'\0'结束;
//
//}
//练习: char str[5][10]接收5个字符串
/*
char str[5][10] 二维数组,5个行数组的数组,每个行数组最多接收99个有效字符
5个行数组: str[0],str[1],...,str[4]
*/
int main()
{
char str[5][100] = {};
for(int i=0;i<5;i++)
{
printf("请输入一个字符串:\n");
scanf("%s",str[i]);//str[i]是个数组,就是str[i][0]的地址,元素str[i][0]~str[i][0]===========>多理解数组地址????
}
for(int i=0;i<5;i++)
{
printf("%s\n",str[i]);
}
}
- 05==数组(查找,添加,删除,排序)
- 数组的添加、删除、排序、与字符串之间的转换、截取、查找、遍历操作总结!!!
- Angular添加删除查找排序日期等
- 成绩排名\数组排序\素数查找\元素删除
- 数组的添加、删除、排序等方法
- JavaScript 数组添加、删除、排序、转换
- 动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有
- Java实现数组的添加、删除、查找(基础型)
- 第二十三章:杨氏矩阵查找、排序、添加、删除
- AngularJs添加 删除 排序 查找 最后汇总的代码
- angularJS排序查找添加
- Java基础05-数组排序与查找
- 旋转排序数组查找
- 数组排序、查找
- 数组排序与查找
- 数组排序、查找
- 数组排序与查找
- 数组 添加删除元素
- 网站优化不要经常更换空ccxtqj间
- 3.3 声明和使用常量;3.4 术语
- [150826]Maven详解之聚合与继承
- 【HDOJ 4272】 LianLianKan (vector深搜+剪枝)
- hdu5412--CRB and Queries(整体二分)
- 05==数组(查找,添加,删除,排序)
- ZOJ3876 May Day Holiday
- VC中基于Windows的精确定时
- javamail发送邮件
- 06==函数(头文件,声明,封装)
- c#中整型转为字符串型
- UI初级第七课 表视图的使用——iOS学习连载22
- 求余
- java初体验和基本语法问题记录