360从良记

中国早期的互联网,基本上是流氓的天下。

  首先,做站长的基本上都是流氓,这里所说的站长,指那些为追求流量和排名的站长,他们为了增加自己的流量而不择手段,这方面的鼻祖,就是3721插件的创始人的周鸿祎。

  在中国,用户的电脑是可以随便“插”的,而3721插件在当年是“插”的最广的一个,几乎将全中国大江南北都插了个遍,结果名声臭了,3721也当之无愧地名列“十大流氓软件”之首。3721普及量大的一个原因是其与大量的个人网站进行合作,当老流氓和小流氓联手合作的时候,用户的电脑就要遭殃了。

  小流氓者,国内的个人网站的站长,他们大都有很强烈的“强奸”欲望,给点小钱就什么东西都敢往网站上放,例如HAO123这样的个人流氓网站的成功者,就是通过强制设定为主页,在没有多少选择的情况下获得了巨大的覆盖率,也因此成了名,被百度高价收购。淘宝在推广初期也是通过个人网站联盟强制弹出窗口、众多站长帮忙掠夺用户,花费了一点小钱就达到目前的规模,在纳斯达克上风起云涌的百度,百度搜霸不算特别出名,但也算在流氓行业小有名气,我也专门写过如何卸载百度流氓插件的方法

  对此,研究流氓颇长的布棉就曾经感叹:很多中国互联网企业的发展过程,就是一场赤裸裸的流氓对用户侵略的过程,而很多企业获得成功的历史,就是一个个流氓妓女从良的历史。

  当然,对付流氓的软件目前也有不少,比较有代表性的是“流氓软件清除大师”这个软件,能卸载一百多个流氓软件,然而令人疑惑的是,这个软件本身会强行修改IE首页,并且也有工具栏插件,似乎也有流氓化的趋势,恰恰在这个时候,自称已经从良的周鸿祎推出了360safe这个软件。

  360safe看上去是一个简单易用的流氓软件清除工具,据说可以查杀121款恶意软件,并能诊断系统,一键修复保证系统恢复如初,安装试用了一下,感觉比“流氓软件清除大师”要好用一些。比如我系统的Google工具栏,“流氓软件清除大师”会误判断为IE插件,而360safe则不会误判,同时360safe具有诊断修复功能,可以用来诊断一些未知的流氓软件和木马病毒,包括系统进程、注册表、系统服务等栏目的检测,如下图所示,使用起来很方便,可以及时发现系统配置被修改的情况。并且没有顺便给我电脑安装什么插件,看起来还是很不错的。

360界面

  虽然周鸿一原先的口碑并不太好,但是现在看来他似乎是要弃恶从良了,至少现在看来360safe还没有什么流氓行为,就暂时来看,似乎周鸿祎是真心诚意干起了反流氓软件的大业,如果真是这样的话,我们也应该对他表示谨慎地欢迎。

