c语言 sysinfo_实验报告C语言数据结构全国交通模拟咨询.doc

浙江工商大学计算机与信息工程学院

数据结构实验大作业报告

专 业: 物流1001

班 级: 1001

学 号: 1012600118

姓 名: 金渐

指导教师: 庄毅

2011年12月8日

一、问题描述

处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

【基本要求】

(1)提供对城市信息进行编辑(如:添加或删除)的功能。

(2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。

(3)提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具。

(4)旅途中耗费的总时间应该包括中转站的等候时间。

(5)咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。

【测试数据】

二、系统设计

系统框图:

模块说明:

本系统共分15个模块

主函数

2、添加城市

查找城市并返回序号

删除城市

添加列车

添加航班

删除列车或航班

找出最小费用路线

打印出最小费用路线

初始化系统数据(读入内存)

找出最快路线

计算最快路线耗费的时间并打印

计算最小费用路线

主界面

存储信息到文件

退出

下面是系统总流程图:

下面是各模块示意图:

三、系统测试

1、主界面

添加城市模块:输入命令 1 后,将提示输入城市名,而后返回主界面

3、删除城市:输入命令2后,提示输入城市名,而后返回主界面

4、添加交通路线:输入命令3,提示输入起点站和重点站,并提示选择火车或飞机,而后输入班次、出发时间、到达时间、票价,而后返回主界面

原train文件:

添加路线后:

5、删除路线:输入命令4,输入班次,而后返回主界面

原train文件:

删除后ttrain文件:

6、查询最小费用路线:输入命令5,并输入起点站和重点站,然后选择交通工具

结果正确!

7、查询时间最短路线:输入命令6,并输入起点站和重点站,然后选择交通工具

四、小结

从小学家里买了电脑起,我对计算机就相当感兴趣,有事没事就喜欢捣鼓捣鼓。六年级的时候,我的第一台台式电脑就这样被我折腾坏了。高中,我迷上了硬件,一放假就泡论坛,研究攒机。大学,我买了一台真正的属于自己的智能手机——魅族M8。买时已经上市超过两年的M8使用的是被微软抛弃的windows CE系统。系统的落后导致了应用程序的匮乏,虽然日常应用勉强可以应付,但是看着android丰富有趣的app不免让人心痒。于是在大一的寒假里我第一次萌生了学习编程的念头。

现在,经过了C语言和数据结构的学习之后,编写一个相对大型的程序的机会终于来了,我也憋足了劲想要写出一个优秀的程序,并且选择了一个具有实际价值的模型——全国交通咨询系统。第一天,我花了周六10个小时的时间写出了寻找相邻城市旅行时间最短的一个函数,然而这只是系统其中的一个简单的功能。至此,我也就做好了在编写过程中遇到相当大困难的准备。但是,后来的一个星期里,虽然利用了所有的课外时间来思考文件的存储格式以及所有城市间的转车、最低费用、最短时间函数,事情却依然毫无进展。由于期末临近,时间紧迫,我只好求助于网上的资料。查阅之后发现求图的最短路径使用的是我还未学会的迪杰斯特拉算法。在认真研究之后,终于将迪杰斯特拉算法加到了自己的程序之中,完成了最最关键的功能。两个星期后的今天,终于完成了系统的全部功能以及测试。

这一次的编程经验,我最大的体会是:

代码的编写、调试并不是最困难的部分。最困难的部分在于如何构思出一个巧妙的软件框架、统一的数据输入输出格式以形成一个完整的体系。包括各种全局变量的设定、模块的划分都是需要很长的时间去考虑完善的。

五、附录

cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include

#include

#include

/////////////////////////////////////结构体定义////////////////////////////////

typedef short int NumType;

typedef struct TrafficWay //交通工具信息 记录了班次

<think>我们正在解决宏重定义警告(-Wmacro-redefined),即'SysInfo_Set_RemoteDisChargeRelay'宏被重复定义。 根据之前的问题,我们知道在头文件重复包含时,如果没有保护措施,会导致重复定义。但是宏重定义警告通常是因为在同一个编译单元中多次定义了同一个宏(可能是由于头文件被多次包含,或者在不同的头文件中定义了相同的宏)。 解决方法: 1. 使用头文件保护宏(#ifndef ... #define ... #endif)或#pragma once来防止头文件被多次包含。但是,如果宏是在不同的头文件中定义的,则需要进一步处理。 2. 检查宏定义的位置,确保只定义一次。如果该宏在多个地方定义,我们需要保留一个定义,移除其他定义。 3. 如果宏定义是相同的,那么我们可以通过条件编译来避免重复定义。例如: #ifndef SysInfo_Set_RemoteDisChargeRelay #define SysInfo_Set_RemoteDisChargeRelay ... // 原来的定义 #endif 4. 如果宏定义不同,那么我们需要确定哪个定义是正确的,并统一使用那个定义。 步骤: 1. 首先查找项目中所有定义'SysInfo_Set_RemoteDisChargeRelay'的地方(可能在头文件中)。 2. 如果多个头文件都定义了该宏,考虑将宏定义集中到一个头文件中,并在其他地方包含这个头文件。 3. 如果宏定义不一致,需要根据项目需求确定使用哪个定义,并删除其他定义。 注意:宏重定义警告可能出现在同一个头文件被多次包含时,也可能出现在不同的头文件定义了同一个宏时。 根据引用[1]中提到的CPU亲和力操作宏,它们通常也是通过条件编译来避免重复定义的,例如: #ifndef CPU_SET #define CPU_SET(cpu, cpusetp) ... #endif 因此,我们可以为宏添加条件定义: 示例: #ifndef SysInfo_Set_RemoteDisChargeRelay #define SysInfo_Set_RemoteDisChargeRelay (0x1234) // 假设这是一个数值或者函数宏 #endif 但是,如果宏定义出现在不同的头文件中,且我们无法修改其中一个(比如是第三方库),我们可以: - 在包含第三方头文件之前,先定义这个宏(这样第三方头文件中的定义会被跳过,因为条件编译已经定义了),但这可能会导致第三方库功能异常,因为宏的含义可能不同。 - 或者,在包含自己的头文件之前,取消第三方头文件的包含,并重新安排包含顺序。 因此,最安全的方法是: 1. 确定宏定义的必要性:如果项目中有多个定义,保留一个,删除其余的定义。 2. 如果确实需要多个定义(比如为了兼容不同平台),则使用不同的宏名称。 由于用户没有提供具体的宏定义内容,我们只能给出一般性建议。 操作步骤: 步骤1:全局搜索宏名称'SysInfo_Set_RemoteDisChargeRelay',找到所有定义的位置。 步骤2:如果发现多个定义,检查每个定义是否相同。如果相同,则选择其中一个,并在其他定义处用条件编译保护(或者删除其他定义)。 步骤3:如果定义不同,需要与开发人员确认正确的定义,然后删除其他定义,或者根据条件(如平台、配置)使用条件编译。 例如,在头文件中这样写: #if defined(PLATFORM_A) #define SysInfo_Set_RemoteDisChargeRelay (0x1000) #elif defined(PLATFORM_B) #define SysInfo_Set_RemoteDisChargeRelay (0x2000) #else #define SysInfo_Set_RemoteDisChargeRelay (0x0000) #endif 步骤4:如果宏定义在同一个头文件中被多次包含(由于没有头文件保护),则添加头文件保护宏(或#pragma once)并确保宏定义也有条件编译保护。 注意:如果宏定义依赖于其他宏,请确保条件编译的正确性。 另外,引用[4]中提到关于dll文件缺失的解决方法,这里不适用,因为我们处理的是宏重定义。 引用[2]和[3]是关于系统调用的,与当前问题无关。 因此,总结解决方案: 1. 为包含该宏定义的头文件添加头文件保护(防止同一头文件被多次包含)。 2. 对宏定义本身添加条件编译保护(防止不同头文件定义同一个宏时重复定义)。 3. 统一项目中的宏定义,确保只有一个定义生效。 具体操作示例: 假设在`config_A.h`中定义: #define SysInfo_Set_RemoteDisChargeRelay 0x01 在`config_B.h`中也定义: #define SysInfo_Set_RemoteDisChargeRelay 0x02 则在包含这两个头文件时,后包含的会覆盖先包含的,导致警告(或错误)。我们可以修改为: 在`config_common.h`中统一条件定义: #ifndef SysInfo_Set_RemoteDisChargeRelay #if defined(USE_CONFIG_A) #define SysInfo_Set_RemoteDisChargeRelay 0x01 #elif defined(USE_CONFIG_B) #define SysInfo_Set_RemoteDisChargeRelay 0x02 #else #define SysInfo_Set_RemoteDisChargeRelay 0x00 #endif #endif 然后在项目中只包含`config_common.h`,并且在编译时通过`-DUSE_CONFIG_A`等来指定配置。 如果无法统一到一个头文件,也可以在每个定义宏的头文件中加上条件编译保护: // config_A.h #ifndef SysInfo_Set_RemoteDisChargeRelay #define SysInfo_Set_RemoteDisChargeRelay 0x01 #endif // config_B.h #ifndef SysInfo_Set_RemoteDisChargeRelay #define SysInfo_Set_RemoteDisChargeRelay 0x02 #endif 这样,如果先包含了`config_A.h`,那么`config_B.h`中的定义就会跳过;反之亦然。但是这样可能会导致使用错误的配置,所以最好还是统一管理。 所以,最终建议:将宏定义集中到同一个配置头文件中,并使用条件编译来区分不同的平台或配置。 相关问题: 1. 如何防止C/C++头文件被重复包含? 2. 如何处理不同平台之间的宏定义冲突? 3. 条件编译的使用场景有哪些? 4. 如何通过编译选项定义宏? 5. 宏重定义警告和错误有什么区别? </think>### 解决宏重定义警告的方法(-Wmacro-redefined) 针对`SysInfo_Set_RemoteDisChargeRelay`宏重定义警告,本质是同一宏名被多次定义但内容不同。解决方法如下: #### 核心解决步骤 1. **添加条件编译保护(首选方案)** 在定义宏的头文件开头添加: ```c #ifndef SYSINFO_SET_REMOTEDISCHARGERELAY_DEFINED #define SYSINFO_SET_REMOTEDISCHARGERELAY_DEFINED ``` 宏定义结束后添加: ```c #endif /* SYSINFO_SET_REMOTEDISCHARGERELAY_DEFINED */ ``` 这确保宏仅首次包含时被定义[^1] 2. **检查重复定义源** - 使用全局搜索查找项目中所有`SysInfo_Set_RemoteDisChargeRelay`定义 - 执行命令: ```bash grep -rn "SysInfo_Set_RemoteDisChargeRelay" /项目路径 ``` - 保留最新/最准确的宏定义,删除冗余定义 3. **统一宏定义格式** 若不同文件需要相同宏,创建专用头文件(如`sysinfo_macros.h`): ```c // sysinfo_macros.h #pragma once #define SysInfo_Set_RemoteDisChargeRelay (0x1u << 12) // 示例定义 ``` 其他文件通过`#include "sysinfo_macros.h"`引用[^1] 4. **检查包含依赖** - 确保头文件包含顺序合理(系统头文件 → 通用头文件 → 专用头文件) - 使用编译命令生成依赖关系图: ```bash gcc -M your_source_file.c ``` #### 特殊情况处理 - **宏定义冲突时** 若不同模块需不同定义,使用模块前缀: ```c // 模块A #define MODA_SysInfo_Set_RemoteDisChargeRelay ... // 模块B #define MODB_SysInfo_Set_RemoteDisChargeRelay ... ``` - **第三方库冲突** 在包含冲突头文件前添加: ```c #define SysInfo_Set_RemoteDisChargeRelay ... // 优先定义 #include "third_party.h" // 第三方库会跳过定义 ``` #### 错误原因图解 ```mermaid graph TD A[头文件A.h] -->|#define MACRO 1| C[编译单元] B[头文件B.h] -->|#define MACRO 2| C C --> D[警告-Wmacro-redefined] ``` #### 验证方法 编译时添加警告选项: ```bash gcc -Wmacro-redefined -c your_file.c -o output.o ``` 修复后警告应消失,且功能测试正常。 > **操作优先级** > 1. 添加条件编译保护(立即生效) > 2. 统一宏定义(项目级优化) > 3. 模块化重命名(长期维护)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值