C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言之数据结构中的数组

C语言之数据结构中的数组解读

作者:字节跳动的小码农

文章系统讲解了数组的初始化、遍历、加法运算、外部变量运算、元素删除、最值求解、排序及数学统计方法(如平均值、加权平均、标准差),并附有计算示例与注意事项,适用于编程学习和数据处理场景

一、如何初始化数组

1.声明数组

int codes[10]={1,2,3,4,5,6,7,8,9,0};
int codes[10];

2.使用循环

int code[10];
for (int i=0;i<10;i++)
    code[i]=i;

3.使用另一个数组的值

char code[]={"a","b","c"};
char copy_code[4];
for(int i=0;i<4;i++)
    copy_code[i]=code[i];

4.使用特殊值

int code[2];
code[1]=2;

二、遍历数组

1.使用下标遍历一维数组

int codes[6]={1,2,3,4,5,6};
for(int i=0;i<6;i++)
    print("%d",codes[i]);

2.如何使用指针遍历一维数组

int codes[6]={1,2,3,5,6,7};
for (int i=0;i<7;i++)
    printf("%d",*(codes+i)));

3.如何使用下标遍历二维数组

int codes[2][2]={{1,2},{3,4}};
for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
        printf("%d",codes[i][j]);

4.如何使用指针遍历二维数组

int codes[2][2]={{1,2},{3,4}};
for(int i=0;i<2;i++)
    for(int j=0;j<2;j++)
        printf("%d",*(*(codes+i)+j));

三、数组中的加法

1.将指定范围内的数据元素加起来

int Add(int arry[],int start,int end)
{
    int sum=0;
    for(int i = start;i < end;i++)
        sum+=arry[i];
    return sum;
}

2.将数组中偶数位置和奇数的元素加起来

double ArryAdd(double arry[];int stary ;int end;int flag)
{
    int i = stary;
    double = sum;
    if (flag==0) // 计算数组中偶数位置的和
    {
        if(start%2==0)
            i=start;
        else
            i=start+1;
        for(;i<end;i++)
            sum+=arry[i];
    }
    if (flag==1) // 计算数组中奇数位置的和
    {
        if(start%2!=0)
            i=start;
        else
            i=start+1;
         for(;i<end;i++)
            sum+=arry[i];
    }
    return sum;
}

3.将数组中偶数和奇数的元素分别加起来

double ArryAdd(double arry[];int end;int flag)
{
    int i = 0;
    double = sum;
    if (flag==0) //计算偶数位置的和
    {
        if(start%2==0)
            for(;i<end;i++)
                sum+=arry[i];
    }
    if (flag==1) //计算奇数位置的和
    {
        if(start%2!=0)
           for(;i<end;i++)
                sum+=arry[i];
    }
    return sum;
}

四、执行包含外部变量的运算

1.将一个元素乘以(加上,减去,除以)数组的每一个元素

//将一个元素乘以(加上,减去,除以)数组的每一个元素
void multiplyelements(int arry[],int size,int number)
{
    for(i=0;i<size;i++)
        arry[i]*=number;//'+=','-=','/='
}

2.平方数组中的每个元素

void SquareArrayElemnts(int arry[],int size,int number)
{
    for(int i=0;i<size;i++)
        arry[i]=pow(arry[i],2);
}

注:

1.pow()是 C 语言标准库<math.h>中的函数,用于计算一个数的幂次方

2.需包含<math.h>头文件。

五、删除数组中的元素

1.按数据项删除

void delete_item(int arry[],int size,int x)
{
    int flag=0;
    for(int i=0;i<size;i++)
        if(arry[i]==x) //在arry[]中寻找要删除的元素x
        {
            flag=1;
            break;
        }
        if(flag==1)   
        {
            for(int k=i;k<size;k++)
                arry[i]=arry[i+1];
        }
        else
            printf("这个数据不存在");
}

2.按位置删除

void delete_location(char arry[],int delete_element)
{
       for(int i=delete_element;i<strlen(arry)-1;i++)
            array[i]=array[i+1];
}

六、数组中的最值

1.求数组中的最大值

int FindMaxNumber(int arry[],int size)
{
    int max = arry[0];
    for(int i=0;i < size;i++)
        if (arry[i] >= max)
            max = arry[i];
    return max;
}

2.求数组中的最小值

int FindMinNumber(int arry[],int size)
{
    int min = arry[0];
    for( int i=0; i < size; i++)
        if (arry[i] <= min)
            min = arry[i];
    return min;
}

八、数组中的排序

1.按字母排序

