/*大作业:学生成绩统计程序
要求:至少包含如下模块和基本功能
上交内容:程序源代码+程序报告
分数:平时分数的1/10
程序报告内容至少包括:
学生成绩统计程序
成绩输入
数据计算
数据查找
输出成绩
计算学生平均分
计算课程平均分*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 13
#define SIZE 5
//#include"student.h"
struct subject
{
float Chinese;
float Math;
float English;
};
typedef struct Student
{
char name[SIZE];
int age;
char number[LEN];
struct subject course;
struct Student *next;
}students;
typedef struct Linked_list
{
students *head;
students *last;
}List;
//函数原型
//在链表末尾添加项,输入成绩
//int Add(List *plist);
//删除学生信息
//int Delete(List *plist);
//查找某一学生
//int Search(List *plist);
//计算学生平均成绩,课程平均成绩,输出成绩
//int Compute(List *plist);
//初始化一个链表
void Initializelist(List *plist);
//释放内存
void Release(List *plist);
//得到用户的选择
int get_int(void);
//获取name,number输入
char *Input(char *str,int n);
int main(void)
{
List *plist;
Initializelist(plist);
/* FILE* fp;
int space = sizeof(students);
if((fp = fopen("student.txt","a+b")) == NULL)
{
fputs("不能打开该文件!\n",stderr);
exit(1);
}
*/
puts("欢迎来到学生成绩管理系统,");
printf("1) 录入学生信息 2)删除学生信息\n"
"3) 查询学生信息 4)计算学生平均成绩,课程平均成绩\n"
"5) 退出\n");
printf("请选择你需要的服务:");
// scanf("%d",&x);
int x;
x = get_int();
while(x != 5)
switch(x)
{
case 1:
{
char input1[SIZE],input2[LEN];
char *str;
students *prev,*current;
prev = (*plist).head;
// current = (*plist).head;
// prev = (*plist).head;
puts("请输入第一个学生的姓名:");
str = Input(input1,SIZE);
while(str != NULL && input1[0] != '\0')
{
current = (students*)malloc(sizeof(students));
if(current == NULL)
exit(2);
if((*plist).head == NULL)
(*plist).head = current;
else
prev->next = current;
current->next = (*plist).last;
strcpy(current->name,input1);
puts("学号:");
Input(input2,LEN);
strcpy(current->number,input2);
puts("年龄:");
scanf("%d",¤t->age);
puts("语文成绩:");
scanf("%f",¤t->course.Chinese);
puts("数学成绩:");
scanf("%f",¤t->course.Math);
puts("英语成绩:");
scanf("%f",¤t->course.English);
while(getchar() != '\n')
continue;
puts("请输入下一个学生的姓名(empty line to stop):");
str = Input(input1,SIZE);
prev = current;
}
if((*plist).head == NULL)
printf("没有输入!\n");
else
printf("这是你的学生:\n");
current = (*plist).head;
while(current != NULL)
{
printf("Name: %s,Age: %d,Number: %s\n"
"Chinese: %.2f,Math: %.2f,English: %.2f\n",
current->name,current->age,current->number,
current->course.Chinese,current->course.Math,current->course.English);
current = current->next;
}
printf("请选择你需要的服务:");
x = get_int();
}break;
case 2:
{
char name[SIZE];
char *str;
students *current,*prev;
printf("请输入你想删除的学生姓名:");
str = Input(name,SIZE);
// Input(name,SIZE);
current = (*plist).head;
if(str)
{
while(current != NULL && strcmp(current->name,str) != 0)
{
prev = current;
current = current->next;
}
if(current == NULL)
printf("不存在该学生!\n");
else
//if(!strcmp(current->name,str))
{
prev = current->next;
free(current);
printf("成功删除!\n");
}
}
else
printf("异常!\n");
printf("请选择你需要的服务:");
x = get_int();
}break;
case 3:
{
char name[SIZE];
char *str;
students *current;
// students *prev;
printf("请输入你想要查询的学生姓名:");
str = Input(name,SIZE);
current = (*plist).head;
if(str)
{
while(current != NULL && strcmp(current->name,str) != 0)
current = current->next;
if(current == NULL)
printf("不存在该学生!\n");
// break //跳出循环回到while的判断步骤,解决方案,if加控制条件 空结束,
else
//if(!strcmp(current->name,str)) //current->name无意义
{
printf("Name: %s,Age: %d,Number: %s\n"
"Chinese: %f,Math: %f,English: %f\n",
current->name,current->age,current->number,
current->course.Chinese,current->course.Math,current->course.English);
}
}
else
printf("异常!\n");
printf("请选择你需要的服务:");
x = get_int();
}break;
case 4:
{
students *current;
current = (*plist).head;
int cnt = 0;
double sum_average = 0.0,Chinese_average = 0.0,Math_average = 0.0,English_average = 0.0;
while(current->next != NULL)
{
sum_average = current->course.Chinese + current->course.Math + current->course.English;
Chinese_average += current->course.Chinese;
Math_average += current->course.Math;
English_average += current->course.English;
// current = current->next;
cnt++;
}
sum_average = sum_average/(double)cnt;
Chinese_average = Chinese_average/(double)cnt;
Math_average = Math_average/(double)cnt;
English_average = English_average/(double)cnt;
printf("sum_average = %.2f\nChinese_average = %.2f\n"
"Math_average = %.2f\nEnglish_average = %.2f\n",sum_average,Chinese_average,
Math_average,English_average);
printf("请选择你需要的服务:");
x = get_int();
}break;
default:
{
printf("输入错误!请再次输入:\n");
x = get_int();
}break;
}
// x = get_int();
if((*plist).head != NULL)
Release(plist);
printf("谢谢使用!再见");
return 0;
}
void Release(List *plist)
{
students *current;
current = (*plist).head;
while(current != NULL)
{
free(current);
current = current->next;
}
}
void Initializelist(List *plist)
{
(*plist).head = NULL;
(*plist).last = NULL;
}
int get_int(void)
{
int input;
char ch;
if(scanf("%d",&input) != 1)
{
puts("这是你错误的输入:");
while((ch = getchar()) != '\n')
putchar(ch);
putchar('\n');
printf("请只输入一个数字:\n");
}
while(getchar() != '\n')
continue;
return input;
}
char *Input(char *str,int n)
{
char *ret;
char *find;
ret = fgets(str,n,stdin);
if(ret)
{
find = strchr(str,'\n');
if(find)
*find = '\0';
else
while(getchar() != '\n')
continue;
}
return ret;
}
求大佬解答,程序编译通过却无法运行
最新推荐文章于 2022-10-17 08:57:47 发布