array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 【转载】C语言综合实验1—学生信息管理系统 - 爱码网
CoderTian

http://www.cnblogs.com/Anker/archive/2013/05/06/3063436.html

实验题目:学生信息管理系统

实验要求:用户可以选择1-7可以分别进行学生信息的查看、添加、删除,修改,计算平均成绩,保存,退出系统操作。

提示:用一个结构体类型表示学生信息

typedef struct node /*定义结构体*/
{ 
    int num; //学号
    char name[15];//姓名
    char sex[9]; //性别
    int age;  //年龄
    int english; //英语成绩
    int math; //数学成绩
    int computer;//计算机成绩
    int average; //平均成绩
    struct node *next; //链表指针域
}student_info;

运行过程中采用一个结构体链表存储学生信息。退出系统时可以采用文件存储用户输入的信息,再次运行的时候从文件中读取。

完整C语言程序分为三个文件,student.h、student.cpp和main.c文件。具体实现如下所示:

student.h文件中定义学生信息结构体,操作函数声明。

#ifndef STUDENT_HEAD
#define STUDENT_HEAD

typedef struct node /*定义结构体*/
{ 
    int num; //学号
    char name[15];//姓名
    char sex[9]; //性别
    int age;  //年龄
    int english; //英语成绩
    int math; //数学成绩
    int computer;//计算机成绩
    int average; //平均成绩
    struct node *next; //链表指针域
}student_info;

//学生信息链表
extern student_info* student_list;  //全局变量声明


//初始化函数声明
//初始化学生信息链表
void init_student_info_list();
//判断学生信息链表是否为空
int student_list_empty();

//操作函数声明
//向学校信息表中添加学生信息记录
int add_student_info();
//根据学号删除学生信息
int delete_student_info(int num);
//根据学号修改学生信息
int modify_student_info(int num);
//根据学号查找学生信息
student_info* search_student_info(int num);
//输出每个学生的平均成绩
void display_average();
//显示所有学生信息
void display_student_info();
//将学生信息保存到文件
int save_file();
//从文件中读取学生信息
int read_file();
#endif

student.c文件中是对student.h文件中声明的函数进行定义,给出具体的实现代码。

#include "student.h"
#include <stdio.h>
#include <string.h>
#include <malloc.h>

//初始化学生信息链表
void init_student_info_list()
{
    //学生信息链表头结点
    student_list = (student_info*)malloc(sizeof(student_info));
    student_list->next = NULL;
}
//判断学生信息链表是否为空
int student_list_empty()
{
    return student_list->next == NULL;
}
//操作函数实现
//向学校信息表中添加学生信息记录
int add_student_info()
{
    student_info *pstu = (student_info*)malloc(sizeof(student_info));
    if(pstu == NULL)
    {
        printf("内存分配失败.\n");
        return 0;
    }
    printf("请按要求一次输入学生的信息.\n");
    printf("请输入学号: ");
    scanf("%d",&pstu->num);
    //判断该学号是否已经存在
    if(search_student_info(pstu->num) != NULL)
    {
        printf("该学号已经存在学生信息表中.\n");
        return 0;
    }
    printf("请输入姓名: ");
    getchar();
    gets(pstu->name);
    printf("请输入性别: ");
    scanf("%s",pstu->sex);
    printf("请输入年龄: ");
    scanf("%d",&pstu->age);
    printf("请输入英语成绩: ");
    scanf("%d",&pstu->english);
    printf("请输入数学成绩: ");
    scanf("%d",&pstu->math);
    printf("请输入计算机成绩: ");
    scanf("%d",&pstu->computer);
    pstu->average = (pstu->english + pstu->math + pstu->computer)/3;
    //每次从学生信息链表的头部插入;
    pstu->next = student_list->next;
    student_list->next = pstu;
    return 1;
}
//根据学号删除学生信息
int delete_student_info(int num)
{
    student_info *pstu;
    student_info *qstu;
    if(search_student_info(num) == NULL)
    {
        printf("不存在该学好为%d的学生信息.\n",num);
        return 0;
    }
    pstu = student_list->next;
    qstu = student_list;
    while(pstu->num != num)
    {
        qstu = pstu;
        pstu = pstu->next;
    }
    qstu->next = pstu->next;
    free(pstu);
    return 1;
}
//根据学号修改学生信息
int modify_student_info(int num)
{
    int choice;
    student_info *pstu = search_student_info(num);
    if(pstu == NULL)
    {
        printf("不存在该学好为%d的学生信息.\n",num);
        return 0;
    }
    printf("1.姓名 2.性别 3.年龄 4.英语成绩 5.数学成绩 6.计算机成绩.\n");
    printf("请选择修改的信息: ");
    scanf("%d",&choice);
    switch(choice)
    {
    case 1:
        printf("请输入新的姓名: ");
        getchar();
        gets(pstu->name);
        break;
    case 2:
        printf("请输入新的性别: ");
        scanf("%s",pstu->sex);
        break;
    case 3:
        printf("请输入新的年龄: ");
        scanf("%d",&pstu->age);
        break;
    case 4:
        printf("请输入新的英语成绩: ");
        scanf("%d",&pstu->english);
        break;
    case 5:
        printf("请输入新的数学成绩: ");
        scanf("%d",&pstu->math);
        break;
    case 6:
        printf("请输入新的计算机成绩: ");
        scanf("%d",&pstu->computer);
        break;
    default:
        printf("请按提示要求操作.\n");
    }
    return 1;
}
//根据学号查找学生信息
student_info* search_student_info(int num)
{
    student_info *pstu;
    pstu = student_list->next;
    while(pstu  && pstu->num != num)
    {

        pstu = pstu->next;
    }
    return pstu;
}
//输出每个学生的平均成绩
void display_average()
{
    student_info *pstu;
    pstu = student_list->next;
    while(pstu)
    {
        printf("学号为%d,姓名为%s的学生平均成绩为: %d\n",pstu->num,pstu->name,pstu->average);
        pstu = pstu->next;
    }
}
//显示所有学生信息
void display_student_info()
{
    student_info *pstu;
    pstu = student_list->next;
    printf("所有学生信息如下所示.\n");
    printf("学号\t姓名\t性别\t年龄\t英语\t数学\t计算机\t平均成绩.\n");
    while(pstu)
    {
        printf("%d\t",pstu->num);
        printf("%s\t",pstu->name);
        printf("%s\t",pstu->sex);
        printf("%d  \t",pstu->age);
        printf("%d   \t",pstu->english);
        printf("%d  \t",pstu->math);
        printf("%d    \t",pstu->computer);
        printf("%d\n",pstu->average);
        pstu = pstu->next;
    }
}
//将学生信息保存到文件
int save_file()
{
    FILE *pfile;
    student_info *pstu;
    pfile = fopen("student.txt","w");
    if(pfile == NULL)
    {
        printf("打开文件失败.\n");
        return 0;
    }
    pstu = student_list->next;
    while(pstu)
    {
        fprintf(pfile,"%5d%15s%9s%3d%4d%4d%4d%4d",pstu->num,pstu->name,pstu->sex,pstu->age,
            pstu->english,pstu->math,pstu->computer,pstu->average);
        pstu = pstu->next;
    }
    fclose(pfile);
    return 1;
}

