当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C/C++  » 编程基础
永建

学生成绩管理和统计

永建 发布于 2014年11月22日 19时, 0评/1286阅
分享到: 
收藏 +0
2
pc
VS2013
标签: <无>

代码片段(1) [全屏查看所有代码]

1. [文件] 学生成绩管与统计.txt ~ 11KB     下载(142)     跳至 [1] [全屏预览]

#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#include"string.h"
#include"ctype.h"
#define size sizeof(struct student)
#define ture 1
#define max 10
#define error 0
int index_counter = 0;////////执行次数
int count_student = 1;//     学生数目
typedef struct student *pointer;
///////
typedef struct student 
{

	int num;////学号
	int n_sub;////科目的个数
	char name[max];//学生姓名
	char subject[max][2*max];////科目
	float score[max];///科目对应的的成绩
	pointer next;////下一个节点的指针
};/////节点数据类型  
typedef pointer lklist;
pointer head1;///    
pointer rear1 = NULL;
///////////////////函数的声明////////////////////////函数的声明////////////////////////
lklist input_one_new(lklist stud);////一个学生信息的输入
lklist show_one_stu_new(lklist y);////显示一个学生的信息
lklist creat_input_new();//创建链表,并从键盘输入
float cal_one_sum(lklist sum_one);////计算一个学生总成绩
float  calcu_sum_hight(lklist sum_h);/////获取最高总成绩
int input_num();///输入要操作的学号
char inout_name();
char continue_run_order();/////操作是否继续执行的选择
void show_stu_mew(lklist stu);////显示所有学生信息 
void  calculate_sum(lklist p);//计算学生信息
void find_stu_new(lklist fi);////查询信息
void update_new(lklist up);/////修改信息
void save_stu_new_tofile(lklist student);/////保存信息
void creat_input_to_file_new(lklist st);//////从文件读取信息到链表
void clear_record(lklist clear);////////清除记录
void free_pointer_quit(lklist s);/////释放空间,,,退出系统
void screen_clear();////////清除 文本窗口
/////////////////主函数//////////////主函数////////////////主函数////////////主函数 ////
/////////////
void main()
{
	rear1=head1= (struct student*)malloc(size);
	int select = -1;
	char ch2;/////是程序等待
	while (ture)//打印主菜单供用户选则的内容
	{
		printf("\n\n\n");
		printf("  /*******************学生成绩统计系统************************/\n");
		
		printf("     1       ******     从键盘输入学生信息\n\n");
		printf("     2       ******     计算学生成绩\n\n");
		printf("     3       ******     修改学生信息\n\n");
		printf("     4       ******     查询学生信息\n\n");
		printf("     5       ******     显示学生信息\n\n");
		printf("     6       ******     保存学生信息\n\n");
		printf("     7       ******     从文件输入学生信息\n\n");
		printf("     8       ******     清除文本窗口\n\n");
		printf("     9       ******     释放空间和退出系统\n\n");
		while (ture)
		{
			printf("    输入选择  [ 1 2 3 4 5 6 7 8 9] \n 您的选择是  :");
			scanf_s("%d", &select);
			fflush(stdin); //清空缓冲区
			if (select == 1)
			{
				creat_input_new();
				break;
			}
			else if (select == 2)
			{
				calculate_sum(head1);
				ch2 = getchar();
				break;
			}
			else if (select == 3)
			{
				update_new(head1);
				break;
			}
			else if (select == 4)
			{
				find_stu_new(head1);
				break;
			}
			else if (select == 5)
			{ 
				show_stu_mew(head1);
				ch2 = getchar();
				break;
			}
			else if (select == 6)
			{
				save_stu_new_tofile(head1);
				printf("信息已经保存!\n");
				break;
			}
			else if (select == 7)
            {
				creat_input_to_file_new(rear1); 
				break;
			}
			else if (select == 8){
				screen_clear();
				break;
            }
			else 
			if (select == 9){
				free_pointer_quit(head1);
				break;
			}
			else 
			{
				 printf("  输入错误,,请输入【0,1,2,3,4,5,6,7】中的一个");
				 break;
			}
				
		}
	}
}  
///////////函数实现//////////////////////////////函数实现///////////////////////函数实现//////////
lklist input_one_new(lklist stud){
	int sub_c = 0;////////科目的个数
	int cycle_index_counter = 0;///////控制WHILE循环的执行次数
	printf("第【 %d 】个学生信息\n", count_student);
	printf("     学号  "); scanf_s("%d", &(stud->num)); fflush(stdin); //清空缓冲区
	printf("       姓名  "); scanf_s("%s", stud->name, max); fflush(stdin); //清空缓冲区
	sub_c = 0;
	while (cycle_index_counter != 1){
		printf("      科目【%d】  ", sub_c + 1); scanf_s("%s", stud->subject[sub_c], max); fflush(stdin); //清空缓冲区
		printf("      成绩【%d】 ", sub_c + 1); scanf_s("%f", &(stud->score[sub_c])); fflush(stdin); //清空缓冲区

		printf("    科目 【%d 】成绩输入是否继续?【输入 1 结束】\n", sub_c + 2);
		scanf_s("%d", &cycle_index_counter); fflush(stdin); //清空缓冲区
		sub_c++;
		stud->n_sub = sub_c;
	}
   count_student++;
	return stud;
}
lklist show_one_stu_new(lklist y){
	printf(" 学号    %d  \n", y->num);
	printf(" 姓名    %s  \n", y->name);
	for (int i = 0; i <y->n_sub; i++){
		printf("  科目    %s  \n", y->subject[i]);
		printf("  成绩    %6.2f  \n", y->score[i]);
	}
	return y;
}
float cal_one_sum(lklist sum_one){
	float total = 0;//一个学生的总成绩
	total = 0;//////必须有,      ////  /// /  / / / /没有  ,计算所有学生的成绩
	for (int i = 0; i < sum_one->n_sub; i++){
		total = total + sum_one->score[i];
	}
	return total;
}
float  calcu_sum_hight(lklist sum_h){
	  sum_h = sum_h->next;//指向首节点
       float sum_hight = 0;
	   float sum_hig = 0;//// 临时存储
	   sum_hight = cal_one_sum(sum_h);
	   sum_h = sum_h->next;//指向首节点的下一个节点
	   while (sum_h!=NULL){
		   sum_hig = cal_one_sum(sum_h);
		   sum_hight = (sum_hig > sum_hight) ? sum_hig : sum_hight;
		   sum_h = sum_h->next;//指向下一个节点
	   }
	   return sum_hight;
}
lklist creat_input_new(){
	pointer head=NULL, rear=NULL,temp=NULL;
	int cycle_select=0;
	head = head1;
	rear1=rear = head;
	printf("   计划要输入的信息  请  一次性输入!!!!!");
	while (cycle_select != 1)
	{
		temp = (struct student*)malloc(size);
		temp=input_one_new(temp);
        rear->next = temp;
		rear = temp;
		printf("   学生信息输入是否继续?【输入 1 结束】\n");
		scanf_s("%d", &cycle_select); fflush(stdin); //清空缓冲区
        }
	rear1 = rear;
        rear->next = NULL;
	return head1;
}
void show_stu_mew(lklist stu){
stu= head1->next;
	while (  stu != NULL){
		   stu= show_one_stu_new(stu);
				stu = stu->next;			
		}
}
int input_num(){
		int lg = 0;////学号
          printf("请输入要处理的学生的学号  ");
		  scanf_s("%d", &lg); fflush(stdin); //清空缓冲区
		 return lg;
}
char *input_name(){
	char nam[max]; 
	printf("请输入要处理的学生的行姓名!  ");
	scanf_s("%s", nam, max); fflush(stdin); //清空缓冲区
	return nam;
}
char continue_run_order(){
	char chr;//////控制变量
	printf("是否继续处理信息?     是 【 Y 】  否  【  N  】\n");
	chr = getchar();
	return chr;
}
void  calculate_sum(lklist p){
	p = p->next;//指向首节点
	float average = 0;//一个学生的平均成绩
	while (p != NULL){
		average = cal_one_sum(p) / p->n_sub;///调用求和,并计算平均分
		if ((average*p->n_sub )!= calcu_sum_hight(head1))
			printf("  计算结果   学号  %d  姓名  %s   总成绩 %f   平均分  %f  \n ", p->num, p->name, cal_one_sum(p), average);
		else
			printf(" 成绩最高者   学号  %d  姓名  %s   总成绩 %f   平均分  %f  \n ",p->num, p->name, cal_one_sum(p), average);
		p = p->next;
	}
}
void find_stu_new(lklist fi){
	int select_f = 0; 
	char *name1 = NULL;
	fi = fi->next;//指向首节点
	int h; 
	 
	while (ture){ 
		printf("输入  【 1 】  按学号查找   输入  【 2 】  按姓名查找");
	     scanf_s("%d", &select_f); fflush(stdin); //清空缓冲区
		 
		 if (select_f==1){
		     h =input_num() ;///接收     学号
			 while (fi != NULL){
				 if (h== fi->num)
					 fi = show_one_stu_new(fi);
				 fi = fi->next;
			 }
		 }
		 else  if(select_f==2){
			  name1 = input_name();///接收   姓名
		     while (fi != NULL){
			  if (!strcmp((name1),fi->name))
				fi = show_one_stu_new(fi);
			   fi = fi->next;
		     }
		
		 }
        else 
		 printf("查询失败!");
		 char chy = continue_run_order();/////接收是否继续执行的条件
	if (chy == 'y' || chy == 'Y'){
		fi = head1;
		fi = fi->next;////////指向首节点
		continue;
	}
    else 
	     break;
  } 
}
void update_new(lklist up){
	
	up = up->next;///指向首节点
	while (ture){
		int nu_h = input_num();
	while (up!=NULL){
		if (nu_h==up->num)
			input_one_new(up);
		up = up->next;
	}
	char c= continue_run_order();
	if ( c== 'y' || c == 'Y'){
			up = head1;/////////指向头节点
			up = up->next;////指向首节点
			continue;
		}
		else
			break;
	}
}///////修改学生信息
////////////////////不正确////////////////////////////不正确///////////////////////
void save_stu_new_tofile(lklist student){
	FILE * file_pointer;////文件指针
	fpos_t *position=NULL;
	student = student->next;////指向首节点
	fopen_s(&file_pointer, "d:\\学生信息.txt", "w");
	if (file_pointer==NULL){
		printf("文件打开失败!");
	}
	while (student!=NULL){
	      //fwrite(student,size,1,file_pointer);
		fprintf(file_pointer," %5d%5d%5s",student->num,student->n_sub,student->name);
		for (int i=0;i<student->n_sub;i++){
			fprintf(file_pointer,"%12s%10.2f\n",student->subject[i],student->score[i]);
		}
		  student = student->next;
      }
	//fgetpos(file_pointer,position);
	printf("文件读写出错检测!  输出   0  表示没有出错    %d   ",ferror(file_pointer));
	fclose(file_pointer);////////
	index_counter = 1;
}////保存已经输入的学生信息
///////////////////////不正确//////////////////////不正确//////////////////
void creat_input_to_file_new(lklist st){
	FILE * fp1=NULL;
	pointer temp0=NULL;
	pointer rear0 = NULL;
	rear0 = st;
	temp0 = (pointer)malloc(size);
	rear0->next = temp0;
	rear0= temp0;//使    st   指向空接点    即链表的最后一得节点
	fopen_s(&fp1,"d:\\学生信息.txt","r");
	if (fp1 == NULL){
		printf("文件打开失败!\n");
	}
	//fsetpos(fp1,&position);
	while (!feof(fp1)){
		
		fscanf_s(fp1,"%d%d",&(temp0->num),&(temp0->n_sub));
		fscanf_s(fp1,"%s",temp0->name,max);
		for (int i = 0; i < temp0->n_sub; i++){
			fscanf_s(fp1,"%s",temp0->subject[i],max);
			fscanf_s(fp1,"%f",&(temp0->score[i]));
		}
		fgetc(fp1);
		rear0->next = temp0;
		 rear0= temp0;
		temp0 = (pointer)malloc(size);
	}
	rear1 = rear0;
	rear0->next = NULL;
	printf("文件读写出错检测!  输出   0  表示没有出错   %d   \n",ferror(fp1));
	fclose(fp1);
}/////将信息从文件中读入链表
void clear_record(lklist clear){
	if (clear==NULL){
		return;
	}
	if (clear->next==NULL){
		free(clear);
	}
	else{
		void clear_record(head1);
		free(clear);
		clear = NULL;
	}
}
void free_pointer_quit(lklist s){
	if (index_counter == 1){
		clear_record(head1);
		exit(0);
	}
	if (index_counter == 0){
		char ch;
		printf("是否对已经输入的信息进行保存????【是:Y   ;  否  N 】 ");
		scanf_s("%c", &ch, 1); fflush(stdin); //清空缓冲区
		if ((ch == 'Y') || (ch - 32 == 'Y')){
			save_stu_new_tofile(rear1);
			 clear_record(head1);
			exit(0);
		}
		else
			exit(0);
	}
}
void screen_clear(){
	system("CLS");
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

开源从代码分享开始 分享代码