void AlpaSort(char *array[], int size) {
    char *temp;  // 用于交换指针的临时变量
    for (int j = 0; j < size - 1; j++) {
        for (int i = 0; i < size - j - 1; i++) {
            if (strcmp(array[i], array[i + 1]) > 0) {
                // 直接交换指针
                temp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = temp;
            }
        }
    }
    // 打印排序结果
    for (int i = 0; i < size; i++) {
        printf("%s\n", array[i]);
    }
}

int main() {
    // 初始化多个字符串(确保数量与size一致)
    char* array[] = { "bdekwr", "apple", "orange", "cat", "dog" };
    AlpaSort(array, 5);  // 传入正确的size
    return 0;
}

注:

(1)strcmp逐字符比较两个字符串str1str2,直到遇到不相等的字符或字符串结束符\0。比较基于字符的 ASCII 值。

(2)返回值含义

返回值 < 0:str1的第一个不匹配字符的 ASCII 值小于str2的对应字符。

返回值 = 0:两个字符串完全相同。

返回值 > 0:str1的第一个不匹配字符的 ASCII 值大于str2的对应字符。

2.判断字符串是否是回文字符串

回文字符串是指正读和反读都相同的字符串。例如,"madam"、"racecar"、"level" 都是回文字符串。空字符串或单个字符的字符串也被视为回文。

int ExcludeSpecialString(char arry[], int size) 
{
    // 创建一个临时数组用于存储过滤后的字符
    char Copy_arry[size];
    int k = 0;

    // 定义枚举类型表示是否为回文字符串
    enum {NOT_palindrome, palindrome};
    
    // 遍历输入字符串
    for (int i = 0; i < strlen(arry); i++)
    {
        // 检查当前字符是否为字母(大小写)
        if ((arry[i] >= 'a' && arry[i] <= 'z') || (arry[i] >= 'A' && arry[i] <= 'Z'))
        {
            // 将字母字符存入临时数组
            Copy_arry[k] = arry[i];
            k++;
        }
    }
    
    // 在字符串末尾添加终止符
    Copy_arry[k] = '\0';
    
    // 比较字符串与其反转后的字符串(不区分大小写)
    if (strcmpi(Copy_arry, strrev(Copy_arry)) == 0)
        return palindrome;  // 是回文字符串
    else
        return NOT_palindrome;  // 不是回文字符串
}

注意:如果用的是Visual Studio 2022编译环境strrev()函数需改为_streev()否则会报错

九、数组中的数学

1.让数组元素唯一

int Find(int array[], int start, int end, int whatToFind)
{
    // 定义枚举类型表示查找结果:未找到(NOT_Find)和找到(Find)
    enum{NOT_Find,Find};
    int search_result = NOT_Find;  // 初始化查找结果为未找到
    
    // 遍历数组从start到end的范围
    for (int i = start; i <= end; i++)
        // 如果当前元素等于要查找的值
        if (array[i] == whatToFind)
        {
            search_result = Find;  // 更新查找结果为找到
            break;  // 提前退出循环
        }
    return search_result;  // 返回查找结果
}

void Distanct(int arry[], int size)
{
    // 第一个元素在之前没有出现过,肯定是唯一的,直接输出
    printf("%d\n", arry[0]);
    
    // 从第二个元素开始遍历数组
    for (int i = 1; i < size; i++) {
        // 调用Find函数检查当前元素是否在之前的子数组中出现过
        if (! Find(arry, 0, i -1, arry[i]))
            // 如果未出现过,输出该元素
            printf("%d\n", arry[i]);
    }
}

int main() {
    // 定义一个测试数组
    int a[] = {1,2,3,4,2,3,4,5,6,7,8,9,4,8,9};
    // 计算数组大小
    int size = sizeof(a) / sizeof(a[0]);
    // 调用Distanct函数输出所有不重复的元素
    Distanct(a,size);
    return 0;
}

2.计算数组元素的平均值

double Mean(int array[], int size) {
    // 初始化平均值为0
    double avg = 0;
    
    // 遍历数组中的每个元素
    for (int i = 0; i < size; i++)
        // 将当前元素转换为double类型后除以数组大小,并累加到avg中
        avg += (double)array[i] / (double)size;
    
    // 返回计算得到的平均值
    return avg;
}

3. 计算一组整数的加权平均值

加权平均值:加权平均值是一种考虑数据点不同重要程度的平均计算方法。

要计算一组整数的加权平均值,核心是先计算 “数值 × 对应权重” 的总和(加权和),再计算所有权重的总和(权重和),最终通过加权平均值 = 加权和 ÷ 权重和得到结果。

示例

假设学生的成绩和学分如下:

