C语言学生信息管理课设的艰辛路-我的缝合道路

这个学期我学习了C语言,然而是网上上课,我完全没怎么听进去,所以导致我基本什么都不会。

但是呢,考试并不会因为你说你什么都不会而不考了,而且开学再考比现在考试还要噩梦,所以我马上开始了我的企业级编程。

我选择的课程设计项目是:学生信息管理,为什么?

因为看起来最简单

难啊,很难啊,毕竟什么都没学过,你要我突然写一个C语言程序,真的很难。

我的这个课设项目围绕的重点是如下功能,各位借鉴的时候记得仔细看看

学生信息管理系统设计

学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计学生信息管理系统,使之能提供以下功能:

  1. 系统以菜单方式工作
  2. 学生信息录入功能(学生信息用文件保存)---输入
  3. 学生信息浏览功能---输出
  4. 查询、排序功能---算法
  5. 按学号查询
  6. 按姓名查询

学生信息的删除与修改(可选项)

我做到的功能有:1,2,3,4,5,6,可选项里面学生信息的删除也做到了。

而且我尽可能在CSDN里面寻找了简单比较容易理解的程序来进行处理,代码我个人觉得也比较简练,也方便进行答辩,至少不会一问三不知,啊啊啊啊啊嗯嗯嗯嗯嗯的卡壳。

代码基本上完全参考了

C语言课设:学生信息管理系统设计_GameStrategist的博客-CSDN博客_学生信息管理系统c语言程序设计

我所做的事情,仅仅只是完善了代码以及去掉了我不会修复的登陆界面,还有增加了TXT输出功能,为了应付了事,在此特别鸣谢GameStrategist能够给我一个能修改的底子,万分感激。

如下,代码奉上:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h> 
//创建结构体模板
struct student
{
	int	id;
	char	name[30];
	int	age;
	char	sex[30];
	int	birthday;
	int	phone;
	char	address[100];
	char	email[100];
}	st[50];//创建结构体数组

//定义全局变量i
int	i = 0;

/* 输入学生信息 */
void shuru()                            
{
	char a[10];
	do
	{
		printf( "\n请输入学号:" );
		scanf( "%d", &(st[i].id) );
		fflush( stdin );        /* 刷新缓冲区 */
		printf( "\n请输入姓名:" );
		scanf( "%s", st[i].name );
		fflush( stdin );
		printf( "\n请输入年龄:" );
		scanf( "%d", &st[i].age );
		fflush( stdin );
		printf( "\n请输入性别:" );
		scanf( "%s", &st[i].sex );
		fflush( stdin );
		printf( "\n请输入出生年,月:" );
		scanf( "%d,%d", &st[i].birthday );
		fflush( stdin );
		printf( "\n请输入电话号码:" );
		scanf( "%d", &st[i].phone );
		fflush( stdin );
		printf( "\n请输入地址:" );
		scanf( "%s", &st[i].address );
		fflush( stdin );
		printf( "\n请输入email:" );
		scanf( "%s", &st[i].email );
		fflush( stdin );
		printf( "\n是否继续输入另外一个学生信息?(y/n)" );
		fflush( stdin );
		scanf("%s",a);
		fflush( stdin );
		i++;
	}
	while ( ( a[0] == 'Y' || a[0] == 'y') && i <= 50 );
}

 /* 显示学生信息 */
void xianshi()                         
{
	int j;
	printf( "-----------------------------------------------\n" );
	for ( j = 0; j < i; j++ )
	{
		printf( "学号\t%d\n\n姓名\t%s\n\n年龄\t%d\n\n性别\t%s\n\n出生年月\t%d\n\n电话号码\t%d\n\n地址\t%s\n\nemail\t%s\n\n", st[j].id, st[j].name, st[j].age, st[j].sex, st[j].birthday, st[j].phone, st[j].address, st[j].email );
		printf( "-----------------------------------------------\n" );
	}
}

 /*按年龄从小到大排序 */
void paixunianling()                               
{
	int	j, k, id1, age1, birthday1, phone1;
	char	name1[30], sex1[3], address1[100], email1[100];
	//冒泡法排序
	for ( j = 0; j < i; j++ )
	{
		for ( k = 0; k < i - 1 - j; k++ )
		{
			if ( st[k].age > st[k + 1].age )
			{
				//交换变量
				age1		= st[k].age;
				st[k].age	= st[k + 1].age;
				st[k + 1].age	= age1;

				strcpy( name1, st[k].name ); /* name1=st[k].name;strcpy() */
				strcpy( st[k].name, st[k + 1].name );
				strcpy( st[k + 1].name, name1 );

				strcpy( sex1, st[k].sex );
				strcpy( st[k].sex, st[k + 1].sex );
				strcpy( st[k + 1].sex, sex1 );

				id1		= st[k].id;
				st[k].id	= st[k + 1].id;
				st[k + 1].id	= id1;

				birthday1		= st[k].birthday;
				st[k].birthday		= st[k + 1].birthday;
				st[k + 1].birthday	= birthday1;

				phone1		= st[k].phone;
				st[k].phone	= st[k + 1].phone;
				st[k + 1].phone = phone1;

				strcpy( address1, st[k].address );
				strcpy( st[k].address, st[k + 1].address );
				strcpy( st[k + 1].address, address1 );

				strcpy( email1, st[k].email );
				strcpy( st[k].email, st[k + 1].email );
				strcpy( st[k + 1].email, email1 );
			}
		}
	}
	//展示排序后的结果
	xianshi();
}

/*按学号从小到大排序 */
void paixuxuehao()                                
{
	int	j, k, id1, age1, birthday1, phone1;
	char	name1[30], sex1[3], address1[100], email1[100];
	//冒泡
	for ( j = 0; j < i; j++ )
	{
		for ( k = 0; k < i - 1 - j; k++ )
		{
			if ( st[k].id > st[k + 1].id )
			{
				id1		= st[k].id;
				st[k].id	= st[k + 1].id;
				st[k + 1].id	= id1;

				strcpy( name1, st[k].name ); /* name1=st[k].name;strcpy() */
				strcpy( st[k].name, st[k + 1].name );
				strcpy( st[k + 1].name, name1 );

				strcpy( sex1, st[k].sex );
				strcpy( st[k].sex, st[k + 1].sex );
				strcpy( st[k + 1].sex, sex1 );

				age1		= st[k].age;
				st[k].age	= st[k + 1].age;
				st[k + 1].age	= age1;

				birthday1		= st[k].birthday;
				st[k].birthday		= st[k + 1].birthday;
				st[k + 1].birthday	= birthday1;

				phone1		= st[k].phone;
				st[k].phone	= st[k + 1].phone;
				st[k + 1].phone = phone1;

				strcpy( address1, st[k].address );
				strcpy( st[k].address, st[k + 1].address );
				strcpy( st[k + 1].address, address1 );

				strcpy( email1, st[k].email );
				strcpy( st[k].email, st[k + 1].email );
				strcpy( st[k + 1].email, email1 );
			}
		}
	}
	//展示数据
	xianshi();
}

/*按学号查找学生的信息 */
void chaxuehao()                       
{
	int	a, num;
	int isFind = 0;
	printf( "\n请输入想查找的学生学号:" );
	fflush( stdin );
	scanf( "%d", &num);
	for ( a = 0; a < i; a++ )
	{
		//按学号为主键进行查询
		if (num==st[a].id)
		{
			printf( "\n\t\t您查找的学生在第%d个位置找到了!\n", a + 1 );
			printf( "学号\t%d\n姓名\t%s\n年龄\t%d\n性别\t%s\n出生年月\t%d\n电话号码\t%d\n地址\t%s\nemail\t%s\n", st[a].id, st[a].name, st[a].age, st[a].sex, st[a].birthday, st[a].phone, st[a].address, st[a].email );
			printf( "------------------------------------------------\n" );
			isFind = 1;
			break;
		}
	}
	if (isFind != 1)
	{
		printf( "\n\t\t没有找到这个学生!\n" );
	}
}

/* 根据姓名查询 */
void chaxingming()                                              
{
	int m, k;
	k = 0;          /* 用K来反映该生姓名是否重名 */                                        
	char name[20];
	printf( "请输入姓名:" );
	scanf( "%s", &name );
	for ( m = 0; m < 50; m++ )
		if ( strcmp( st[m].name, name ) == 0 )  /* 检索该姓名人数 */
		{
			k++;
		}
	if ( k > 1 )     /* k>1,重名 */                               
	{
		printf( "           因您与某同学重名,请输入学号查询\n" );
		chaxuehao();        /* 调用电话查询函数 */                   
	}
	else       /*不重名情况 */                                    
		for ( m = 0; m < 50; m++ )
			if ( strcmp( st[m].name, name ) == 0 )
			{
				printf( "\n\t\t您查找的学生在第%d个位置找到了!!!\n", m + 1 ); break;
			}


	if ( k == 0 )
		printf( "\n    没有找到该学生\n" );
	if ( m > 50 )
		printf( "\n\t\t没有找到这个学生!!!\n" );
	else{
		printf( "------------------------------------------------\n" );
		printf( "学生\t%d\n姓名\t%s\n年龄\t%d\n性别\t%s\n出生年月\t%d\n电话号码\t%d\n地址\t%s\nemail\t%s\n", st[m].id, st[m].name, st[m].age, st[m].sex, st[m].birthday, st[m].phone, st[m].address, st[m].email );
		printf( "------------------------------------------------\n" );
	}
}

//用文本方式输出数据
void PrintToTxt()
{
    FILE* fp_output = fopen("data.txt", "w");
    for (int r = 0; r < i ; r++) 
	{
		fprintf( fp_output,"-----------------------------------------------\n" );
        fprintf(fp_output, "学号%d\n ", st[r].id);
        fprintf(fp_output, "姓名%s\n ", st[r].name);
        fprintf(fp_output, "年龄%d\n ", st[r].age);
		fprintf(fp_output, "性别%s\n ", st[r].sex);
		fprintf(fp_output, "生日%d\n ", st[r].birthday);
		fprintf(fp_output, "电话%d\n ", st[r].phone);
		fprintf(fp_output, "地址%s\n ", st[r].address);
		fprintf(fp_output, "电子邮箱%s\n ", st[i].email );
		fprintf( fp_output,"-----------------------------------------------\n" );
    }
   fclose(fp_output);
}

/*删除学生信息 */
void shanchu()                             
{
	int	p, number;
	char	c;
	do
	{
		printf( "\n请输入要删除的学生学号:\n" );
		fflush( stdin );
		scanf( "%d", &number );
		for ( p = 0; p < i; p++ )
		{
			//循环查找,如发现相同的id则跳出循环,记录p p表示查找的下标
			if ( st[p].id == number )
				break;
		}
		//从p下标开始,依次向前覆盖数据,以达成删除数据的目的
		for ( number = p; number < i; number++ )
			st[number] = st[number + 1];
		if ( p > i )
			printf( "\t\t没有找到这个学生!!!\n" );
		else{
			i--;
			xianshi();//展示处理后的结果
		}

		printf( "\n是否继续删除另一个学员信息?(y/n) " );
		fflush( stdin );
		c = getchar();
	}
	while ( c == 'y' || c == 'Y');
}


int main()
{
	system("color 9F");//改变色彩
	system( "cls" );
	int change, n;
	do
	{
		system( "cls" );
		printf( "============================学生信息管理系统===================================\n" );
		printf( "\t\t\t1 输入学生信息\n" );
		printf( "\t\t\t2 显示学生信息\n" );
		printf( "\t\t\t3 查找学生信息\n" );
		printf( "\t\t\t4 删除学生信息\n" );
		printf( "\t\t\t5 按年龄排序信息\n" );
		printf( "\t\t\t6 按学号排序信息\n" );
		printf( "\t\t\t7 用文本方式输出数据\n" );
		printf( "\t\t\t8 退出程序\n" );
		printf( "==============================================================================\n" );
		fflush( stdin );
		printf( "\t\t\t请输入功能选项:" );
		scanf( "%d", &change );
		switch ( change )//使用switch函数进行分支选项,在完成目的之后返回起始界面
		{
		case 1: shuru(); break;
		case 2:
			xianshi(); break;
		case 3:
			printf( "请输入您的姓名或学号,输入姓名请按1,输入学号请按2。(输入后按enter键)\n" );
			printf( "输入选择: " );
			scanf( "%d", &n );
			getchar();
			switch ( n )
			{
			case 1: chaxingming(); break;
			case 2: chaxuehao(); break;
			}
			; break;

		case 4:
			shanchu(); break;
		case 5:
			paixunianling(); break;
		case 6:
			paixuxuehao(); break;
		case 7:
		    PrintToTxt(); break;
		case 8:
		    break;
		}
		getch();
	}
	while ( change != 8 );
	return(0);
}


在修改以及程序学习方面,我感谢kanokano,我的好朋友,在这里贴上他的个人博客链接

XM的小窝 - 随便写写~时不时会更新一些好玩的东西~https://kanokano.cn/

首先是引入相关的头文件
string.h 是引入操作字符串方法的头文件 比如 srtcpy strcmp之类的函数
conio.h 在我的程序里面只是引入和使用getch函数
其他的头文件是引入常规的输入输出语句

然后是创建结构体,结构体里面定义了学生的信息,其中字符串是用字符数组形式存放的。

结构体之后接着定义一个长度为50的结构体数组,用来存放每个学生的信息

全局变量i的作用是,统计输入的学生的总人数,避免数组越界。

shuru 函数解释:
    创建一个循环和一个字符串数组a,然后依次输入,每次循环都会要求输入a,如果a[0]为Y或者y,那么继续
执行循环,反之则跳出循环,结束输入,并且总输入次数不超过50
   关于为什么变量a是数组形式而不是普通char形式,是因为防止用户输入一个以上的字符导致程序异常

xianshi 函数解释:
    在循环里面遍历结构体数组,输出

排序部分:
paixunianling 函数解释:
    这个函数的功能是把结构体数组按照年龄从小到大排序,使用的排序方法为冒泡法

paixuxuehao 函数解释:
    这个函数的功能是把结构体数组按照学号从小到大排序,使用的排序方法为冒泡法

查找部分:
chaxuehao 函数解释:
    函按照学号为主键进行查找,依次遍历数组元素,如果找到就输出 并将isFind标记设为1,并跳出循环
如果都找不到,isFind标记则始终为0 代表没有找到 ,提示用户未找到

chaxingming同上 区别在于 姓名需要strcmp函数来进行字符串比较,相同函数返回0,且名字容易重复
在重名的情况下会跳转到电话查询函数中来进行精确查找

shanchu 函数解释:
首先是定位需要删除的学生的学号,使用循环遍历,定位到所在下标,之后使用循环,从这个下标(p)开始,依次使用后一个数据覆盖前一个数据,并让全局变量i,也就是所储存的学生总人数减一,以此达到删除数据的目的

TXT输入函数解释:直接在函数里循环里面遍历结构体数组,输出到TXT之后返回主界面,非常的没有技术含量,非常的好解释。

main函数部分:外使用循环来维持程序的执行,当用户输入8的时候结束循环
内层使用switch 按照序号细分功能。


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值