北大考研复试上机——日志排序(C语言)

在这里插入图片描述
在这里插入图片描述

个人总体思路

当时我看了很多人的答案,发现千篇一律基本都是用结构体来做的,但是我本人不喜欢用结构体(其实是我不太会用结构体),我就想着能不能用字符串做。

首先是数据的存储

这里我定义了一个两个二维字符串数组 a[10002][100], b[10002][100],a数组要对它进行一系列操作,最后可能会有数据的丢失,所以我这里相当于将原始数据拷贝到b数组中,方便最后的输出。每行100个是足够用的,再考虑到每行数据中可能含有空格,所以这里用gets()来读入函数,然后用死循环来做,判断字符长度是否为0,如果是0就break;

然后是字符串后面秒数的读取(关键)

这里我通过分析每条数据的组成结构后发现数据的特点,发现每条数据中有一个独一无二的符号“,”,
在这里插入图片描述
它就是我的突破口,通过使用strchr()函数来将一个指针指向这个“,”,但是还不够,还要想办法越过这个315,再次使用strchr()函数在刚才那个指针的基础上再次寻找空格,这时候我们指针后面的东西就是“ 253.035(s) ”了,这里再通过我的s函数将"(“替换为”\0",现在我们这个指针所指的字符串就是" 253.035"了。
但是它现在还是一个字符串,我们这里用一个 atof 进行强制类型转换,它可以将字符串类型强制转换为一个浮点型数据,然后我们将之存储到我们新建的浮点数数组中。

接下来就是排序问题了

这里我们每一组数据中的需要比较的数据已经被我们提取并存储到我们的数组中去了
这里我们通过冒泡排序法进行排序,使用选择排序法无法满足相同时间按照输入的先后顺序输出这一要求。
这里需要注意的就是将我们浮点数数组排序的同时将我们的b数组一起连带着进行排序。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void s(char *q)
{
	while (1) {
		if (*q == '(')
		{
			*q = '\0';
			break;
		}
		else if (*q == '\0')
			break;
		q++;
	}
}
int main()
{
	char a[10002][100];
    char b[10002][100];
	int i = 0;
	while (1)
	{
		gets(a[i]);
        strcpy(b[i],a[i]);
		if (strlen(a[i])==0)
		{
			break;
		}
		i++;
	}
	int j = 0;
	double c[10002] = {0};
	for (j = 0; j < i; j++)
	{
		char* p = strchr(a[j], ',');
		p = strchr(p, ' ');
		s(p);
		c[j] = atof(p);
	}
    int n;
	for (int m = 0; m < i - 1; m++) {
		for (n = 0; n < i - 1 - m; n++) {
			if (c[n] > c[n + 1])
			{
				double o;
				o = c[n];
				c[n] = c[n + 1];
				c[n + 1] = o;
				char r[100];
				strcpy(r, b[n]);
				strcpy(b[n], b[n + 1]);
				strcpy(b[n + 1], r);
			}
		}
	}
	for (int y = 0; y < i; y++)
		printf("%s\n",b[y]);
	return 0;
}

这里就是我的代码,写的的比较乱,函数用的也不多,没有打备注,我觉得上面的文字介绍已经介绍的很清楚了,有时间在整理下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值