话不多说,直接上源码,源码有注释 ?? ???? inquire()//查询 ?? ???? show()//显示 ?? ???? increase();//增加 ?? ???? del()//删除 ?? ???? modification()//修改 ?? ???? save()//保存
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#define DATALEN 15//定义结构体数量
int n=0;//当前学生人数
int m=0;//新增学生人数
void help();
int inquire();
void modification();
void save();
void show();
void increase();
void del();
struct stduent {//储存学生信息
int age;//年龄
char name[30];//姓名
char Id[30];//学号
char chinese[10];//语文成绩
char math[10];//数学
};
struct stduent words[DATALEN];
int main() {
int j;
FILE* data;//要读取的文件指针
int sum = 0, k = 1;
int i = 0;//结构题数组移动
if ((data = fopen("D://qq.txt", "r")) == NULL) {//打开文件
printf("打开文件失败\n");
return ;
}
else {
printf("---读取的学生信息\n");
printf("年龄 姓名 学号 语文 数学 \n");
while (!feof(data)) {
fscanf(data, "%d %3s %3s %3s %3s\n", &words[i].age, &words[i].name, &words[i].Id, &words[i].chinese, &words[i].math);
//循环读出文件信息并保存进结构体
i++;//每储存一位学生信息就加一
}
//fclose(data);
for (j = 0; j < i; j++) {
printf("%d %5s %5s %5s %5s\n", words[j].age, words[j].name, words[j].Id, words[j].chinese, words[j].math);//循环显示学生信息
}
fclose(data);
n = j;//读取当前学生信息
}
while (k)
{
int num;
printf("\n----------------------------------------\n");
printf(" 学生信息管理系统\n");
printf("\n");
printf(" * 0. 系统帮助\n");
printf("\n");
printf(" * 1. 查询学生信息\n");
printf("\n");
printf(" * 2. 显示所有学生信息\n");
printf("\n");
printf(" * 3. 增加学生信息\n");
printf("\n");
printf(" * 4. 删除学生信息\n");
printf("\n");
printf(" * 5. 修改学生信息\n");
printf("\n");
printf(" * 6. 保存当前信息\n");
printf("\n");
printf(" * 7. 退出系统\n");
printf("\n");
printf("--------------------------------------------\n");
printf("请选择菜单编号:");
scanf("%d", &num);
switch (num)
{
case 0:help(); break;//帮助
case 1:inquire(); break;//查询
case 2:show(); break;//显示
case 3:increase(); break;//增加
case 4:del(); break;//删除
case 5:modification(); break;//修改
case 6:save(); break;
case 7: {
k = 0;//用于退出while循环
printf("即将退出程序!\n");
break;
}
default:printf("请在0-8之间选择\n");
}
}
return 0;
}
//操作需知
void help(){
printf("\n----------------------------------------------------------\n");
printf("\n--操作须知:\n");
printf(" 欢迎使用学生信息管理系统,请认真阅读操作须知\n");
printf(" 注意,输入分大小写\n");
printf(" 初次进去请增加学生信息\n");
printf(" 请按要求输入要查询的信息代号,不然将会出现错误\n");
printf(" 完成操作后请保存信息\n");
printf(" 感谢您的使用\n");
printf("--------------------------------------------------------------\n");
system("pause");//用于退出当前函数
}
//查询学生信息
int inquire() {
int flag = 0;//用于判断
char pp[15];//学号
int i = 0;
int num = 0;
while (1)
{
printf("\n--请输入菜单编号\n");
printf(" 1. 按学号查询\n");
printf(" 2. 退出\n");
scanf("%d", &num);
switch (num)
{
case 1:
printf("请输入要查询的学生的学号:\n");
scanf("%s", pp);//用于比较
for (int i = 0; i < n; i++) {
if (strcmp(words[i].Id, pp) == 0)//进行比较
{
printf("\n年龄 姓名 学号 数学 语文 \n");
printf("%d %s %s %s %s", words[i].age, words[i].name, words[i].Id, words[i].math, words[i].chinese);
printf("\n");
flag = 1;
}
}
if (flag == 0)
printf("不存在");
break;
case 2:
system("cls");//清屏函数
return;
default:
printf("请在1-3之间选择\n");
}
}
}
//修改学生信息
void modification() {
int i, item, num = -1,flag=0;
char s1[30], s2[30],score1[5], score[5];
printf("请输入要要修改的学生的姓名:\n");
scanf("%s", s1);
for (i = 0; i < n; i++) {
if (strcmp(words[i].name, s1) == 0) {
flag = 1;
num = i;
}
}
if (flag == 0) {
printf("\n不存在\n");
system("pause");
}
if (num != -1)
{
while (1) {
printf("\n请确认需要修改的信息,并输入编号:\n");
printf("\n");
printf(" *1. 姓名\n");
printf(" *2. 年龄\n");
printf(" *3. 语文\n");
printf(" *4. 数学\n");
printf(" *5. 退出\n");
printf("\n");
printf("请选择子菜单编号:");
scanf("%d", &item);
switch (item)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s", s2);
strcpy(words[num].name, s2);
printf("修改完毕\n");
break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d", words[num].age);
printf("修改完毕\n");
break;
case 3:
printf("请输入新的语文成绩:\n");
scanf("%s", &score);
strcpy(words[num].chinese, score);
printf("修改完毕\n");
break;
case 4:
printf("请输入新的数学成绩:\n");
scanf("%s", &score);
strcpy(words[num].math, score);
printf("修改完毕\n");
break;
case 5:
system("cls");//清屏
return;
default:printf("请在1-7之间选择\n");
}
}
}
if(flag==1)
printf("修改完毕!请及时保存!\n");
else if (flag == 0)
printf("未能修改\n");
}
//保存信息
void save()
{
FILE* fp; //文件指针
int i;
fp = fopen("D://qq.txt", "wb + ");//打开文件
for (i = 0; i < 2; i++)
{
fprintf(fp,"%d %s %s %s %s\r\n", words[i].age, words[i].name, words[i].Id, words[i].math, words[i].chinese);
}
fclose(fp);//关闭文件
printf("已完成保存!");
system("pause");//结束进程但不退出
system("cls");
}
//显示
void show() {
int i;
printf("共有%d位学生的信息:\n", n);
if (n!=0)
{
printf("年龄 姓名 学号 语文 数学 \n");
printf("--------------------------------------------------------------------\n");
for (i = 0; i < n; i++)
{
printf("%d %5s %5s %5s %5s\n", words[i].age, words[i].name, words[i].Id, words[i].chinese, words[i].math);
}
return;
}
}
//增加
void increase() {
int i = n, j, flag; //n为现有学生人数
printf("请输入待增加的学生数:\n");
scanf("%d", &m);
if (m > 0)
{
do
{
flag = 1;
while (flag)
{
flag = 0;
printf("请输入第%d位学生的学号:\n", i + 1);
scanf("%s", &words[i].Id);
for (j = 0; j < i; j++)
if (strcmp(words[i].Id, words[j].Id) == 0) {//先进行比较是否存在
printf("已有该学号!\n");
flag = 1;
break;
}
}
printf("请输入第%d 个新学生的学号:\n", i + 1);
scanf("%s", words[i].Id);
printf("请输入第%d 个新学生的姓名:\n", i + 1);
scanf("%s", words[i].name);
printf("请输入第%d 个新学生的年龄:\n", i + 1);
scanf("%d", &words[i].age);
printf("请输入第%d 个新学生的语文成绩\n", i + 1);
scanf("%s", words[i].chinese);
printf("请输入第%d 个新学生的数学成绩:\n", i + 1);
scanf("%s", words[i].math);
if (flag == 0)
{
i++;
}
} while (i < n + m);//用于判断是否结束循环
n += m;//原来的加上新增的
printf("信息增加完毕!\n\n");
system("pause");
system("cls");
}
}
//删除
void del() {
int i, j, flag = 0; //flag为查找成功标志,0表示查找失败,1表示查找成功
char s1[30];
printf("请输入要删除学生的学号:\n");
scanf("%s", s1);
for (i = 0; i < n; i++)
if (strcmp(words[i].Id, s1) == 0){//比较是否存在
flag = 1;
for (j = i; j < n - 1; j++) //后面的学生向前移动
words[j] = words[j + 1];
}
}
if (flag == 0)
printf("该学号不存在!\n");
else if (flag == 1)
{
printf("删除成功\n");
n--; //删除成功后,学生人数减1
}
system("pause");
system("cls");
}
#define _CRT_SECURE_NO_WARNINGS 要注意此宏定义的使用,如果是在像vs这用编译器中使用就要加上,不然像scanf_s这种不安全的函数就不能使用,在vc++这种编译器中就要去掉了,否则程序报错。
|