现代软件工程 第一章 【概论】第3题——张晓丽

本文介绍了当前流行的源程序版本管理软件和项目管理软件,包括Microsoft TFS、GitHub、Trac、Bugzilla、Apple XCode等,并分析了各自的优缺点。

第3题 目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?

参照http://www.cnblogs.com/WJ1234/p/5285595.html

    http://www.360doc.com/content/12/0712/11/4565_223745448.shtml

1、Microsoft TFS的优缺点:

优点:是对敏捷,msf,cmmi等项目、过程管理、过程改善的支持。任务版上能将需求、项目进度一览无余,对于小团队而言,比甘特图更有用。

缺点:能应用起来的团队、公司的数量极少,多数真正用起来,也就是源代码管理这部分,这也仅仅是占TFS极小部分功能。

2、GitHub的优缺点:

优点:GitHub提供Git存储库服务,基于web,允许你使用Git的源代码管理功能,或者其特性。

缺点:如果有不公开的专案的话,需要付费,没有一个很清楚的图表可以看清楚所有专案的milestone due day顺序,没有甘特图可以看,只有英文界面

3、Trac的优缺点:

优点:非常灵活,可以随心所欲控制可以和SVN集成

缺点:功能不是很强大

4、Bugzilla的优缺点:

优点:免费,有中文版支持

缺点:快速搜索结果不准确。只能管理缺陷。

5、Apple XCode的优缺点:

优点:编译速度极快,每次操作都很快速和轻松。自动提供撤消、重做和保存功能,无需编写任何编码。

缺点:更新版本后,某个插件可能会失效。

6、Visual Source Safe的优缺点:

优点:如果开发工具是VS.NET,用VSS较合适,方便,安装配置和使用都简单,版本控制简单,打label后,要还原到这个版本较简单

缺点:基局域网,效率低,VSS自身安全性较差,只支持widows平台下

7、Concurrent Version System的优缺点:

优点:一度成为主流,不必担心数据流失,对中文路径名支持的较好,本地文件与库的对应可以多对多

缺点:不支持文件改名且只允许存储文件,管理员很难清楚的知道一个项目到底有多少个用户各用户的权限和密码是什么只能用分组的方式管理用户而且密码和权限还是不清晰

8、subversion的优缺点:

优点:支持文件重命名提交系统会提示删除旧文件,创建新文件,删除本地文件提交库中文件也被删除

缺点:要将权限控制文件保存为svn支持的UTF-8格式,一个库可以有多个工作目录但一个工作目录只能对应一个库虽然可以更改库位置但是要求很严格,库中文件存放方式,看不到文件真正的内容

缺点:可能不是捕捉创意过程和记录创意点子的最佳工具。对于这种特殊功能模拟可以选择LayerVault 或其他相似工具。 之前,我们已经强调过Github非常适用代码跟踪,但是却不是最好的设计跟踪工具。将图片内容转化为代码,或者将设计用于产品设置,看起来依旧不是那样顺利。

 

 

转载于:https://www.cnblogs.com/hahalovejava20160905/p/5857375.html

好的,这是一个比较完整的程序,我会逐步给出代码,如果您有任何疑问可以随时问我。 首先,我们需要定义一个结构体来存储每个同学的信息,包括学号、姓名、三门成绩和平均分。代码如下: ```c struct student { int id; char name[20]; float math; float english; float c; float average; }; ``` 接下来,我们需要编写读取文件的函数,从 score.txt 文件中读入每个同学的成绩,并存储到结构体数组中。代码如下: ```c #define MAX_STUDENT 100 int read_scores(struct student stu[]) { FILE *fp; int i = 0; fp = fopen("score.txt", "r"); if (fp == NULL) { printf("Error opening file!\n"); exit(1); } while (!feof(fp) && i < MAX_STUDENT) { fscanf(fp, "%d %s %f %f %f", &stu[i].id, stu[i].name, &stu[i].math, &stu[i].english, &stu[i].c); i++; } fclose(fp); return i; } ``` 接下来,我们需要编写一个函数来计算每个同学的平均分。代码如下: ```c void calculate_average(struct student stu[], int n) { int i; for (i = 0; i < n; i++) { stu[i].average = (stu[i].math + stu[i].english + stu[i].c) / 3; } } ``` 然后,我们需要编写一个函数来对成绩按照平均分进行排序。代码如下: ```c void sort_by_average(struct student stu[], int n) { int i, j; struct student temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (stu[j].average < stu[j + 1].average) { temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } } ``` 最后,我们需要编写一个函数来将结果输出到屏幕并写入文件 score_avg.txt 中。代码如下: ```c void output_scores(struct student stu[], int n) { int i; FILE *fp; fp = fopen("score_avg.txt", "w"); if (fp == NULL) { printf("Error opening file!\n"); exit(1); } printf("学号\t姓名\t高数\t英语\tC语言\t平均分\n"); fprintf(fp, "学号\t姓名\t高数\t英语\tC语言\t平均分\n"); for (i = 0; i < n; i++) { printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].english, stu[i].c, stu[i].average); fprintf(fp, "%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].english, stu[i].c, stu[i].average); } fclose(fp); } ``` 最后,我们将所有函数组合起来,形成一个完整的程序,并在主函数中调用它们。完整代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENT 100 struct student { int id; char name[20]; float math; float english; float c; float average; }; int read_scores(struct student stu[]) { FILE *fp; int i = 0; fp = fopen("score.txt", "r"); if (fp == NULL) { printf("Error opening file!\n"); exit(1); } while (!feof(fp) && i < MAX_STUDENT) { fscanf(fp, "%d %s %f %f %f", &stu[i].id, stu[i].name, &stu[i].math, &stu[i].english, &stu[i].c); i++; } fclose(fp); return i; } void calculate_average(struct student stu[], int n) { int i; for (i = 0; i < n; i++) { stu[i].average = (stu[i].math + stu[i].english + stu[i].c) / 3; } } void sort_by_average(struct student stu[], int n) { int i, j; struct student temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (stu[j].average < stu[j + 1].average) { temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } } void output_scores(struct student stu[], int n) { int i; FILE *fp; fp = fopen("score_avg.txt", "w"); if (fp == NULL) { printf("Error opening file!\n"); exit(1); } printf("学号\t姓名\t高数\t英语\tC语言\t平均分\n"); fprintf(fp, "学号\t姓名\t高数\t英语\tC语言\t平均分\n"); for (i = 0; i < n; i++) { printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].english, stu[i].c, stu[i].average); fprintf(fp, "%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].english, stu[i].c, stu[i].average); } fclose(fp); } int main() { struct student stu[MAX_STUDENT]; int n; n = read_scores(stu); calculate_average(stu, n); sort_by_average(stu, n); output_scores(stu, n); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值