0.此次目的:
hello大家好,俺是没事爱瞎捣鼓又分享欲爆棚的叶同学!!!下面是我大一时的c语言课程设计,当时,今天不小心翻到了于是分享了出来,有很多地方没有优化哈,但可以提供大家一个学习的框架,大家也可以参考,完善。这是俺写的第一个小系统,当时还是比较有成就感的,主要就是学习链表比较难,but无他,唯手熟尔啦,多看多练就会啦!!!加油(咱是最棒的!!!)
1:求Π的近似值
利用”正多边形逼近“的方法求Π值,利用圆内接正六边形等于半径的特点将边数翻番,作正十二边形,求出边长,重复这一过程,就可获得所需精度的Π的近似值。
2:捕鱼和分鱼问题
A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三竿,A第一个醒来,他将鱼分为5份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为5份,把多余的一条鱼扔掉,拿走自己的一份。C、D、E依次醒来,也按同样的方法拿走鱼。问:他们合伙至少捕了多少条鱼?使用循环方法求解。
根据题意,总共将所有的鱼进行了5次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成5份,然后拿走自己的1份,余下其他的4份。假定鱼的总数为X,则X可以按照题目的要求进行5次分配:X-1后可被5整除,余下的鱼为4*(X-1)/5。若X满足上述要求,则X就是题目的解。
3:校运动会项目管理系统
运动会是高校学生在校活动中不可缺少的一个重要组成部分,现代体育的发展,要求参与者、参赛项目越来越多,时间安排也相对紧张,对比赛结果的准确性和实时性要求也越来越高。但是目前很多学校仍然延续着将赛前的报名、比赛的安排、赛中的成绩录入、赛后成绩的统计,采用手工和电脑并用的方式处理,存在许多弊端,例如 :时间和场次安排冲突、统计排名汇总错误等原因导致运动会无法圆满完成,因此设计一款适合运动会成绩的管理系统就迫在眉睫。
项目内容:
建立校运动会项目管理系统,对校运动会项目相关信息 进行管理。校运动会项目的相关信息包括比赛项目,学院名称,单项成绩,单项名次,总成绩和总名次等。
4.详细描述:
1. 结构体定义
struct node {char xiangmu[40]; // 比赛项目名称char name[10][40]; // 学院名称数组float score[10]; // 学院成绩数组int no[10]; // 学院名次数组struct node *link; // 指向下一节点的指针
};
node
结构体用于表示一个运动会项目的所有信息。每个节点包含以下字段:
xiangmu
: 比赛项目名称。name
: 一个包含10个学院名称的数组。score
: 一个包含10个学院成绩的数组。no
: 一个包含10个学院名次的数组。link
: 指向链表中下一个节点的指针。
2. 初始化链表头节点
struct node *head = NULL;
通过定义全局变量 head
,将链表的头节点初始化为空。所有新插入的节点都会链接到此头节点。
3. 功能模块实现
(1)录入运动会项目信息
void input() {struct node *p = (struct node *)malloc(sizeof(struct node));printf("请输入比赛项目名称:\n");scanf("%s", p->xiangmu);printf("请输入学院名称及成绩(格式:学院名称 成绩):\n");int count = 0;float total = 0.0;while (count < 10) {scanf("%s%f", p->name[count], &p->score[count]);total += p->score[count];count++;printf("是否继续录入(1/0):\n");char flag;scanf(" %c", &flag);if (flag == '0') {break;}}p->link = head; // 将新节点插入链表头部head = p;printf("录入成功!\n\n");
}
解释:
- 用户通过键盘输入项目名称及学院成绩。数据存储在新分配的
node
结构体中。 - 新节点总是插入到链表头部,成为新的头节点。
(2)查找运动会项目信息
void find() {char xiangmu[40];printf("请输入要查找的比赛项目名称:\n");scanf("%s", xiangmu);struct node *p = head;while (p != NULL) {if (strcmp(p->xiangmu, xiangmu) == 0) {printf("比赛项目名称:%s\n", p->xiangmu);printf("学院名称\t成绩\t单项名次\n");int i;for (i = 0; i < 10; i++) {if (strlen(p->name[i]) > 0) {printf("%s\t%.2f\t%d\n", p->name[i], p->score[i], p->no[i]);}}printf("\n");return;}p = p->link;}printf("未找到该项目信息!\n\n");
}
解释:
- 用户输入要查找的项目名称,程序在链表中逐一遍历节点,查找并输出对应项目信息。
(3)修改运动会项目信息
void modify() {char xiangmu[40];printf("请输入要修改的比赛项目名称:\n");scanf("%s", xiangmu);struct node *p = head;while (p != NULL) {if (strcmp(p->xiangmu, xiangmu) == 0) {printf("请输入新的学院名称及成绩(格式:学院名称 成绩):\n");int count = 0;float total = 0.0;while (count < 10) {scanf("%s%f", p->name[count], &p->score[count]);total += p->score[count];count++;printf("是否继续录入(1/0):\n");char flag;scanf(" %c", &flag);if (flag == '0') {break;}}// 更新节点信息strcpy(p->xiangmu, xiangmu);printf("修改成功!\n\n");return;}p = p->link;}printf("未找到该项目信息!\n\n");
}
解释:
- 用户输入要修改的项目名称,程序查找到对应节点后,更新该项目的学院及成绩信息。
(4)对运动会项目进行排名
void rank() {char xiangmu[40];printf("请输入要排名的比赛项目名称:\n");scanf("%s", xiangmu);struct node *p = head;while (p != NULL) {if (strcmp(p->xiangmu, xiangmu) == 0) {int i, j;for (i = 0; i < 10; i++) {for (j = i + 1; j < 10; j++) {if (p->score[j] > p->score[i]) {// 交换成绩float temp = p->score[i];p->score[i] = p->score[j];p->score[j] = temp;// 交换学院名称char t[40];strcpy(t, p->name[i]);strcpy(p->name[i], p->name[j]);strcpy(p->name[j], t);}}}// 更新名次for (i = 0; i < 10; i++) {if (strlen(p->name[i]) > 0) {p->no[i] = i + 1;}}printf("排名成功!\n\n");return;}p = p->link;}printf("未找到该项目信息!\n\n");
}
解释:
- 用户选择需要排名的项目,程序对各学院成绩进行排序,并更新名次。
(5)输出所有运动会项目信息
void output() {struct node *p = head;while (p != NULL) {printf("比赛项目名称:%s\n", p->xiangmu);printf("学院名称\t成绩\t单项名次\n");int i;for (i = 0; i < 10; i++) {if (strlen(p->name[i]) > 0) {printf("%s\t%.2f\t%d\n", p->name[i], p->score[i], p->no[i]);}}p = p->link;}printf("\n");
}
解释:
- 遍历链表,逐一输出每个运动会项目的所有信息。
(6)计算π值
void pi() {int n;double side = 1;double PI;int i;printf("假设圆半径为1\n");printf("正6边形,π=3\n");for (i = 0, n = 12; i < 10; i++, n *= 2) {side = (double)sqrt(2 - sqrt(4 - side * side));PI = (double)n * side / 2;printf("正%d边形,边长=%.15f\tπ=%.15f\n", n, side, PI);}printf("\n");
}
解释:
- 利用正多边形逼近法,逐步逼近π值,并输出每一步的近似值。
(7)捕鱼分鱼问题
void fish() {int all;int num = 6;int j;while (1) {all = num;for (j = 0; j < 4; j++) {if (all <= 1 || all % 5 != 1) {break;}all = all - all / 5 - 1;}if (j == 4) {printf("鱼数为%d条", num);break;}num++;}printf("\n");
}
解释:
- 模拟五个渔夫分鱼的过程,找到符合条件的最小鱼数。每个渔夫按规则取鱼,最后输出结果。
4. 主程序目录调用
int main() {int choice;while (1) {printf("1. 录入运动会项目信息\n");printf("2. 查找运动会项目信息\n");printf("3. 修改运动会项目信息\n");printf("4. 对运动会项目进行排名\n");printf("5. 输出所有运动会项目信息\n");printf("6. 正多边形逼近法求Π值\n");printf("7. 捕鱼和分鱼问题\n");printf("8. 退出\n");printf("请选择操作:\n");scanf("%d", &choice);switch (choice) {case 1:input();break;case 2:find();break;case 3:modify();break;case 4:rank();break;case 5:output();break;case 6:pi();break;case 7:fish();break;case 8:exit(0);default:printf("无效操作!\n");}}return 0;
}
解释:
- 主程序提供一个循环菜单,用户可选择执行不同操作。
- 程序持续运行,直到用户选择退出。
5.运行截图
首先是建立菜单页面。
选项录入信息
首先用一功能录入信息,首先录入跑步,学院和成绩,还有录入跳高信息,录入学院和成绩。
对录入的信息查询(这里由于还未进行4的排名处理所以为0)
对录入的各项目进行排名处理
显示所有运动会项目的排名
修改运动会项目信息
当选择功能六时,则时解决正多边形逼近法求Π值问题并计算出Π的值。
解决捕鱼和分鱼问题。
如果输入数字8,则直接退出系统。
加油加油!!!