当前位置:网站首页>【C补充】【字符串】按日期排序显示一个月的日程
【C补充】【字符串】按日期排序显示一个月的日程
2022-07-01 16:28:00 【一苇以航fp】
1、程序说明
要求: 用户按固定格式输入一系列日程(输入0时停止),程序将其按日期排序,并逐行显示。
输入格式: “日期 事件”。例如 “24 Mom’s birthday”
2、思路
2.1 字符串存储形式
- 将读入的字符串中的日期和事件分开存储(
scanf读取日期,getchar逐个读取事件字符串),便于之后的比较和排序。 - 排序(
strcpy函数)结束后,二者合并(strcat函数)存储,存储在二维字符数组中; - 将排序好且合并后的字符数组逐行输出。
2.2 排序存储的方法
- 提取日期,单独存储,将其与此前的日期比较(
strcmp函数);
此前的日期已被存储在日程字符串的前2位,由strcmp函数的比较机制,不必额外单独提取 - 找到比其大的那一行,余下各行各下移一行,空出该行的位置;
由数组存储机制,下移实际是后移 - 将该日期对应的完整内容存储在空出的该行之中。
3、代码
/************************************ * 显示一个月的日程列表 * * **********************************/
#include<stdio.h>
#include<string.h>
#define MAX_REMIND 50 //事件个数上限
#define MSG_LEN 60 //各事件描述的长度上限
int read_line(char str[], int n); //读取事件内容并存储
int main(void)
{
char reminders[MAX_REMIND][MSG_LEN+3]; //+3是预留日期和字符串空字符的位置
char day_str[3], msg_str[MSG_LEN+1]; //临时存储日期和事件
int day, i, j;
int num_remind = 0; //记录已读取的日程数量
//设置死循环,保证用户可持续输入
for(;;){
//限制读取数量
if(num_remind == MAX_REMIND){
printf("———————————— 日程已达上限 ————————————\n");
break;
}
printf("Enter day and reminder: ");
scanf("%2d", &day); //读取前两位的数字
if(day == 0) break; //读取终止
sprintf(day_str, "%2d", day); //将日期转换为字符串存储,占两格右对齐
read_line(msg_str, MSG_LEN); //读取事件并存储
/********按日期排序********/
//逐行比较,找到适合适合的位置(i)
for(i=0; i<num_remind; i++){
if( strcmp(day_str, reminders[i]) < 0 ) break;
}
//空出该位置所在行(其下方字符串各下移一行)
for(j=num_remind; j>i; j--){
strcpy( reminders[j], reminders[j-1] );
}
//将日期和事件合并存储
strcpy( reminders[i], day_str );
strcat( reminders[i], msg_str );
num_remind++;
}
//逐行显示排序后的日程
printf("\n\nDay Reminder: \n");
for(i=0; i<num_remind; i++){
printf(" %s\n", reminders[i]);
return 0;
}
int read_line(char str[], int n)
{
int i=0, ch;
while( (ch=getchar()) != '\n' ) //空格不会被跳过(与scanf不同)
if(i<n) str[i++] = ch;
str[i] = '\0'; //字符数组末位加空字符,成为字符串
return i; //返回字符数组长度
}
4、运行结果示例

边栏推荐
- [kotlin] Introduction to higher-order functions
- sql刷题627. 变更性别
- P2893 [usaco08feb] making the grade g (DP & priority queue)
- Jojogan practice
- Tutorial on principles and applications of database system (004) -- MySQL installation and configuration: resetting MySQL login password (Windows Environment)
- What are the differences between PHP and DW
- 判断链表是否是回文链表
- How to use phpipam to manage IP addresses and subnets
- Determine whether the linked list is a palindrome linked list
- Detailed explanation of activity life cycle and startup mode
猜你喜欢

Redis distributed lock

博睿数据一体化智能可观测平台入选中国信通院2022年“云原生产品名录”

SystemVerilog-结构体(二)

模板引擎Velocity 基础
![[live broadcast appointment] database obcp certification comprehensive upgrade open class](/img/50/83a533f4e8a60f90e03b991385c08d.jpg)
[live broadcast appointment] database obcp certification comprehensive upgrade open class

机器学习11-聚类,孤立点判别

Babbitt | yuan universe daily must read: Naixue coin, Yuan universe paradise, virtual stock game Do you understand Naixue's tea's marketing campaign of "operation pull full"

Flux d'entrées / sorties et opérations de fichiers en langage C

SQL question brushing 586 Customers with the most orders
![[pyg] document summary and project experience (continuously updated](/img/b4/75da8c3e657069be4e3e3bfd5b2dc0.png)
[pyg] document summary and project experience (continuously updated
随机推荐
Research and investment strategy report of China's sodium sulfate industry (2022 Edition)
sql刷题1050. 合作过至少三次的演员和导演
GaussDB(for MySQL) :Partial Result Cache,通过缓存中间结果对算子进行加速
如何使用 etcd 实现分布式 /etc 目录
FRP intranet penetration, reverse proxy
【直播预约】数据库OBCP认证全面升级公开课
Zabbix2.2 monitoring system and application log monitoring alarm
模板引擎Velocity 基础
China sorbitol Market Forecast and investment strategy report (2022 Edition)
Advantages, values and risks of chain games compared with traditional games
游戏行业安全选择游戏盾,效果怎么样?
Redis 分布式锁
【C语言基础】12 字符串
毕业季 | 华为专家亲授面试秘诀:如何拿到大厂高薪offer?
数据库系统原理与应用教程(002)—— MySQL 安装与配置:MySQL 软件的卸载(windows 环境)
博睿数据一体化智能可观测平台入选中国信通院2022年“云原生产品名录”
数据库系统原理与应用教程(006)—— 编译安装 MySQL5.7(Linux 环境)
Golang爬虫框架初探
AI college entrance examination volunteer filling: the gods of Dachang fight, and candidates pay to watch
拼接字符串,得到字典序最小的结果