免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2071 | 回复: 6
打印 上一主题 下一主题

[算法] 一个字符串有关的程序,求思路 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-16 19:20 |只看该作者 |倒序浏览
要求是这样的,一个简单的日程记事本,按照用户输入的日期和时间(24小时制)排序,其中日期是一定要输入的,时间则可以省略。
例如:
用户输入
7 Dental appointment
5 8:00 - Saturday class
5 19:00 - Dinner with Marge and Russ
屏幕将输出:
5 8:00 - Saturday class
5 19:00 - Dinner with Marge and Russ
7 Dental appointment

如果只是要求按日期排序到还不是很难,用一个day_str[]读入前两位再用strcmp和已存放好的日程比较就可以了。
但后面的时间该怎么处理呢?想过用一个time_str[]来放时间,可一来时间可以省略,二来和已经存放好的日程该如何只比较时间呢?(假设日期加上空格共占三位,时间占五位,于是从第四位开始,比较时间的五位?)

希望大家给点思路,关于字符串的处理,小弟还是新手,许多东西还不太明白。

下面是只按日期排序的程序:
#include <stdio.h>
#include <string.h>

#define MAX_REMIND 50
#define MSG_LEN 60

int read_line(char str[], int n);

int main(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;char reminders[MAX_REMIND][MSG_LEN+1];
&nbsp;&nbsp;&nbsp;&nbsp;char day_str[3], msg_str[MSG_LEN+1];
&nbsp;&nbsp;&nbsp;&nbsp;int day, i, j, num_remind = 0;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for(;;) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (num_remind == MAX_REMIND) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("--No space left--\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Enter day and reminder: ");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%2d", &day);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (day == 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (day < 0 || day>= 31) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Error!!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(day_str, "%2d", day);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_line(msg_str, MSG_LEN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i < num_remind; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (strcmp(day_str, reminders[i]) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (j = num_remind; j > i; j--)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(reminders[j], reminders[j-1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(reminders[i], day_str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcat(reminders[i], msg_str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num_remind++;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;printf("\nDay Reminder\n");
&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i< num_remind; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" %s\n", reminders[i]);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;system("pause");
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int read_line(char str[], int n)
{
&nbsp;&nbsp;&nbsp;&nbsp;char ch;
&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;while ((ch = getchar()) != '\n')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i < n)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[i++] = ch;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[i] = '\0';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return i;
}

论坛徽章:
0
2 [报告]
发表于 2009-04-16 21:09 |只看该作者
c++ 的话很好办
用仿函数 直接传给sort就可以了

typedef struct node
{
   string s1; //day
   string s2;//time
   string s3;//text
}TYPE;

bool cmp(TYPE obj1, TYPE obj2)
{
      if(obj1.s1 < obj2.s1) return 1;
      if((obj.s1 == obj2.s2) && obj1.s2 <= obj2.s2) return 1;
      else return 0;
}
......
TYPE s[N];
....
sort(s,s+N,cmp);
....

论坛徽章:
0
3 [报告]
发表于 2009-04-17 10:50 |只看该作者
关键就在于是C……
谢谢你,等我学了C++也许就更明白了。

论坛徽章:
0
4 [报告]
发表于 2009-04-17 11:52 |只看该作者

回复 #1 niexinnm 的帖子

以“:” 作为截断符, 分别读出小时和分。
用sscanf 直接存到为整形hour 和minutes 比较撒

论坛徽章:
0
5 [报告]
发表于 2009-04-17 18:38 |只看该作者
多谢多谢~ 我去试试哈~

论坛徽章:
0
6 [报告]
发表于 2009-04-20 10:45 |只看该作者

回复 #1 niexinnm 的帖子

用函数指针
void sort(Type* arr, int left, int right, int(*cmp)(Type* memo1, Type* memo2));
cmp又可以实现多种排序方式,按名称,日期, ...


备忘应该把日期和时间分开为两个字段
而且备忘的存储方式应该用树或链表吧

[ 本帖最后由 daxi1987 于 2009-4-20 10:47 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-04-20 15:36 |只看该作者
输入格式   + 时间分离 +  时间比较
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP