一、数组运算
数组的集成初始化
int a[13] = {0}; //将数组所有初始化为0
集成初始化时的定位(C99ONLY)
int a[10] =
{
[0] = 2, [2] = 3, 6,
}
用[n]在初始化数据中给出定位
没有定位的数据接在前面 的位置后面
其他位置的值补零
也可以不给出数组的大小,让编译器算
特别适合初始数组数据稀疏的数组
数组的大小
sizeof给出整个数组所占据的内容的大小,单位是字节。
sizeof(a) / sizeof(a[0]) 是这个数组的大小
sizeof(a[0])给出数组中单个元素的大小,是、于是相除就得到了数组的单元个数
这样的代码,一旦修改数组中初始的数据,不需要修改便利的代码
数组的赋值
数组变量本身不能被赋值
要把一个数组所有元素交给另一个数组,必须采用遍历(唯一)
for(i=0; i<length; i++)
{
b[i] = a[i];
}
遍历数组![](https://img-blog.csdnimg.cn/16434804a6764a99bbd4b039d925de8f.png)
通常都是使用for循环,让循环变量i从0到<数组的长度,这样循环体内最大的i正好是数组最大的有效下标
常见错误:
循环结束条件是<=数组长度,或;
离开循环后,继续使用i的值来做数组元素的下标!
素数的构造
#include<stdio.h>
int main()
{
const int maxNumber = 25;
int isPrime[maxNumber];
int i;
int x;
for(i=0; i<maxNumber; i++)
{
isPrime[i] = 1;
}
for(x=2; x<maxNumber; x++)
{
if(isPrime[x])
{
for(i=2; i*x<maxNumber; i++)
{
isPrime[i*x] = 0;
}
}
}
for(i=2; i<maxNumber; i++)
{
if(isPrime[i])
{
printf("%d\t",i);
}
}
printf("\n");
return 0;
}
二、搜索
在一个数组中找到某个数的位置(或确认是否存在)
基本方法:遍历
变量一专多能是不好的代码
根据数字显示对应字符
1美分:penny
5美分:nickel
10美分:dime
25美分:quarter
50美分:half-dollar
#include<stdio.h>
int amount[] = {1,5,10,25,50};
int *name[] = {"penny","nickel","dime","quarter","half-dollar"};
int search(int key, int a[], int len)
{
int ret = -1;
for(int i=0; i<len; i++)
{
if(key == a[i])
{
ret = i;
break;
}
}
return ret;
}
int main()
{
int k = 50;
int r = search(k, amount, sizeof(amount)/sizeof(amount[0]));
if(r>-1)
{
printf("%s\n",name[r]);
}
return 0;
}
对cache比较友好的写法
#include<stdio.h>
int amount[] = {1,5,10,25,50};
int *name[] = {"penny","nickel","dime","quarter","half-dollar"};
struct
{
int amount;
int *name;
}coins[] =
{
{1,"penny"},
{5,"nickel"},
{10,"dime"},
{25,"quarter"},
{50,"half-doullar"}
};
int search(int key, int a[], int len)
{
int ret = -1;
for(int i=0; i<len; i++)
{
if(key == a[i])
{
ret = i;
break;
}
}
return ret;
}
int main()
{
int k = 50;
//int r = search(k, amount, sizeof(amount)/sizeof(amount[0]));
for(int i=0; i<sizeof(coins)/sizeof(coins[0]); i++)
{
if(k == coins[i].amount)
{
printf("%s\n",coins[i].name);
break;
}
}
return 0;
}
在一些数当中搜索要找的数(二分法提高效率)
int search(int key, int a[], int len)
{
int ret = -1;
int left = 0;
int right = len-1;
while(right > left)
{
int mind = left+right/2;
if(a[mind] == k)
{
ret = mind;
break;
}else if(a[mind] > k)
{
right = mind-1;
}else
{
left = left+1;
}
}
return ret;
}
三、排序初步
将无序的数组进行有序排列(选择排序)
#include<stdio.h>
int max(int a[], int len)
{
int maxid = 0;
for(int i=1; i<len; i++)
{
if(a[i] > a[maxid])
{
maxid = i;
}
}
return maxid;
}
int main()
{
int a[] = {2,45,6,12,87,34,90,24,23,11,65};
int len = sizeof(a)/sizeof(a[0]);
//选择排序
for(int i=len-1; i>0; i--)
{
int maxid = max(a, i+1);
//swap a[maxid], a[len-1]
int t = a[maxid];
a[maxid] = a[i];
a[i] = t;
}
for(int i=0; i<len; i++)
{
printf("%d ",a[i]);
}
return 0;
}