热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c语言对二维数组根据某一值划分为两个二维数组

前一篇文章说了如&

c C S V 这一篇文章将会在将对得到二维数组根据某一个值进行划分操作

CSV文件

x1,x2,x3,x4,y
3.6216,8.6661,-2.8073,-0.44699,0
4.5459,8.1674,-2.4586,-1.4621,0
3.866,-2.6383,1.9242,0.10645,0
3.4566,9.5228,-4.0112,-3.5944,1
0.32924,-4.4552,4.5718,-0.9888,1
4.3684,9.6718,-3.9606,-3.1625,1

x2=8.1674" role="presentation" > x 2 = 8.1674 为界限,把二维数组划分为两部分,对于二维数组中的每一行来说x2" role="presentation" > x 2 的值大于8.1674" role="presentation" > 8.1674 的存储在一个二维数组里面,小于8.1674" role="presentation" > 8.1674 的每一行存储在一个二维数组里面

思路很简单,就是利用循环来进行划分操作

先来一个Python版本的伪代码,比较直观:

def split(index, value, dataset):
    left, right = list(), list()
    for row in dataset:
        if row[index] else:
            right.append(row)
    return left, right

c语言里面没有append()" role="presentation" > a p p e n d ( ) 操作,只能利用双重循环来进行赋值,并且我们要利用两个链表来记录所在行x2" role="presentation" > x 2 的值小于和大于8.1674" role="presentation" > 8.1674 值所在行的行下标

完整的c语言代码

#include 
#include 
#include 

struct node{
    int data;
    struct node *next;
};//链表的定义 

void get_two_dimension(char* line, double** data, char *filename);
void print_two_dimension(double** data, int row, int col);
int get_row(char *filename);
int get_col(char *filename);
int Gini(int** train_data, int* target);
void split_data(double **data, int index, int value, int row, int col);

int main()
{
    char filename[] = "C:\\Users\\...\\...\\csvtest.csv";
    char line[1024];
    double **data;
    int row, col;
    int index = 1;
    double value = 8.1674;
    row = get_row(filename);
    col = get_col(filename);
    data = (double **)malloc(row * sizeof(int *));
    for (int i = 0; i double *)malloc(col * sizeof(double));
    } 
    get_two_dimension(line, data, filename);
    printf("row = %d\n", row);
    printf("col = %d\n", col);
    split_data(data, index, value, row, col);
}

void get_two_dimension(char* line, double** data, char *filename)
{
    FILE* stream = fopen(filename, "r");
    int i = 0;
    while (fgets(line, 1024, stream)) 
    {
        int j = 0;
        char *tok;
        char* tmp = strdup(line);
        for (tok = strtok(line, ","); tok && *tok; j++, tok = strtok(NULL, ",\n")){
            data[i][j] = atof(tok); 
        } 
        i++;
        free(tmp);
    }
    fclose(stream);
}

void print_two_dimension(double** data, int row, int col)
{
    int i, j;
    for(i=1; ifor(j=0; jprintf("%f\t", data[i][j]);
        }
        printf("\n");
    }
}

int get_row(char *filename)
{
    char line[1024];
    int i;
    FILE* stream = fopen(filename, "r");
    while(fgets(line, 1024, stream)){
        i++;
    }
    fclose(stream);
    return i;
}

int get_col(char *filename)
{
    char line[1024];
    int i = 0;
    FILE* stream = fopen(filename, "r");
    fgets(line, 1024, stream);
    char* token = strtok(line, ",");
    while(token){
        token = strtok(NULL, ",");
        i++;
    }
    fclose(stream);
    return i;
}

void split_data(double **data, int index, int value, int row, int col)
{
    node *left_node, *right_node;//left_node记录小于x2的行下标,right_node记录大于x2的行下标 
    left_node = (node *)malloc(sizeof(node));
    right_node = (node *)malloc(sizeof(node));
    left_node->next = NULL;
    right_node->next = NULL; 
    int count_left_size=0, i, count_right_size=0, j, k;
    for(i=1; iif(data[i][index] else
            count_right_size++;
    }//计算两个二维数组的长度 
    printf("left size = %d\n", count_left_size);
    printf("right size = %d\n", count_right_size);
    double left_array[count_left_size][col], right_array[count_right_size][col];
    for(i=1; iif(data[i][index] malloc(sizeof(node));
            p->data = i;
            p->next = left_node->next;
            left_node->next = p;
        }//对所在行x2的值小于8.1674的行下标进行链接 
        else{
            node *q;
            q = (node *)malloc(sizeof(node));
            q->data = i;
            q->next = right_node->next;
            right_node->next = q;
        }//对所在行x2的值大于8.1674的行下标进行链接 
    }
    left_node = left_node->next;//链表的头部不存储行下标,往后移一位 
    right_node = right_node->next;//链表的头部不存储行下标,往后移一位 
    i = 0;
    while(left_node){
        for(j=0; jdata][j];
        }//赋值操作 
        left_node = left_node->next;
        i++;
    }
    i = 0;
    while(right_node){
        for(j=0; jdata][j];
        }//赋值操作 
        right_node = right_node->next;
        i++;
    }

    for(i=0; iprintf("I'm left\n");
        for(j=0; jprintf("%f\t", left_array[i][j]);
        }
        printf("\n");
    }
    for(i=0; iprintf("I'm right\n");
        for(j=0; jprintf("%f\t", right_array[i][j]);
        }
        printf("\n");
    }
}

