呜哇阿阿
2021-06-20 16:25
采纳率: 100%
浏览 27

关于C语言课设学生成绩管理系统的打印功能

/* Note:Your choice is C IDE */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*****函数声明*********/
/////////////////////////////////////////////////////
// 主业务
//////////////////////////////////////////////////////
//	增加:
void  addStudent();
//	删除:
void deleteStudent();
//	查找:
void queryStudent();
void queryBySno();
void queryByName();
//	修改:
void updateStudnt();
//	打印所有信息: 
void printAll();
//	按成绩排序:
void sortNodeByTotal();  
/////////////////////////////////////////////
//辅助业务
/////////////////////////////////////////////
//	读文件:
int readData();
//	写文件:
int writeData();
//	自动生成学号:
int createSno(); 
//	根据学号查找索引:
int findIndex(int sno);
//	显示当前学生信息:
void printCurrent(int index);
//	主菜单:
void mainMenu();
/*********数据结构*********/
struct student      	
{  
     int sno;  // 学号
     char name[20]; // 姓名
	 int chinese; // 语文
	 int maths; // 数学
	 int english; // 英语
	 int total;	// 总成绩
     int state;//状态(1正常,0删除)	
};

// 定义结构体数组存储学生信息
struct student students[100];
// 定义存储当前的最大索引
int maxIndex = -1; 
// 定义文件指针,操作文件
FILE *fp; 
/*****主函数***********/
int main()
{
	maxIndex = readData();
	mainMenu();
	return 0;
}




/*****函数定义*********/ 
void mainMenu()
{
    // 循环显示主业务
	// 提供选择项提示
	// 根据输入选择项调用主业务函数 
	int select = 0;
	while(1)
	{
	printf("|------------------------------|\n");
	printf("|---  欢迎使用学生成绩管理  ---|\n");
	printf("|------------------------------|\n");
	printf("\n");
	
		printf("|------------------------------|\n");
		printf("|       1. 增加学生信息        |\n");
		printf("|       2. 删除学生信息        |\n");
		printf("|       3. 修改学生信息        |\n");
		printf("|       4. 查找学生信息        |\n");
		printf("|       5. 打印全部信息        |\n");
		printf("|       6. 按成绩排序          |\n");
		printf("|       0. 退出系统            |\n");
		printf("|------------------------------|\n");
		printf("请选择业务:");
		scanf("%d",&select);
		switch(select)
		{
			case 1:
			 	addStudent();
			 	break;
			case 2:
			 	deleteStudent();
			 	break;
	 	    case 3:
			 	updateStudnt();
			 	break;
		    case 4:
			 	queryStudent();
			 	break; 	
		 	case 5:
			 	printAll();
			 	break;
		 	case 6:
			 	sortNodeByTotal();
			 	break;	
		 	case 0:
			 	exit(0);
		 	default:
		 		printf("您的选择有误,请重新选择!\n");
		} 
	} 
	 
}

//读文件
int readData()
{
	// 定义读取文件的行数 
	int i = 0;
	// 1打开文件
	if((fp = fopen("student.txt","r")) == NULL)
	{
		// 创建新文件
		fp = fopen("student.txt","w"); 
		return -1;
	}
	// 2读文件
	while(!feof(fp))
	{
		fscanf(fp,"%d %s %d %d %d %d %d",
				&students[i].sno,
				students[i].name,
				&students[i].chinese,
				&students[i].maths,
				&students[i].english,
				&students[i].total,
				&students[i].state);
				// 读取一行数据,索引+1 
				i++;
	} 
	
	// 3关闭文件 
	fclose(fp);
	// 多读取一行,索引从0开始 
	return i-2;
} 
	
	

int writeData()
{
	// 数组索引 
	int i = 0; 
	// 1打开文件
	if((fp = fopen("student.txt","w")) == NULL)
	{
	    printf("打开文件失败!");
	    return 0;
	}
	// 2写文件 - 遍历数组循环操作
	for(i = 0; i <= maxIndex; i++ )
	{
		fprintf(fp,"%d %s %d %d %d %d %d\n",
				students[i].sno,
				students[i].name,
				students[i].chinese,
				students[i].maths,
				students[i].english,
				students[i].total,
				students[i].state);
	} 
	
	// 3关闭文件 
	fclose(fp);
	return 1;
} 
	

int createSno()
{
	// 如果是第一个学生 
	if(maxIndex == 0)
	{
		return 101;
	}
	else
	{
		// 上一个学生的学号 +1 
		return students[maxIndex -1].sno + 1;
	}
  
}
//按学号查询学生在数组中的索引位置
int findIndex(int sno)
{
	int index = -1;
	int i = 0;
	for(i = 0; i <= maxIndex; i++)
	{   
	    // 保证学生是正常状态 
		if(students[i].state == 1)
		{
			if(students[i].sno == sno)
			{
			   // 记录当前索引 
			   index = i;
			   break;
			}	
		}
		
	} 
    return index;
}
//打印当前索引的学生信息
void printCurrent(int index)
{
   printf("|-------------------------------------------------------------------------|\n");
   printf("|%-8s|%-10s|%-8s|%-8s|%-8s|%-8s|\n","学号","姓名","性别","语文","数学","英语","总成绩");
   printf("|--------+----------+--------+--------+--------+--------+--------+--------|\n");
   printf("|%-8d|%-10s|%-8d|%-8d|%-8d|%-8d|\n",
		students[index].sno,
		students[index].name,
		students[index].chinese,
		students[index].maths,
		students[index].english,
		students[index].total);
   printf("|-------------------------------------------------------------------------|\n");
}
void  addStudent()
{
	char answer = 'n';
	printf("----------  增加学生信息  ----------\n");
    // 输入数据到数组
    maxIndex++;
	// 给学生信息赋值
	while(1)
	{
		//学号自增 
		students[maxIndex].sno = createSno(); 
		fflush(stdin);//清空缓存 
		printf("姓名: ");
		gets(students[maxIndex].name);
		fflush(stdin);//清空缓存 
		printf("语文: ");
	    scanf("%d",&students[maxIndex].chinese);
	    printf("数学: ");
	    scanf("%d",&students[maxIndex].maths);
	    printf("英语: ");
	    scanf("%d",&students[maxIndex].english);
	    // 计算总成绩
		students[maxIndex].total = 
		 students[maxIndex].chinese+
		 students[maxIndex].maths+
		 students[maxIndex].english;
		 // 状态默认置为1
		 students[maxIndex].state = 1; 
	
		// 写文件 
		 if(writeData() == 1)
		 {
	 		printf("增加成功!\n");	
	   	 }
	   	 else
	   	 {
	 	   	printf("增加失败!\n");
	     }
	     printf("是否继续:是(y) 否(n): ");
   	     fflush(stdin);//清空缓存 
		 scanf("%c",&answer);
		 if(answer == 'y')
		 {
 			continue;
 		 }
 		 else
	  	 {
 		   break;	
 		 }
		 
	}

	
}
void printAll()

{
	int i;
	printf("----------  打印全部信息  ----------\n");
    printf("|-------------------------------------------------------|\n");
    printf("|%-8s|%-10s|%-8s|%-8s|%-8s|%-8s|\n","学号","姓名","语文","数学","英语","总成绩");
    printf("|--------+----------+--------+--------+--------+--------|\n");
	for(i=0;i<=maxIndex;i++)
	{
		if(students[i].state==1)
		{
			 printf("|%-8d|%-10s|%-8s|%-8d|%-8d|%-8d|\n",
				students[i].sno,
				students[i].name,
				students[i].chinese,
				students[i].maths,
				students[i].english,
				students[i].total);
		     if(i < maxIndex)
		     {
     			  printf("|--------+----------+--------+--------+--------+--------|\n");
     		 }
     		 else
     		 {
 		     	 printf("|-------------------------------------------------------|\n");
 		     }
		}
	}
} 



void deleteStudent()
{
	
	
}
void queryStudent()
{
	
}





void updateStudnt()
{
	
}
 


void sortNodeByTotal()
{
	
	
}  


	

C语言 学生成绩管理系统的打印全部信息功能不可用,不能打印被增加的,数据文件里的信息,并且按功能键回闪退(应用数组遍历循环打印信息)就输入功能数字,可看到打印格式,然后就闪退,没有学生信息

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • Andre_young 2021-06-20 16:27
    已采纳

    闪退问题应该是软件问题吧,你先看看代码有没有错误。能不能贴张图看看具体代码。

    点赞 1 评论
  • CSDN专家-link 2021-06-20 16:26

    说半天还得看代码才知道为什么啊。可能时越界了把

    点赞 1 评论
  • CSDN专家-link 2021-06-20 17:03

    printf("|%-8d|%-10s|%-8s|%-8d|%-8d|%-8d|\n"

    第三个应该是%-8d,不是%-8s

    点赞 评论
  • 呜哇阿阿 2021-06-20 17:13

     

    点赞 评论
  • 有问必答小助手 2021-06-22 16:29

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论

相关推荐 更多相似问题