c数组

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。



数组


数组,顾名思义就是一组同类型的数。

一、数组的声明

int array[10];
这条语句定义了一个具有10个整型元素的名为array的数组。这些整数在内存中是连续存储的。数组的大小等于每个元素的大小乘上数组元素的个数。方括号中的维数表达式可以包含运算符,但其计算结果必须是一个长整型值。这个数组是一维的。
下面这些声明是合法的:
int offset[5+3];
float count[5*2+3];



下面是不合法的:
int n=10;
int offset[n]; /*在声明时,变量不能作为数组的维数*/

二、用下标访问数组元素
int offset[10];
表明该数组是一维数组,里面有10个数,它们分别为offset[0],offset[1],……offset[9];千万注意,数组的第一个元素下标从0开始。一些刚学编程的人员经常在这儿犯一些错误。
offset[3]=25;
上面的例子是把25赋值给整型数组offset的第四个元素。
在赋值的时候,可以使用变量作为数组下标。





#include "stdio.h"

#include "string.h"



void main()

{



int i;

char offset[5];

for(i=0;i<5;i++) scanf("%c",&offset[i]);

for(i=4;i>=0;i--) printf("%c" ,offset[i]);

printf("\n");



}



//直接在控制台中输入 asdfg 回车就OK

题目的意思是先输入5个整数,存入到数组中,然后反序输出。



三、数组的初始化



下面集中是Ok的
int array[5]={1,2,3,4,5};

int str[4]={1,2,3};

int str[]={1,2,3,41,5,6};


在定义数组时,可以用放在一对大括号中的初始化表对其进行初始化。
初始化值的个数 <= 数组元素个数
如果初始化的个数多于元素个数,将产生编译错误;如果少于元素个数,其余的元素被初始化为0。
如果维数表达式为空时,那么将用初始化值的个数来隐式地指定数组元素的个数,如下所式:
int array[]={1,2,3,4,5};
这也表明数组array元素个数为5。
{
int i,array[]={1,3,5,7,9,11};
for(i=0;i<5;i++) printf(%d ,array[i]);
printf(\n);
}
最终结果为1 3 5 7 9




字符数组
整数和浮点数数组很好理解,在一维数组中,还有一类字符型数组。
char array[5]={'H','E','L','L','O'};

char array[]={"sdsdsd"};

char array[]="0123asdfgh";

对于单个字符,必须要用单引号括起来。又由于字符和整型是等价的,所以上面的字符型数组也可以这样表示:
char array[5]={72,69,76,76,79}; /*用对应的ASCII码*/
举一个例子:



#include "stdio.h"



void main()

{

int i;

char array[5]={'H','E','L','L','O'};

for(i=0;i<5;i++) printf("%d ",array[i]);



}


最终的输出结果为72 69 76 76 79

(char可以转换成int 所以char可以用int的格式输出)




但是字符型数组和整型数组也有不同的地方,看下面的:
char array[]="HELLO";
如果我们

能看到内部的话,实际上编译器是这样处理的:
char array[]={'H','E','L','L','O','\0'};
看上面最后一个字符'\0',它是一个字符常量,Turbo C编译器总是给字符型数组的最后自动加上一个\0,这是字符的结束标志。
所以虽然HELLO只有5个字符,但存入到数组的个数却是6个。




#include "stdio.h"

#include "math.h"

#include "string.h"









void main()

{

char str[]={'1','2','3','\0'}; //strlen 结果是3

char str2[4]={'1','2','3','\0'}; //strlen 结果是3 但是声明的时候长度和元素个数一致
char tea[]={'1','2','3'};//结果就不正确了
char arr[]="avc"; //strlen 结果是3

char arrs[]={"asd" }; //strlen 结果是3



int len;



len=strlen(str) ;

printf("%d",len );



len=strlen(arr);

printf("%d",len);



}





#include "stdio.h"

#include "string.h"



void main()

{

int i,j;

char array[]="0123asdfgh";



j=strlen(array); /* 要导入string.h */
printf("%d\n",j );

/* 实际上数组最后有一个 \0 但是不记录为char[]字符串的长度 */

/*所以使用起来和java一样的*/



for(i=0;i
printf("%c ", array[i] );

}

}




其实我们可以根据判断'\0'来输出字符串,看下面的:
main()
{
int i;
char array[]=094387fdhgkdladhladaskdh;
for(i=0;array[i]!='\0';i++) printf(%c,array[i]);
printf(\n);
}




接收控制台输入的String 并存入在数组中




void main(){

char c;

char array[5];



int i=0;

//定义的大小虽然是5 但是如果输入的字符超过了5个 array的大小会自动增加一些
while( (c=getchar())!='\n'){

array[i]=c;

i++;

}



array[i]='\0';

// 虽然数组的长度是5 但是这里却可以使用arrray[5]来赋值

//如果赋值是 '\0' 表明字符串结尾 strlen 当然还是5 strlen表示的是字符串的长度
//如果赋值是 其他字符 数组的长度会增加 似乎是系统重新分配了空间
printf("length is %d\n", strlen(array) );



printf("%s",array);

}



上面的方法很复杂 其实没有必要



标准的字符数组输入输出

#include "stdafx.h"

#include "stdio.h"



void main()

{

char str[20];



scanf("%s", str); // 这里写&也不会报错 但是没有必要
printf("%s", str);


}



数组应用实例
1.输入10个整数存入数组中,然后把它们从小到大排列并放在同一数组中。(思路:先找出最小的,放在第一个位置,为了防止把原先的数覆盖掉,可以把原先的第一个数和最小数的位置互换)。



#include "stdio.h"

#include "string.h"



void main()

{

int nums[5];

int length=5;

int temp;

int i=0;



for (i=0;i
{

scanf("%d",&nums[i] );

for (int j=0;j
{

if (nums[j]>nums[i] )

{

temp=nums[j];

nums[j]=nums[i];

nums[i]=temp;

}

}

}



for (i=0;i
{

printf("%d ",nums[i] );

}



}



/************************************************************************/

/*

在c 中
不能像java中那样在一个方法中的两个for循环都使用变量i

xxx (){

for(int i=0; ....){}

for(int i=0; ....){}

}

*/

/************************************************************************/



分析:先让第一个值作为基准,如果后面有比它小的,那么就把这两个数互换一下,同时把基准换成小的值。两个数互换应该这样(stmp=a;a=b; b=stmp;),而不是(a=b;b=a;),想想这是为什么?必须要用一个变量作为桥梁。这种一个一个的把最小的放在前面的排序方法,我们形象的叫做 冒泡法。





2.输入一行字符存入数组,然后把他们反序存入到同一数组中。



#include "stdio.h"

#include "string.h"



void main(){

char c;

char array[5];

int len;



int i=0;

while( (c=getchar())!='\n'){

array[i]=c;

i++;

}

array[i]='\0';



len=strlen(array);

printf("length is %d\n", len );



int temp=0;

for (int j=i-1;j>=len/2;j--)

{

temp=array[j];

array[j]=array[len-1-j];

array[len-1-j]=temp;

}



for (i=0;i
{

printf("%c", array[i] );

}

}





3.一个已经排好序的数组,输入一个数,利用二分法把这个数从原数组中删除,数组顺序保持不变。如原数组为1,3,5,7,9,11,13,15,17,19,待删除的数为13,则输出为1,3,5,7,9,11,15,17,19。
二分法:每次都是判断中间的数是否满足要求,若满足则删除,若不满足,则把该数当作边界,然后再找中点。例如这一题,第一次的是10个数的中点,为11, 发现11<13,则找11-19的中点15,发现15>13,再找11-15的中点13,正好,则删除。



#include "stdio.h"

#include "string.h"

#include "math.h"



int binarySearch(int low,int high, char searchValue);



char array[5];



void main(){

char c;

int len;

int index;



// receive

int i=0;

while( (c=getchar())!='\n'){

array[i]=c;

i++;

}

array[i]='\0';
len=strlen(array);

printf("length is %d\n", len );





//find use binarysearch

printf(

"%s\n","type tge number you want to index " );

scanf("%c",&c ); //



index=binarySearch(0,len-1,c);

printf("find index is %d\n",index );



//del

for (;index
{

array[index]=array[index+1];

}

for (i=0;i
{

printf("%c ",array[i] );

}





}



//此2分查找适用于增序时
int binarySearch(int low,int high, char searchValue){

int mid=(low+high)/2;

if(low>high){

return -1;

}else {

if(searchValue==array[mid])

{

return mid;

}

else if (searchValue
{

return binarySearch(low,mid-1,searchValue);

}else if (searchValue>array[mid] )

{

return binarySearch(mid+1,high,searchValue);

}



}





}



/************************************************************************/

/* 2分查找的总结


使用2分查找 数组中的数据必须有序
查找总是在某一段数据中取出中间值和要找的值进行比较


x x x M x x x

0 1 2 3 4 5 6



如果searchValue < M 那么就会在M 左边找(不包括M) 也就是[0,2]段
也就是说下一次的范围是 low mid-1



如果searchValue > M 那么就会在M 右边找(不包括M) 也就是[4,6]段
也就是说下一次的范围是 mid+1 high





一开始不明白if(low>high)的原因
考虑在边界的情况, 就知道递归应该在什么时候停止
x x x M x x x

0 1 2 3 4 5 6

假如要找的值比最小的值还要小
那么某一时刻 low在0的位置 high在1的位置 那么mid也是0的位置 和要找的值不相等 进入下一次
此刻接收到的low还是0 而high 就是-1了 这时就表示值不存在
*/

/************************************************************************/

相关文档
最新文档