概述
数组运算
数组的集成初始化
int a[] = {2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32};
遍历数组输出的是 2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32,我们写入的数组会依次用来初始化数组的每一个单元。编译器帮我们设定好了容量为13个整数的数组。
int a[13] = {2};
输出的结果显示,数组a中的第一个数是2,剩下的12个都为0
int count[100] = {0};
达到的效果也就是:
int count[100];
for (i=0; i<100; 1++) {
count[i]=0;
}
集成初始化时的定位
int a[10]={
[0]=2, [2]=3, 6
};
-
用
[n]
在初始化数据中给出定位 -
没有定位的数据接在前面的位置后面
-
其他位置的值补零
-
也可以不给出数组大小,让编译器算
-
特别适合初始数据稀疏的数组
c99才行!
数组的大小
sizeof
给出整个数组所占据的内容的大小,单位时字节
sizeof(a)/sizeof(a[0])
sizeof(a[0])
给出数组中单个元素的大小,于是相处就得到了数组的单位个数- 这样的代码,一旦修改数组中初始的数据,不需要修改遍历的代码
数组的赋值
int a[] = {2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32}
int b[] = a; //不能这样赋值
- 数组变量本身不能被赋值
- 要把一个数组的所有元素交给另一个数组,必须采用遍历
for ( i=0; i<length; i++) {
b[i] = a[i];
}
遍历数组
数组赋值
for ( i=0; i<length; i++){
b[i] = a[i];
}
数组初始化
for (i=0; i<number; i++){
count [i] = 0;
找出数组中某一值
for ( i=0; i<length; i++){
if (a[i] == key ){
ret = i;
break;
}
}
打印数组
for (i=0; i<number; i++){
printf("%d;%dn",i,number);
}
- 通常都是使用for循环,让循环变量i从0到<数组的长度,这样循环体内最大的i正好是数组最大的有效下标
- 常见错误是:
- 循环结束条件是<=数组长度(i从0开始累加,i=数组长度-1刚好遍历数组)
- 离开循环后,继续用i的值来做数组元素的下标(i++了)
/*
找出key在数组a中的位置
@param key 要寻找的数字
@param a 要寻找的数组
@param length 数组a的长度
@return 如果找到,返回其在a中的位置;如果找不到则返回-1
*/
int search(int key, int a[], int length);
int main(void)
{
int a[]={2, 4, 6, 7, 1, 3, 5, 9, 11, 13, 23, 14, 32};
int x;
int loc;
printf("请输入一个数字:");
scanf("%d",&x);
loc = search(x, a, sizeof(a)/sizeof(a[0]));
if (loc != -1) {
printf("%d在第%d个位置上n", x, loc);
} else {
printf("%d不存在n", x);
}
return 0;
}
int search(int key, int a[], int length)
{
int ret = -1;
int i;
for(i=0; i<length; i++) {
if(a[i] == key ){
ret = i;
break;
}
}
return ret;
}
数组作为函数的参数时:
- 不能在[]中给出数组的大小
- 不能再利用sizeof来计算数组的元素个数
数组例子:素数
首先搭一个主程序的框架
主程序
- 如果
isPrime
不是素数输出“不是素数”,如果isPrime
是素数输出“是素数”。
int isPrime(int x);
int main(void)
{
int x;
scanf("%d",&x);
if( isPrime(x)){
printf("%d是素数n", x);
} else {
printf("%d不是素数n", x);
}
return 0;
}
isPrime
方案1:
- 从2到x-1测试是否可以整除
int isPrime (int x)
{
int ret = 1;
int i;
if( x==1 ) ret=0;
for (i=2; i<x; i++) {
if(x%i == 0 ){
ret = 0;
break;
}
}
return ret;
}
缺点:
- 对于n要循环n-1遍
- 当n很大时就是n遍
方案2:
去掉偶数后,从3到x-1,每次加2
思路
- 如果x是偶数,立刻判断非素数
- 否则循环(n-3)/2+1遍
- 当n很大时就是n/2遍
int isPrime(int x)
{
int ret = 1;
int i;
if ( x==1 ||
(x%2 == 0 && x!=2))
ret = 0;
for (i=3; i<x; i+=2) {
if (x%i == 0) {
ret = 0;
break;
}
}
return ret;
}
- 如果是偶数,立刻
- 否则要循环(n-3)/2+1遍
- 当n很大时就是n/2遍
方案3:
无需到x-1,到sqrt(x)就够了
int isPrime(int x)
{
int ret = 1;
int i;
if ( x == 1 ||
(x%2 == 0 && x!=2))
ret = 0;
for (i=3; i<sqrt(x); i+=2 ) {
if (x%i == 0) {
ret = 0;
break;
}
}
return ret;
}
判断是否能被已知的且<x的素数整除
int main(void)
{
const int number = 100; //100个素数
int prime[number] = {2}; //初始化数组,第一个素数为2
int count = 1; //已知素数个数
int i = 3; //
while ( count < number){
if (isPrime(i, prime, count)){
Prime[count++] = i; //赋值时指向的是Prime[count],赋完值后count=count+1
}
i++;
}
for ( i=0; i<number; i++ ) {
printf("%d", prime [i]); //遍历素数表
if ((i+1)%5) printf("t"); //每隔五个换行
else printf("n");
return 0;
}
int isPrime(int x, int knownPrimes[], int numberOfKnownPrimes)
{
int ret = 1; //假设x是素数
int i;
// 用x除去素数表中的数,若能被整除,则不是素数;反之,ret = 1,是素数
for(i=0; i<numberOfKnownPrimes; i++){
if(x%knownPrimes[i]==0){
ret = 0;
break;
}
}
return ret;
}
用{}
去看i和数组变化
构造素数表
- 令x为2
- 将2x、3x、4x直至ax<n的数标记为非素数
- 令x为下一个没有被标记为非素数的数,重复2;知道所有的数都已经被尝试完毕。
最后
以上就是俊秀枕头为你收集整理的C语言 第七周知识点随记的全部内容,希望文章能够帮你解决C语言 第七周知识点随记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复