使用Time类遍历一学期的所有天

本文介绍了一种遍历一学期所有日期的算法实现过程,并通过具体代码示例展示了如何从学期初开始遍历到学期末,同时记录每周的日期变化。

 

其中:

 

        Time t = new Time();
        t.set(21, 1, 2011); // 2011-2-21日
        Log.i("test", "t:" + t.format2445() + " " + t.getWeekNumber() + " " + t.toMillis(true));
        t.normalize(true); // 没有这一步计算结果总会出错,到底这一步做了些什么还不清楚
        Log.i("test", "t:" + t.format2445() + " " + t.getWeekNumber() + " " + t.toMillis(true));

 

打印结果如下:

 

t:20110221 7 1298217600000

t:20110221 8 1298217600000

 

一个是7,一个是8,原因还请高手指明。

<think>嗯,用户想用C语言在Visual Studio里开发个学生选课管理系统,需要用到链表和文件操作。首先,我得理清楚每个功能模块怎么实现。 首先,用户身份登录。系统有管理员和学生,得设计个登录界面,输入用户名和密码,然后根据身份跳转到不同菜单。可能需要两个结构体,个存用户信息,另个存学生和课程的数据。这里可能需要把用户信息存在文件里,比如admin.txt和student.txt,登录时读取验证。 然后是课程和学生信息管理。管理员需要增删改查课程和学生信息,这部分得用链表来动态管理数据,同时每次操作后保存到文件。比如,课程信息可能包括课程编号、名称、学分、时间、性质等。学生信息要有学号、姓名、已选课程、学分等。这里得考虑文件读写的方式,比如二进制还是文本,可能用fwrite和fread配合链表遍历。 课程查询功能,管理员和学生都能查看,按学分或课程性质筛选。这需要遍历课程链表,根据条件输出。比如用户输入要查询的学分,循环检查每个课程的学分是否符合。 选课管理部分比较复杂。学生选课时要检查学分是否超过60,还要判断时间是否冲突。每门课程可能有上课时间,比如周节到第三节,这里需要设计时间存储结构,比如用位段或者数组记录每的节次。选课时遍历已选课程的时间,与新课程比较是否有重叠。如果冲突,提示不能选。选成功后更新学生的已选课程链表,并累加学分。 统计选修人数,管理员查看每门课程的选课人数。课程结构体中需要有个计数器,记录当前选课人数。当学生选课成功时,该课程的计数器加,并在管理员查看时遍历课程链表输出。 接下来是数据结构的设计。学生和课程都需要用链表,所以每个结构体要有next指针。学生选课的话,可能需要个课程列表,比如在学生结构体中包含个指向课程节点的指针数组,或者另个链表。不过可能更简单的是,在学生结构体中有个选课链表,记录该学生选的所有课程。 文件存储方面,每次程序启动时需要读取保存的课程和学生信息到链表中,退出时保存回去。需要注意文件读取和写入时的格式,比如用二进制保存整个结构体可能方便,但要注意指针的问题,因为链表节点在文件中无法保存指针地址,所以可能需要用唯标识符(如课程编号)来重建链表关系。 时间冲突检测是个难点。假设每门课程有多个时间段,比如每周几的第几节,可以用个二维数组或者结构体数组来存储。例如,定义个时间结构体,包含星期几和节次。学生选课时,遍历已选课程的所有时间,与新课程的时间比较,如果有重叠则冲突。 在编码时,需要注意模块化,把不同的功能分成函数,比如登录函数、管理员菜单、学生菜单、文件读写函数等。链表操作要小心内存泄漏,确保每次添加或删除节点时正确管理内存。 测试方面,需要逐个功能测试,特别是选课的冲突检测和学分累计是否正确。还有文件读写是否正确,比如突然断电或程序崩溃时,数据是否保存完整。 可能遇到的问题:链表操作错误导致程序崩溃,文件读写格式不匹配,时间冲突检测逻辑错误。需要逐步调试,尤其是处理指针和内存分配的地方。 总结下来,步骤大概是:设计数据结构,实现文件读写,编写登录验证,实现管理员功能(增删改查),学生选课功能,最后是统计和查询功能。每个部分分模块开发,逐步测试整合。</think>我将分步骤指导您实现这个系统,以下是详细设计方案: 、系统架构设计 1. 数据结构定义 ```c /* 课程结构体 */ typedef struct Course { char id[20]; //课程编号 char name[50]; //课程名称 int credit; //学分 char type[20]; //课程性质 int time_slot; //时间槽(用位运算表示) int selected_num; //已选人数 struct Course* next; } Course; /* 学生结构体 */ typedef struct Student { char id[20]; //学号 char name[50]; //姓名 char password[20]; //密码 int total_credit; //已选总学分 Course* selected; //已选课程链表 struct Student* next; } Student; ``` 二、核心功能实现步骤 1. 登录模块 ```c void login() { int role; printf("请选择身份:\n1.管理员\n2.学生\n"); scanf("%d", &role); if(role == 1) { // 验证管理员密码 verify_admin(); } else { // 学生登录验证 verify_student(); } } ``` 2. 文件操作模块(示例) ```c // 保存课程数据到文件 void save_courses(Course* head) { FILE* fp = fopen("courses.dat", "wb"); Course* p = head; while(p) { fwrite(p, sizeof(Course), 1, fp); p = p->next; } fclose(fp); } // 从文件加载课程数据 Course* load_courses() { FILE* fp = fopen("courses.dat", "rb"); // 创建链表... } ``` 3. 选课冲突检测算法 ```c int check_time_conflict(Course* selected, Course* new_course) { Course* p = selected; while(p) { if(p->time_slot & new_course->time_slot) { return 1; // 存在时间冲突 } p = p->next; } return 0; } ``` 三、关键功能实现 1. 选课管理流程 ``` 1. 显示可选课程列表 2. 输入课程编号选择 3. 验证学分限制:total_credit + new_credit <= 60 4. 检测时间冲突 5. 更新学生选课链表 6. 更新课程选修人数 ``` 四、系统模块组成 1. admin.c 管理员功能模块 2. student.c 学生功能模块 3. file_io.c 文件操作模块 4. list.c 链表操作模块 5. utils.c 通用工具模块 五、开发建议 1. 使用Visual Studio创建C++空项目(仍使用C语言编写) 2. 分模块开发测试 3. 建议使用二进制文件存储数据 4. 内存管理注意事项: - 每次分配节点后及时初始化 - 退出时释放所有链表内存 - 使用Valgrind等工具检测内存泄漏 六、扩展优化建议 1. 增加选课时间冲突图形化显示 2. 实现课程容量限制 3. 添加选课结果导出功能 4. 增加密码加密存储 5. 实现日志记录功能 需要具体实现某个模块或遇到具体问题时可继续提问,我可以提供更详细的代码示例和调试建议。开发过程中请特别注意链表操作和文件读写的同步问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值