输入 /输出 缓冲区 与 数组的常识

1. 输入输出缓冲区

1.1 输入缓冲区

键盘——>键盘缓冲区——>输入缓冲区——>程序
scanf("%*[^\n]");
scanf("%*c");(丢弃任意一个字符)——>清空输入缓冲区——>程序
解释:*  丢弃读取到的内容
[^\n]    表示任何非\n的字符
如果读取到的数据类型匹配,那么缓冲区中的数据会被成功读取,缓冲区中被读取完的数据就不存在了


1.2 输出缓冲区

程序——>输出缓冲区——>屏幕
输出缓冲区内容到屏幕显示的方法:
(1)\n 刷新缓冲区

(2)fflush 用于刷新缓冲区

                 fflush(stdin)刷新输入缓冲区,但是这个基本不用

fflush(stdout);刷新输出缓冲区
(3)输出缓冲区满了的时候,可以显示在屏幕上,(一般大小4Kb)

(4)程序结束

2.数组

  2.1 数组的定义

  数据类型 数组名 [数组的长度];
  例如:int nums[10];表示定义了一个可以保存10个int类型数据的名为nums的数组
  使用数组名来标记数组的首地址,从而可以找到数组的内存空间,使用下标去访问数组中具体的元素
  下标:0  1 。。。9   访问数组中的第二个元素:nums[1]
注意: 
   
int nums [10];表示的是数组的长度,只有在定义的时候[]表示数组的长度
    nums[5];      5表示的是数组的下标,在使用的时候[]表示数组的下标

 2.2 数组的初始化

  (1)全部初始化
  int nums[5] = {1,2,3,4,5};
    (2)部分初始化
  int nums[5] = {11};剩余的元素默认初始化为0
  int nums[5] = {0};一般用于将数组所有元素初始化为0
  int nums[5] = {};将数组中所有元素初始化为0,不推荐使用
  (3)指定初始化
  int nums[5] = {[2] = 33};将数组中的第三个元素初始化为33
注意:
(1)C语言中定义数组的时候,要求指定数组的长度,不支持[]在数组名的前面
(2)如果非得不指定数组的长度,那么需要将数组进行全部初始化
int nums[] = {1,2,3,4,5,6};不推荐使用

2.3一维数组的赋值

    int num = 10;//变量的初始化
    num = 10;//变量的赋值
    int nums[5] = {11,22,33,44,55};//数组的初始化
  结论:
      数组定义的时候可以初始化,但是不可以使用数组名进行赋值,如果非要赋值的话,就通过数组的下标去对每一个元素进行赋值

2.4习惯用法

      (1)数组的清零
      for(i = 0;i < n;i++)
      {
         nums[i] = 0;
      }  
      (2)输入数据到数组中
        for(i = 0;i < n;i++)
        {
                   scanf("%d",&nums[i]);
        }
      (3)数组元素的求和
      for(i = 0;i < n;i++)
      {
         sums += nums[i];
      }
      (4)数组中的每一个元素都可以像普通变量一样去使用

2.5 数组的深入浅出

    -------------------
    数组名表示的是数组的首地址,也就是数组中第一个元素的地址数组名是个常量,不可改变
    对于数组来说,nums[i]实际上就是相对于数组名nums的一个偏移量
    int nums [5] = {11,22,33,44,55};
    nums = &nums[0] = nums + 0 = 数组中第一个元素的地址
    &nums 打印地址也是数组的首地址,但是级别不一样,分别使用nums + 1和&num + 1来查看级别的不同
    扩展信息:

2.6 数组的sizeof值

数组的sizeof = sizeof(数组中元素)*元素的个数
    int arr[5] = {11,22,33,44,55};
    sizeof(arr) = 4*5 = 20;
特例:
void fn (int arr[5])
{
sizeof(arr) = 4;//这里arr相当于一个指针,sizeof(指针) = 4
}

2.7数组的下标越界访问

     C语言中数组是可以越界访问的,程序中变量的内存分配顺序与变量的定义顺序无关,对数组进行越界访问时可能访问到其他变量的值,
  也可能引发段错误,所以要求程序员自己对数组进行下标控制,尽量避免数组的下标越界

2.8 数组的下标越界赋值

数组的下标越界赋值可能修改其他数据的值,还有可能引发段错误,所以要防止数组下标的越界