//从文件中读取学生信息
int read_file()
{
    FILE *pfile;
    student_info *pstu;
    pfile = fopen("student.txt","r");
    if(pfile == NULL)
    {
        printf("打开文件失败.\n");
        return 0;
    }
    while(!feof(pfile))
    {
        pstu = (student_info*)malloc(sizeof(student_info));
        fscanf(pfile,"%5d%15s%9s%4d%4d%4d%4d%4d",&pstu->num,pstu->name,pstu->sex,&pstu->age,
            &pstu->english,&pstu->math,&pstu->computer,&pstu->average);
        pstu->average = (pstu->english + pstu->math + pstu->computer)/3;
        //每次从学生信息链表的头部插入;
        pstu->next = student_list->next;
        student_list->next = pstu;
    }
    fclose(pfile);
    return 1;
}

主函数main.c文件进行测试调用,如下所示:

#include "student.h"
#include <stdlib.h>
#include <stdio.h>

void menu();

//学生信息链表
student_info* student_list;

//用户可以选择1-7可以分别进行学生信息的查看、添加、删除,修改,计算平均成绩,保存,退出系统操作。
int main()
{
    int choice;
    int num;
    printf("**************************\n");
    printf("欢迎使用学生信息管理系统\n");
    printf("**************************\n");
    printf("-----------------------------\n");
    init_student_info_list();
    if(read_file())
        printf("从文件中读取学生信息成功.\n");
    else
        printf("从文字中读取学生信息失败.\n");
    printf("-----------------------------\n");
    menu();
    while(1)
    {
        printf("请选择操作: ");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
            if(student_list_empty())
                printf("学生信息表为空,请先添加学生信息.\n");
            else
                display_student_info();
            break;
        case 2:
            if(add_student_info())
                printf("添加学生信息成功.\n");
            else
                printf("添加学生信息失败.\n");
            break;
        case 3:
            if(student_list_empty())
                printf("学生信息表为空,请先添加学生信息.\n");
            else
            {
                printf("请输入要删除学生信息的学号: ");
                scanf("%d",&num);
                if(delete_student_info(num))
                    printf("成功删除该学号对应的学生信息.\n");
                else
                    printf("删除失败.\n");
            }
            break;
        case 4:
            if(student_list_empty())
                printf("学生信息表为空,请先添加学生信息.\n");
            else
            {
                printf("请输入要修改学生信息的学号: ");
                scanf("%d",&num);
                if(modify_student_info(num))
                    printf("成功修改该学号对应的学生信息.\n");
                else
                    printf("修改失败.\n");
            }
            break;
        case 5:
            if(student_list_empty())
                printf("学生信息表为空,请先添加学生信息.\n");
            else
                display_average();
            break;
        case 6:
            if(student_list_empty())
                printf("学生信息表为空,请先添加学生信息.\n");
            else
                if(save_file())
                    printf("保存学生信息成功.\n");
                else
                    printf("保存学生信息失败.\n");
            break;
        case 0:
            printf("欢迎下次使用,再见.\n");
            system("pause");
            exit(0);
            break;
        default:
            printf("输入错误,请重新选择操作.\n");
        }
    }
    system("pause");
    return 0;
}

void menu()
{
    printf("1.查看学生信息.\n");
    printf("2.添加学生信息.\n");
    printf("3.删除学生信息.\n");
    printf("4.修改学生信息.\n");
    printf("5.输出平均成绩.\n");
    printf("6.保存学生信息.\n");
    printf("0.退出系统操作.\n");
}

程序执行结果如下所示:

(1)第一次执行没有学生信息,读取文件失败。

(2)以后执行先从文件中读取学生信息,然后进行操作。

分类:

技术点:

相关文章: