中国大学慕课C语言第七讲笔记

数组

引入

int number[100];
scanf(“%d”,&number[i]);
算出平均数,并把大于平均数的数输出来。因为要比较每个数与平均数的大小,而不能一一定义这些数,所以用到了数组:

int main()
{
  int x;
  double sum=0;
  int cnt=0;
  int number[100];//定义数组
  scanf("%d",&x);
  while(x!=-1){
    number[cnt]=x;/*数组中的元素赋值把x放到number这个数组的cnt的位置上。*/
    sum+=x;
    cnt++
    scanf("%d",&x);
  }
  if(cnt>0){
    printf("%f\n",sum/cnt);
    int i;
    for(i=0;i<cnt;i++){
      if(number[i]>sum/cnt){//使用数组中的元素
        printf("%d\n",number[i]);//遍历数组
      }
    }
  }
  return 0;
}

这个程序是危险的,因为输入的数据可能超过100个。
放入一段调试的代码:

//
{
  int i;
  printf("%d\t",cnt);
  for(i=0;i<=cnt;i++){
    printf("%d\t",number[i]);
  }
  printf("\n");
}
//

就可以看到变化,把第一个数放在0的位置上,依次类推。

定义数组

这里写图片描述
这里写图片描述
这里写图片描述

数组的单元

这里写图片描述

从0开始的数。

有效的下标范围

这里写图片描述

有时候数组越界会出错,有时候不会。一定要在:[0,数组的大小-1]。

数组的例子——统计个数

写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,
输入-1表示结束。

这里写图片描述

用count[x]来计算x出现的次数。
初始化数组需要遍历数组,所以需要写循环。
只要ASCII的值不越界,就可以做数组的下标。

讨论:

以下代码是大神纯爱枫若情的,用来说明“数组的单元在内存中是连续存放的”。
链接在这里
回答在第三页

#include <stdio.h>

int main(){
    const int NUM=10;
    int number[NUM];
    int i;

    for(i=0;i<NUM;i++){
        printf("第%d个的内存索引:\t%d\n",i+1,&number[i]);
    }

    return 0;
}

运行结果:

这里写图片描述

数组运算

数组的集成初始化

直接用大括号给出数组的所有元素的初始值;
不需要给出数组的大小,编译器替你数数。

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
如果是:

int a[13]={2};

则会输出:
2 0 0 0 0 0 0 0 0 0 0 0 0
不用上一节的遍历来初始化,可以直接:

int count[number]={0};

就可以达到遍历初始化的效果。

集成初始化时的定位

这里写图片描述

但是如果这里没给数组大小,因为涉及到的最大的是5,所以数组大小默认为6。

int a[]={[1]=2,4,[5]=6}

输出结果就是:
0 2 4 0 0 6

数组的大小

sizeof给出整个数组所占据的内容的大小,单位是字节。

这里写图片描述

数组的赋值

这里写图片描述

遍历数组

这里写图片描述

最后一个错误是指,离开循环的时候正好用数组无效的下标。

例子:

这里写图片描述

这里就是lenth传入数组大小数组作为函数参数时,往往必须再用另一个参数来传入数组的大小,原因是:
数组作为参数时:
不能在[]中给出数组的大小;
不能再利用sizeof来计算数组的元素个数!
不然函数无法做计算。

数组例子——素数

这里写图片描述
这里写图片描述
这里写图片描述
windows:搜索函数。
linux: man sqrt

素数例子

这里写图片描述
这里写图片描述
是把i也就是3放在了cnt也就是1的位置上,然后把cnt++,只想2的位置上。
输出素数表:
这里写图片描述
这里写图片描述

构造素数表

这里写图片描述
原理:
这里写图片描述
伪代码(从算法推进没有到代码但是接近代码):
这里写图片描述
prime数组里初始化所有都为1,判断是不是素数。
把素数的倍数都标记为非素数。
代码:

这里写图片描述
这里写图片描述
算法不一定和人的思考方式相同。

二维数组

二维或更多的数组。

这里写图片描述

第一个下标是行,第二个是列,同线性代数。

这里写图片描述

在C语言看来a[i,j]里的逗号是运算符,所以这个表达式相当于a[j]。

二维数组的初始化

这里写图片描述

列数不可以省略,行数可以省略。

二维数组的例子

这里写图片描述

1. 读入矩阵

这里写图片描述

2. 检查行

这里写图片描述

3. 检查列

这里写图片描述

4. 检查对角线

这里写图片描述

左边是正对角线,右边是反对角线。

讨论

老师问:能不能把检查行和检查列的代码合并?
放上赞的最多的眼泪的花火大神的代码:

链接在此

代码在链接的第三页。

 for(i=0;i<size && result==-1;i++)
 {
  numofO=numofX=0;
  for(j=0;j<size;j++)
  {
   //检查行
   if(board[i][j]==1)
    numrowofX++;
   else
    numrowofO++;
   //检查列
   if(board[j][i]==1)
    numcolofX++;
   else
    numcolofO++;
  }
  if(numrowofO==size || numcolofO==size)
   result=0;
  else ifnumrowofX==size || numcolofX==size)
   result=1;
 }

很简练。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值