3 二维数组

 3.1二维数组的定义

     数据类型 数组名[行数][列数]
     例如:int arr[3][4];表示定义了一个3行4列的二维数组
  注意:
  二维数组在内存中是按照行主序进行排列 的

  3.2二维数组的初始化

  (1)全部初始化
    int arr[2][3];看做具有两个元素的数组,而每一元素又是一个具有三个元素的一维数组
    int arr[2][3] = {{11,22,33},{44,55,66}};
   (2)部分初始化
    int arr[2][3] = {{11,22},{33}};剩余的元素默认初始化为0
    int arr[2][3] = {{0}};表示将二维数组中所有元素初始化为0
   (3)指定初始化
    int arr[2][3] ={[0][2]=33};将第一行中第三个元素初始化为33
   行主序排列:int arr[2][3] = {11,22,33,44}
 例子:使用二维数组输出单位矩阵

3.3 习惯用法

 (1)清零
  for(i = 0;i < n;i++)
  {
     for(j = 0;j < m;j++)
     {
      arr[i][j] = 0;
     }
  }
 (2)从键盘键入
  for(i = 0;i < n;i++)
  {
    for(j = 0;j < m;j++)
    {
    scanf("%d",&arr[i][j]);
    }
  }
 (3)求和
  for(i = 0;i < n;i++)
  {
    for(j = 0;j < m;j++)
    {
    sum += arr[i][j];
    }
  }

 3.4变长数组(C99支持)

 例子:
     int num = 0;
     printf("请输入数组的长度:\n");
     scanf("%d",&num);
     int arr[num];
 注意:
 (1)注意变量和数组的定义顺序
 (2)变长数组不能进行初始化,很少使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是添加中值滤波的代码,你可以将其插入到原有代码中: ```c #include <stdio.h> #include <stdlib.h> // 中值滤波器函数 float median_filter(float* data, int len) { float temp; int i, j; // 冒泡排序 for (i = 0; i < len - 1; i++) { for (j = i + 1; j < len; j++) { if (data[i] > data[j]) { temp = data[i]; data[i] = data[j]; data[j] = temp; } } } // 返回中值 if (len % 2 == 0) return (data[len / 2] + data[len / 2 - 1]) / 2.0; else return data[len / 2]; } int main() { #define FILTER_ORDER 16 // 滤波器阶数 #define BUFFER_SIZE 32 // 缓冲区大小 float filter_coeffs[FILTER_ORDER + 1] = {0.0007, 0.0021, 0.0042, 0.0071, 0.0106, 0.0144, 0.0182, 0.0218, 0.0248, 0.0269, 0.0278, 0.0272, 0.0248, 0.0205, 0.0142, 0.0060, -0.0039}; // 低通滤波器系数 float input_buffer[BUFFER_SIZE] = {0}; // 输入缓冲区 float output_buffer[BUFFER_SIZE] = {0}; // 输出缓冲区 int diangan[4]; // 存储ADC通道值的数组 int i, j; float sum = 0.0, median; int cnt = 0; // 无限循环 while (1) { // 读取ADC通道值 for (i = 0; i < 4; i++) { diangan[i] = ADC_Read(i); } // 将ADC通道值放入输入缓冲区 for (i = 0; i < 4; i++) { input_buffer[cnt * 4 + i] = (float)diangan[i]; } // 累加输入缓冲区的值 for (i = 0; i < BUFFER_SIZE; i++) { sum += input_buffer[i]; } // 计算滤波结果 for (i = 0; i <= FILTER_ORDER; i++) { for (j = 0; j < BUFFER_SIZE; j++) { if (i + j < BUFFER_SIZE) { output_buffer[j] += filter_coeffs[i] * input_buffer[i + j]; } } } // 计算中值滤波结果 for (i = 0; i < BUFFER_SIZE; i++) { median = median_filter(&input_buffer[i], FILTER_ORDER + 1); output_buffer[i] = median; } // 输出滤波结果 for (i = 0; i < 4; i++) { printf("%f ", output_buffer[cnt * 4 + i]); } printf("\n"); cnt++; if (cnt >= BUFFER_SIZE / 4) { cnt = 0; sum = 0.0; // 清空输入缓冲区输出缓冲区 for (i = 0; i < BUFFER_SIZE; i++) { input_buffer[i] = 0.0; output_buffer[i] = 0.0; } } } return 0; } ``` 其中,`median_filter()`函数是中值滤波器函数,使用冒泡排序实现,返回中值。在主函数中,先计算出输入缓冲区中的值的总和,然后计算低通滤波器的输出,并将其存储到输出缓冲区。接着,计算中值滤波器的输出,并将其存储到输出缓冲区。最后,输出滤波结果。注意,这里的输出是每个通道的滤波结果,需要适当修改输出方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值