《IOS_C语言》一维数组、数组排序、字符数组
2015-08-29 08:57
381 查看
一:一维数组
数组数组也是一种构造类型(跟枚举类似,是一个构造类型),相同数据类型组成的新数据类型,数组的每一个成员成为一个数组元素;
数组是一串“连续”的内存空间,并且类型相同;
格式:类型修饰符 数组名[常量表达式(可直接是常量,也可是是定义的常量字符)]={值1,值2,·····值n};这里的常量表达式表示有多少个元素,比元素的下标要多1,因为下标是从0开始的。如下例子:
int a[5]={0};这里表示整型的数组名为a的数组有5个元素(a[0],a[1],a[2],a[3],a[4]),并且全赋初值为0;
但是int a[5]={1};则表示只有首个元素a[0]=1,其他默认为0,跟上面的有所不同;
int a[]={1,2,1,3,5,6};这个数组的长度[ ]的值则由后面的{ }的个数决定;
常用的有:(1)int a[2]={1,3}或(2)int a[5]={0}
其他类型的:跟整型数组一样的定义方法
浮点型的数组:float b[]={2.3,2.5};
字符型的数组:char str[]="iphone5";注意的是这里str[ ]数组的长度比实际的字符串的字符个数要多一位,因为字符串的结束符是‘\0’;但是char str[]={'i','p','h','o','n','e','5'};这种的数组长度就实实在在的等于字符的个数。
注意:系统不会检验数组元素的下标是否越界的问题,因此需要自己注意
数组是一个整体,不能直接参与运算,只能对单个元素进行处理,这里就必须用到循环实现,如下练习:
课上练习:
练习1:定义一个具有20个元素的数组,每个元素的取值范围是30~70,并且数组的和
int a[20]={0};
int sum=0;
for(int i=0;i<20;i++){
a[i]=arc4random()%(70-30+1)+30;
printf("a[%d]=%d",i,a[i]);//赋值一个,就打印一个
sum+=a[i];
}
printf("%d",sum);
// //整体打印方法
// for(int i=0;i<20;i++){
// printf("a[%d]=%d",i,a[i]);
// }
// printf("sum=%d",sum);
练习2:
复制一个数组,即两个数组容量一样的,把其中一个数组的元素复制到另一个数组中
int a[5]={1,2,3,1,4};
int b[5]={0};
for(int i=0;i<5;i++){
b[i]=a[i];
}
for(int i=0;i<5;i++){
printf("b[%d]=%d",i,b[i]);
}
练习3
生成2个数组,每个数组都有10个元素,元素取值范围是20~40,对应元素相加,放到另一个数组中(一共三个元素)
int a[10]={0};
int b[10]={0};
int c[10]={0};
for(int i=0;i<10;i++){
a[i]=arc4random()%(40-20+1)+20;
b[i]=arc4random()%(40-20+1)+20;
c[i]=a[i]+b[i];
}
// for(i=0;i<10;i++){
// printf("a[%d]=%d,b[%d]= %d ,c[%d]=%d\n",i,a[i],i,b[i],i,c[i]);
// }
二:数组排序
主要学习了冒泡排序(由小到大,或者由大到小排序),主要使用两个for循环,外层循环控制比较的趟数,比比较的个数要少一(count-1),内层循环则控制比较的轮数,比外层比较的趟数少i,(count-1-i);如下练习
随机产生10个20~40之间的数,并且对10个数有小到大排序
int const n=20;
int i;
int a
={0};
printf("\n原来的顺序:");
for(i=0;i<n;i++){
a[i]=arc4random()%(40-20+1)+20;
printf("%d ",a[i]);
}
int j,k;
for(i=0;i<n-1;i++){//10个数则需要进行n-1轮比较(趟数比较),也就是需要进行10-1轮单个数单个数的比较,如三个数(1,2,3)需要进行2趟单个数字的比较
for(j=0;j<n-1-i;j++){//每轮比较里面需要进行n-i次两两比较,如三个数(1,2,3)需要进行2次单个数字的比较,比如1进行两两两比较的次数为n-i=3-1=2,也就是跟2两两比较后,还要跟3两两比较。2进行两两比较时,则只需要n-i=3-2=1次,也就是只跟3两两比较就行了。
if(a[j]>a[j+1]){//数组的两两比较,要求由小到大排序
k=a[j+1];//顺序大的(j+1)值小,则先用k把它保存起来
a[j+1]=a[j];//顺序大的(j+1)空间装上值小的数组a[j]
a[j]=k;//顺序小的a[j]装上值小的值
}
}
}
//注意,i=0,j=0,而不是从1开始,因为a[j],从a[0]开始,也就是j=0开始,j<n-1-i//
printf("\n新的顺序,由小到大排序:");
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
三:字符数组
//定义有两种形式:
char c1[]={'i','p','h','o','n','e'};
char c2[20]="iphone";
//后面这个是由‘\0’结束标识符的,所以比上面的那种多一位‘\0’
//while循环——》计算字符数组的字符个数
用while循环计算字符个数,但这种算法并不能应用于c2[20]="iphone"的字符个数统计,因为它有个结束符'\0',\但可以count=1;开始算起则可以计算。
int i=0,count=0;
while (c1[i]!='\0') {
printf("%c ",c1[i]);
count++;
i++;
}
printf("\ncount=%d\n",count);
//strlen()---->计算字符数组的字符个数,跟上面的方法实现的结果一样,但无法计算"iphone"的字符个数,'\0'
printf("%lu\n",strlen(c2));//等效于上面的while循环的方法,字符串长度统计是不算'\0'的。
//求字节数--->用sizeof()运算方法:
printf("%lu\n",sizeof(c1));//sizeof(c1)是一个运算符//结果为6
printf("%lu\n",sizeof(c2));//结果为20
如果是int型的数组,则计算字节数,长度是则需要sizeof(a)/sizeof(int),也就是需要除以4,因为int占4个字节,而字符型char则只占一个字节
//字符串赋值给字符串数组:strcpy(装赋值的数组名,被赋值的数组名)
如:char c3[20]={0};
strcpy(c3, "iPhone");//后者赋值给前者
printf("c3=%s\n",c3);
//字符串比较strcmp(比较的字符串1,比较的字符串2),比较后有一个结果,并用int 型的变量来接收
int result=strcmp(c2, c3);
printf("result=%d\n",result);
//字符串拼接 strcat(c3, "asf");//后者拼接到前者
strcat(c3, "asf");//后者拼接到前者//赋给c1不行,因为c1[]没有定义多少个元素是不行的,系统会报错。因此要赋值给一个有一定数组长度的元素,并且装得下的数组名
printf("%s\n",c3);
练习3:
//练习3:查找字符串中的空格数:
//例如:
//“I love iOS, i want an iPhone5s”6个空格
char a[50]="I love iOS, i want an iPhone5s";
// putchar(a[50]);
int count=0;
int i=0;
while(a[i]!='\0'){//‘0’表示是结束符号
if(a[i] == ' '){
count++;
}
i++;
}
printf("%d\n",count);
//方法2:
for (i=0; a[i]!='\0'; i++) {
// if (a[i]==' ') {
// count++;
// }
// }
// printf("\ncount=%d\n",count);
//课本例题3:字符数组与一般的数组一样,也可以一次性的输入
char str[10]={0};
printf("请输入一个字符串:");
scanf("%s",&str[0]);
for(int i=0;i<10;i++){
printf("%c",str[i]);
}
printf("\n");
printf("\n%s\n",str);
//练习4:
//将字符串倒转:方法1(只用一个数组)
char s1[50]="afjnpue";
// printf("please input a string:");
// gets(s1);//会提示出错,尽量不用咯
printf("原来的是:%s\n",s1);
long count=strlen(s1);
// printf("%lu\n",count);
char temp;
for (int j=0; j<count/2; j++) {//对半方法
temp=s1[j];
s1[j]=s1[count-1-j];
s1[count-1-j]=temp;
}
// puts(s1);//尽量不用
printf("逆序后是:%s\n",s1);
课上代码:方法2(更好)用两个数组
char s1[]="sdfsdjfsdsfsa";
printf("%s\n",s1);
char s2[100]={0};
for (int i=0; i<strlen(s1); i++) {
s2[i]=s1[strlen(s1)-1-i];
}
printf("%s\n",s2);
如下例子5:找出若干字符串的最大者,函数的定义在头文件下面
void max_string(char str[][20],int i);//函数的声明。本题通过二维数组,第一表示行,第二表示列有20列
char str[4][20]={"Basic","C","Java","JSP"};
for(int i=0;i<4;i++){
printf("%s ",str[i]);
}
printf("\n");
max_string(str, 4);
函数定义,并且放于头文件地方
void max_string(char str[][20],int n)
{
char max_str[20];//用于存放最大的字符串
strcpy(max_str, str[0]);//先假定二维数组中第0行的字符串最大
for(int i=0;i<n;i++){
if (strcmp(str[i],max_str)>0) {//如果当前的str[i]比较大
strcpy(max_str,str[i]);//把当前比较大的字符串复制存入max_str中
printf("the largest string is:%s\n",max_str);
}
}
}
数组数组也是一种构造类型(跟枚举类似,是一个构造类型),相同数据类型组成的新数据类型,数组的每一个成员成为一个数组元素;
数组是一串“连续”的内存空间,并且类型相同;
格式:类型修饰符 数组名[常量表达式(可直接是常量,也可是是定义的常量字符)]={值1,值2,·····值n};这里的常量表达式表示有多少个元素,比元素的下标要多1,因为下标是从0开始的。如下例子:
int a[5]={0};这里表示整型的数组名为a的数组有5个元素(a[0],a[1],a[2],a[3],a[4]),并且全赋初值为0;
但是int a[5]={1};则表示只有首个元素a[0]=1,其他默认为0,跟上面的有所不同;
int a[]={1,2,1,3,5,6};这个数组的长度[ ]的值则由后面的{ }的个数决定;
常用的有:(1)int a[2]={1,3}或(2)int a[5]={0}
其他类型的:跟整型数组一样的定义方法
浮点型的数组:float b[]={2.3,2.5};
字符型的数组:char str[]="iphone5";注意的是这里str[ ]数组的长度比实际的字符串的字符个数要多一位,因为字符串的结束符是‘\0’;但是char str[]={'i','p','h','o','n','e','5'};这种的数组长度就实实在在的等于字符的个数。
注意:系统不会检验数组元素的下标是否越界的问题,因此需要自己注意
数组是一个整体,不能直接参与运算,只能对单个元素进行处理,这里就必须用到循环实现,如下练习:
课上练习:
练习1:定义一个具有20个元素的数组,每个元素的取值范围是30~70,并且数组的和
int a[20]={0};
int sum=0;
for(int i=0;i<20;i++){
a[i]=arc4random()%(70-30+1)+30;
printf("a[%d]=%d",i,a[i]);//赋值一个,就打印一个
sum+=a[i];
}
printf("%d",sum);
// //整体打印方法
// for(int i=0;i<20;i++){
// printf("a[%d]=%d",i,a[i]);
// }
// printf("sum=%d",sum);
练习2:
复制一个数组,即两个数组容量一样的,把其中一个数组的元素复制到另一个数组中
int a[5]={1,2,3,1,4};
int b[5]={0};
for(int i=0;i<5;i++){
b[i]=a[i];
}
for(int i=0;i<5;i++){
printf("b[%d]=%d",i,b[i]);
}
练习3
生成2个数组,每个数组都有10个元素,元素取值范围是20~40,对应元素相加,放到另一个数组中(一共三个元素)
int a[10]={0};
int b[10]={0};
int c[10]={0};
for(int i=0;i<10;i++){
a[i]=arc4random()%(40-20+1)+20;
b[i]=arc4random()%(40-20+1)+20;
c[i]=a[i]+b[i];
}
// for(i=0;i<10;i++){
// printf("a[%d]=%d,b[%d]= %d ,c[%d]=%d\n",i,a[i],i,b[i],i,c[i]);
// }
二:数组排序
主要学习了冒泡排序(由小到大,或者由大到小排序),主要使用两个for循环,外层循环控制比较的趟数,比比较的个数要少一(count-1),内层循环则控制比较的轮数,比外层比较的趟数少i,(count-1-i);如下练习
随机产生10个20~40之间的数,并且对10个数有小到大排序
int const n=20;
int i;
int a
={0};
printf("\n原来的顺序:");
for(i=0;i<n;i++){
a[i]=arc4random()%(40-20+1)+20;
printf("%d ",a[i]);
}
int j,k;
for(i=0;i<n-1;i++){//10个数则需要进行n-1轮比较(趟数比较),也就是需要进行10-1轮单个数单个数的比较,如三个数(1,2,3)需要进行2趟单个数字的比较
for(j=0;j<n-1-i;j++){//每轮比较里面需要进行n-i次两两比较,如三个数(1,2,3)需要进行2次单个数字的比较,比如1进行两两两比较的次数为n-i=3-1=2,也就是跟2两两比较后,还要跟3两两比较。2进行两两比较时,则只需要n-i=3-2=1次,也就是只跟3两两比较就行了。
if(a[j]>a[j+1]){//数组的两两比较,要求由小到大排序
k=a[j+1];//顺序大的(j+1)值小,则先用k把它保存起来
a[j+1]=a[j];//顺序大的(j+1)空间装上值小的数组a[j]
a[j]=k;//顺序小的a[j]装上值小的值
}
}
}
//注意,i=0,j=0,而不是从1开始,因为a[j],从a[0]开始,也就是j=0开始,j<n-1-i//
printf("\n新的顺序,由小到大排序:");
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
三:字符数组
//定义有两种形式:
char c1[]={'i','p','h','o','n','e'};
char c2[20]="iphone";
//后面这个是由‘\0’结束标识符的,所以比上面的那种多一位‘\0’
//while循环——》计算字符数组的字符个数
用while循环计算字符个数,但这种算法并不能应用于c2[20]="iphone"的字符个数统计,因为它有个结束符'\0',\但可以count=1;开始算起则可以计算。
int i=0,count=0;
while (c1[i]!='\0') {
printf("%c ",c1[i]);
count++;
i++;
}
printf("\ncount=%d\n",count);
//strlen()---->计算字符数组的字符个数,跟上面的方法实现的结果一样,但无法计算"iphone"的字符个数,'\0'
printf("%lu\n",strlen(c2));//等效于上面的while循环的方法,字符串长度统计是不算'\0'的。
//求字节数--->用sizeof()运算方法:
printf("%lu\n",sizeof(c1));//sizeof(c1)是一个运算符//结果为6
printf("%lu\n",sizeof(c2));//结果为20
如果是int型的数组,则计算字节数,长度是则需要sizeof(a)/sizeof(int),也就是需要除以4,因为int占4个字节,而字符型char则只占一个字节
//字符串赋值给字符串数组:strcpy(装赋值的数组名,被赋值的数组名)
如:char c3[20]={0};
strcpy(c3, "iPhone");//后者赋值给前者
printf("c3=%s\n",c3);
//字符串比较strcmp(比较的字符串1,比较的字符串2),比较后有一个结果,并用int 型的变量来接收
int result=strcmp(c2, c3);
printf("result=%d\n",result);
//字符串拼接 strcat(c3, "asf");//后者拼接到前者
strcat(c3, "asf");//后者拼接到前者//赋给c1不行,因为c1[]没有定义多少个元素是不行的,系统会报错。因此要赋值给一个有一定数组长度的元素,并且装得下的数组名
printf("%s\n",c3);
练习3:
//练习3:查找字符串中的空格数:
//例如:
//“I love iOS, i want an iPhone5s”6个空格
char a[50]="I love iOS, i want an iPhone5s";
// putchar(a[50]);
int count=0;
int i=0;
while(a[i]!='\0'){//‘0’表示是结束符号
if(a[i] == ' '){
count++;
}
i++;
}
printf("%d\n",count);
//方法2:
for (i=0; a[i]!='\0'; i++) {
// if (a[i]==' ') {
// count++;
// }
// }
// printf("\ncount=%d\n",count);
//课本例题3:字符数组与一般的数组一样,也可以一次性的输入
char str[10]={0};
printf("请输入一个字符串:");
scanf("%s",&str[0]);
for(int i=0;i<10;i++){
printf("%c",str[i]);
}
printf("\n");
printf("\n%s\n",str);
//练习4:
//将字符串倒转:方法1(只用一个数组)
char s1[50]="afjnpue";
// printf("please input a string:");
// gets(s1);//会提示出错,尽量不用咯
printf("原来的是:%s\n",s1);
long count=strlen(s1);
// printf("%lu\n",count);
char temp;
for (int j=0; j<count/2; j++) {//对半方法
temp=s1[j];
s1[j]=s1[count-1-j];
s1[count-1-j]=temp;
}
// puts(s1);//尽量不用
printf("逆序后是:%s\n",s1);
课上代码:方法2(更好)用两个数组
char s1[]="sdfsdjfsdsfsa";
printf("%s\n",s1);
char s2[100]={0};
for (int i=0; i<strlen(s1); i++) {
s2[i]=s1[strlen(s1)-1-i];
}
printf("%s\n",s2);
如下例子5:找出若干字符串的最大者,函数的定义在头文件下面
void max_string(char str[][20],int i);//函数的声明。本题通过二维数组,第一表示行,第二表示列有20列
char str[4][20]={"Basic","C","Java","JSP"};
for(int i=0;i<4;i++){
printf("%s ",str[i]);
}
printf("\n");
max_string(str, 4);
函数定义,并且放于头文件地方
void max_string(char str[][20],int n)
{
char max_str[20];//用于存放最大的字符串
strcpy(max_str, str[0]);//先假定二维数组中第0行的字符串最大
for(int i=0;i<n;i++){
if (strcmp(str[i],max_str)>0) {//如果当前的str[i]比较大
strcpy(max_str,str[i]);//把当前比较大的字符串复制存入max_str中
printf("the largest string is:%s\n",max_str);
}
}
}
相关文章推荐
- doxygen的使用与C/C++注释规范
- 基于Doxygen的C/C++注释原则
- 一起talk C栗子吧(第四十三回:C语言实例--图)
- C语言类型占多少字节
- C语言的字符处理函数库
- c语言-一些学习c的经典例子
- 条款5:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)
- c语言-指针实现链表增删改查
- C++编程常用头文件及其包含函数汇总
- C/C++常用头文件及函数汇总
- [C语言][LeetCode][48]Rotate Image
- 如何成为一个牛逼的C/C++程序员?
- C/C++程序员必须熟练应用的开源项目
- [C语言][LeetCode][34]Search for a Range
- [C语言][LeetCode][35]Search Insert Position
- [C语言][LeetCode][73]Set Matrix Zeroes
- C++中string类常用函数
- [C语言][LeetCode][219]Contains Duplicate II
- C++中string的size,length,capacity三者到底有何区别求解啦?
- [C++11 并发编程] 15 承诺promise