计算加权平均成绩:

  1. 加权和计算:90×4 + 85×3 + 78×2 = 360 + 255 + 156 = 771(代码中weightedSum结果为 771.0)。
  2. 权重和计算:4 + 3 + 2 = 9(代码中weightSum结果为 9)。
  3. 加权平均值:771 ÷ 9 ≈ 85.67(代码中result结果为 85.67,保留 2 位小数)。

应用场景

教育领域:计算加权平均分(如 GPA)。

金融领域:计算投资组合的加权平均收益率。

数据分析:处理不同重要性的样本数据。

double WMean(double array[], double weights[], int size)
{
    double Msum = 0;
    double Wsum = 0;
    for (int i = 0; i < size; i++) {
        Msum += array[i] * weights[i];
        Wsum += weights[i];
    }
    return Msum / Wsum;
}

4.计算已排序数组元素的中值

// 计算浮点数数组的中位数
float median(float array[], int size)
{
    int n = 0;
    n = size / 2; // 计算中间位置的索引
    
    // 如果数组长度为奇数,直接返回中间元素
    if (size % 2 != 0)
        return array[n];
    // 如果数组长度为偶数,返回中间两个元素的平均值
    else
        return (array[n - 1] + array[n]) / 2;
}

5.找出数组元素的众数

// 函数:计算数组中特定元素出现的次数
// 参数:a[] - 目标数组,size - 数组大小,x - 要统计的元素
// 返回值:元素x在数组中出现的次数
int count(int a[], int size, int x) {
    int frequency = 0; // 初始化计数器
    for (int i = 0; i < size; i++) // 遍历数组
    {
        if (a[i] == x) // 如果当前元素等于目标元素
            frequency++; // 计数器加1
    }
    return frequency; // 返回统计结果
}

// 函数:找出数组中的众数(出现次数最多的元素)
// 参数:a[] - 目标数组,size - 数组大小
// 返回值:数组中的众数
int Mode(int a[], int size)
{
    int temp = a[0]; // 初始化临时变量为数组第一个元素
    for (int i = 0; i < size; i++) // 遍历数组
    {
        // 比较当前元素和下一个元素的出现频率
        if (count(a, size, a[i]) < count(a, size, a[i + 1]))
            temp = a[i + 1]; // 如果下一个元素出现更频繁,更新临时变量
    }
    return temp; // 返回众数
}

6.计算数组的标准差

标准差是用来衡量一组数据离散程度的统计量 —— 它能反映数据相对于平均值的 “分散” 情况:标准差越小,数据越集中在平均值附近;标准差越大,数据的波动范围越广。

一、标准差的核心概念与计算公式

标准差分为总体标准差(针对全部数据,如整个班级的成绩)和样本标准差(针对部分数据,如从班级中抽取 10 人的成绩作为样本),两者计算逻辑相似,仅分母有差异。

1. 计算步骤(通用)

无论总体还是样本,计算都需 3 步:

  1. 计算平均值:所有数据的总和除以数据个数;

  2. 计算偏差平方和:每个数据与平均值的差值(偏差)的平方,再将所有平方值相加;

  3. 计算方差与标准差:方差是 “偏差平方和” 除以数据个数(总体)或 “数据个数 - 1”(样本),标准差是方差的平方根(还原为原数据的量级)。

2.假设一组数据:学生成绩[85, 90, 78, 92, 88],计算总体标准差。

步骤 1:计算平均值μ

总和 =85+90+78+92+88=433数据个数N=5平均值μ=433÷5=86.6

步骤 2:计算偏差平方和

逐个计算 “数据 - 平均值” 的平方,再求和:

步骤 3:计算方差与标准差

方差σ2=119.2÷5=23.84

标准差σ≈4.88

// 计算数组平均值
double Mean(double array[], int size)
{
    // 处理空数组情况,避免除以0
    if (size <= 0) {
        printf("错误:数组大小不能为0或负数\n");
        return 0.0;
    }
    
    double sum = 0;
    for (int i = 0; i < size; i++)
    {
        sum += array[i];
    }
    return sum / size;
}

// 计算数组指定范围内元素的和(包含start和finish)
double Add(double array[], int start, int finish)
{
    double sum = 0;
    // 循环条件,确保包含finish索引的元素
    for (int i = start; i <= finish; i++)
        sum += array[i];
    return sum;
}

// 计算总体标准差
double StandardDeviation(double a[], int size) {
    // 处理无效输入
    if (size <= 0) {
        printf("错误:数组大小不能为0或负数\n");
        return 0.0;
    }
    
    double b[100];
    double mean = Mean(a, size);
    
    // 计算每个元素与平均值的差的平方
    for (int i = 0; i < size; i++)
    {
        double diff = a[i] - mean;
        b[i] = pow(diff, 2);
    }
    
    // 计算方差的平方根(标准差)
    return sqrt(Add(b, 0, size - 1) / size);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文