我是靠谱客的博主 俊秀枕头,最近开发中收集的这篇文章主要介绍C语言 第七周知识点随记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

数组运算

数组的集成初始化

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和数组变化

构造素数表

  1. 令x为2
  2. 将2x、3x、4x直至ax<n的数标记为非素数
  3. 令x为下一个没有被标记为非素数的数,重复2;知道所有的数都已经被尝试完毕。

最后

以上就是俊秀枕头为你收集整理的C语言 第七周知识点随记的全部内容,希望文章能够帮你解决C语言 第七周知识点随记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部