好的,这是一个比较复杂的系统设计,需要考虑到各种情况,下面是我的建议: (1)数据逻辑结构分析: 考虑到学生成绩查询统计系统需要录学生的个人信息以及三科成绩信息,我们可以设计如下的逻辑结构: - 学生信息:包括学号、姓名、性别、出生日期、班级等。 - 成绩信息:包括学号、姓名、语文成绩、数学成绩、英语成绩、总分、排名等。 (2)数据存储结构设计: 我们可以使用结构体数组来存储学生信息和成绩信息,例如: ```c struct student { char id[10]; char name[20]; char gender[10]; char birthday[20]; char class[20]; }; struct score { char id[10]; char name[20]; int chinese; int math; int english; int total; int rank; }; ``` 然后,将这些结构体数组存储在文件中,可以使用文本文件或二进制文件来存储。 (3)根据学生姓名进行字典排序: 可以使用字符串比较函数 `strcmp()` 来进行排序,例如: ```c int cmp_by_name(const void *a, const void *b) { return strcmp(((struct student *)a)->name, ((struct student *)b)->name); } ``` (4)根据成绩进行由高到低排序: 可以使用快速排序算法来进行排序,例如: ```c int cmp_by_total(const void *a, const void *b) { return ((struct score *)b)->total - ((struct score *)a)->total; } void quick_sort(struct score *scores, int left, int right) { if (left >= right) { return; } int i = left, j = right; struct score pivot = scores[left]; while (i < j) { while (i < j && scores[j].total <= pivot.total) { j--; } scores[i] = scores[j]; while (i < j && scores[i].total >= pivot.total) { i++; } scores[j] = scores[i]; } scores[i] = pivot; quick_sort(scores, left, i - 1); quick_sort(scores, i + 1, right); } ``` (5)根据学号或姓名查找学生成绩: 可以使用线性查找算法来进行查找,例如: ```c void search_by_id(struct score *scores, int n, const char *id) { for (int i = 0; i < n; i++) { if (strcmp(scores[i].id, id) == 0) { printf("学号:%s,姓名:%s,语文:%d,数学:%d,英语:%d,总分:%d,排名:%d\n", scores[i].id, scores[i].name, scores[i].chinese, scores[i].math, scores[i].english, scores[i].total, scores[i].rank); return; } } printf("未找到学号为 %s 的学生\n", id); } void search_by_name(struct score *scores, int n, const char *name) { for (int i = 0; i < n; i++) { if (strcmp(scores[i].name, name) == 0) { printf("学号:%s,姓名:%s,语文:%d,数学:%d,英语:%d,总分:%d,排名:%d\n", scores[i].id, scores[i].name, scores[i].chinese, scores[i].math, scores[i].english, scores[i].total, scores[i].rank); return; } } printf("未找到姓名为 %s 的学生\n", name); } ``` (6)输出统计及格、中、良、优秀和不及格学生人数及其所占比例: 可以先按照总分排序,然后根据总分计算各个等级的学生人数和所占比例,例如: ```c void print_statistics(struct score *scores, int n) { quick_sort(scores, 0, n - 1); int pass = 0, mid = 0, good = 0, excellent = 0, fail = 0; for (int i = 0; i < n; i++) { if (scores[i].total < 180) { fail++; } else if (scores[i].total < 240) { pass++; } else if (scores[i].total < 300) { mid++; } else if (scores[i].total < 360) { good++; } else { excellent++; } } printf("及格人数:%d,占比:%.2f%%\n", pass, (float)pass / n * 100); printf("中等人数:%d,占比:%.2f%%\n", mid, (float)mid / n * 100); printf("良好人数:%d,占比:%.2f%%\n", good, (float)good / n * 100); printf("优秀人数:%d,占比:%.2f%%\n", excellent, (float)excellent / n * 100); printf("不及格人数:%d,占比:%.2f%%\n", fail, (float)fail / n * 100); for (int i = 0; i < n; i++) { printf("学号:%s,姓名:%s,语文:%d,数学:%d,英语:%d,总分:%d,排名:%d\n", scores[i].id, scores[i].name, scores[i].chinese, scores[i].math, scores[i].english, scores[i].total, scores[i].rank); } } ``` (7)主要C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> struct student { char id[10]; char name[20]; char gender[10]; char birthday[20]; char class[20]; }; struct score { char id[10]; char name[20]; int chinese; int math; int english; int total; int rank; }; int cmp_by_name(const void *a, const void *b) { return strcmp(((struct student *)a)->name, ((struct student *)b)->name); } int cmp_by_total(const void *a, const void *b) { return ((struct score *)b)->total - ((struct score *)a)->total; } void quick_sort(struct score *scores, int left, int right) { if (left >= right) { return; } int i = left, j = right; struct score pivot = scores[left]; while (i < j) { while (i < j && scores[j].total <= pivot.total) { j--; } scores[i] = scores[j]; while (i < j && scores[i].total >= pivot.total) { i++; } scores[j] = scores[i]; } scores[i] = pivot; quick_sort(scores, left, i - 1); quick_sort(scores, i + 1, right); } void search_by_id(struct score *scores, int n, const char *id) { for (int i = 0; i < n; i++) { if (strcmp(scores[i].id, id) == 0) { printf("学号:%s,姓名:%s,语文:%d,数学:%d,英语:%d,总分:%d,排名:%d\n", scores[i].id, scores[i].name, scores[i].chinese, scores[i].math, scores[i].english, scores[i].total, scores[i].rank); return; } } printf("未找到学号为 %s 的学生\n", id); } void search_by_name(struct score *scores, int n, const char *name) { for (int i = 0; i < n; i++) { if (strcmp(scores[i].name, name) == 0) { printf("学号:%s,姓名:%s,语文:%d,数学:%d,英语:%d,总分:%d,排名:%d\n", scores[i].id, scores[i].name, scores[i].chinese, scores[i].math, scores[i].english, scores[i].total, scores[i].rank); return; } } printf("未找到姓名为 %s 的学生\n", name); } void print_statistics(struct score *scores, int n) { quick_sort(scores, 0, n - 1); int pass = 0, mid = 0, good = 0, excellent = 0, fail = 0; for (int i = 0; i < n; i++) { if (scores[i].total < 180) { fail++; } else if (scores[i].total < 240) { pass++; } else if (scores[i].total < 300) { mid++; } else if (scores[i].total < 360) { good++; } else { excellent++; } } printf("及格人数:%d,占比:%.2f%%\n", pass, (float)pass / n * 100); printf("中等人数:%d,占比:%.2f%%\n", mid, (float)mid / n * 100); printf("良好人数:%d,占比:%.2f%%\n", good, (float)good / n * 100); printf("优秀人数:%d,占比:%.2f%%\n", excellent, (float)excellent / n * 100); printf("不及格人数:%d,占比:%.2f%%\n", fail, (float)fail / n * 100); for (int i = 0; i < n; i++) { printf("学号:%s,姓名:%s,语文:%d,数学:%d,英语:%d,总分:%d,排名:%d\n", scores[i].id, scores[i].name, scores[i].chinese, scores[i].math, scores[i].english, scores[i].total, scores[i].rank); } } int main() { struct student students[1000]; struct score scores[1000]; int n = 0; FILE *fp = fopen("data.txt", "r"); while (fscanf(fp, "%s%s%s%s%s%d%d%d", students[n].id, students[n].name, students[n].gender, students[n].birthday, students[n].class, &scores[n].chinese, &scores[n].math, &scores[n].english) != EOF) { strcpy(scores[n].id, students[n].id); strcpy(scores[n].name, students[n].name); scores[n].total = scores[n].chinese + scores[n].math + scores[n].english; n++; } fclose(fp); for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (strcmp(students[i].name, students[j].name) > 0) { struct student temp_student = students[i]; students[i] = students[j]; students[j] = temp_student; struct score temp_score = scores[i]; scores[i] = scores[j]; scores[j] = temp_score; } } } int rank = 1; for (int i = 0; i < n; i++) { if (i > 0 && scores[i].total != scores[i - 1].total) { rank = i + 1; } scores[i].rank = rank; } int choice; do { printf("1.查询学生信息\n"); printf("2.按姓名排序\n"); printf("3.按总分排序\n"); printf("4.统计成绩信息\n"); printf("5.退出\n"); printf("请选择要进行的操作:"); scanf("%d", &choice); switch (choice) { case 1: { printf("请选择查询方式(1.按学号查询,2.按姓名查询):"); int search_choice; scanf("%d", &search_choice); if (search_choice == 1) { char id[10]; printf("请输入要查询的学生学号:"); scanf("%s", id); search_by_id(scores, n, id); } else if (search_choice == 2) { char name[20]; printf("请输入要查询的学生姓名:"); scanf("%s", name); search_by_name(scores, n, name); } else { printf("输入有误,请重新选择\n"); } break; } case 2: { qsort(students, n, sizeof(struct student), cmp_by_name); for (int i = 0; i < n; i++) { printf("学号:%s,姓名:%s,性别:%s,出生日期:%s,班级:%s\n", students[i].id, students[i].name, students[i].gender, students[i].birthday, students[i].class); } break; } case 3: { quick_sort(scores, 0, n - 1); for (int i = 0; i < n; i++) { printf("学号:%s,姓名:%s,语文:%d,数学:%d,英语:%d,总分:%d,排名:%d\n", scores[i].id, scores[i].name, scores[i].chinese, scores[i].math, scores[i].english, scores[i].total, scores[i].rank); } break; } case 4: { print_statistics(scores, n); break; } case 5: { printf("程序退出!\n"); break; } default: { printf("输入有误,请重新选择\n"); break; } } } while (choice != 5); return 0; } ``` (8)录入学生成绩: 可以在程序中添加录入学生成绩的功能,例如: ```c void input_score(struct student *students, struct score *scores, int *n) { printf("请输入学生学号、姓名、性别、出生日期、班级和三科成绩(以空格分隔):\n"); scanf("%s%s%s%s%s%d%d%d", students[*n].id, students[*n].name, students[*n].gender, students[*n].birthday, students[*n].class, &scores[*n].chinese, &scores[*n].math, &scores[*n].english); strcpy(scores[*n].id, students[*n].id); strcpy(scores[*n].name, students[*n].name); scores[*n].total = scores[*n].chinese + scores[*n].math + scores[*n].english; (*n)++; printf("学生信息录入成功!\n"); } ``` (9)各个功能通过目录选择要进行的功能: 可以使用 `do-while` 循环和 `switch-case` 语句来实现菜单功能,例如: ```c int choice; do { printf("1.录入学生成绩\n"); printf("2.查询学生信息\n"); printf("3.按姓名排序\n"); printf("4.按总分排序\n"); printf("5.统计成绩信息\n"); printf("6.退出\n"); printf("请选择要进行的操作:"); scanf("%d", &choice); switch (choice) { case 1: { input_score(students, scores, &n); break; } case 2: { printf("请选择查询方式(1.按学号查询,2.按姓名查询):"); int search_choice; scanf("%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值