C语言实现学生信息管理系统(文件操作)

目录
  • 新增函数——文件操作;
  • 1.头文件和预处理
  • 2.定义学生结构体的数据结构
  • 3.定义每条记录或节点的数据结构
  • 4.函数接口代码.
    • 1.定义提示菜单
    • 2.增加学生记录
    • 3.输入学号接口·
    • 4.遍历表中学生
    • 5.增加学生记录
    • 6.删除学生信息
    • 7.查找学生信息
    • 8.修改学生信息
    • 9.统计学生人数
    • 10.清空链表
    • 11.文件操作
  • 5.main函数
  • 6.学生信息管理系统总源码(可直接复制运行)
  • 7.测试结果

本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下

前言:与上篇文章相比,增加了文件操作,可将任意时期的的学生数据存储再文件中,菜单也随之改动,增加了文件操作一栏,是否存储到相应文件中由使用者决定

新增函数——文件操作;

//学生数据文件储存 
//储存任意时期的学生数据 
void Store_List(Link head)
{
    //文件操作 
    ofstream ofs;
    ofs.open("Std_Information.txt",ios::out);
    
    if(head==NULL)
    {
        printf("学生为空\n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
}

1.头文件和预处理

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
#include<fstream>//文件操作所需头文件 
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11

/* 定义学生结构体的数据结构 */
typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;

/* 定义每条记录或节点的数据结构 */
typedef struct node
{
    struct Student data; //数据域
    struct node *next; //指针域
}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

2.定义学生结构体的数据结构

typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;

3.定义每条记录或节点的数据结构

/* 定义每条记录或节点的数据结构 */
typedef struct node
{
    struct Student data; //数据域
    struct node *next; //指针域
}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

4.函数接口代码.

1.定义提示菜单

//定义提示菜单
void myMenu(){

    printf("*****************************菜单*****************************\n"); 
    printf("***********************1 增加学生记录*************************\n"); 
    printf("***********************2 删除学生记录*************************\n"); 
    printf("***********************3 查找学生记录*************************\n"); 
    printf("***********************4 修改学生记录*************************\n"); 
    printf("***********************5 统计学生人数 ************************\n"); 
    printf("***********************6 显示学生记录*************************\n"); 
    printf("***********************7 信息文件打印*************************\n");
    printf("***********************8 退出系统 ****************************\n"); 
    
}

2.增加学生记录

void inputStudent(Link l){
     printf("请输入学生学号:");
     scanf("%s",l->data.studentNo);
     printf("请输入学生的姓名:");
     scanf("%s",l->data.studentName);
    printf("请输入学生的成绩:");
     scanf("%s",&(l->data.score));
     //每个新创建的节点的next域都初始化为NULL
     l->next = NULL;
     system("cls");
}

3.输入学号接口·

void inputStudentNo(char s[],char no[]){
    printf("请输入要%s的学生学号:",s);
    scanf("%s",no);
}

4.遍历表中学生

//遍历表中学生 
void displayNode(Link head){
    if(head==NULL)
    {
        printf("学生为空\n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
   system("pause");
   system("cls");
}

5.增加学生记录

/* 增加学生记录 */
bool addNode(Link head){
     Link p,q;   //p,q两个节点一前一后
     Link node;  //node指针指向新创建的节点
     node=(Link)malloc(sizeof(Node));
     inputStudent(node);

     q = head;
     p = head->next;  //q指向head后面的第一个有效节点
     if(head->next==NULL)
         //链表为空时
        head->next = node;
     else {
         //循环访问链表中的所有节点
        while(p != NULL){
            if (node->data.studentNo < p->data.studentNo){
                //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                q->next = node;
                node->next = p;
                return true;
            }
            else{
                //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                q = p;
                p = p->next;

            }
        }
        //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
        q->next = node;

    }
     return true;
     system("pause");
   system("cls");
}

6.删除学生信息

//删除学生信息
bool deleteNode(Link head){
    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false

    //输入要处理的学号
        char no[NO_LENGTH];
    inputStudentNo("删除",no);
        Link p=head->next;
    Link q=head;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"成功删除该学生"<<endl; 
            q->next=p->next;
            free(p);
            system("pause");
               system("cls");
            return true;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    cout<<"未找到该学生"<<endl; 
        system("pause");
           system("cls");
    return false;
}

7.查找学生信息

//查找学生信息 
bool queryNode(Link head){
    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false

    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("查找",no);
        Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            
               system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到该学生"<<endl; 
   system("cls");

    return false;
}

8.修改学生信息

//修改学生信息 
bool modifyNode(Link head){
    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
    
    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("修改",no);
    Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"请输入修改后的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"请输入修改后的学号"<<endl; 
            cin>>p->data.studentNo;
            cout<<"请输入修改后的成绩"<<endl; 
            cin>>p->data.score;
            system("cls");
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到该学生,请重新输入学号"<<endl; 
    system("cls");
    return false;
}

9.统计学生人数

//统计学生人数
int countNode(Link head){
    //统计学生人数,扫描链表统计节点个数,返回节点数
    Link p;
    int count = 0;
    p = head->next;
    while(p)
    {
        p=p->next;
        count++;
    }
    //填充代码
    system("cls");
    return count;
}

10.清空链表

//清空链表 
void clearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;
    while(p)
    {
        q->next=p->next;
        free(p);
        p=q->next;
    }
        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
}

11.文件操作

//学生数据文件储存 
//储存任意时期的学生数据 
void Store_List(Link head)
{
    //文件操作 
    ofstream ofs;
    ofs.open("Std_Information.txt",ios::out);
    
    if(head==NULL)
    {
        printf("学生为空\n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
}

5.main函数

int main() {
    int select;
        int count;
    Link head;  // 定义链表

    //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
    head = (Link)malloc(sizeof(Node));
    head->next = NULL;

    while(1)
    {
        myMenu();
        printf("\n请输入你的选择(0-7):");  //显示提示信息
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            //增加学生记录
            if(addNode(head))
                printf("成功插入一个学生记录。\n\n");
            break;
        case 2:
            //删除学生记录
            if(deleteNode(head))
                printf("成功删除一个学生记录。\n\n");
            else
                printf("没有找到要删除的学生节点。\n\n");
            break;
        case 3:
            //查询学生记录
            if(queryNode(head))
                printf("成功找到学生记录。\n\n");
            else
                printf("没有找到要查询的学生节点。\n\n");
            break;
        case 4:
            //修改学生记录
            if(modifyNode(head))
                printf("成功修改一个学生记录。\n\n");
            else
                printf("没有找到要修改的学生节点。\n\n");
            break;
        case 5:
            //统计学生人数
            count = countNode(head);
            printf("学生人数为:%d\n\n",count);
            break;
        case 6:
            //显示学生记录
            displayNode(head);
            break;
        case 7:
            //退出前清除链表中的所有结点
            clearLink(head);
            return 0;
        default:
            printf("输入不正确,应该输入0-7之间的数。\n\n");
            system("cls"); 
            break;
        }
    }
    return 0;
}

6.学生信息管理系统总源码(可直接复制运行)

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
#include<fstream>//文件操作所需头文件 
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11

/* 定义学生结构体的数据结构 */
typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;

/* 定义每条记录或节点的数据结构 */
typedef struct node
{
    struct Student data; //数据域
    struct node *next; //指针域
}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

//定义提示菜单
void myMenu(){

    printf("*****************************菜单*****************************\n"); 
    printf("***********************1 增加学生记录*************************\n"); 
    printf("***********************2 删除学生记录*************************\n"); 
    printf("***********************3 查找学生记录*************************\n"); 
    printf("***********************4 修改学生记录*************************\n"); 
    printf("***********************5 统计学生人数 ************************\n"); 
    printf("***********************6 显示学生记录*************************\n"); 
    printf("***********************7 信息文件打印*************************\n");
    printf("***********************8 退出系统 ****************************\n"); 
    
}

void inputStudent(Link l){
     printf("请输入学生学号:");
     scanf("%s",l->data.studentNo);
     printf("请输入学生的姓名:");
     scanf("%s",l->data.studentName);
    printf("请输入学生的成绩:");
     scanf("%d",&(l->data.score));
     //每个新创建的节点的next域都初始化为NULL
     l->next = NULL;
     system("cls");
}

void inputStudentNo(char s[],char no[]){
    printf("请输入要%s的学生学号:",s);
    scanf("%s",no);
}
//遍历表中学生 
void displayNode(Link head){
    if(head==NULL)
    {
        printf("学生为空\n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            //ofs<< "姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
   system("pause");
   system("cls");
}

/* 增加学生记录 */
bool addNode(Link head){
     Link p,q;   //p,q两个节点一前一后
     Link node;  //node指针指向新创建的节点
     node=(Link)malloc(sizeof(Node));
     inputStudent(node);

     q = head;
     p = head->next;  //q指向head后面的第一个有效节点
     if(head->next==NULL)
         //链表为空时
        head->next = node;
     else {
         //循环访问链表中的所有节点
        while(p != NULL){
            if (node->data.studentNo < p->data.studentNo){
                //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                q->next = node;
                node->next = p;
                return true;
            }
            else{
                //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                q = p;
                p = p->next;

            }
        }
        //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
        q->next = node;

    }
     return true;
     system("pause");
   system("cls");
}

bool deleteNode(Link head){
    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false

    //输入要处理的学号
        char no[NO_LENGTH];
    inputStudentNo("删除",no);
        Link p=head->next;
    Link q=head;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"成功删除该学生"<<endl; 
            q->next=p->next;
            free(p);
            system("pause");
               system("cls");
            return true;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    cout<<"未找到该学生"<<endl; 
system("pause");
   system("cls");
    return false;
}

//查找学生信息 
bool queryNode(Link head){
    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false

    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("查找",no);
        Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            
               system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到该学生"<<endl; 
   system("cls");

    return false;
}

//修改学生信息 
bool modifyNode(Link head){
    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
    
    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("修改",no);
    Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"请输入修改后的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"请输入修改后的学号"<<endl; 
            cin>>p->data.studentNo;
            cout<<"请输入修改后的成绩"<<endl; 
            cin>>p->data.score;
            system("cls");
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到该学生,请重新输入学号"<<endl; 
    system("cls");
    return false;
}

//统计学生人数
int countNode(Link head){
    //统计学生人数,扫描链表统计节点个数,返回节点数
    Link p;
    int count = 0;
    p = head->next;
    while(p)
    {
        p=p->next;
        count++;
    }
    //填充代码
    system("cls");
    return count;
}

//清空链表 
void clearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;
    while(p)
    {
        q->next=p->next;
        free(p);
        p=q->next;
    }
        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
}

//学生数据文件储存 
//储存任意时期的学生数据 
void Store_List(Link head)
{
    //文件操作 
    ofstream ofs;
    ofs.open("Std_Information.txt",ios::out);
    
    if(head==NULL)
    {
        printf("学生为空\n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
}
int main() {
    int select;
        int count;
    Link head;  // 定义链表
    
    
    //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
    head = (Link)malloc(sizeof(Node));
    head->next = NULL;

    while(1)
    {
        myMenu();
        printf("\n请输入你的选择(0-8):");  //显示提示信息
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            //增加学生记录
            if(addNode(head))
                printf("成功插入一个学生记录。\n\n");
            break;
        case 2:
            //删除学生记录
            if(deleteNode(head))
                printf("成功删除一个学生记录。\n\n");
            else
                printf("没有找到要删除的学生节点。\n\n");
            break;
        case 3:
            //查询学生记录
            if(queryNode(head))
                printf("成功找到学生记录。\n\n");
            else
                printf("没有找到要查询的学生节点。\n\n");
            break;
        case 4:
            //修改学生记录
            if(modifyNode(head))
                printf("成功修改一个学生记录。\n\n");
            else
                printf("没有找到要修改的学生节点。\n\n");
            break;
        case 5:
            //统计学生人数
            count = countNode(head);
            printf("学生人数为:%d\n\n",count);
            break;
        case 6:
            //显示学生记录
            displayNode(head);
            break;
        case 7:Store_List(head);
                cout<<"打印成功"<<endl; 
                system("pause");
                   system("cls");
            break;
        case 8:
            //退出前清除链表中的所有结点
            clearLink(head);
            return 0;
        default:
            printf("输入不正确,应该输入0-8之间的数。\n\n");
            system("pause");
            system("cls"); 
            break;
        }
    }
    return 0;
}

7.测试结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现学生信息管理系统(单链表)

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 /*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:吴敬超 * 完成日期:2016年7月1日 * 版本号:codeblock * * 问题描述: 学生信息管理系统 * 输入描述: * 程序输出: 输出结果 */ #include <stdio.h> #include <stdlib.h> #include

  • C语言使用链表实现学生信息管理系统

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 代码实现的功能: 1.插入学生信息 2.显示学生信息 3.删除学生信息 4.在指定位置插入学生信息 5.查找学生信息 代码内容: #include <stdio.h> #include <stdlib.h> #include <string.h> #define Max_Student_Num 10 #define Max_Str_len 20 typedef struct T_stud

  • C语言实现学生信息管理系统(文件版)

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 下面是我自己用写的学生信息管理系统,为了增加数据的利用率,分为学生端和教师端,同时实现账号密码登录,以文件的形式将其存入. 代码如下 #include <stdio.h> #include <string.h> #include <string> #include<Windows.h> #define USER "TOM" // 事先定义用户名,用于登录页

  • C语言版学生信息管理系统

    本文实例为大家分享了C语言版学生信息管理系统的具体代码,供大家参考,具体内容如下 一.题目分析 1.功能概述 1)查询学生信息 2)添加学生信息 3)修改学生信息 4)删除学生信息 5)刷新学生信息 6)保存学生信息 7)输出当前学生信息 2.题目要求: 1)使用结构体建立学生信息体制 2)实现七大基本功能 3)采用文件存储学生信息 二.算法构造 1.难点解析----对文件的操作 1.1文件读取 FILE * fp; if ((fp = fopen(filename, "r")) ==

  • C语言数据结构之学生信息管理系统课程设计

    本文实例为大家分享了学生信息管理系统设计的具体代码,供大家参考,具体内容如下 建立一个动态链表,链表中每一结点包括:学号.姓名.性别.年龄.成绩.程序能实现以下功能: 建立链表      显示链表      查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息.      删除链表中指定学号的结点.      在链表中指定的位置插入一个新结点(学号不能和其他结点重复). 要求:程序运行中,先显示实现以上功能所构成的菜单,然后根据选项调用相应程序

  • C语言数组实现学生信息管理系统设计

    概述 单纯只用多个数组管理学生成绩信息,不使用结构体,该程序最主要的难点是依据学号或总成绩对学生信息进行排序,借助了临时数组来标记排好序的下标. 运行结果如下: 输入数据: 打印数据: 根据学号对信息进行排序: 根据总成绩对信息进行排序: 根据学号删除某一信息: 代码如下: #include <stdio.h> #include <stdlib.h> //exit函数头文件 #include <string.h> //字符串相关操作头文件 #define MAX_STU

  • 学生信息管理系统C语言版

    C语言学生信息管理系统包括以下功能: 1.学生信息的整体注册 2.学生信息的修改 3.学生成绩信息的录入 4.学生信息的添加 5.恢复误删的学生信息 6.学生信息的删除 7.密码修改保存函数 8.学生信息的查询 9.密码修改函数 10.学生信息管理系统的菜单函数 #include "stdio.h" #include "malloc.h" #include "string.h" #include "stdlib.h" #inc

  • C语言学生信息管理系统小项目

    本文为大家分享了C语言学生信息管理系统小项目,供大家参考,具体内容如下 /* 运行环境:我是在linux里面用gcc编译的,在windows里应该也能运行,用的一些文件库函数都是c标准库,没有用linux的系统调用(纠正一下:system("clear")这个系统调用是linux的,windows里面用system("cls") ) (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等.试设计一学生信息管理系统,使之能提供以下功

  • C语言单链表版学生信息管理系统

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 代码: //以单链表作为存储结构,设计和实现课程成绩管理的完整程序. //程序包括如下功能. //1.建立学生成绩表,包含学生的学号.姓名和成绩. //2.可以显示所有学生成绩. //3.可以计算学生的总数. //4.可以按学号和序号查找学生. //5.可以在指定位置插入学生成绩数据. //6.可以删除指定位置的学生数据. //7.可以把学生成绩按从高到低的顺序排序. //作者: yinlinqvan //操作系统:

  • C语言学生信息管理系统设计与实现

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 #include"stdio.h" //标准的输入输出函数文件头部说明 #include"math.h" // 数学函数头部说明 #include"string.h" #include"stdlib.h" //通过该函数头部里的函数,改变控制台的背景和颜色 #include"windows.h" //头文件声明,下文用到了改变控

随机推荐