运行结果

row = 7
col = 5
left size = 2
right size = 4
I'm left
0.329240        -4.455200       4.571800        -0.988800       1.000000
I'm left
3.866000        -2.638300       1.924200        0.106450        0.000000
I'm right
4.368400        9.671800        -3.960600       -3.162500       1.000000
I'm right
3.456600        9.522800        -4.011200       -3.594400       1.000000
I'm right
4.545900        8.167400        -2.458600       -1.462100       0.000000
I'm right
3.621600        8.666100        -2.807300       -0.446990       0.000000

可以直观的感觉到Python代码是多么的简洁,不过在用c语言实现时用到了单链表,终于感觉单链表没白学了。


推荐阅读
  • 1、逻辑型(logical)该类型变量值为1或0。2、字符型(char)Matlab的字符型输入需使用单引号ÿ ... [详细]
  • 九日集训 Day 4 指针
    一、概念定义1、指针即地址计算机中所有的数据都必须放置在内存中,不同类型的数据占用的字节数也不一样,例如32位整型int占据4个字节,64位整型longlong占据8个字节,字符型 ... [详细]
  • 本文目录一览:1、《C语言程序设计第四版》pdf下载在线阅读全文,求百度网盘云资源 ... [详细]
  • 局限性_Scrum框架的局限性
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Scrum框架的局限性相关的知识,希望对你有一定的参考价值。在很多工作坊的讨论中, ... [详细]
  • 摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的 ... [详细]
  • 重学数据结构之链表篇
    本文是重学数据结构系列文章的第二篇,本文和大家一起探讨链表的相关知识。重学数据结构之数组篇文章目录链表是怎么样的数据结构链表的特点常见的链表结构单链表双向链表循环链表链表or数组链 ... [详细]
  • 最近想用js做一个简单的计算器,不过网上的例子好像大部分都是直接从左到右挨个计算,就好像1+2*5,就会先计算1+2,再计算3*5,并没有实现运算符的优先级,这里找到了一种方法实现,来总结一下。不过这 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了将JSON数组反序列化为强类型的.NET对象相关的知识,希望对你有一定的参考价值。 ... [详细]
  • DFS基本概念步骤优缺点典型例题递推基本概念直接或者间接调用自身的算法称为递归算法一般数据n ... [详细]
  • 题目链接:杭电多校7-VirtualJudgevjudge上题目显示的有问题,我下面附上官方题目:样例输入:32201 ... [详细]
  • 我正在使用数组列表通过构建一个交互式菜单供用户选择来存储来自用户输入的值。到目前为止,我的两个选择是为用户提供向列表输入数据和读取列表的全部内容。到目前为止,我创建的代码由两个类组成。 ... [详细]
  • (一)javax.mail.Session:Session类代表JavaMail中的一次邮件会话.每个基于JavaMail的应用程序至少有一次会话,也可以产生多次会话.发送邮件之前 ... [详细]
  • 字符串匹配: BF与KMP算法
    文章目录一.BF算法1.算法思想2.代码实现二.KMP算法1.算法思想概述2.理解基于最长相等前后缀进行匹配3.代码中如何实现next数组5.代码实现6.next数组的优化一.BF ... [详细]
  • java内存模型浅析_浅析Java内存模型
    在并发编程中,需要处理两个关键问题:线程之间如何通信以及线程之间如何同步。通信是指线程之间以何种机制来交换信息。同步是指程序中用于控制不同线程间操作发生 ... [详细]
  • 1.什么是hashcode方法?hashcode方法返回对象的哈希码值在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有改变& ... [详细]
author-avatar
快乐xin_yi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有