一、实验名称
学生成绩管理系统。
二、实验任务
(一)程序运行时,首先显示主菜单如下:
1新建数据
2添加数据
3删除数据
4排序
5查询
6退出
屏幕提示:请输入序号选择相应操作。
要求当用户输入任意序号后,程序都能进行相应操作。
(二)在主菜单中选择序号4,弹出子菜单选择排序方式,子菜单如下:
数学成绩排序
程序设计成绩排序
总分排序。
返回主菜单
请按序号选择相应操作。
选择子菜单的序号后,程序能正确运行并在屏幕上显示按要求排序后的相关信息。
(三)在主菜单中选择序号5,弹出子菜单选择查询方式,子菜单如下:
学号查询
姓名查询
数学成绩查询
程序设计成绩查询
总分查询
返回主菜单
请按序号选择相应操作。
在子菜单中选择序号后,程序按以下方式工作:
1)学号查询:输入学号后,若该学号存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:查询到满足条件的结果后,查询即可结束)
2)姓名查询:输入姓名后,若该姓名存在则显示与其相关的所有信息,否则显示找不到的提示信息;(提示:使用字符串比较函数进行比较)
3)按科目查询:输入指定分数,程序运行后显示该科目中考试成绩大于等于指定分数的同学的学号、姓名以及该科成绩并统计满足条件的人数;
4)总分查询:输入指定分数,程序运行后显示总分成绩大于等于指定分数的同学的学号、姓名以及各科成绩并统计满足条件的人数。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
// 定义结构体类型
struct student {
char id[10]; // 学号
char name[20]; // 姓名
float math; // 数学成绩
float program; // 程序设计成绩
float total; // 总分
};
// 声明全局变量和函数
struct student stu[100]; // 最多存放100个学生的信息
int count = 0; // 学生信息总数
void newdata(); // 新建数据函数
void adddata(); // 添加数据函数
int find(char id[]); // 根据学号查找学生信息函数
void delete(); // 删除数据函数
void sort(); // 排序函数
void query(); // 查询函数
// 主函数
int main() {
int option;
while (1) {
// 显示主菜单
printf(" -----------------1. 新建数据---------------\n");
printf(" -----------------2. 添加数据---------------\n");
printf(" -----------------3. 删除数据---------------\n");
printf(" -----------------4. 排序-------------------\n");
printf(" -----------------5. 查询-------------------\n");
printf(" -----------------6. 退出-------------------\n");
printf("请输入序号选择相应操作:");
scanf("%d", &option);
switch (option) {
case 1:
newdata();
break;
case 2:
adddata();
break;
case 3:
delete();
break;
case 4:
sort();
break;
case 5:
query();
break;
case 6:
printf("谢谢使用!\n");
return 0;
default:
printf("输入错误,请重新输入。\n");
break;
}
}
return 0;
}
// 新建数据函数
void newdata() {
printf("请输入学生的学号、姓名、数学成绩、程序设计成绩:[空格隔开]\n");
// 读入学生信息,存放到数组中
scanf("%s %s %f %f", stu[count].id, stu[count].name, &stu[count].math, &stu[count].program);
stu[count].total = stu[count].math + stu[count].program;
printf("新建成功!\n");
count++; // 学生信息总数加1
}
// 添加数据函数
void adddata() {
char ch[10];
printf("请输入要添加数据的学生的学号、姓名、数学成绩、程序设计成绩:[空格隔开]\n");
// 读入学生信息,存放到数组中
scanf("%s %s %f %f", ch, stu[count].name, &stu[count].math, &stu[count].program);
strcpy(stu[count].id, ch);
stu[count].total = stu[count].math + stu[count].program;
printf("添加成功!\n");
count++; // 学生信息总数加1
}
// 根据学号查找学生信息函数
int find(char id[]) {
int i;
for (i = 0; i < count; i++) {
if (strcmp(stu[i].id, id) == 0) { // 学号匹配
return i; // 返回该学生信息在数组中的下标
}
}
return -1; // 没有找到,返回-1
}
// 删除数据函数
void delete() {
int i, k;
char ch[10];
printf("请输入要删除数据的学生的学号:\n");
scanf("%s", ch);
// 根据学号查找该学生信息是否存在,并返回该学生信息在数组中的下标
k = find(ch);
if (k == -1) { // 没有找到
printf("没有找到该学生的信息!\n");
}
else { // 找到了
// 将后面的学生信息往前移动一位
for (i = k; i < count - 1; i++) {
stu[i] = stu[i + 1];
}
count--; // 学生信息总数减1
printf("删除成功!\n");
}
}
// 数学成绩排序函数
void sort_math() {
int i, j;
struct student temp;
// 冒泡排序
for (i = 0; i < count - 1; i++) {
for (j = 0; j < count - i - 1; j++) {
if (stu[j].math > stu[j + 1].math) { // 比较数学成绩大小
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
// 输出排序结果
printf("学号 姓名 数学成绩 程序设计成绩 总分\n");
for (i = 0; i < count; i++) {
printf("%s\t%s\t%.2f \t%.2f\t\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].program, stu[i].total);
}
}
// 程序设计成绩排序函数
void sort_program() {
int i, j;
struct student temp;
// 冒泡排序
for (i = 0; i < count - 1; i++) {
for (j = 0; j < count - i - 1; j++) {
if (stu[j].program > stu[j + 1].program) { // 比较程序设计成绩大小
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
// 输出排序结果
printf("学号 姓名 数学成绩 程序设计成绩 总分\n");
for (i = 0; i < count; i++) {
printf("%s\t%s\t%.2f \t%.2f\t\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].program, stu[i].total);
}
}
// 总分排序函数
void sort_total() {
int i, j;
struct student temp;
// 冒泡排序
for (i = 0; i < count - 1; i++) {
for (j = 0; j < count - i - 1; j++) {
if (stu[j].total > stu[j + 1].total) { // 比较总分大小
temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
// 输出排序结果
printf("学号 姓名 数学成绩 程序设计成绩 总分\n");
for (i = 0; i < count; i++) {
printf("%s\t%s\t%.2f \t%.2f\t\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].program, stu[i].total);
}
}
// 排序函数
void sort() {
int option;
// 显示子菜单
printf("1. 数学成绩排序\n");
printf("2. 程序设计成绩排序\n");
printf("3. 总分排序\n");
printf("4. 返回主菜单\n");
printf("请选择子菜单序号:\n");
scanf("%d", &option);
switch (option) {
case 1:
sort_math();
break;
case 2:
sort_program();
break;
case 3:
sort_total();
break;
case 4:
break;
default:
printf("输入错误,请重新输入。\n");
break;
}
}
// 学号查询函数
void query_id(char id[]) {
int k = -1;
// 根据学号查找该学生信息是否存在,并返回该学生信息在数组中的下标
k = find(id);
if (k == -1) { // 没有找到
printf("没有找到该学号对应的学生信息!\n");
}
else { // 找到了
printf("学号 姓名 数学成绩 程序设计成绩 总分\n");
printf("%s\t%s\t%.2f \t%.2f\t\t%.2f\n", stu[k].id, stu[k].name, stu[k].math, stu[k].program, stu[k].total);
}
}
// 姓名查询函数
void query_name(char name[]) {
int i, flag = 0;
// 遍历数组,查找与指定姓名匹配的学生信息
printf("学号 姓名 数学成绩 程序设计成绩 总分\n");
for (i = 0; i < count; i++) {
if (strcmp(stu[i].name, name) == 0) { // 姓名匹配
printf("%s\t%s\t%.2f \t%.2f\t\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].program, stu[i].total);
flag = 1; // 标记已经找到
}
}
if (!flag) { // 没有找到
printf("没有找到该姓名对应的学生信息!\n");
}
}
// 按科目查询函数
void query_score(int score) {
int i, num = 0;
char name[20];
// 遍历数组,查找符合条件的学生信息并打印出来,并统计人数
printf("请输入对应的学科名[数学|程序设计]:");
for (;;) {
scanf("%s", name);
getchar();
if (strcmp(name, "数学") == 0) {
printf("学号\t姓名\t科目成绩\n");
for (i = 0; i < count; i++) {
if (stu[i].math >= score) { // 符合条件
printf("%s\t%s\t%.2f\n", stu[i].id, stu[i].name, stu[i].math);
num++; // 统计人数
}
}
break;
}
else if (strcmp(name, "程序设计") == 0) {
printf("学号\t姓名\t科目成绩\n");
for (i = 0; i < count; i++) {
if (stu[i].program >= score) { // 符合条件
printf("%s\t%s\t%.2f\n", stu[i].id, stu[i].name,stu[i].program);
num++; // 统计人数
}
}
break;
}
else {
printf("不存在该科目!\n");
}
}
printf("符合条件的学生总数为:%d\n", num);
}
// 总分查询函数
void query_total(int score) {
int i, num = 0;
// 遍历数组,查找符合条件的学生信息并打印出来,并统计人数
printf("学号 姓名 数学成绩 程序设计成绩 总分\n");
for (i = 0; i < count; i++) {
if (stu[i].total >= score) { // 符合条件
printf("%s\t%s\t%.2f \t%.2f\t\t%.2f\n", stu[i].id, stu[i].name, stu[i].math, stu[i].program, stu[i].total);
num++; // 统计人数
}
}
printf("符合条件的学生总数为:%d\n", num);
}
// 查询函数
void query() {
int option, score;
char ch[20];
// 显示子菜单
printf("1. 学号查询\n");
printf("2. 姓名查询\n");
printf("3. 按科目查询\n");
printf("4. 总分查询\n");
printf("5. 返回主菜单\n");
printf("请选择子菜单序号:\n");
scanf("%d", &option);
switch (option) {
case 1:
printf("请输入要查询的学生的学号:\n");
scanf("%s", ch);
query_id(ch);
break;
case 2:
printf("请输入要查询的学生的姓名:\n");
scanf("%s", ch);
query_name(ch);
break;
case 3:
printf("请输入指定分数:\n");
scanf("%d", &score);
query_score(score);
break;
case 4:
printf("请输入指定分数:\n");
scanf("%d", &score);
query_total(score);
break;
case 5:
break;
default:
printf("输入错误,请重新输入。\n");
break;
}
}
代码块
#include <stdio.h>
#include <stdlib.h>
int binsearch(int x, int v[], int n);
int main()
{
int x=3;
int v[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n=10;
int a;
a=binsearch(x, v, n);
printf("%d\n", a);
system("pause");
return 0;
}
int binsearch(int x, int v[], int n)
{
int low, high, mid;
low=0;
high=n-1;
mid=(low+high)/2;
while((low<=high)&&(x!=v[mid])){
(x<v[mid]) ? high=mid-1 : low=mid+1;
mid=(low+high)/2;
}
if (x==v[mid])
return mid;
else
return -1;
}
如果程序设计有错误或更简洁的方法,欢迎并感谢您指正出示,谢谢!
C语言实现学生成绩管理系统
首先,需要定义数组结构体存储学生成绩的信息:
#define M 30 // 学生信息最多为30条
#define NAME_LEN 15 // 学生姓名长度最大为15
struct student {
char name[NAME_LEN];
char num[20]; // 学号
int math; // 数学成绩
int program; // 程序设计成绩
int total; // 总分
} students[M];
然后需要编写子菜单的排序函数,包括数学成绩排序、程序设计成绩排序、总分排序。选用快速排序算法。
void quick_sort(struct student s[], int left, int right, int key) {
int pivot_index;
if (left < right) {
pivot_index = partition(s, left, right, key);
quick_sort(s, left, pivot_index - 1, key);
quick_sort(s, pivot_index + 1, right, key);
}
}
int partition(struct student s[], int left, int right, int key) {
int pivot, i = left, j = right + 1;
switch (key) {
case 1: // 以数学成绩为关键字排序
pivot = s[i].math;
while (1) {
while (s[++i].math >= pivot) {
if (i == right) break;
}
while (s[--j].math <= pivot) {
if (j == left) break;
}
if (i >= j) break;
swap(&s[i], &s[j]);
}
swap(&s[left], &s[j]);
return j;
case 2: // 以程序设计成绩为关键字排序
pivot = s[i].program;
while (1) {
while (s[++i].program >= pivot) {
if (i == right) break;
}
while (s[--j].program <= pivot) {
if (j == left) break;
}
if (i >= j) break;
swap(&s[i], &s[j]);
}
swap(&s[left], &s[j]);
return j;
case 3: // 以总分为关键字排序
pivot = s[i].total;
while (1) {
while (s[++i].total >= pivot) {
if (i == right) break;
}
while (s[--j].total <= pivot) {
if (j == left) break;
}
if (i >= j) break;
swap(&s[i], &s[j]);
}
swap(&s[left], &s[j]);
return j;
}
}
void swap(struct student *a, struct student *b) {
struct student temp = *a;
*a = *b;
*b = temp;
}
接着编写子菜单的查询函数,包括学号查询、姓名查询、按科目查询、总分查询。
void query() {
int choice;
printf("请选择查询方式:\n1. 按学号查询\n2. 按姓名查询\n3. 按科目查询\n4. 按总分查询\n");
scanf("%d", &choice);
switch (choice) {
case 1: // 按学号查询
printf("请输入要查询的学生学号:\n");
char num[20];
scanf("%s", num);
for (int i = 0; i < M; i++) {
if (strcmp(students[i].num, num) == 0) {
printf("%s %s %d %d %d\n", students[i].name, students[i].num, students[i].math, students[i].program, students[i].total);
return;
}
}
printf("未找到该学生!\n");
break;
case 2: // 按姓名查询
printf("请输入要查询的学生姓名:\n");
char name[NAME_LEN];
scanf("%s", name);
for (int i = 0; i < M; i++) {
if (strcmp(students[i].name, name) == 0) {
printf("%s %s %d %d %d\n", students[i].name, students[i].num, students[i].math, students[i].program, students[i].total);
return;
}
}
printf("未找到该学生!\n");
break;
case 3: // 按科目查询
printf("请选择科目:\n1. 数学\n2. 程序设计\n");
int key;
scanf("%d", &key);
printf("请输入分数线:\n");
int score;
scanf("%d", &score);
switch (key) {
case 1: // 按数学成绩查询
for (int i = 0; i < M; i++) {
if (students[i].math >= score) {
printf("%s %s %d %d %d\n", students[i].name, students[i].num, students[i].math, students[i].program, students[i].total);
}
}
break;
case 2: // 按程序设计成绩查询
for (int i = 0; i < M; i++) {
if (students[i].program >= score) {
printf("%s %s %d %d %d\n", students[i].name, students[i].num, students[i].math, students[i].program, students[i].total);
}
}
break;
}
break;
case 4: // 按总分查询
printf("请输入分数线:\n");
int totalScore;
scanf("%d", &totalScore);
for (int i = 0; i < M; i++) {
if (students[i].total >= totalScore) {
printf("%s %s %d %d %d\n", students[i].name, students[i].num, students[i].math, students[i].program, students[i].total);
}
}
break;
}
}
接下来编写主函数,包括新建数据、添加、删除、排序、查询、退出等功能选项。
```c int main() { int n = 0; // 学生信息数目 int choice; while (1) { printf("欢迎使用学生成绩管理系统:\n1. 新建数据\n2. 添加\n3. 删除\n4. 排序\n5. 查询\n6. 退出\n"); scanf("%d", &choice); switch (choice) { case 1: // 新建数据 printf("请输入学生信息数目:\n"); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("请输入第%d个学