您的位置:首页 > 编程语言 > C语言/C++

《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);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: