这个学期我学习了C语言,然而是网上上课,我完全没怎么听进去,所以导致我基本什么都不会。
但是呢,考试并不会因为你说你什么都不会而不考了,而且开学再考比现在考试还要噩梦,所以我马上开始了我的企业级编程。
我选择的课程设计项目是:学生信息管理,为什么?
因为看起来最简单
难啊,很难啊,毕竟什么都没学过,你要我突然写一个C语言程序,真的很难。
我的这个课设项目围绕的重点是如下功能,各位借鉴的时候记得仔细看看
学生信息管理系统设计
学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计学生信息管理系统,使之能提供以下功能:
- 系统以菜单方式工作
- 学生信息录入功能(学生信息用文件保存)---输入
- 学生信息浏览功能---输出
- 查询、排序功能---算法
- 按学号查询
- 按姓名查询
学生信息的删除与修改(可选项)
我做到的功能有: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 按照序号细分功能。